commit-gnue
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]