[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/gnue-common README.databases setup.py src/...
From: |
Jason Cater |
Subject: |
gnue/gnue-common README.databases setup.py src/... |
Date: |
Wed, 14 Nov 2001 14:49:30 -0500 |
CVSROOT: /home/cvs
Module name: gnue
Changes by: Jason Cater <address@hidden> 01/11/14 14:49:30
Modified files:
gnue-common : README.databases setup.py
gnue-common/src: GDataObjects.py
gnue-common/src/dbdrivers/_dbsig: DBdriver.py
gnue-common/src/dbdrivers/odbc: DBdriver.py
gnue-common/src/dbdrivers/popy: DBdriver.py
gnue-common/src/dbdrivers/postgresql: DBdriver.py
gnue-common/src/dbdrivers/psycopg: DBdriver.py
gnue-common/src/dbdrivers/pypgsql: DBdriver.py
Log message:
added support for PythonWin ODBC; added optional encoding= parameter to
Postgresql drivers
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/README.databases.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/setup.py.diff?cvsroot=OldCVS&tr1=1.30&tr2=1.31&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/GDataObjects.py.diff?cvsroot=OldCVS&tr1=1.30&tr2=1.31&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.22&tr2=1.23&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.8&tr2=1.9&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/popy/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.6&tr2=1.7&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.23&tr2=1.24&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/psycopg/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.6&tr2=1.7&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/pypgsql/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.10&tr2=1.11&r1=text&r2=text
Patches:
Index: gnue/gnue-common/README.databases
diff -u gnue/gnue-common/README.databases:1.4
gnue/gnue-common/README.databases:1.5
--- gnue/gnue-common/README.databases:1.4 Wed Nov 14 10:10:17 2001
+++ gnue/gnue-common/README.databases Wed Nov 14 14:49:29 2001
@@ -19,7 +19,7 @@
Quick chart of supported middleware:
* GEAS [via GEAS+ORBit]
- * ODBC [via mxODBC]
+ * ODBC [via PythonWin ODBC, mxODBC]
* SQLRelay [via SQLRelay-Python]
----------------------------------------------------------------
@@ -61,6 +61,7 @@
provider=postgresql # Use the pygresql adapter
host=localhost # The hostname/IP of the postgresql host
dbname=mydb # The name of the pg database
+ encoding=ASCII # Optional: the client encoding for PG
@@ -82,6 +83,7 @@
provider=pypgsql # Use the pypgsql adapter
host=localhost # The hostname/IP of the postgresql host
dbname=mydb # The name of the pg database
+ encoding=ASCII # Optional: the client encoding for PG
@@ -105,6 +107,7 @@
provider=psycopg # Use the psycopg adapter
host=localhost # The hostname/IP of the postgresql host
dbname=mydb # The name of the pg database
+ encoding=ASCII # Optional: the client encoding for PG
Notes:
@@ -132,6 +135,7 @@
provider=popy # Use the PoPy adapter
host=localhost # The hostname/IP of the postgresql host
dbname=mydb # The name of the pg database
+ encoding=ASCII # Optional: the client encoding for PG
Notes:
@@ -498,6 +502,35 @@
ODBC
====
+
+*** PythonWin ODBC
[http://aspn.activestate.com/ASPN/Downloads/ActivePython/Extensions/Win32all]
+
+ POSIX Support: YES
+ Win32 Support: YES [prebuilt binaries]
+
+ Platforms Tested:
+ ??? (We need your help!)
+
+ Description:
+ A commercial ODBC interface for Python written by Marc-André Lemburg.
+ Supports practically any database backend with ODBC drivers (are there
+ any without ODBC drivers?)
+
+ Example connections.conf entry:
+
+ [myconn]
+ provider=odbc # Use the mxODBC adapter
+ service=mydsn # The DSN connection string of the database
+
+ Notes:
+
+ 1. This driver has not been fully tested. If you are successfully using
+ this driver, please let us know.
+
+ 2. This driver does not yet support schema introspection, so you will not
+ be able to use Wizards in GNUe Designer.
+
+
*** mxODBC [http://www.lemburg.com/files/python/mxODBC.html]
Index: gnue/gnue-common/setup.py
diff -u gnue/gnue-common/setup.py:1.30 gnue/gnue-common/setup.py:1.31
--- gnue/gnue-common/setup.py:1.30 Tue Nov 13 17:12:49 2001
+++ gnue/gnue-common/setup.py Wed Nov 14 14:49:29 2001
@@ -178,6 +178,7 @@
"gnue.common.dbdrivers.geas",
"gnue.common.dbdrivers.mysql",
"gnue.common.dbdrivers.odbc",
+ "gnue.common.dbdrivers.mxodbc",
"gnue.common.dbdrivers.oracle",
"gnue.common.dbdrivers.postgresql",
"gnue.common.dbdrivers.psycopg",
Index: gnue/gnue-common/src/GDataObjects.py
diff -u gnue/gnue-common/src/GDataObjects.py:1.30
gnue/gnue-common/src/GDataObjects.py:1.31
--- gnue/gnue-common/src/GDataObjects.py:1.30 Fri Nov 9 00:45:22 2001
+++ gnue/gnue-common/src/GDataObjects.py Wed Nov 14 14:49:30 2001
@@ -31,6 +31,7 @@
import GDebug
import GConfig
+import GConditions
import string
class Error(StandardError):
@@ -122,7 +123,11 @@
# Designed to be replaced by vendor-specific code
def _createEmptyResultSet(self, readOnly=0, masterRecordSet=None):
- return self.createResultSet(conditions={'1':2}, readOnly=readOnly,
+ cond = GConditions.GCondition()
+ ceq = GConditions.GCeq(cond)
+ GConditions.GCConst(ceq,1,"number")
+ GConditions.GCConst(ceq,0,"number")
+ return self.createResultSet(conditions=cond, readOnly=readOnly,
masterRecordSet=masterRecordSet)
Index: gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.22
gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.23
--- gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.22 Fri Nov 9
00:45:22 2001
+++ gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py Wed Nov 14 14:49:30 2001
@@ -313,7 +313,7 @@
if not len(cond._children):
return ""
elif len(cond._children) > 1:
- chillun = cond._children
+ chillun = cond._children[:]
cond._children = []
_and = GConditions.GCand(cond)
_and._children = chillun
@@ -332,7 +332,12 @@
if otype == 'field':
return "%s" % element.name
elif otype == 'const':
- return (element.value == None and "NULL") or ("'%s'" % element.value)
+ if element.value == None:
+ return "NULL"
+ elif element.type == 'number':
+ return "%s" % element.value
+ else:
+ return "'%s'" % element.value
elif otype == 'param':
v = element.getValue()
return (v == None and "NULL") or ("'%s'" % element.getValue())
Index: gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py:1.8
gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py:1.9
--- gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py:1.8 Mon Nov 5 14:32:53 2001
+++ gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py Wed Nov 14 14:49:30 2001
@@ -22,10 +22,11 @@
# odbc/DBdriver.py
#
# DESCRIPTION:
-# Driver to provide access to data via the mxODBC Driver
+# Driver to provide access to data via the public domain win32all ODBC Driver
#
# NOTES:
-# Requires mxODBC (http://www.lemburg.com/files/python/mxODBC.html)
+# Only works under Win32... requires the win32all extensions.
+# (http://aspn.activestate.com/ASPN/Downloads/ActivePython/Extensions/Win32all)
#
# Supported attributes (via connections.conf or <database> tag)
#
@@ -33,62 +34,278 @@
#
#
-#### THIS IS AN UNTESTED DRIVER ####
-#### Any volunteers? ####
+import sys, string, types
+from gnue.common import GDebug, GDataObjects, GConnections, GConditions
-import sys, string
-from gnue.common import GDebug, GDataObjects, GConnections, dyn_import
-from gnue.common.dbdrivers._dbsig.DBdriver \
- import DBSIG_RecordSet, DBSIG_ResultSet, DBSIG_DataObject, \
- DBSIG_DataObject_SQL, DBSIG_DataObject_Object
try:
- # This isn't actually used at this point, but is imported
- # to generate an ImportError early on if not installed.
- from mx import ODBC
+ import dbi, odbc
except ImportError, message:
raise GConnections.AdapterNotInstalled, \
- "Driver not installed: ODBC\nGrab mxODBC from "\
- "http://www.lemburg.com/files/python/mxODBC.html\n\n[%s]" % message
+ "Driver not installed: win32all ODBC driver\n\n[%s" % message
-class ODBC_RecordSet(DBSIG_RecordSet):
- pass
-class ODBC_ResultSet(DBSIG_ResultSet):
- def __init__(self, dataObject, cursor=None, defaultValues={},
masterRecordSet=None):
- DBSIG_ResultSet.__init__(self, dataObject, \
- cursor, defaultValues, masterRecordSet)
+class ODBC_RecordSet(GDataObjects.RecordSet):
+ def _postChanges(self):
+ if not self.isPending(): return
+ if self._deleteFlag:
+ statement = self._buildDeleteStatement()
+ elif self._insertFlag:
+ statement = self._buildInsertStatement()
+ elif self._updateFlag:
+ statement = self._buildUpdateStatement()
+
+ GDebug.printMesg(5, "_postChanges: statement=%s" % statement)
+
+ try:
+ self._parent._update_cursor.execute(statement)
+
+ # Set _initialData to be the just-now posted values
+ if not self._deleteFlag:
+ self._initialData = {}
+ for key in self._fields.keys():
+ self._initialData[key] = self._fields[key]
+
+ except self._parent._dataObject._DatabaseError, err:
+ raise GDataObjects.ConnectionError, err
+
+ self._updateFlag = 0
+ self._insertFlag = 0
+ self._deleteFlag = 0
+
+ return 1
+
+
+ # If a vendor can do any of these more efficiently (i.e., use a known
+ # PRIMARY KEY or ROWID, then override these methods. Otherwise, leave
+ # as default. Note that these functions are specific to DB-SIG based
+ # drivers (i.e., these functions are not in the base RecordSet class)
+
+ def _buildDeleteStatement(self):
+ if self._initialData.has_key(self._parent._primaryIdField):
+ where = [self._parent._primaryIdFormat % \
+ self._initialData[self._parent._primaryIdField] ]
+ else:
+ where = []
+ for field in self._initialData.keys():
+ if self._parent.isFieldBound(field):
+ if self._initialData[field] == None:
+ where.append ("%s IS NULL" % field)
+ else:
+ where.append ("%s='%s'" % (field, self._initialData[field]))
+
+ statement = "DELETE FROM %s WHERE %s" % \
+ (self._parent._dataObject.table, string.join(where,' AND ') )
+ return statement
+
+ def _buildInsertStatement(self):
+ vals = []
+ fields = []
+
+ # TODO: This should actually only insert modified fields.
+ # TODO: Unfortunately, self._modifiedFlags is not being
+ # TODO: set for new records (address@hidden)
+ #for field in self._modifiedFlags.keys():
+
+ for field in self._fields.keys():
+ if self._parent.isFieldBound(field):
+ fields.append (field)
+ if self._fields[field] == None or self._fields[field] == '':
+ vals.append ("NULL") # % (self._fields[field]))
+ else:
+ try:
+ if self._parent._fieldTypes[field] == 'number':
+ vals.append ("%s" % (self._fields[field]))
+ else:
+ vals.append ("'%s'" % (self._fields[field]))
+ except ValueError:
+ vals.append ("%s" % (self._fields[field]))
+
+ return "INSERT INTO %s (%s) VALUES (%s)" % \
+ (self._parent._dataObject.table, string.join(fields,','), \
+ string.join(vals,',') )
+
+
+ def _buildUpdateStatement(self):
+ updates = []
+ for field in self._modifiedFlags.keys():
+ try:
+ if self._parent._fieldTypes[field] == 'number':
+ updates.append ("%s=%s" % (field, self._fields[field]))
+ else:
+ updates.append ("%s='%s'" % (field, self._fields[field]))
+ except KeyError:
+ updates.append ("%s='%s'" % (field, self._fields[field]))
+
+ if self._initialData.has_key(self._parent._primaryIdField):
+ where = [self._parent._primaryIdFormat % \
+ self._initialData[self._parent._primaryIdField] ]
+ else:
+ where = []
+ for field in self._initialData.keys():
+ if self._initialData[field] == None:
+ where.append ("%s IS NULL" % field)
+ else:
+ try:
+ if self._parent._fieldTypes[field] == 'number':
+ where.append ("%s=%s" % (field, self._initialData[field]))
+ else:
+ where.append ("%s='%s'" % (field, self._initialData[field]))
+ except KeyError:
+ where.append ("%s='%s'" % (field, self._initialData[field]))
+
+ return "UPDATE %s SET %s WHERE %s" % \
+ (self._parent._dataObject.table, string.join(updates,','), \
+ string.join(where,' AND ') )
+
+
+class ODBC_ResultSet(GDataObjects.ResultSet):
+ def __init__(self, dataObject, cursor=None, \
+ defaultValues={}, masterRecordSet=None):
+ GDataObjects.ResultSet.__init__(
+ self,dataObject,cursor,defaultValues,masterRecordSet)
self._recordSetClass = ODBC_RecordSet
+ self._fieldNames = None
+ self._fieldTypes = {}
+# self._recordCount = cursor.rowcount > 0 and cursor.rowcount or 0
+ self._recordCount = -1
+ # If a DB driver supports a unique identifier for rows,
+ # list it here. _primaryIdField is the field name (lower case)
+ # that would appear in the recordset (note that this can be
+ # a system generated format). If a primary id is supported,
+ # _primaryIdFormat is the WHERE clause to be used. It will have
+ # the string % (fieldvalue) format applied to it.
+ self._primaryIdField = None
+ self._primaryIdFormat = "__gnue__ = '%s'"
+
+ GDebug.printMesg(5, 'ResultSet created')
+
+
+ # Post changes to the database
+ def post(self, foreign_keys={}):
+ # post our changes
+ self._update_cursor = self._dataObject._dataConnection.cursor()
+
+ currentRecord = self._currentRecord
+
+ i = 0
+ while i < len(self._cachedRecords):
+
+ record = self._cachedRecords[i]
+ for field in foreign_keys.keys():
+ record._fields[field] = foreign_keys[field]
+ # Some DBs will throw an exception if you update a Primary Key
+ # (even if you are updating to the same value)
+ if record._insertFlag:
+ record._modifiedFlags[field] = 1
+
+ delete = record._emptyFlag or record._deleteFlag
+ record.post()
+
+ # Adjust the current record if a preceding record is deleted
+ if delete and i <= self._currentRecord:
+ self._currentRecord -= 1
+
+ if delete:
+ self._cachedRecords.pop(i)
+ self._recordCount -= 1
+ else:
+ i = i + 1
+
+ # Move to record 0 if all preceding records were deleted
+ # (or set to -1 if all records were deleted)
+ if self._currentRecord < 0:
+ if len(self._cachedRecords):
+ self._currentRecord = 0
+ else:
+ self._currentRecord = -1
+ if self._currentRecord >= self._recordCount:
+ self._currentRecord = self._recordCount - 1
+
+
+ def _loadNextRecord(self):
+ if self._cursor:
+ rs = None
+
+ try:
+ rs = self._cursor.fetchone()
+ except self._dataObject._DatabaseError, err:
+ pass
+# TODO: It seems that popy does what the other drivers don't
+# TODO: and raises this error ALOT need to find out why
+# raise GDataObjects.ConnectionError, err
+
+ if rs:
+ if not self._fieldNames:
+ self._fieldNames = []
+ for t in (self._cursor.description):
+ self._fieldNames.append (string.lower(t[0]))
+ self._fieldTypes[string.lower(t[0])] = (string.lower(t[1]))
+ i = 0
+ dict = {}
+ for f in (rs):
+ dict[self._fieldNames[i]] = f
+ i = i + 1
+ self._cachedRecords.append (self._recordSetClass(parent=self, \
+ initialData=dict))
+ return 1
+ else:
+ return 0
+ else:
+ return 0
+
+
+class ODBC_DataObject(GDataObjects.DataObject):
+
+ conditionElements = {
+ 'add': (2, 999, '(%s)', '+' ),
+ 'sub': (2, 999, '(%s)', '-' ),
+ 'mul': (2, 999, '(%s)', '*' ),
+ 'div': (2, 999, '(%s)', '/' ),
+ 'and': (1, 999, '(%s)', ' AND ' ),
+ 'or': (2, 999, '(%s)', ' OR ' ),
+ 'not': (1, 1, '(NOT %s)', None ),
+ 'negate': (1, 1, '-%s', None ),
+ 'eq': (2, 2, '(%s = %s)', None ),
+ 'ne': (2, 2, '(%s != %s)', None ),
+ 'gt': (2, 2, '(%s > %s)', None ),
+ 'ge': (2, 2, '(%s >= %s)', None ),
+ 'lt': (2, 2, '(%s < %s)', None ),
+ 'le': (2, 2, '(%s <= %s)', None ),
+ 'like': (2, 2, '%s LIKE %s', None ),
+ 'notlike': (2, 2, '%s NOT LIKE %s', None ),
+ 'between': (3, 3, '%s BETWEEN %s AND %s', None ) }
-class ODBC_DataObject(DBSIG_DataObject):
- def __init__(self):
- DBSIG_DataObject.__init__(self)
+ def __init__(self):
+ GDataObjects.DataObject.__init__(self)
+
+ GDebug.printMesg (1,"DB-SIG database driver backend initializing")
+
self._resultSetClass = ODBC_ResultSet
- self._backend = None
+ self._DatabaseError = None
+
+ # This should be over-ridden only if driver needs more than user/pass
+ def getLoginFields(self):
+ return [['_username', 'User Name',0],['_password', 'Password',1]]
+
+
def connect(self, connectData={}):
+
GDebug.printMesg(1,"ODBC database driver initializing")
- try:
- backend, dsn = string.split(connectData['service'],'|',1)
- self._backend = dyn_import("mx.ODBC.%s" % backend)
- self._DatabaseError = self._backend.DatabaseError
- except ValueError:
- raise GDataObjects.ConnectionError, \
- 'Invalid service string for ODBC driver.\n' +\
- 'Format: service="Backend|DSNString"'
- except ImportError, mesg:
- raise GConnections.AdapterNotInstalled, \
- 'Unable to load the ODBC drivers for %s' % backend
+ self._DatabaseError = odbc.error
try:
- self._dataConnection = SIG2api.connect( dsn, \
- user=connectData['_username'], \
- password=connectData['_password'])
+ self._dataConnection = odbc.odbc( "%s/%s/%s" % (
+ connectData['service'],
+ connectData['_username'],
+ connectData['_password']))
+
except self._DatabaseError, value:
raise GDataObjects.LoginError, value
@@ -103,7 +320,7 @@
# Return a list of the types of Schema objects this driver provides
def getSchemaTypes(self):
- return [('table','Table',1)]
+ return None # [('table','Table',1)]
# Return a list of Schema objects
def getSchemaList(self, type=None):
@@ -116,32 +333,130 @@
def _postConnect(self):
self.triggerExtensions = TriggerExtensions(self._dataConnection)
+ def _createResultSet(self, conditions={}, readOnly=0, masterRecordSet=None):
+ try:
+ cursor = self._dataConnection.cursor()
+ cursor.execute(self._buildQuery(conditions))
+
+ except self._DatabaseError, err:
+ raise GDataObjects.ConnectionError, err
+ rs = self._resultSetClass(self, cursor=cursor,
masterRecordSet=masterRecordSet)
+ if readOnly:
+ rs._readonly = readOnly
+ return rs
+
+
+ def commit(self):
+ GDebug.printMesg (5,"DB-SIG database driver: commit()")
+
+ try:
+ self._dataConnection.commit()
+ except self._DatabaseError, value:
+ raise GDataObjects.ConnectionError, value
+
+ self._beginTransaction()
-class ODBC_DataObject_Object(ODBC_DataObject, \
- DBSIG_DataObject_Object):
+ def rollback(self):
+ GDebug.printMesg (5,"DB-SIG database driver: rollback()")
- def __init__(self):
- # Call DBSIG init first because ODBC_DataObject needs to overwrite
- # some of its values
- DBSIG_DataObject_Object.__init__(self)
- ODBC_DataObject.__init__(self)
-
- def _buildQuery(self, conditions={}):
- return DBSIG_DataObject_Object._buildQuery(self, conditions)
-
-
-class ODBC_DataObject_SQL(ODBC_DataObject, \
- DBSIG_DataObject_SQL):
- def __init__(self):
- # Call DBSIG init first because ODBC_DataObject needs to overwrite
- # some of its values
- DBSIG_DataObject_SQL.__init__(self)
- ODBC_DataObject.__init__(self)
+ try:
+ self._dataConnection.rollback()
+ except:
+ pass # I'm SURE this isn't right (jcater)
+ # But not all db's support transactions
- def _buildQuery(self, conditions={}):
- return DBSIG_DataObject_SQL._buildQuery(self, conditions)
+ self._beginTransaction()
+ def _buildQuery(self, conditions={}):
+ return None
+
+
+ # Used to convert a condition tree to an sql where clause
+ def _conditionToSQL (self, condition):
+ if condition == {} or condition == None:
+ return ""
+ elif type(condition) == types.DictType:
+ cond = GConditions.buildConditionFromDict(condition)
+ else:
+ cond = condition
+
+ if not len(cond._children):
+ return ""
+ elif len(cond._children) > 1:
+ chillun = cond._children
+ cond._children = []
+ _and = GConditions.GCand(cond)
+ _and._children = chillun
+
+
+ where = " WHERE (%s)" % (self.__conditionToSQL (cond._children[0]))
+ GDebug.printMesg(5, where)
+ return where
+
+ # Used internally by _conditionToSQL
+ def __conditionToSQL (self, element):
+ if type(element) != types.InstanceType:
+ return "%s" % element
+ else:
+ otype = string.lower(element.getObjectType()[2:])
+ if otype == 'field':
+ return "%s" % element.name
+ elif otype == 'const':
+ if element.value == None:
+ return "NULL"
+ elif element.type == 'number':
+ return "%s" % element.value
+ else:
+ return "'%s'" % element.value
+ elif otype == 'param':
+ v = element.getValue()
+ return (v == None and "NULL") or ("'%s'" % element.getValue())
+ elif self.conditionElements.has_key(otype):
+ for i in range(0, len(element._children)):
+ element._children[i] = self.__conditionToSQL(element._children[i])
+ if len(element._children) < self.conditionElements[otype][0]:
+ raise GConditions.ConditionError, \
+ 'Condition element "%s" expects at least %s arguments; found %s' %
\
+ (otype, self.conditionElements[otype][0],
len(element._children))
+ if len(element._children) > self.conditionElements[otype][1]:
+ raise GConditions.ConditionError, \
+ 'Condition element "%s" expects at most %s arguments; found %s' % \
+ (otype, self.conditionElements[otype][0],
len(element._children))
+ if self.conditionElements[otype][3] == None:
+ return self.conditionElements[otype][2] % tuple(element._children)
+ else:
+ return self.conditionElements[otype][2] % \
+ (string.join(element._children, self.conditionElements[otype][3]))
+ else:
+ raise GConditions.ConditionNotSupported, \
+ 'Condition clause "%s" is not supported by this db driver.' % otype
+
+ # Code necessary to force the connection into transaction mode...
+ # this is usually not necessary (MySQL is one of few DBs that must force)
+ def _beginTransaction(self):
+ pass
+
+
+class ODBC_DataObject_Object(ODBC_DataObject):
+ def _buildQuery(self, conditions={}):
+ GDebug.printMesg(7,'Implicit Fields: %s' % self._fieldReferences)
+ if len(self._fieldReferences):
+ q = "SELECT %s FROM %s%s" % \
+ (string.join(self._fieldReferences.keys(),","), self.table,
+ self._conditionToSQL(conditions))
+ else:
+ q = "SELECT * FROM %s%s" % (self.table, self._conditionToSQL(conditions))
+
+ if hasattr(self,'order_by'):
+ q = "%s ORDER BY %s " % (q, self.order_by)
+
+ GDebug.printMesg(5,q)
+
+ return q
+
+
+
#
# Extensions to Trigger Namespaces
#
@@ -153,7 +468,6 @@
-
######################################
#
# The following hashes describe
@@ -166,6 +480,7 @@
#
supportedDataObjects = {
'object': ODBC_DataObject_Object,
- 'sql': ODBC_DataObject_SQL
+# 'sql': ODBC_DataObject_SQL
}
+
Index: gnue/gnue-common/src/dbdrivers/popy/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/popy/DBdriver.py:1.6
gnue/gnue-common/src/dbdrivers/popy/DBdriver.py:1.7
--- gnue/gnue-common/src/dbdrivers/popy/DBdriver.py:1.6 Sun Nov 11 01:11:03 2001
+++ gnue/gnue-common/src/dbdrivers/popy/DBdriver.py Wed Nov 14 14:49:30 2001
@@ -72,6 +72,22 @@
except self._DatabaseError, value:
raise GDataObjects.LoginError, value
+ try:
+ encoding = connectData['encoding']
+ GDebug.printMesg(1,'Setting postgresql client_encoding to %s' % encoding)
+ cursor = self._dataConnection.cursor()
+ cursor.execute("SET CLIENT_ENCODING TO '%s'" % encoding)
+ cursor.close()
+ except KeyError:
+ pass
+ except self._DatabaseError:
+ try:
+ cursor.close()
+ except:
+ pass
+
+
+
self._postConnect()
Index: gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py:1.23
gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py:1.24
--- gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py:1.23 Thu Nov 8
02:55:52 2001
+++ gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py Wed Nov 14
14:49:30 2001
@@ -117,6 +117,20 @@
except self._DatabaseError, value:
raise GDataObjects.LoginError, value
+ try:
+ encoding = connectData['encoding']
+ GDebug.printMesg(1,'Setting postgresql client_encoding to %s' % encoding)
+ cursor = self._dataConnection.cursor()
+ cursor.execute("SET CLIENT_ENCODING TO '%s'" % encoding)
+ cursor.close()
+ except KeyError:
+ pass
+ except self._DatabaseError:
+ try:
+ cursor.close()
+ except:
+ pass
+
self._postConnect()
Index: gnue/gnue-common/src/dbdrivers/psycopg/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/psycopg/DBdriver.py:1.6
gnue/gnue-common/src/dbdrivers/psycopg/DBdriver.py:1.7
--- gnue/gnue-common/src/dbdrivers/psycopg/DBdriver.py:1.6 Sun Nov 11
01:11:03 2001
+++ gnue/gnue-common/src/dbdrivers/psycopg/DBdriver.py Wed Nov 14 14:49:30 2001
@@ -62,6 +62,21 @@
except self._DatabaseError, value:
raise GDataObjects.LoginError, value
+ try:
+ encoding = connectData['encoding']
+ GDebug.printMesg(1,'Setting postgresql client_encoding to %s' % encoding)
+ cursor = self._dataConnection.cursor()
+ cursor.execute("SET CLIENT_ENCODING TO '%s'" % encoding)
+ cursor.close()
+ except KeyError:
+ pass
+ except self._DatabaseError:
+ try:
+ cursor.close()
+ except:
+ pass
+
+
self._postConnect()
Index: gnue/gnue-common/src/dbdrivers/pypgsql/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/pypgsql/DBdriver.py:1.10
gnue/gnue-common/src/dbdrivers/pypgsql/DBdriver.py:1.11
--- gnue/gnue-common/src/dbdrivers/pypgsql/DBdriver.py:1.10 Sun Nov 11
01:11:03 2001
+++ gnue/gnue-common/src/dbdrivers/pypgsql/DBdriver.py Wed Nov 14 14:49:30 2001
@@ -73,6 +73,20 @@
GDebug.printMesg(1,"Exception %s " % value)
raise GDataObjects.LoginError, value
+ try:
+ encoding = connectData['encoding']
+ GDebug.printMesg(1,'Setting postgresql client_encoding to %s' % encoding)
+ cursor = self._dataConnection.cursor()
+ cursor.execute("SET CLIENT_ENCODING TO '%s'" % encoding)
+ cursor.close()
+ except KeyError:
+ pass
+ except self._DatabaseError:
+ try:
+ cursor.close()
+ except:
+ pass
+
GDebug.printMesg(1,"Pre post connect")
self._postConnect()
GDebug.printMesg(1,"Post post connect")
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/gnue-common README.databases setup.py src/...,
Jason Cater <=