commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue gnue-common/etc/sample.gnue.conf gnue-comm...


From: James Thompson
Subject: gnue gnue-common/etc/sample.gnue.conf gnue-comm...
Date: Wed, 29 Aug 2001 17:23:13 -0700

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     James Thompson <address@hidden> 01/08/29 17:23:12

Modified files:
        gnue-common/etc: sample.gnue.conf 
        gnue-common/src: GDataObjects.py 
        gnue-common/src/dbdrivers/_dbsig: DBdriver.py 
        gnue-common/src/dbdrivers/db2: DBdriver.py 
        gnue-common/src/dbdrivers/empty: DBdriver.py 
        gnue-common/src/dbdrivers/geas: DBdriver.py 
        gnue-common/src/dbdrivers/mysql: DBdriver.py 
        gnue-common/src/dbdrivers/odbc: DBdriver.py 
        gnuef/samples  : helloworld2.gfd 
        gnuef/samples/inventory/forms: company.gfd 
        gnuef/src      : GFClient.py GFTrigger.py 
        gnuef/src/GFObjects: GFBlock.py 

Log message:
        Got master/details working/saving/caching correctly.
        (jcater's changes, not jamest's)

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/etc/sample.gnue.conf.diff?cvsroot=OldCVS&tr1=1.6&tr2=1.7&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/GDataObjects.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/_dbsig/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/db2/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/empty/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/geas/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/mysql/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/samples/helloworld2.gfd.diff?cvsroot=OldCVS&tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/samples/inventory/forms/company.gfd.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/src/GFClient.py.diff?cvsroot=OldCVS&tr1=1.25&tr2=1.26&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/src/GFTrigger.py.diff?cvsroot=OldCVS&tr1=1.45&tr2=1.46&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/src/GFObjects/GFBlock.py.diff?cvsroot=OldCVS&tr1=1.9&tr2=1.10&r1=text&r2=text

Patches:
Index: gnue/gnue-common/etc/sample.gnue.conf
diff -u gnue/gnue-common/etc/sample.gnue.conf:1.6 
gnue/gnue-common/etc/sample.gnue.conf:1.7
--- gnue/gnue-common/etc/sample.gnue.conf:1.6   Sun Aug 12 12:55:26 2001
+++ gnue/gnue-common/etc/sample.gnue.conf       Wed Aug 29 17:23:12 2001
@@ -31,6 +31,18 @@
 # for a query can be retrieved by doing an Enter-Query twice) 
 RememberLastQuery = 1
 
+# Detail data caching behavior:
+#
+# If set to true (default), then always cache detail data in a master/detail 
+# set. The benefits of this method is performance.  The downsize to this method
+# is that records are cached so any changes made elsewhere are not reflected
+# in the cached records.
+#
+# If set to false, then only cache detail data if it has unposted changes.
+# The benefits of this method are that if another user modifies data and 
+# saves, then it will be available to your form much quicker.
+CacheDetailRecords = 1
+
 # Hack for db encoding
 Encoding=DEFAULT
                           
Index: gnue/gnue-common/src/GDataObjects.py
diff -u gnue/gnue-common/src/GDataObjects.py:1.8 
gnue/gnue-common/src/GDataObjects.py:1.9
--- gnue/gnue-common/src/GDataObjects.py:1.8    Sun Aug 12 12:55:26 2001
+++ gnue/gnue-common/src/GDataObjects.py        Wed Aug 29 17:23:12 2001
@@ -30,6 +30,7 @@
 #
 
 import GDebug
+import GConfig
 import string
 
 class LoginError(Exception): 
@@ -106,7 +107,12 @@
   def hasMaster(self): 
     return self._masterObject != None
 
+  # Do not over-ride by vendor code
   def createResultSet(self, conditions={}, readOnly=0): 
+    return self._createResultSet(conditions, readOnly)
+
+  # Designed to be replaced by vendor-specific code 
+  def _createResultSet(self, conditions={}, readOnly=0): 
     pass
 
   def createEmptyResultSet(self, readOnly=0): 
@@ -192,16 +198,23 @@
 
   # Called when new record master in master/detail is queried
   def _masterRecordChanged(self, master):
-#    self._masterfields = string.split(self.masterlink, ',')
-#    self._detailfields = string.split(self.detaillink, ',')
     GDebug.printMesg (5, 'Master Record Changed')
     criteria = {}
-    for i in range(0, len(self._masterfields)): 
-      GDebug.printMesg(10,"Adding criteria")
-      criteria[string.strip(self._detailfields[i])] = \
-          master.current.getField(string.strip(self._masterfields[i]))
-      GDebug.printMesg(10,master.current.getField(self._masterfields[i]))
-    return self.createResultSet(conditions=criteria)
+    
+    # If a detail result set has already been created for a particular
+    # master record set, then just return/reuse this old set (after all, 
+    # it may contain uncommitted changes)
+    if (not master.current._cachedDetailResultSets.has_key(self)) or \
+        ( not int(GConfig.get('CacheDetailRecords','1')) and \
+         not master.current._cachedDetailResultSets[self].isPending() ):
+      for i in range(0, len(self._masterfields)): 
+        GDebug.printMesg(10,"Adding criteria")
+        criteria[string.strip(self._detailfields[i])] = \
+            master.current.getField(string.strip(self._masterfields[i]))
+        GDebug.printMesg(10,master.current.getField(self._masterfields[i]))
+      master.current._cachedDetailResultSets[self] = \
+          self.createResultSet(conditions=criteria)
+    return master.current._cachedDetailResultSets[self]
 
 
 ###########################################################
@@ -367,7 +380,6 @@
     #    print "GDataObjects ",detail
 
     for detail in self._dataObject._detailObjects:
-       print detail
        rs = detail[0]._masterRecordChanged(self)
        if detail[1]: 
          detail[1].masterResultSetChanged(self, rs)
@@ -409,6 +421,8 @@
     self._modifiedFlags = {}      # If field name is present as a key, 
                                   # then field has been modified
 
+    self._cachedDetailResultSets = {}
+
     self._initialData = initialData
 
     self._unboundFields = {}
@@ -515,12 +529,15 @@
     # It does no harm to attempt to post since nothing will be posted,
     # But does this allow sloppy programming?
 
+    GDebug.printMesg(5,'Preparing to post datasource %s' %  
self._parent._dataObject.name)
+
     if self.isPending(): 
+      GDebug.printMesg(5,'Posting datasource %s' % 
self._parent._dataObject.name)
       self._postChanges()
 
     # Post all details in 
-    for child in (self._detailObjects): 
-      child.post()
+    for child in (self._cachedDetailResultSets.keys()): 
+      self._cachedDetailResultSets[child].post()
 
 
   # Sets the ResultSet associated with this master record
Index: gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.9 
gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.10
--- gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.9       Wed Aug 29 
17:20:36 2001
+++ gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py   Wed Aug 29 17:23:12 2001
@@ -90,9 +90,18 @@
   def _buildInsertStatement(self): 
     vals = []
     fields = []
-    for field in self._modifiedFlags.keys(): 
+
+    # 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(): 
       fields.append (field)
-      vals.append ("'%s'" % (self._fields[field]))
+      if self._fields[field] == None or self._fields[field] == '': 
+        vals.append ("NULL" % (self._fields[field]))
+      else:
+        vals.append ("'%s'" % (self._fields[field]))
 
     return "INSERT INTO %s (%s) VALUES (%s)" % \
        (self._parent._dataObject.table, string.join(fields,','), \
@@ -220,7 +229,7 @@
     return [['_username', 'User Name',0],['_password', 'Password',1]]
 
 
-  def createResultSet(self, conditions={}, readOnly=0): 
+  def _createResultSet(self, conditions={}, readOnly=0): 
     try: 
       cursor = self._dataConnection.cursor()
       cursor.execute(self._buildQuery(conditions))
Index: gnue/gnue-common/src/dbdrivers/db2/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/db2/DBdriver.py:1.3 
gnue/gnue-common/src/dbdrivers/db2/DBdriver.py:1.4
--- gnue/gnue-common/src/dbdrivers/db2/DBdriver.py:1.3  Thu Jul 12 20:56:31 2001
+++ gnue/gnue-common/src/dbdrivers/db2/DBdriver.py      Wed Aug 29 17:23:12 2001
@@ -40,7 +40,7 @@
           DBSIG_DataObject_SQL, DBSIG_DataObject_Object
 
 
-class PG_RecordSet(DBSIG_RecordSet): 
+class DB2_RecordSet(DBSIG_RecordSet): 
   def _postChanges(self): 
     values = []
     fields = []
@@ -52,15 +52,15 @@
     statement = 'UPDATE %s SET %s WHERE %s = %s'
     
 
-class PG_ResultSet(DBSIG_ResultSet): 
+class DB2_ResultSet(DBSIG_ResultSet): 
   def __init__(self, dataObject, cursor=None, defaultValues={}, 
masterRecordSet=None): 
     DBSIG_ResultSet.__init__(self, dataObject, \
             cursor, defaultValues, masterRecordSet)
-    self._recordSetClass = PG_RecordSet
+    self._recordSetClass = DB2_RecordSet
 
 
   #### NOTE:  Once PyGreSQL's .fetchone() bug is fixed, this method 
-  ####   should be deleted!  Also note the line in PG_DataObject.__init__.
+  ####   should be deleted!  Also note the line in DB2_DataObject.__init__.
   ####   Right now, we are having to preload *ALL* rows from a datasource.
   def _loadNextRecord(self): 
     if self._cursor: 
@@ -95,12 +95,12 @@
 ####
 
 
-class PG_DataObject(DBSIG_DataObject): 
+class DB2_DataObject(DBSIG_DataObject): 
   def __init__(self): 
     DBSIG_DataObject.__init__(self)
     self._DatabaseError = "Database Error"
     #### When the PyGreSQL's .fetchone() bug is fixed, delete following line
-    self._resultSetClass = PG_ResultSet
+    self._resultSetClass = DB2_ResultSet
 
 
   def connect(self, connectData={}): 
@@ -114,26 +114,26 @@
       raise GDataObjects.ConnectionError, value
 
 
-class PG_DataObject_Object(PG_DataObject, \
+class DB2_DataObject_Object(DB2_DataObject, \
       DBSIG_DataObject_Object): 
 
   def __init__(self): 
-    # Call DBSIG init first because PG_DataObject needs to overwrite 
+    # Call DBSIG init first because DB2_DataObject needs to overwrite 
     # some of its values
     DBSIG_DataObject_Object.__init__(self) 
-    PG_DataObject.__init__(self)
+    DB2_DataObject.__init__(self)
 
   def _buildQuery(self, conditions={}): 
     return DBSIG_DataObject_Object._buildQuery(self, conditions)
 
 
-class PG_DataObject_SQL(PG_DataObject, \
+class DB2_DataObject_SQL(DB2_DataObject, \
       DBSIG_DataObject_SQL): 
   def __init__(self): 
-    # Call DBSIG init first because PG_DataObject needs to overwrite 
+    # Call DBSIG init first because DB2_DataObject needs to overwrite 
     # some of its values
     DBSIG_DataObject_SQL.__init__(self) 
-    PG_DataObject.__init__(self)
+    DB2_DataObject.__init__(self)
 
   def _buildQuery(self, conditions={}): 
     return DBSIG_DataObject_SQL._buildQuery(self, conditions)
@@ -141,254 +141,7 @@
 
 
 supportedDataObjects = { 
-  'object': PG_DataObject_Object,
-  'sql':    PG_DataObject_SQL
+  'object': DB2_DataObject_Object,
+  'sql':    DB2_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.
-##
-##########################################################################
-##########################################################################
-
-
-class DBdriver:
-  def __init__(self):
-    GDebug.printMesg(1,"DB2 database driver initializing")
-    self.connection = None
-    self.cursor = None
-    self.uniqueKey = None
-    self.oldMaskData = {}
-    self.maskCount = 1
-
-  def connect(self, dbhost, dbname, dbuser, dbpasswd):
-    GDebug.printMesg(1,"connecting")
-    try:
-      self.connection = DB2.connect(dsn=dbname, uid=dbuser, pwd=dbpasswd)
-#      self.connection.cursorclass = DB2.DictCursor
-      self.cursor = self.connection.cursor()
-      self.triggerExtensions = TriggerExtensions(self.connection)
-    except:
-      raise DBError, "Connection Error: %s" % (sys.exc_info()[1])
-    
-  def disconnect(self):
-    try:
-      self.connection.close()
-    except:
-      raise DBError, "Disconnect Error: %s" % (sys.exc_info()[1])
-
-
-  def beginTransaction(self):
-    try:
-      pass
-    except:
-      raise DBError, "Begin Transaction Error: %s" % (sys.exc_info()[1])
-
-  def commit(self):
-    try:
-      self.connection.commit()
-    except:
-      raise DBError, "Commit Error: %s" % (sys.exc_info()[1])
-
-  def rollback(self):
-    try:
-      self.connection.rollback()
-    except:
-      raise DBError, "Rollback Error: %s " % (sys.exc_info()[1])
-
-
-  def insert(self, table, mask):
-    for fieldname in mask.keys():
-      if mask[fieldname] == None or len(mask[fieldname]) == 0:
-        del mask[fieldname]
-
-    command = self.constructSQL('insert', table, mask)
-    try:
-      self.cursor.execute(command)
-    except:
-      raise DBError, "Insert Error: %s" % (sys.exc_info()[1])
-
-    mask[self.uniqueKey] = self.getMaskCount()
-    return mask
-  
-  def delete(self, table, mask):
-    command = self.constructSQL('delete', table, mask)
-    try:
-      self.cursor.execute(command)
-    except:
-      raise DBError, "Deletion Error: %s" % (sys.exc_info()[1])
-
-
-  def update(self, table, mask):
-    command = self.constructSQL('update', table, mask)
-    try:
-      self.cursor.execute(command)
-    except:
-      raise DBError, "Update Error: %s " % (sys.exc_info()[1])
-
-
-  def getFieldList(self, table):
-    l = {}
-    try:
-      cr = self.connection.cursor()
-      cr.execute("select * from %s where 1=2" % table)
-      rs = cr.description
-    except:
-      raise DBError, "Field retrieval error"
-    self.getUniqueKey(table)
-    for r in rs:
-      l[lower(r[0])] = "text"
-    return l
-
-    # Primary key fetching code, will possibly be used in later implementation
-    #  if r["Key"] == "PRI":
-    #    print "PK = %s" % (r["Field"])
-    #    self.primaryKey[r["Field"]] = ''
-    #for d in cr.description:
-    #  l[d[0]] = 'text'
-
-
-  def query(self, table, mask, order_by = None):
-    command = self.constructSQL('query',table, mask)
-    try:
-      self.cursor.execute(command)
-      rs = self.cursor.fetchallDict()
-    except:
-      raise DBError, "Query Error: %s" % (sys.exc_info()[1])
-                                          
-    self.oldMaskData = {}
-    self.maskCount = 1
-    for r in rs:
-      r[self.uniqueKey] = self.getMaskCount()
-      self.oldMaskData[int(r[self.uniqueKey])] = self.copyDict(r)
-    return rs
-
-  def constructSQL(self, style, table, mask = None):
-    sql = None
-    fields = None
-    qualifier = None
-
-    if style == 'query':
-      action = "SELECT "
-      location = "FROM %s " % (table)
-      fields = " * "
-      
-      if type(mask) == type({}):
-        fields = "%s" % (string.join(mask.keys(), ','))
-        fields = string.replace(fields, "%s," % (self.uniqueKey), '')
-        fields = "%s " % (fields)
-        for fieldname in mask.keys():
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              if qualifier == None:
-                qualifier = "WHERE %s LIKE '%s'" % (fieldname,mask[fieldname])
-              else:
-                qualifier = "%s AND %s LIKE  '%s'" % (qualifier, 
fieldname,mask[fieldname])
-
-      sql = action + fields + location + (qualifier and qualifier or "")
-
-    elif style == 'insert':
-      action = "INSERT "
-      location = "INTO %s " % (table)
-      values = None
-
-      if type(mask) == type({}):
-        fields = "(%s) " % (string.join(mask.keys(), ','))
-        for fieldname in mask.keys():  
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              if values == None:
-                values = "VALUES ('%s'" % (mask[fieldname])
-              else:
-                values = "%s, '%s'" % (values, mask[fieldname])
-        values = "%s)" % (values)
-        
-      sql = action + location + fields + values + (qualifier and qualifier or 
"")
-
-    elif style == 'update':
-      action = "UPDATE "
-      location = "%s " % (table)
-      values = " SET "
-      qualifier = " WHERE "
-
-      if type(mask) == type({}):
-        for fieldname in mask.keys():
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              values = "%s %s='%s'," % (values, fieldname, mask[fieldname])
-              qualifier = "%s %s='%s' AND" % (qualifier, fieldname, 
self.oldMaskData[int(mask[self.uniqueKey])][fieldname])
-        values = values[:-1]
-        qualifier = qualifier[:-3]
-        
-      sql = action + location + values + (qualifier and qualifier or "")
-
-    elif style == 'delete':
-      action = "DELETE FROM "
-      location = "%s " % (table)
-      values = ""
-      qualifier = " WHERE "
-
-      if type(mask) == type({}):
-        for fieldname in mask.keys():
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              qualifier = "%s %s='%s' AND" % (qualifier, fieldname, 
self.oldMaskData[int(mask[self.uniqueKey])][fieldname])
-        qualifier = qualifier[:-3]
-        
-      sql = action + location + values + (qualifier and qualifier or "")
-
-    else:
-      print "constructSQL: unsupport SQL statement type"
-
-    return sql
-
-  def getUniqueKey(self, table):
-    self.uniqueKey = "uniqueKey_%s" % (table)
-    return self.uniqueKey
-
-  def getMaskCount(self):
-    self.maskCount = self.maskCount + 1
-    return self.maskCount - 1
-
-  def copyDict(self, dict):
-    nd = {}
-    for key in dict.keys():
-      nd[key] = dict[key]
-
-    return nd
-
-  supportedDataObjects = { 
-  'object': PG_DataObject_Object,
-  'sql':    PG_DataObject_SQL
-  }
-
-
-
-#
-#  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
-
-
-
 
Index: gnue/gnue-common/src/dbdrivers/empty/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/empty/DBdriver.py:1.2 
gnue/gnue-common/src/dbdrivers/empty/DBdriver.py:1.3
--- gnue/gnue-common/src/dbdrivers/empty/DBdriver.py:1.2        Thu Aug 23 
18:36:07 2001
+++ gnue/gnue-common/src/dbdrivers/empty/DBdriver.py    Wed Aug 29 17:23:12 2001
@@ -45,7 +45,7 @@
     DataObject.__init__(self)
     self.triggerExtensions = TriggerExtensions(self)
 
-  def createResultSet(self, conditions={}, readOnly=0): 
+  def _createResultSet(self, conditions={}, readOnly=0): 
     return NIL_ResultSet(self)
 
   # We don't do logins
Index: gnue/gnue-common/src/dbdrivers/geas/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/geas/DBdriver.py:1.8 
gnue/gnue-common/src/dbdrivers/geas/DBdriver.py:1.9
--- gnue/gnue-common/src/dbdrivers/geas/DBdriver.py:1.8 Wed Aug 29 11:21:22 2001
+++ gnue/gnue-common/src/dbdrivers/geas/DBdriver.py     Wed Aug 29 17:23:12 2001
@@ -181,7 +181,7 @@
     return [['_username', 'User Name',0],['_password', 'Password',1]]
 
 
-  def createResultSet(self, conditions={}, readOnly=0): 
+  def _createResultSet(self, conditions={}, readOnly=0): 
     try: 
       cursor = self._dataConnection.cursor()
       cursor.execute(self._buildQuery(conditions))
Index: gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py:1.4 
gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py:1.5
--- gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py:1.4        Wed Aug 29 
11:21:22 2001
+++ gnue/gnue-common/src/dbdrivers/mysql/DBdriver.py    Wed Aug 29 17:23:12 2001
@@ -136,252 +136,3 @@
   '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
-from gnue.forms.GFError import DBError
-
-class DBdriver:
-  def __init__(self):
-    GDebug.printMesg(1,"MySQL database driver initializing")
-    self.connection = None
-    self.cursor = None
-    self.uniqueKey = None
-    self.oldMaskData = {}
-    self.maskCount = 1
-
-  def connect(self, dbhost, dbname, dbuser, dbpasswd):
-    GDebug.printMesg(1,"connecting")
-    try:
-      self.connection = MySQLdb.connect(db=dbname, host=dbhost, user=dbuser, 
passwd=dbpasswd)
-      self.connection.cursorclass = MySQLdb.DictCursor
-      self.cursor = self.connection.cursor()
-      self.triggerExtensions = TriggerExtensions(self.connection)
-    except:
-      raise DBError, "Connection Error: %s" % (sys.exc_info()[1])
-    
-  def disconnect(self):
-    try:
-      self.connection.close()
-    except:
-      raise DBError, "Disconnect Error: %s" % (sys.exc_info()[1])
-
-
-  def beginTransaction(self):
-    try:
-      pass
-    except:
-      raise DBError, "Begin Transaction Error: %s" % (sys.exc_info()[1])
-
-  def commit(self):
-    try:
-      pass
-    except:
-      raise DBError, "Commit Error: %s" % (sys.exc_info()[1])
-
-  def rollback(self):
-    try:
-      pass
-    except:
-      raise DBError, "Rollback Error: %s " % (sys.exc_info()[1])
-
-
-  def insert(self, table, mask):
-    for fieldname in mask.keys():
-      if mask[fieldname] == None or len(mask[fieldname]) == 0:
-        del mask[fieldname]
-
-    command = self.constructSQL('insert', table, mask)
-    try:
-      self.cursor.execute(command)
-    except:
-      raise DBError, "Insert Error: %s" % (sys.exc_info()[1])
-
-    mask[self.uniqueKey] = self.getMaskCount()
-    return mask
-  
-  def delete(self, table, mask):
-    command = self.constructSQL('delete', table, mask)
-    try:
-      self.cursor.execute(command)
-    except:
-      raise DBError, "Deletion Error: %s" % (sys.exc_info()[1])
-
-
-  def update(self, table, mask):
-    command = self.constructSQL('update', table, mask)
-    try:
-      self.cursor.execute(command)
-    except:
-      raise DBError, "Update Error: %s " % (sys.exc_info()[1])
-
-
-  def getFieldList(self, table):
-    l = {}
-    try:
-      cr = self.connection.cursor()
-      cr.execute('DESCRIBE %s' % table)
-      rs = cr.fetchallDict()
-    except:
-      raise DBError, "Field retrieval error"
-    self.getUniqueKey(table)
-    for r in rs:
-      l[r["Field"]] = "text"
-    return l
-
-    # Primary key fetching code, will possibly be used in later implementation
-    #  if r["Key"] == "PRI":
-    #    print "PK = %s" % (r["Field"])
-    #    self.primaryKey[r["Field"]] = ''
-    #for d in cr.description:
-    #  l[d[0]] = 'text'
-
-
-  def query(self, table, mask, order_by = None):
-    command = self.constructSQL('query',table, mask)
-    try:
-      self.cursor.execute(command)
-      rs = self.cursor.fetchallDict()
-    except:
-      raise DBError, "Query Error: %s" % (sys.exc_info()[1])
-                                          
-    self.oldMaskData = {}
-    self.maskCount = 1
-    for r in rs:
-      r[self.uniqueKey] = self.getMaskCount()
-      self.oldMaskData[int(r[self.uniqueKey])] = self.copyDict(r)
-    return rs
-
-  def constructSQL(self, style, table, mask = None):
-    sql = None
-    fields = None
-    qualifier = None
-
-    if style == 'query':
-      action = "SELECT "
-      location = "FROM %s " % (table)
-      fields = " * "
-      
-      if type(mask) == type({}):
-        fields = "%s" % (string.join(mask.keys(), ','))
-        fields = string.replace(fields, "%s," % (self.uniqueKey), '')
-        fields = "%s " % (fields)
-        for fieldname in mask.keys():
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              if qualifier == None:
-                qualifier = "WHERE %s LIKE '%s'" % (fieldname,mask[fieldname])
-              else:
-                qualifier = "%s AND %s LIKE  '%s'" % (qualifier, 
fieldname,mask[fieldname])
-
-      sql = action + fields + location + (qualifier and qualifier or "")
-
-    elif style == 'insert':
-      action = "INSERT "
-      location = "INTO %s " % (table)
-      values = None
-
-      if type(mask) == type({}):
-        fields = "(%s) " % (string.join(mask.keys(), ','))
-        for fieldname in mask.keys():  
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              if values == None:
-                values = "VALUES ('%s'" % (mask[fieldname])
-              else:
-                values = "%s, '%s'" % (values, mask[fieldname])
-        values = "%s)" % (values)
-        
-      sql = action + location + fields + values + (qualifier and qualifier or 
"")
-
-    elif style == 'update':
-      action = "UPDATE "
-      location = "%s " % (table)
-      values = " SET "
-      qualifier = " WHERE "
-
-      if type(mask) == type({}):
-        for fieldname in mask.keys():
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              values = "%s %s='%s'," % (values, fieldname, mask[fieldname])
-              qualifier = "%s %s='%s' AND" % (qualifier, fieldname, 
self.oldMaskData[int(mask[self.uniqueKey])][fieldname])
-        values = values[:-1]
-        qualifier = qualifier[:-3]
-        
-      sql = action + location + values + (qualifier and qualifier or "")
-
-    elif style == 'delete':
-      action = "DELETE FROM "
-      location = "%s " % (table)
-      values = ""
-      qualifier = " WHERE "
-
-      if type(mask) == type({}):
-        for fieldname in mask.keys():
-          if fieldname != self.uniqueKey:
-            if mask[fieldname] != None and len(mask[fieldname]):
-              qualifier = "%s %s='%s' AND" % (qualifier, fieldname, 
self.oldMaskData[int(mask[self.uniqueKey])][fieldname])
-        qualifier = qualifier[:-3]
-        
-      sql = action + location + values + (qualifier and qualifier or "")
-
-    else:
-      print "constructSQL: unsupport SQL statement type"
-
-    return sql
-
-  def getUniqueKey(self, table):
-    self.uniqueKey = "uniqueKey_%s" % (table)
-    return self.uniqueKey
-
-  def getMaskCount(self):
-    self.maskCount = self.maskCount + 1
-    return self.maskCount - 1
-
-  def copyDict(self, dict):
-    nd = {}
-    for key in dict.keys():
-      nd[key] = dict[key]
-
-    return nd
-
-#
-#  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
-
Index: gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py:1.3 
gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py:1.4
--- gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py:1.3 Thu Jul 12 20:56:31 2001
+++ gnue/gnue-common/src/dbdrivers/odbc/DBdriver.py     Wed Aug 29 17:23:12 2001
@@ -268,6 +268,3 @@
 #  def sql(self, statement): 
 #    pass
 
-
-
-
Index: gnue/gnuef/samples/helloworld2.gfd
diff -u gnue/gnuef/samples/helloworld2.gfd:1.5 
gnue/gnuef/samples/helloworld2.gfd:1.6
--- gnue/gnuef/samples/helloworld2.gfd:1.5      Thu Jun  7 18:36:52 2001
+++ gnue/gnuef/samples/helloworld2.gfd  Wed Aug 29 17:23:12 2001
@@ -13,7 +13,10 @@
 #Populate User Name from Name
 #
 from string import *
-login.fields.user = address.fields.name
+print login.fields.user
+print address.fields.name
+print self._value
+#login.fields.user = address.fields.name
 </trigger>
 
   <datasource name="nil" cache="5" />
@@ -36,9 +39,9 @@
 #User name validation trigger
 #
 from string import *
-print login.fields.__class__
-print lower(login.fields.user)
-print login.fields.user[:3]
+#print login.fields.__class__
+#print lower(login.fields.user)
+#print login.fields.user[:3]
 if lower(login.fields.user)[:3] != lower(address.fields.name)[:3]:
   print "ERROR! First 3 letters of user name MUST"
   print "       match first three letters of full name."
Index: gnue/gnuef/samples/inventory/forms/company.gfd
diff -u gnue/gnuef/samples/inventory/forms/company.gfd:1.2 
gnue/gnuef/samples/inventory/forms/company.gfd:1.3
--- gnue/gnuef/samples/inventory/forms/company.gfd:1.2  Sun Jan 14 15:32:37 2001
+++ gnue/gnuef/samples/inventory/forms/company.gfd      Wed Aug 29 17:23:12 2001
@@ -55,11 +55,13 @@
               <tip>Please enter the value for zip code.</tip>
             </options>
             <trigger type ="Pre-FocusOut">
-ziplookup.clear()      
-ziplookup.setField(0,"zipcode",self.value,TRUE)
-ziplookup.query()
-state = ziplookup.getField(0,"state")
-city  = ziplookup.getField(0,"city")
+print "zipcode",self._value
+#ziplookup.clear()     
+#ziplookup.setField(0,"zipcode",self.value,TRUE)
+rs = ziplookup.createResultSet({"zipcode":self.value})
+rs.getFirstRecord()
+state = rs.current.getField("state")
+city  = rs.current.getField("city")
 blckcompany.fields.ntrycity = city
 blckcompany.fields.ntrystate = state
            </trigger>
Index: gnue/gnuef/src/GFClient.py
diff -u gnue/gnuef/src/GFClient.py:1.25 gnue/gnuef/src/GFClient.py:1.26
--- gnue/gnuef/src/GFClient.py:1.25     Sun Aug 12 12:55:27 2001
+++ gnue/gnuef/src/GFClient.py  Wed Aug 29 17:23:12 2001
@@ -34,7 +34,7 @@
 #
 # Copyright (c) 2000 Free Software Foundation
 #
-# $Id: GFClient.py,v 1.25 2001/08/12 19:55:27 jamest Exp $
+# $Id: GFClient.py,v 1.26 2001/08/30 00:23:12 jamest Exp $
 #
 
 import pstats
@@ -157,6 +157,12 @@
      return self._lastSerialNumber
       
 if __name__ == '__main__':
+
+  print "*" * 60
+  print "*" * 60
+  print "*" * 60
+  print "*" * 60
+
   GFClient().run()
 
 
Index: gnue/gnuef/src/GFObjects/GFBlock.py
diff -u gnue/gnuef/src/GFObjects/GFBlock.py:1.9 
gnue/gnuef/src/GFObjects/GFBlock.py:1.10
--- gnue/gnuef/src/GFObjects/GFBlock.py:1.9     Sun Aug 12 12:55:27 2001
+++ gnue/gnuef/src/GFObjects/GFBlock.py Wed Aug 29 17:23:12 2001
@@ -64,6 +64,7 @@
 
     self._datasource = None
     self._resultSet = None    
+
     self._dataSourceLink = None
     self.mode = 'normal'
     self._entryList = []
@@ -198,6 +199,7 @@
         self.switchRecord(-self._currentRecord)
 
     self.mode='normal'
+    #self.switchRecord(0)
 
   #
   # processRollback
@@ -281,7 +283,6 @@
       self._recordCount = self._resultSet.getCacheCount()
 
       self.processTrigger('Post-Query')
-
 
 
 
Index: gnue/gnuef/src/GFTrigger.py
diff -u gnue/gnuef/src/GFTrigger.py:1.45 gnue/gnuef/src/GFTrigger.py:1.46
--- gnue/gnuef/src/GFTrigger.py:1.45    Sun Aug 12 12:55:27 2001
+++ gnue/gnuef/src/GFTrigger.py Wed Aug 29 17:23:12 2001
@@ -280,6 +280,7 @@
       self.__dict__['helper'] = helper( object )
     
   def __getattr__(self,name):
+    print "GFTrigger.py - Hi"
     return self.__dict__['helper'].getattribute(name)
 
   def __setattr__(self,name,value):



reply via email to

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