[SQL-CVS] r3964 - in SQLObject/trunk: docs sqlobject/firebird sqlobject/maxdb sqlobject/mssql sqlob
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
Author: phd Date: 2009-08-21 11:20:17 -0600 (Fri, 21 Aug 2009) New Revision: 3964 Modified: SQLObject/trunk/docs/News.txt SQLObject/trunk/sqlobject/firebird/firebirdconnection.py SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py SQLObject/trunk/sqlobject/mssql/mssqlconnection.py SQLObject/trunk/sqlobject/mysql/mysqlconnection.py SQLObject/trunk/sqlobject/postgres/pgconnection.py SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py SQLObject/trunk/sqlobject/sybase/sybaseconnection.py SQLObject/trunk/sqlobject/tests/test_datetime.py SQLObject/trunk/sqlobject/tests/test_select.py SQLObject/trunk/sqlobject/tests/test_sqlite_factory.py Log: Imported DB API drivers are stored as connection instance variables, not in global variables. Modified: SQLObject/trunk/docs/News.txt =================================================================== --- SQLObject/trunk/docs/News.txt 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/docs/News.txt 2009-08-21 17:20:17 UTC (rev 3964) @@ -24,6 +24,13 @@ * .selectBy(), .deleteBy() and .by*() methods pass all values through .from_python(), not only unicode. +Small Features +-------------- + +* Imported DB API drivers are stored as connection instance variables, not + in global variables; this allows to use different DB API drivers at the + same time; for example, PySQLite2 and sqlite3. + SQLObject 0.11 ============== Modified: SQLObject/trunk/sqlobject/firebird/firebirdconnection.py =================================================================== --- SQLObject/trunk/sqlobject/firebird/firebirdconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/firebird/firebirdconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -2,7 +2,6 @@ import os from sqlobject.dbconnection import DBAPI from sqlobject import col -kinterbasdb = None class FirebirdConnection(DBAPI): @@ -13,9 +12,7 @@ def __init__(self, host, db, user='sysdba', password='masterkey', autoCommit=1, dialect=None, role=None, charset=None, **kw): - global kinterbasdb - if kinterbasdb is None: - import kinterbasdb + import kinterbasdb self.module = kinterbasdb self.limit_re = re.compile('^\s*(select )(.*)', re.IGNORECASE) @@ -53,13 +50,13 @@ # @@: Horrible auto-commit implementation. Just horrible! try: conn.begin() - except kinterbasdb.ProgrammingError: + except self.module.ProgrammingError: pass try: val = meth(conn, *args) try: conn.commit() - except kinterbasdb.ProgrammingError: + except self.module.ProgrammingError: pass finally: self.releaseConnection(conn) @@ -74,7 +71,7 @@ extra = {} if self.dialect: extra['dialect'] = self.dialect - return kinterbasdb.connect( + return self.module.connect( host=self.host, database=self.db, user=self.user, Modified: SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py =================================================================== --- SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -15,7 +15,6 @@ """ from sqlobject.dbconnection import DBAPI from sqlobject import col -dbapi = None @@ -63,9 +62,7 @@ def __init__ (self, user, password, database, host='', autoCommit=1, sqlmode='internal', isolation=None, timeout=None, **kw): - global dbapi - if dbapi is None: - from sapdb import dbapi + from sapdb import dbapi self.module = dbapi self.autoCommit = autoCommit self.user = user @@ -114,7 +111,7 @@ return '%s_SEQ'%(table[:SAPDBMAX_ID_LENGTH -4]) def makeConnection(self): - conn = dbapi.Connection( + conn = self.module.Connection( self.user, self.password, self.database, self.host, **self._getConfigParams(self.sqlmode,self.autoCommit)) return conn Modified: SQLObject/trunk/sqlobject/mssql/mssqlconnection.py =================================================================== --- SQLObject/trunk/sqlobject/mssql/mssqlconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/mssql/mssqlconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -2,8 +2,6 @@ from sqlobject import col import re -sqlmodule = None - class MSSQLConnection(DBAPI): supportTransactions = True @@ -12,15 +10,12 @@ def __init__(self, db, user, password='', host='localhost', autoCommit=0, **kw): - global sqlmodule - if not sqlmodule: - try: - import adodbapi as sqlmodule - except ImportError: - import pymssql as sqlmodule + try: + import adodbapi as sqlmodule + except ImportError: + import pymssql as sqlmodule if sqlmodule.__name__ == 'adodbapi': - import adodbapi as sqlmodule self.dbconnection = sqlmodule.connect # ADO uses unicode only (AFAIK) self.usingUnicodeStrings = True Modified: SQLObject/trunk/sqlobject/mysql/mysqlconnection.py =================================================================== --- SQLObject/trunk/sqlobject/mysql/mysqlconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/mysql/mysqlconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -1,7 +1,6 @@ from sqlobject import col from sqlobject.dbconnection import DBAPI from sqlobject.dberrors import * -MySQLdb = None class ErrorMessage(str): def __new__(cls, e, append_msg=''): @@ -18,9 +17,7 @@ schemes = [dbName] def __init__(self, db, user, password='', host='localhost', port=0, **kw): - global MySQLdb - if MySQLdb is None: - import MySQLdb, MySQLdb.constants.CR, MySQLdb.constants.ER + import MySQLdb, MySQLdb.constants.CR, MySQLdb.constants.ER self.module = MySQLdb self.host = host self.port = port @@ -49,7 +46,7 @@ # MySQLdb < 1.2.1: only ascii # MySQLdb = 1.2.1: only unicode # MySQLdb > 1.2.1: both ascii and unicode - self.need_unicode = (MySQLdb.version_info[:3] >= (1, 2, 1)) and (MySQLdb.version_info[:3] < (1, 2, 2)) + self.need_unicode = (self.module.version_info[:3] >= (1, 2, 1)) and (self.module.version_info[:3] < (1, 2, 2)) DBAPI.__init__(self, **kw) @@ -71,7 +68,7 @@ try: conn = self.module.connect(host=self.host, port=self.port, db=self.db, user=self.user, passwd=self.password, **self.kw) - if MySQLdb.version_info[:3] >= (1, 2, 2): + if self.module.version_info[:3] >= (1, 2, 2): conn.ping(True) # Attempt to reconnect. This setting is persistent. except self.module.OperationalError, e: conninfo = "; used connection string: host=%(host)s, port=%(port)s, db=%(db)s, user=%(user)s" % self.__dict__ @@ -115,35 +112,35 @@ for count in range(3): try: return cursor.execute(query) - except MySQLdb.OperationalError, e: - if e.args[0] in (MySQLdb.constants.CR.SERVER_GONE_ERROR, MySQLdb.constants.CR.SERVER_LOST): + except self.module.OperationalError, e: + if e.args[0] in (self.module.constants.CR.SERVER_GONE_ERROR, self.module.constants.CR.SERVER_LOST): if count == 2: raise OperationalError(ErrorMessage(e)) if self.debug: self.printDebug(conn, str(e), 'ERROR') else: raise OperationalError(ErrorMessage(e)) - except MySQLdb.IntegrityError, e: + except self.module.IntegrityError, e: msg = ErrorMessage(e) - if e.args[0] == MySQLdb.constants.ER.DUP_ENTRY: + if e.args[0] == self.module.constants.ER.DUP_ENTRY: raise DuplicateEntryError(msg) else: raise IntegrityError(msg) - except MySQLdb.InternalError, e: + except self.module.InternalError, e: raise InternalError(ErrorMessage(e)) - except MySQLdb.ProgrammingError, e: + except self.module.ProgrammingError, e: raise ProgrammingError(ErrorMessage(e)) - except MySQLdb.DataError, e: + except self.module.DataError, e: raise DataError(ErrorMessage(e)) - except MySQLdb.NotSupportedError, e: + except self.module.NotSupportedError, e: raise NotSupportedError(ErrorMessage(e)) - except MySQLdb.DatabaseError, e: + except self.module.DatabaseError, e: raise DatabaseError(ErrorMessage(e)) - except MySQLdb.InterfaceError, e: + except self.module.InterfaceError, e: raise InterfaceError(ErrorMessage(e)) - except MySQLdb.Warning, e: + except self.module.Warning, e: raise Warning(ErrorMessage(e)) - except MySQLdb.Error, e: + except self.module.Error, e: raise Error(ErrorMessage(e)) def _queryInsertID(self, conn, soInstance, id, names, values): Modified: SQLObject/trunk/sqlobject/postgres/pgconnection.py =================================================================== --- SQLObject/trunk/sqlobject/postgres/pgconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/postgres/pgconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -3,8 +3,6 @@ from sqlobject import col from sqlobject import sqlbuilder from sqlobject.converters import registerConverter -psycopg = None -pgdb = None class PostgresConnection(DBAPI): @@ -15,18 +13,15 @@ def __init__(self, dsn=None, host=None, port=None, db=None, user=None, password=None, usePygresql=False, unicodeCols=False, **kw): - global psycopg, pgdb self.usePygresql = usePygresql if usePygresql: - if pgdb is None: - import pgdb + import pgdb self.module = pgdb else: - if psycopg is None: - try: - import psycopg2 as psycopg - except ImportError: - import psycopg + try: + import psycopg2 as psycopg + except ImportError: + import psycopg self.module = psycopg # Register a converter for psycopg Binary type. Modified: SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py =================================================================== --- SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -5,8 +5,6 @@ from sqlobject import col, sqlbuilder from sqlobject.dberrors import * -sqlite = None -using_sqlite2 = False sqlite2_Binary = None class ErrorMessage(str): @@ -24,32 +22,29 @@ schemes = [dbName] def __init__(self, filename, autoCommit=1, **kw): - global sqlite - global using_sqlite2 - if sqlite is None: + try: + from pysqlite2 import dbapi2 as sqlite + self.using_sqlite2 = True + except ImportError: try: - from pysqlite2 import dbapi2 as sqlite - using_sqlite2 = True + import sqlite3 as sqlite + self.using_sqlite2 = True except ImportError: - try: - import sqlite3 as sqlite - using_sqlite2 = True - except ImportError: - import sqlite - using_sqlite2 = False - if using_sqlite2: - sqlite.encode = base64.encodestring - sqlite.decode = base64.decodestring + import sqlite + self.using_sqlite2 = False + if self.using_sqlite2: + sqlite.encode = base64.encodestring + sqlite.decode = base64.decodestring self.module = sqlite self.filename = filename # full path to sqlite-db-file self._memory = filename == ':memory:' if self._memory: - if not using_sqlite2: + if not self.using_sqlite2: raise ValueError( "You must use sqlite2 to use in-memory databases") # connection options opts = {} - if using_sqlite2: + if self.using_sqlite2: if autoCommit: opts["isolation_level"] = None if 'encoding' in kw: @@ -75,7 +70,7 @@ if 'mode' in kw: opts['mode'] = int(kw.pop('mode'), 0) if 'timeout' in kw: - if using_sqlite2: + if self.using_sqlite2: opts['timeout'] = float(kw.pop('timeout')) else: opts['timeout'] = int(float(kw.pop('timeout')) * 1000) @@ -156,7 +151,7 @@ conn.close() def _setAutoCommit(self, conn, auto): - if using_sqlite2: + if self.using_sqlite2: if auto: conn.isolation_level = None else: @@ -165,14 +160,14 @@ conn.autocommit = auto def _setIsolationLevel(self, conn, level): - if not using_sqlite2: + if not self.using_sqlite2: return conn.isolation_level = level def makeConnection(self): if self._memory: return self._memoryConn - return sqlite.connect(self.filename, **self._connOptions) + return self.module.connect(self.filename, **self._connOptions) def _executeRetry(self, conn, cursor, query): if self.debug: Modified: SQLObject/trunk/sqlobject/sybase/sybaseconnection.py =================================================================== --- SQLObject/trunk/sqlobject/sybase/sybaseconnection.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/sybase/sybaseconnection.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -1,21 +1,21 @@ from sqlobject.dbconnection import DBAPI from sqlobject import col -Sybase = None class SybaseConnection(DBAPI): supportTransactions = False dbName = 'sybase' schemes = [dbName] + NumericType = None def __init__(self, db, user, password='', host='localhost', locking=1, **kw): db = db.strip('/') - global Sybase - if Sybase is None: - import Sybase - Sybase._ctx.debug = 0 + import Sybase + Sybase._ctx.debug = 0 + if SybaseConnection.NumericType is None: from Sybase import NumericType + SybaseConnection.NumericType = NumericType from sqlobject.converters import registerConverter, IntConverter registerConverter(NumericType, IntConverter) self.module = Sybase @@ -48,7 +48,7 @@ return c.fetchone()[0] def makeConnection(self): - return Sybase.connect(self.host, self.user, self.password, + return self.module.connect(self.host, self.user, self.password, database=self.db, auto_commit=self.autoCommit, locking=self.locking) Modified: SQLObject/trunk/sqlobject/tests/test_datetime.py =================================================================== --- SQLObject/trunk/sqlobject/tests/test_datetime.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/tests/test_datetime.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -43,9 +43,9 @@ from mx.DateTime import now, Time dateFormat = None # use default - if getConnection().dbName == "sqlite": - from sqlobject.sqlite.sqliteconnection import using_sqlite2 - if using_sqlite2: + connection = getConnection() + if connection.dbName == "sqlite": + if connection.using_sqlite2: # mxDateTime sends and PySQLite2 returns full date/time for dates dateFormat = "%Y-%m-%d %H:%M:%S" Modified: SQLObject/trunk/sqlobject/tests/test_select.py =================================================================== --- SQLObject/trunk/sqlobject/tests/test_select.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/tests/test_select.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -152,8 +152,7 @@ setupClass(IterTest) if IterTest._connection.dbName == "sqlite": - from sqlobject.sqlite import sqliteconnection - if not sqliteconnection.using_sqlite2: + if not IterTest._connection.using_sqlite2: return # Implement regexp() function for SQLite; only works with PySQLite2 Modified: SQLObject/trunk/sqlobject/tests/test_sqlite_factory.py =================================================================== --- SQLObject/trunk/sqlobject/tests/test_sqlite_factory.py 2009-08-19 15:57:09 UTC (rev 3963) +++ SQLObject/trunk/sqlobject/tests/test_sqlite_factory.py 2009-08-21 17:20:17 UTC (rev 3964) @@ -9,8 +9,7 @@ setupClass(SQLiteFactoryTest) if SQLiteFactoryTest._connection.dbName == "sqlite": - from sqlobject.sqlite import sqliteconnection - if not sqliteconnection.using_sqlite2: + if not SQLiteFactoryTest._connection.using_sqlite2: return factory = [None] @@ -30,8 +29,7 @@ setupClass(SQLiteFactoryTest) if SQLiteFactoryTest._connection.dbName == "sqlite": - from sqlobject.sqlite import sqliteconnection - if not sqliteconnection.using_sqlite2: + if not SQLiteFactoryTest._connection.using_sqlite2: return factory = [None] @@ -40,6 +38,7 @@ pass factory[0] = MyConnection return MyConnection + from sqlobject.sqlite import sqliteconnection sqliteconnection.SQLiteConnectionFactory = SQLiteConnectionFactory setSQLiteConnectionFactory(SQLiteFactoryTest, "SQLiteConnectionFactory") @@ -53,8 +52,7 @@ setupClass(SQLiteFactoryTest) if SQLiteFactoryTest._connection.dbName == "sqlite": - from sqlobject.sqlite import sqliteconnection - if not sqliteconnection.using_sqlite2: + if not SQLiteFactoryTest._connection.using_sqlite2: return def SQLiteConnectionFactory(sqlite): |