# HG changeset patch # User Alexandre Fayolle # Date 1270575757 -7200 # Node ID 1ab032df5ca3ac881be21ff3f9eb91f3dd5db597 # Parent 529861a73ec8cd25cee5fabfe75f14813c18eb35 SQL Server port: temporary table handling Together with support from logilab.database, handle temp tables for SQLServer (which are denoted by a name starting with '#', just don't ask) Note updated dependency on logilab.database 1.0.2 diff -r 529861a73ec8 -r 1ab032df5ca3 debian/control --- a/debian/control Tue Apr 06 19:27:47 2010 +0200 +++ b/debian/control Tue Apr 06 19:42:37 2010 +0200 @@ -33,7 +33,7 @@ Conflicts: cubicweb-multisources Replaces: cubicweb-multisources Provides: cubicweb-multisources -Depends: ${python:Depends}, cubicweb-common (= ${source:Version}), cubicweb-ctl (= ${source:Version}), python-logilab-database, cubicweb-postgresql-support | cubicweb-mysql-support | python-pysqlite2 +Depends: ${python:Depends}, cubicweb-common (= ${source:Version}), cubicweb-ctl (= ${source:Version}), python-logilab-database (=> 1.0.2), cubicweb-postgresql-support | cubicweb-mysql-support | python-pysqlite2 Recommends: pyro, cubicweb-documentation (= ${source:Version}) Description: server part of the CubicWeb framework CubicWeb is a semantic web application framework. diff -r 529861a73ec8 -r 1ab032df5ca3 server/msplanner.py --- a/server/msplanner.py Tue Apr 06 19:27:47 2010 +0200 +++ b/server/msplanner.py Tue Apr 06 19:42:37 2010 +0200 @@ -1042,7 +1042,7 @@ for select in subquery.query.children] for sppi in sppis: if sppi.needsplit or sppi.part_sources != ppi.part_sources: - temptable = 'T%s' % make_uid(id(subquery)) + temptable = plan.make_temp_table_name('T%s' % make_uid(id(subquery))) sstep = self._union_plan(plan, sppis, temptable)[0] break else: @@ -1075,7 +1075,7 @@ inputmap = self._ppi_subqueries(ppi) aggrstep = need_aggr_step(select, sources) if aggrstep: - atemptable = 'T%s' % make_uid(id(select)) + atemptable = plan.make_temp_table_name('T%s' % make_uid(id(select))) sunion = Union() sunion.append(select) selected = select.selection[:] @@ -1119,7 +1119,7 @@ subinputmap = self._ppi_subqueries(ppi) stepdefs = ppi.part_steps() if need_aggr_step(select, ppi.part_sources, stepdefs): - atemptable = 'T%s' % make_uid(id(select)) + atemptable = plan.make_temp_table_name('T%s' % make_uid(id(select))) selection = select.selection[:] select_group_sort(select) else: @@ -1169,6 +1169,7 @@ else: table = '_T%s%s' % (''.join(sorted(v._ms_table_key() for v in terms)), ''.join(sorted(str(i) for i in solindices))) + table = plan.make_temp_table_name(table) ppi.build_non_final_part(minrqlst, solindices, sources, insertedvars, table) # finally: join parts, deal with aggregat/group/sorts if necessary diff -r 529861a73ec8 -r 1ab032df5ca3 server/querier.py --- a/server/querier.py Tue Apr 06 19:27:47 2010 +0200 +++ b/server/querier.py Tue Apr 06 19:42:37 2010 +0200 @@ -164,6 +164,13 @@ finally: self.clean() + def make_temp_table_name(self, table): + """ + return a temp table name according to db backend + """ + return self.syssource.make_temp_table_name(table) + + def init_temp_table(self, table, selected, sol): """initialize sql schema and variable map for a temporary table which will be used to store result for the given rqlst diff -r 529861a73ec8 -r 1ab032df5ca3 server/sources/native.py --- a/server/sources/native.py Tue Apr 06 19:27:47 2010 +0200 +++ b/server/sources/native.py Tue Apr 06 19:42:37 2010 +0200 @@ -669,6 +669,15 @@ pass return None + def make_temp_table_name(self, table): + try: # XXX remove this once + return self.dbhelper.temporary_table_name(table) + except AttributeError: + import warnings + warnings.warn('Please hg up logilab.database') + return table + + def temp_table_def(self, selected, sol, table): return make_schema(selected, sol, table, self.dbhelper.TYPE_MAPPING)