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):
|