[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/gnue-common/src/dbdrivers _dbsig/DBdriver....
From: |
James Thompson |
Subject: |
gnue/gnue-common/src/dbdrivers _dbsig/DBdriver.... |
Date: |
Wed, 29 Aug 2001 11:21:22 -0700 |
CVSROOT: /home/cvs
Module name: gnue
Changes by: James Thompson <address@hidden> 01/08/29 11:21:22
Modified files:
gnue-common/src/dbdrivers/_dbsig: DBdriver.py
gnue-common/src/dbdrivers/geas: DBdriver.py
gnue-common/src/dbdrivers/mysql: DBdriver.py
gnue-common/src/dbdrivers/oracle: DBdriver.py
gnue-common/src/dbdrivers/postgresql: DBdriver.py
Log message:
Re-merged files that were missed in original merge
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.7&tr2=1.8&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/geas/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.7&tr2=1.8&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/oracle/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.9&tr2=1.10&r1=text&r2=text
Patches:
Index: gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.7
gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.8
--- gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.7 Tue Jun 5
22:24:40 2001
+++ gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py Wed Aug 29 11:21:22 2001
@@ -38,8 +38,88 @@
class DBSIG_RecordSet(GDataObjects.RecordSet):
def _postChanges(self):
- pass
+ 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._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 ') )
+
+ def _buildInsertStatement(self):
+ vals = []
+ fields = []
+ for field in self._modifiedFlags.keys():
+ fields.append (field)
+ 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():
+ 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:
+ 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 DBSIG_ResultSet(GDataObjects.ResultSet):
def __init__(self, dataObject, cursor=None, \
defaultValues={}, masterRecordSet=None):
@@ -47,22 +127,49 @@
self,dataObject,cursor,defaultValues,masterRecordSet)
self._recordSetClass = DBSIG_RecordSet
self._fieldNames = None
+
+ # 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):
+ # post our changes
+ self._update_cursor = self._dataObject._dataConnection.cursor()
+
+ i = 0
+ while i < len(self._cachedRecords):
+ record = self._cachedRecords[i]
+ delete = record._deleteFlag and not record._insertFlag
+ record.post()
+ if delete:
+ self._cachedRecords.pop(i)
+ else:
+ i = i + 1
+
+
def _loadNextRecord(self):
if self._cursor:
try:
rs = self._cursor.fetchone()
- except self._DatabaseError, err:
+ except self._dataObject._DatabaseError, err:
raise GDataObjects.ConnectionError, err
GDebug.printMesg(5, rs)
if not self._fieldNames:
self._fieldNames = []
for t in (self._cursor.description):
- self._fieldNames.append (t[0])
- self._boundFields[string.lower[t[0]]] = ""
+ self._fieldNames.append (string.lower(t[0]))
+ self._boundFields[string.lower(t[0])] = ""
if rs:
i = 0
dict = {}
@@ -81,23 +188,23 @@
class DBSIG_DataObject(GDataObjects.DataObject):
conditionElements = {
- 'add': (1, 2, 999, '(%s)', '+' ),
- 'sub': (1, 2, 999, '(%s)', '-' ),
- 'mul': (1, 2, 999, '(%s)', '*' ),
- 'div': (1, 2, 999, '(%s)', '/' ),
- 'and': (1, 2, 999, '(%s)', ' AND ' ),
- 'or': (1, 2, 999, '(%s)', ' OR ' ),
- 'not': (1, 1, 1, '(NOT %s)', None ),
- 'negate': (1, 1, 1, '-%s', None ),
- 'eq': (1, 2, 2, '(%s = %s)', None ),
- 'ne': (1, 2, 2, '(%s != %s)', None ),
- 'gt': (1, 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 ) }
+ '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 ) }
def __init__(self):
GDataObjects.DataObject.__init__(self)
@@ -128,7 +235,7 @@
GDebug.printMesg (5,"DB-SIG database driver: commit()")
try:
- connection.rollback()
+ self._dataConnection.commit()
except self._DatabaseError, value:
raise GDataObjects.ConnectionError, value
@@ -136,7 +243,7 @@
GDebug.printMesg (5,"DB-SIG database driver: rollback()")
try:
- connection.rollback()
+ self._dataConnection.rollback()
except:
pass # I'm SURE this isn't right (jcater)
# But not all db's support transactions
@@ -162,7 +269,10 @@
_and = GConditions.GCand(cond)
_and._children = chillun
- return " WHERE (%s)" % (self.__conditionToSQL (cond._children[0]))
+
+ where = " WHERE (%s)" % (self.__conditionToSQL (cond._children[0]))
+ GDebug.printMesg(5, where)
+ return where
# Used internally by _conditionToSQL
def __conditionToSQL (self, element):
@@ -173,9 +283,10 @@
if otype == 'field':
return "%s" % element.name
elif otype == 'const':
- return "'%s'" % element.value
+ return (element.value == None and "NULL") or ("'%s'" % element.value)
elif otype == 'param':
- return "'%s'" % element.getValue()
+ 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])
@@ -183,15 +294,15 @@
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[i]) < self.conditionElements[otype][1]:
+ 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][4] == None:
- return self.conditionElements[otype][3] % tuple(element._children)
+ if self.conditionElements[otype][3] == None:
+ return self.conditionElements[otype][2] % tuple(element._children)
else:
- return self.conditionElements[otype][3] % \
- (string.join(element._children, self.conditionElements[otype][4]))
+ 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
Index: gnue/gnue-common/src/dbdrivers/geas/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/geas/DBdriver.py:1.7
gnue/gnue-common/src/dbdrivers/geas/DBdriver.py:1.8
--- gnue/gnue-common/src/dbdrivers/geas/DBdriver.py:1.7 Tue Aug 21 01:15:36 2001
+++ gnue/gnue-common/src/dbdrivers/geas/DBdriver.py Wed Aug 29 11:21:22 2001
@@ -326,4 +326,236 @@
print "Please see http://projects.sault.org/orbit-python/ for the required
python CORBA bindings"
sys.exit(0)
+<<<<<<< DBdriver.py
+=======
+class DBdriver:
+ def __init__ (self):
+ GDebug.printMesg(1,"GNU Enterprise Application Server driver
initializing")
+ self.database = None
+ self.orb = None
+ self.ior = None
+ self.factory = None
+ self.uniqueKey = "objectID"
+ self.fieldlist = []
+ self.objlist = {}
+
+ def connect(self, host, dbname, user, passwd):
+ # find the object server base object
+ self.orb = CORBA.ORB_init(() , CORBA.ORB_ID)
+ try:
+ self.ior =
open(GConfig.get('GEASDIR')+"/var/run/geas-server.ior").readline()
+ except (IOError), ex:
+ print "*** Error: ior file for geas was not found... is geas
running?"
+ print
+ sys.exit(1)
+ self.factory = self.orb.string_to_object(self.ior)
+ try:
+ GDebug.printMesg(1,"Logging into geas as %s" % (user))
+ if (user == 'guest') or (user == ''):
+ self.database = self.factory.guestLogin()
+ else:
+ # NOTE: this will change again
+ self.database = self.factory.unsecureLogin(user,passwd)
+
+ ## Now make connection
+ #self.database.connect()
+ self.triggerExtensions = TriggerExtensions(self.database)
+ except (GEAS.ServerError,
+ GEAS.AuthenticationError),ex:
+ print "Failed to connect to database. Exiting."
+ print ex.detail;
+ sys.exit(0)
+
+ def disconnect(self):
+ print "disconnect"
+ self.database.logout();
+
+ def beginTransaction(self):
+ pass
+
+
+ def commit(self):
+ pass
+
+
+ def rollback(self):
+ pass
+
+
+ def query(self, table, mask = None, order_by=None):
+ GDebug.printMesg(3, "query mask %s " % mask)
+ (objectID, mask) = self.filterMask(mask)
+ self.objlist = {}
+ rs = []
+
+ try:
+ if mask or objectID:
+ maskfield = None
+ maskdata = None
+ for k in mask.keys():
+ if mask[k]:
+ maskfield = k
+ maskdata = mask[k]
+
+
+ if not maskfield and objectID:
+ maskfield = "objectID"
+ maskdata = str(objectID)
+
+ if maskfield:
+ self.data = self.database.loadObjects(table, maskfield,
maskdata)
+ else:
+ self.data = self.database.loadAll(table);
+ else:
+ self.data = self.database.loadAll(table);
+
+ if self.data:
+ for obj in self.data.objects:
+ self.objlist[obj.objectID] = obj
+ r = self.buildMask(obj)
+ rs.append(r)
+
+ # Handle any errors from the search functions above
+ except GEAS.UnknownClass,ex:
+ self.data = NULL
+ print ex.detail
+ except GEAS.UnknownField,ex:
+ self.data = NULL
+ print ex.detail
+
+ return rs
+
+ def commit(self):
+ pass
+
+ def rollback(self):
+ pass
+
+ def get_object_field(self,obj,field):
+ retval = ""
+ try:
+ retval = obj.getField(field)
+ except (GEAS.UnknownField,GEAS.NotReadable,GEAS.ServerError,
+ GEAS.Interrupted,GEAS.NotDataField,GEAS.Locked,
+ GEAS.TransactionNotInProgress),ex:
+ # pass error message on
+ raise DBError , ex.detail
+ except GEAS.NullField,ex:
+ # allowed, the field defaults to 'empty'
+ pass
+ return retval
+
+ def set_object_field(self,obj,field,value):
+ try:
+ if field != "objectid":
+ obj.setField(field,value)
+ except (GEAS.UnknownField,GEAS.NotWriteable,
+ GEAS.ServerError,GEAS.Interrupted,GEAS.NotDataField,
+ GEAS.Locked,GEAS.TransactionNotInProgress,GEAS.Format),ex:
+ raise DBError , ex.detail
+
+ def insert(self,table,mask):
+ (objectID, mask) = self.filterMask(mask)
+
+ try:
+ obj = self.database.newObject(table)
+ except GEAS.UnknownClass,ex: print ex.detail
+ for m in mask.keys():
+ self.set_object_field(obj,m,mask[m])
+
+ mask["objectID"] = obj.objectID
+
+ self.objlist[obj.objectID] = obj
+
+ return mask
+
+ def delete(self,table,mask):
+ (objectID, mask) = self.filterMask(mask)
+ obj = self.objlist[objectID]
+ if obj:
+ obj.delete()
+
+ def update(self,table,mask):
+ (objectID, mask) = self.filterMask(mask)
+ obj = self.objlist[objectID]
+ if obj:
+ for k in mask.keys():
+ self.set_object_field(obj,k,mask[k])
+
+ return [self.buildMask(obj)]
+
+ def getFieldList(self,table):
+ list = {}
+ self.fieldlist = {}
+ cd = self.database.getFullClassDefinition(table)
+ if cd:
+ for field in cd.fields:
+ if field.type == GEAS.basic:
+ list[field.name] = field.type
+ list["objectid"] = GEAS.Char
+
+ self.fieldlist = list
+ return list
+
+ def getUniqueKey(self, table):
+ return self.uniqueKey
+
+ def filterMask(self, mask):
+ objectID = None
+ nmask = {}
+ if mask != None:
+ for k in mask.keys():
+ if k == 'objectID':
+ objectID = mask[k]
+ else:
+ nmask[k] = mask[k]
+
+ return (objectID, nmask)
+
+ def buildMask(self, obj):
+ r = {}
+ # add objectID into field list
+ r[self.uniqueKey] = obj.objectID
+ for f in self.fieldlist.keys():
+ r[f] = self.get_object_field(obj,f)
+ return r
+
+ def _make_passkey(self, user, passwd, random):
+ m = md5.new(user + '-' + passwd + '-' + random)
+ return self._hexstr(m.digest())
+
+ def _hexstr(self, s):
+ h = string.hexdigits
+ r = ''
+ for c in s:
+ i = ord(c)
+ r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
+ return r
+
+
+
+#
+# Extensions to Trigger Namespaces
+#
+class TriggerExtensions:
+
+ def __init__(self, connection):
+ self.__connection = connection
+
+ # Return the current date, according to database
+# def getDate(self):
+# pass
+
+ # Return a sequence number from sequence 'name'
+# def getSequence(self, name):
+# pass
+
+ # Run the SQL statement 'statement'
+# def sql(self, statement):
+# pass
+
+
+
+
+>>>>>>> 1.5.2.3
Index: gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py:1.3
gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py:1.4
--- gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py:1.3 Thu Jul 12
20:56:31 2001
+++ gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py Wed Aug 29 11:21:22 2001
@@ -19,17 +19,142 @@
# Copyright 2000 Free Software Foundation
#
# FILE:
-# DSgedi.py
+# mysql/DBdriver.py
#
# DESCRIPTION:
-# Driver to provide access to data vi the gedi object server
-# Accessed via the GFBlock object
-# Requires oribt-python 0.1.3 to function properly at this time
+# Driver to provide access to data vi MySQL
#
# NOTES:
#
+
import MySQLdb
+
+from string import lower
+import sys
+from gnue.common import GDebug, GDataObjects
+from gnue.common.dbdrivers._dbsig.DBdriver \
+ import DBSIG_RecordSet, DBSIG_ResultSet, DBSIG_DataObject, \
+ DBSIG_DataObject_SQL, DBSIG_DataObject_Object
+
+
+class MySQL_RecordSet(DBSIG_RecordSet):
+ pass
+
+
+class MySQL_ResultSet(DBSIG_ResultSet):
+ def __init__(self, dataObject, cursor=None, defaultValues={},
masterRecordSet=None):
+ DBSIG_ResultSet.__init__(self, dataObject, \
+ cursor, defaultValues, masterRecordSet)
+ self._recordSetClass = MySQL_RecordSet
+
+
+
+class MySQL_DataObject(DBSIG_DataObject):
+ def __init__(self):
+ DBSIG_DataObject.__init__(self)
+ self._DatabaseError = MySQLdb.DatabaseError
+ self._resultSetClass = MySQL_ResultSet
+
+
+ def connect(self, connectData={}):
+ GDebug.printMesg(1,"Mysql database driver initializing")
+ try:
+ self._dataConnection = MySQLdb.connect(user=connectData['_username'],
+ passwd=connectData['_password'],
+ host=connectData['host'],
+ db=connectData['dbname'])
+ except self._DatabaseError, value:
+ raise GDataObjects.ConnectionError, value
+
+ self._postConnect()
+
+
+ def _postConnect(self):
+ self.triggerExtensions = TriggerExtensions(self._dataConnection)
+
+
+class MySQL_DataObject_Object(MySQL_DataObject, \
+ DBSIG_DataObject_Object):
+
+ def __init__(self):
+ # Call DBSIG init first because MySQL_DataObject needs to overwrite
+ # some of its values
+ DBSIG_DataObject_Object.__init__(self)
+ MySQL_DataObject.__init__(self)
+
+ def _buildQuery(self, conditions={}):
+ return DBSIG_DataObject_Object._buildQuery(self, conditions)
+
+
+class MySQL_DataObject_SQL(MySQL_DataObject, \
+ DBSIG_DataObject_SQL):
+ def __init__(self):
+ # Call DBSIG init first because MySQL_DataObject needs to overwrite
+ # some of its values
+ DBSIG_DataObject_SQL.__init__(self)
+ MySQL_DataObject.__init__(self)
+
+ def _buildQuery(self, conditions={}):
+ return DBSIG_DataObject_SQL._buildQuery(self, conditions)
+
+
+#
+# Extensions to Trigger Namespaces
+#
+class TriggerExtensions:
+
+ def __init__(self, connection):
+ self.__connection = connection
+
+ # Return the current date, according to database
+# def getDate(self):
+# pass
+
+ # Return a sequence number from sequence 'name'
+# def getSequence(self, name):
+# pass
+
+ # Run the SQL statement 'statement'
+# def sql(self, statement):
+# pass
+
+
+
+######################################
+#
+# The following hashes describe
+# this driver's characteristings.
+#
+######################################
+
+#
+# All datasouce "types" and corresponding DataObject class
+#
+supportedDataObjects = {
+ 'object': MySQL_DataObject_Object,
+ 'sql': MySQL_DataObject_SQL
+}
+
+
+
+
+##########################################################################
+##########################################################################
+##
+## The following is the old-style (pre-GDataObject/GDataSource) driver
+## code. It will soon be deleted after GForms is converted to new style.
+##
+##########################################################################
+##########################################################################
+
+
+
+
+
+
+
+import MySQLdb
import string
import sys
#from gnue.forms import GFOptions
@@ -240,8 +365,6 @@
return nd
-
-
#
# Extensions to Trigger Namespaces
#
@@ -261,7 +384,4 @@
# Run the SQL statement 'statement'
# def sql(self, statement):
# pass
-
-
-
Index: gnue/gnue-common/src/dbdrivers/oracle/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/oracle/DBdriver.py:1.5
gnue/gnue-common/src/dbdrivers/oracle/DBdriver.py:1.6
--- gnue/gnue-common/src/dbdrivers/oracle/DBdriver.py:1.5 Thu Jul 12
20:56:31 2001
+++ gnue/gnue-common/src/dbdrivers/oracle/DBdriver.py Wed Aug 29 11:21:22 2001
@@ -28,6 +28,139 @@
#
# NOTES:
#
+
+
+
+import DCOracle2
+
+from string import lower
+import sys
+from gnue.common import GDebug, GDataObjects
+from gnue.common.dbdrivers._dbsig.DBdriver \
+ import DBSIG_RecordSet, DBSIG_ResultSet, DBSIG_DataObject, \
+ DBSIG_DataObject_SQL, DBSIG_DataObject_Object
+
+
+class Oracle_RecordSet(DBSIG_RecordSet):
+ pass
+
+
+class Oracle_ResultSet(DBSIG_ResultSet):
+ def __init__(self, dataObject, cursor=None, defaultValues={},
masterRecordSet=None):
+ DBSIG_ResultSet.__init__(self, dataObject, \
+ cursor, defaultValues, masterRecordSet)
+ self._recordSetClass = Oracle_RecordSet
+ self._uniqueIdField = "__GNUeF__uniqueKey_%s" % (self._dataObject.table)
+ self._uniqueIdFormat = "ROWID='%s'"
+
+
+
+class Oracle_DataObject(DBSIG_DataObject):
+ def __init__(self):
+ DBSIG_DataObject.__init__(self)
+ self._DatabaseError = DCOracle2.DatabaseError
+ self._resultSetClass = Oracle_ResultSet
+
+
+ def connect(self, connectData={}):
+ GDebug.printMesg(1,"Oracle database driver initializing")
+ try:
+ self._dataConnection = DCOracle2.connect("%s/address@hidden" \
+ % (connectData['_username'], \
+ connectData['_password'], \
+ connectData['dbname']))
+ except self._DatabaseError, value:
+ raise GDataObjects.ConnectionError, value
+
+ self._postConnect()
+
+
+ def _postConnect(self):
+ self.triggerExtensions = TriggerExtensions(self._dataConnection)
+
+
+class Oracle_DataObject_Object(Oracle_DataObject, \
+ DBSIG_DataObject_Object):
+
+ def __init__(self):
+ # Call DBSIG init first because Oracle_DataObject needs to overwrite
+ # some of its values
+ DBSIG_DataObject_Object.__init__(self)
+ Oracle_DataObject.__init__(self)
+
+ def _buildQuery(self, conditions={}):
+ return DBSIG_DataObject_Object._buildQuery(self, conditions)
+
+
+class Oracle_DataObject_SQL(Oracle_DataObject, \
+ DBSIG_DataObject_SQL):
+ def __init__(self):
+ # Call DBSIG init first because Oracle_DataObject needs to overwrite
+ # some of its values
+ DBSIG_DataObject_SQL.__init__(self)
+ Oracle_DataObject.__init__(self)
+
+ def _buildQuery(self, conditions={}):
+ return DBSIG_DataObject_SQL._buildQuery(self, conditions)
+
+
+#
+# Extensions to Trigger Namespaces
+#
+class TriggerExtensions:
+
+ def __init__(self, connection):
+ self.__connection = connection
+
+ # Return the current date, according to database
+ def getDate(self):
+ cursor = self.__connection.cursor()
+ command = "select sysdate from dual"
+ cursor.execute(command)
+ return cursor.fetchone()[0]
+
+ # Return a sequence number from sequence 'name'
+ def getSequence(self, name):
+ cursor = self.__connection.cursor()
+ command = "select %s.nextval from dual" % name
+ cursor.execute(command)
+ return cursor.fetchone()[0]
+
+ # Run the SQL statement 'statement'
+ def sql(self, statement):
+ self.__connection.cursor().execute(statement)
+
+
+
+
+######################################
+#
+# The following hashes describe
+# this driver's characteristings.
+#
+######################################
+
+#
+# All datasouce "types" and corresponding DataObject class
+#
+supportedDataObjects = {
+ 'object': Oracle_DataObject_Object,
+ 'sql': Oracle_DataObject_SQL
+}
+
+
+
+
+##########################################################################
+##########################################################################
+##
+## The following is the old-style (pre-GDataObject/GDataSource) driver
+## code. It will soon be deleted after GForms is converted to new style.
+##
+##########################################################################
+##########################################################################
+
+
import DCOracle
import sys
from string import split, upper, lower, join, replace
@@ -265,8 +398,6 @@
self.maskCount = self.maskCount + 1
return self.maskCount - 1
-
-
#
# Extensions to Trigger Namespaces
#
@@ -292,8 +423,3 @@
# Run the SQL statement 'statement'
def sql(self, statement):
self.__connection.cursor().execute(statement)
-
-
-
-
-
Index: gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py:1.9
gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py:1.10
--- gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py:1.9 Thu Jul 12
20:56:31 2001
+++ gnue/gnue-common/src/dbdrivers/postgresql/DBdriver.py Wed Aug 29
11:21:22 2001
@@ -40,16 +40,7 @@
class PG_RecordSet(DBSIG_RecordSet):
- def _postChanges(self):
- values = []
- fields = []
- fieldString = ""
- for field in (self._modifiedFields.keys()):
- fields.append(field + " = %s")
- values.append(self._fields[field])
-
- statement = 'UPDATE %s SET %s WHERE %s = %s'
-
+ pass
class PG_ResultSet(DBSIG_ResultSet):
def __init__(self, dataObject, cursor=None, defaultValues={},
masterRecordSet=None):
@@ -65,7 +56,7 @@
if self._cursor:
try:
rsall = self._cursor.fetchall()
- except self._DatabaseError, err:
+ except self._dataObject._DatabaseError, err:
raise GDataObjects.ConnectionError, err
if len(rsall):
@@ -113,7 +104,13 @@
except self._DatabaseError, value:
raise GDataObjects.ConnectionError, value
+ self._postConnect()
+
+ def _postConnect(self):
+ self.triggerExtensions = TriggerExtensions(self._dataConnection)
+
+
class PG_DataObject_Object(PG_DataObject, \
DBSIG_DataObject_Object):
@@ -175,140 +172,3 @@
'object': PG_DataObject_Object,
'sql': PG_DataObject_SQL
}
-
-
-##########################################################################
-##########################################################################
-##
-## The following is the old-style (pre-GDataObject/GDataSource) driver
-## code. It will soon be deleted after GForms is converted to new style.
-##
-##########################################################################
-##########################################################################
-
-import pg
-import string
-from gnue.common import GConfig
-from gnue.forms.GFError import DBError
-
-class DBdriver:
- def __init__(self):
-
- GDebug.printMesg(1, "Postgresql database driver initializing")
- self.connection = None
- self.uniqueKey = None
-
- def connect(self, host, dbname, user, passwd):
- GDebug.printMesg(1, "connecting")
- try:
- self.connection = pg.DB(dbname, host, -1, None, None, user, passwd)
- if GConfig.get('Encoding') != 'DEFAULT':
- self.connection.query("set encoding to '%s'" % GConfig.get('Encoding'))
-
- self.triggerExtensions = TriggerExtensions(self.connection)
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
-
-
- def disconnect(self):
- try:
- self.connection.close()
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- def beginTransaction(self):
- try:
- self.connection.query('BEGIN')
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- def commit(self):
- try:
- self.connection.query('END')
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- def rollback(self):
- try:
- self.connection.query('ROLLBACK')
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- def insert(self,table,mask):
- for fieldname in mask.keys():
- if mask[fieldname] == None or len(mask[fieldname]) == 0:
- del mask[fieldname]
- try:
- self.connection.insert(table,mask)
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
- return mask
-
- def delete(self,table,mask):
- try:
- print "deleting"
- self.connection.delete(table,mask)
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- def update(self,table,mask):
- try:
- mask = self.connection.update(table,mask)
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- def getFieldList(self,table):
- try:
- return self.connection.get_attnames(table)
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- #
- # The code below has been written to be compatible with
- # PyGreSql-3.0 wrapper functions. And shoud eventually
- # be offered back to PyGreSql maintainer for inclusion
- # in that package (if they want it :)
- #
- def query(self,table,mask,order_by=None):
- command = self.constructSQL('query',table, mask,order_by)
- try:
- resultset = self.connection.query(command).dictresult()
- except pg.error, value:
- raise GDataObjects.ConnectionError, value
-
- return resultset
-
- def constructSQL(self, style, table, mask = None, order_by=None):
- sql = None
- fields = None
- qualifier = None
-
-
- if style == 'query':
- action = "SELECT "
- location = "FROM %s " % (table)
- fields = " oid AS oid_%s, * " % (table)
-
- if type(mask) == type({}):
- fields = " oid AS oid_%s, %s " % (table, string.join(mask.keys(), ','))
- for fieldname in mask.keys():
- if mask[fieldname] != None and len(mask[fieldname]):
- value = string.replace(mask[fieldname],"'","''")
- if qualifier == None:
- qualifier = "WHERE %s LIKE '%s'" % (fieldname,value)
- else:
- qualifier = "%s AND %s LIKE '%s'" % (qualifier, fieldname,value)
-
- sql = action + fields + location + (qualifier and qualifier or "")
- if order_by != None:
- sql = sql + ' order by ' + order_by
-
- else:
- print "constructSQL: unsupport SQL statement type"
-
- return sql
-
- def getUniqueKey(self, table):
- self.uniqueKey = "oid_%s" % (table)
- return self.uniqueKey
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/gnue-common/src/dbdrivers _dbsig/DBdriver....,
James Thompson <=