Author: luke
Date: 2007-04-17 12:44:35 -0600 (Tue, 17 Apr 2007)
New Revision: 2560
Modified:
SQLObject/branches/sqlbuilder-views+1/sqlobject/dbconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/firebird/firebirdconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/maxdb/maxdbconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/mssql/mssqlconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/mysql/mysqlconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/postgres/pgconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlbuilder.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlite/sqliteconnection.py
SQLObject/branches/sqlbuilder-views+1/sqlobject/sybase/sybaseconnection.py
Log:
Possible implementation to allow sqlbuilder.Select to reference dbconnection._queryAddLimitOffset
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/dbconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/dbconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/dbconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -925,10 +925,8 @@
return self.cachedURIs[uri]
if uri.find(':') != -1:
scheme, rest = uri.split(':', 1)
- assert self.schemeBuilders.has_key(scheme), (
- "No SQLObject driver exists for %s (only %s)"
- % (scheme, ', '.join(self.schemeBuilders.keys())))
- conn = self.schemeBuilders[scheme]().connectionFromURI(uri)
+ connCls = self.dbConnectionForScheme(scheme)
+ conn = connCls.connectionFromURI(uri)
else:
# We just have a name, not a URI
assert self.instanceNames.has_key(uri), \
@@ -938,8 +936,15 @@
self.cachedURIs[uri] = conn
return conn
+ def dbConnectionForScheme(self, scheme):
+ assert self.schemeBuilders.has_key(scheme), (
+ "No SQLObject driver exists for %s (only %s)"
+ % (scheme, ', '.join(self.schemeBuilders.keys())))
+ return self.schemeBuilders[scheme]()
+
TheURIOpener = ConnectionURIOpener()
registerConnection = TheURIOpener.registerConnection
registerConnectionInstance = TheURIOpener.registerConnectionInstance
connectionForURI = TheURIOpener.connectionForURI
+dbConnectionForScheme = TheURIOpener.dbConnectionForScheme
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/firebird/firebirdconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/firebird/firebirdconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/firebird/firebirdconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -107,7 +107,7 @@
self.printDebug(conn, id, 'QueryIns', 'result')
return id
- def _queryAddLimitOffset(self, query, start, end):
+ def _queryAddLimitOffset(cls, query, start, end):
"""Firebird slaps the limit and offset (actually 'first' and
'skip', respectively) statement right after the select."""
if not start:
@@ -117,11 +117,12 @@
else:
limit_str = "SELECT FIRST %i SKIP %i" % (end-start, start)
- match = self.limit_re.match(query)
+ match = cls.limit_re.match(query)
if match and len(match.groups()) == 2:
return ' '.join([limit_str, match.group(2)])
else:
return query
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
def createTable(self, soClass):
self.query('CREATE TABLE %s (\n%s\n)' % \
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/maxdb/maxdbconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/maxdb/maxdbconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/maxdb/maxdbconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -136,7 +136,7 @@
self.printDebug(conn, id, 'QueryIns', 'result')
return id
- def sqlAddLimit(self,query,limit):
+ def sqlAddLimit(cls,query,limit):
sql = query
sql = sql.replace("SELECT","SELECT ROWNO, ")
if sql.find('WHERE') != -1:
@@ -144,12 +144,14 @@
else:
sql = sql + 'WHERE ' + limit
return sql
+ sqlAddLimit = classmethod(sqlAddLimit)
- def _queryAddLimitOffset(self, query, start, end):
+ def _queryAddLimitOffset(cls, query, start, end):
if start:
raise LowerBoundOfSliceIsNotSupported
limit = ' ROWNO <= %d ' % (end)
- return self.sqlAddLimit(query,limit)
+ return cls.sqlAddLimit(query,limit)
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
def createTable(self, soClass):
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/mssql/mssqlconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/mssql/mssqlconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/mssql/mssqlconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -143,15 +143,16 @@
self.printDebug(conn, id, 'QueryIns', 'result')
return id
- def _queryAddLimitOffset(self, query, start, end):
+ def _queryAddLimitOffset(cls, query, start, end):
if end and not start:
limit_str = "SELECT TOP %i" % end
- match = self.limit_re.match(query)
+ match = cls.limit_re.match(query)
if match and len(match.groups()) == 2:
return ' '.join([limit_str, match.group(2)])
else:
return query
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
def createReferenceConstraint(self, soClass, col):
return col.mssqlCreateReferenceConstraint()
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/mysql/mysqlconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/mysql/mysqlconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/mysql/mysqlconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -150,6 +150,14 @@
self.printDebug(conn, id, 'QueryIns', 'result')
return id
+ def _queryAddLimitOffset(cls, query, start, end):
+ if not start:
+ return "%s LIMIT %i" % (query, end)
+ if not end:
+ return "%s LIMIT %i, -1" % (query, start)
+ return "%s LIMIT %i, %i" % (query, start, end-start)
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
+
def createReferenceConstraint(self, soClass, col):
return col.mysqlCreateReferenceConstraint()
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/postgres/pgconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/postgres/pgconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/postgres/pgconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -138,6 +138,14 @@
self.printDebug(conn, id, 'QueryIns', 'result')
return id
+ def _queryAddLimitOffset(cls, query, start, end):
+ if not start:
+ return "%s LIMIT %i" % (query, end)
+ if not end:
+ return "%s OFFSET %i" % (query, start)
+ return "%s LIMIT %i OFFSET %i" % (query, end-start, start)
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
+
def createColumn(self, soClass, col):
return col.postgresCreateSQL()
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlbuilder.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlbuilder.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -637,24 +637,12 @@
select += " ORDER BY %s" % ", ".join([sqlrepr(reverser(x), db) for x in orderBy])
else:
select += " ORDER BY %s" % sqlrepr(reverser(orderBy), db)
+ start, end = self.ops['start'], self.ops['end']
if self.ops['limit'] is not NoDefault:
- select += " LIMIT %s" % sqlrepr(self.ops['limit'], db)
- elif self.ops['start'] or self.ops['end']:
- start, end = self.ops['start'], self.ops['end']
- if db == 'mysql':
- if not start:
- select += "%s LIMIT %i" % end
- elif not end:
- select += "%s LIMIT %i, -1" % start
- else:
- select +="%s LIMIT %i, %i" % (start, end-start)
- else:
- if not start:
- select += " LIMIT %i" % end
- elif not end:
- select += " OFFSET %i" % start
- else:
- select += " LIMIT %i OFFSET %i" % (end-start, start)
+ end = start + limit
+ if start or end:
+ from dbconnection import dbConnectionForScheme
+ select = dbConnectionForScheme(db)._queryAddLimitOffset(select, start, end)
if self.ops['forUpdate']:
select += " FOR UPDATE"
return select
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlite/sqliteconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlite/sqliteconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/sqlite/sqliteconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -231,12 +231,13 @@
else:
return DBAPI._insertSQL(self, table, names, values)
- def _queryAddLimitOffset(self, query, start, end):
+ def _queryAddLimitOffset(cls, query, start, end):
if not start:
return "%s LIMIT %i" % (query, end)
if not end:
return "%s LIMIT 0 OFFSET %i" % (query, start)
return "%s LIMIT %i OFFSET %i" % (query, end-start, start)
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
def createColumn(self, soClass, col):
return col.sqliteCreateSQL()
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/sybase/sybaseconnection.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/sybase/sybaseconnection.py 2007-04-17 16:44:32 UTC (rev 2559)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/sybase/sybaseconnection.py 2007-04-17 18:44:35 UTC (rev 2560)
@@ -94,11 +94,12 @@
self.printDebug(conn, id, 'QueryIns', 'result')
return id
- def _queryAddLimitOffset(self, query, start, end):
+ def _queryAddLimitOffset(cls, query, start, end):
# XXX Sybase doesn't support OFFSET
if end:
return "SET ROWCOUNT %i %s SET ROWCOUNT 0" % (end, query)
return query
+ _queryAddLimitOffset = classmethod(_queryAddLimitOffset)
def createReferenceConstraint(self, soClass, col):
return None
|