[SQL-CVS] r2560 - in SQLObject/branches/sqlbuilder-views+1/sqlobject: . firebird maxdb mssql mysql
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <sub...@co...> - 2007-04-17 18:44:41
|
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 |