commit-gnue
[Top][All Lists]
Advanced

[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")



reply via email to

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