commit-gnue
[Top][All Lists]
Advanced

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

gnue/gnue-common/gnue/common GDataObjects.py GD...


From: Jason Cater
Subject: gnue/gnue-common/gnue/common GDataObjects.py GD...
Date: Tue, 29 May 2001 19:20:57 -0700

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     Jason Cater <address@hidden>    01/05/29 19:20:57

Modified files:
        gnue-common/gnue/common: GDataObjects.py GDataSource.py 
                                 GParser.py 
        gnue-common/gnue/common/dbdrivers/_dbsig: DBdriver.py 
        gnue-common/gnue/common/dbdrivers/postgresql: DBdriver.py 

Log message:
        Changes made to gnue-common for the first test run of gnue-reports.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/gnue/common/GDataObjects.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/gnue/common/GDataSource.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/gnue/common/GParser.py.diff?cvsroot=OldCVS&tr1=1.8&tr2=1.9&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/gnue/common/dbdrivers/_dbsig/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/gnue/common/dbdrivers/postgresql/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text

Patches:
Index: gnue/gnue-common/gnue/common/GDataObjects.py
diff -u gnue/gnue-common/gnue/common/GDataObjects.py:1.4 
gnue/gnue-common/gnue/common/GDataObjects.py:1.5
--- gnue/gnue-common/gnue/common/GDataObjects.py:1.4    Tue May 15 08:16:38 2001
+++ gnue/gnue-common/gnue/common/GDataObjects.py        Tue May 29 19:20:57 2001
@@ -30,7 +30,7 @@
 #
 
 import GDebug
-from string import lower
+import string
 
 class LoginError(Exception): 
   # Raised when invalid login user/pass was provided 
@@ -58,6 +58,10 @@
   # Raised when an attempt is made to update a read-only data object.
   pass
 
+class ConnectionError(Exception): 
+  # Raised when connection raises an exception.
+  pass 
+
 
 
 ###########################################################
@@ -68,17 +72,33 @@
 class DataObject: 
 
   def __init__(self): 
+    # Set by 
+    self.masterlink = ""       
+    self.detaillink = ""
+
+    self._masterfields = []
+    self._detailfields = []
     self._detailObjects = []
     self._dataConnection = None
     self._resultSetClass = ResultSet
+    self._fieldReferences = {}  # Set by GDataSource; lists all fields
+                               # a client explicits references
 
   def createResultSet(self, conditions={}, readOnly=0): 
     pass
 
-  def addDetailDataObject(self, ds): 
-    GDebug.printMesg (1,"DataObject: adding a master/detail relationship")
-    self._detailObjects.append (ds)
 
+  # Add a detail data object.  This dataobject will create a new resultset 
+  # everything this dataobject changes (new record, etc).  The optional 
+  # handler will be called after the detail dataobject is notified.  The 
+  # client application may with to add a handler to know when the detail
+  # has been requeried.  handler is a method that takes two arguments: 
+  # the master ResultSet and the detail ResultSet 
+  def addDetailDataObject(self, dataObject, handler=None): 
+    GDebug.printMesg (1,"Adding a master/detail relationship to DataObject")
+    self._detailObjects.append ([dataObject, handler])
+
+
   # Return a list of necessary login fields (e.g., user/pass). 
   # Each list item is another list of ["field label", isPassword?]
   def getLoginFields(self): 
@@ -99,6 +119,21 @@
   def rollback(self):
     pass
 
+  # 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(10, self._masterfields)
+    GDebug.printMesg(10, self._detailfields)
+    GDebug.printMesg (5, 'Master Record Changed')
+    criteria = {}
+    for i in range(0, len(self._masterfields)): 
+      GDebug.printMesg(10,"Adding criteria")
+      criteria[self._detailfields[i]] = \
+          master.current.getField(self._masterfields[i])
+      GDebug.printMesg(10,master.current.getField(self._masterfields[i]))
+    return self.createResultSet(criteria)
+
 
 ###########################################################
 #
@@ -107,7 +142,8 @@
 ###########################################################
 class ResultSet: 
 
-  def __init__(self, cursor=None,defaultValues={},masterRecordSet=None):
+  def __init__(self, dataObject, 
cursor=None,defaultValues={},masterRecordSet=None):
+     self._dataObject = dataObject
      self._recordSetClass = RecordSet
      self._cursor = cursor
      self._cachedRecords = []
@@ -153,6 +189,7 @@
   
     self._currentRecord = self._currentRecord + 1
     self.current = self._cachedRecords[self._currentRecord]
+    self.notifyDetailObjects()
     return 1
 
 
@@ -163,6 +200,7 @@
     else: 
       self._currentRecord = self._currentRecord - 1
       self.current = self._cachedRecords[self._currentRecord]
+      self.notifyDetailObjects()
       return 1
 
 
@@ -173,6 +211,7 @@
     else: 
       self._currentRecord = 0
       self.current = self._cachedRecords[0]
+      self.notifyDetailObjects()
       return 1
 
 
@@ -185,6 +224,7 @@
         pass
       self._currentRecord = len(self._cachedRecords) 
       self.current = self._cachedRecords(self._currentRecord)
+      self.notifyDetailObjects()
       return 1
 
 
@@ -197,6 +237,7 @@
       self._currentRecord = self._currentRecord+1
       self._cachedRecords.insert(_currentRecord, self._createEmptyRecord())
       current = self._cachedRecords[self._currentRecord]
+      self.notifyDetailObjects()
       return 1
 
 
@@ -216,20 +257,18 @@
     for record in (self._cachedRecords): 
       record.post()
 
-
-  # Called when master in master/detail is updated
-  def masterRecordChanged(self):
-    pass
-
-
   # 
   def notifyDetailObjects(self):
-    pass
+    GDebug.printMesg(5,'Master record changed; Notifying Detail Objects')
+    for detail in self._dataObject._detailObjects:
+       rs = detail[0]._masterRecordChanged(self)
+       if detail[1]: 
+         detail[1].masterResultSetChanged(self, rs)
 
 
   # Returns 1=Field is bound to a database field
   def isFieldBound(self, fieldName):
-    return self._boundFields.has_key(lower(fieldName))
+    return self._boundFields.has_key(string.lower(fieldName))
 
 
   ###
@@ -311,8 +350,8 @@
 
   # Returns current value of "field"
   def getField(self, field):
-    if self._fields.has_key(lower(field)): 
-      return self._fields[lower(field)]
+    if self._fields.has_key(string.lower(field)): 
+      return self._fields[string.lower(field)]
     else: 
       return None
 
@@ -326,7 +365,7 @@
       raise ReadOnlyError, "Attempted to modify read only field '%s'" % field
     else: 
       self._emptyFlag = 0
-      fn = lower(field)
+      fn = string.lower(field)
       self._fields[fn] = value
       if self._parent.isFieldBound(field): 
         self._updateFlag = 1
@@ -339,7 +378,7 @@
 
   # Returns 1=Field has been modified
   def isFieldModified(self, fieldName):
-    return self._modifiedFlags.has_key (lower(fieldName))   
+    return self._modifiedFlags.has_key (string.lower(fieldName))   
 
 
   # Posts changes to database
@@ -371,7 +410,7 @@
 
 
   ###
-  ### Methods below should be overridden by Vendor Specific functions
+  ### Methods below should be over-written by Vendor Specific functions
   ###
 
   # Post any changes to database
Index: gnue/gnue-common/gnue/common/GDataSource.py
diff -u gnue/gnue-common/gnue/common/GDataSource.py:1.4 
gnue/gnue-common/gnue/common/GDataSource.py:1.5
--- gnue/gnue-common/gnue/common/GDataSource.py:1.4     Fri May 25 01:03:01 2001
+++ gnue/gnue-common/gnue/common/GDataSource.py Tue May 29 19:20:57 2001
@@ -52,6 +52,7 @@
     self._connectionManager = None
     self._dataObject = None
     self._connectionComment = "" 
+    self._fieldReferences = {}
 
   #
   # This method should be called after the object is created 
@@ -67,15 +68,26 @@
       # catch this exception and handle it properly (exit w/message)
       self._dataObject = \
          self._connectionManager.getDataObject(self.database, self.type)
+      self._dataObject._fieldReferences = self._fieldReferences
 
+      # Copy all attributes from XML to the dataObject 
+      for attribute in tagAttributes.keys(): 
+        if hasattr(self, attribute): 
+          self._dataObject.__dict__[attribute] = self.__dict__[attribute]
+          
+
   def connect(self): 
     if self.database != None: 
       self._connectionManager.setDataConnection(self)
 
   def getDataObject(self): 
     return self._dataObject
-
 
+  def referenceField(self, field): 
+    GDebug.printMesg(7,'Field %s implicitly referenced' % field)
+    self._fieldReferences[field] = 1
+    if self._dataObject != None: 
+      self._dataObject._fieldReferences[field] = 1
 
 
 class GSql(GObjects.GObj): 
Index: gnue/gnue-common/gnue/common/GParser.py
diff -u gnue/gnue-common/gnue/common/GParser.py:1.8 
gnue/gnue-common/gnue/common/GParser.py:1.9
--- gnue/gnue-common/gnue/common/GParser.py:1.8 Sat May 26 15:36:35 2001
+++ gnue/gnue-common/gnue/common/GParser.py     Tue May 29 19:20:57 2001
@@ -264,7 +264,7 @@
     return saxutils.escape(self._content)
 
   def getContent(self): 
-    return saxutils.escape(self._content)
+    return self._content
 
   def toXML(self): 
     return saxutils.escape(self._content)
Index: gnue/gnue-common/gnue/common/dbdrivers/_dbsig/DBdriver.py
diff -u gnue/gnue-common/gnue/common/dbdrivers/_dbsig/DBdriver.py:1.3 
gnue/gnue-common/gnue/common/dbdrivers/_dbsig/DBdriver.py:1.4
--- gnue/gnue-common/gnue/common/dbdrivers/_dbsig/DBdriver.py:1.3       Tue May 
15 08:15:39 2001
+++ gnue/gnue-common/gnue/common/dbdrivers/_dbsig/DBdriver.py   Tue May 29 
19:20:57 2001
@@ -32,18 +32,21 @@
 #
 
 from gnue.common import GDataObjects, GDebug
-from string import lower
+import string
+from gnue.common import GDebug
 
 class DBSIG_RecordSet(GDataObjects.RecordSet): 
   def _postChanges(self): 
     pass
 
 class DBSIG_ResultSet(GDataObjects.ResultSet): 
-  def __init__(self, cursor=None, defaultValues={}, masterRecordSet=None): 
-    GDataObjects.ResultSet.__init__(self,cursor,defaultValues,masterRecordSet)
+  def __init__(self, dataObject, cursor=None, \
+        defaultValues={}, masterRecordSet=None): 
+    GDataObjects.ResultSet.__init__(
+           self,dataObject,cursor,defaultValues,masterRecordSet)
     self._recordSetClass = DBSIG_RecordSet
     self._fieldNames = None
-    GDebug.printMesg(5, 'DB-SIG dbdriver: ResultSet created')
+    GDebug.printMesg(5, 'ResultSet created')
   
   def _loadNextRecord(self): 
     if self._cursor: 
@@ -51,21 +54,22 @@
       try: 
         rs = self._cursor.fetchone()
       except self._DatabaseError, err:
-        raise DBError, 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[lower[t[0]]] = ""
+          self._boundFields[string.lower[t[0]]] = ""
       if rs: 
         i = 0
         dict = {}
         for f in (rs): 
           dict[self._fieldNames[i]] = f
           i = i + 1
-        self._cachedRecords.append (self._recordSetClass(parent=self, 
initialData=dict))
+        self._cachedRecords.append (self._recordSetClass(parent=self, \
+                                            initialData=dict))
         return 1
       else:
         return 0
@@ -93,8 +97,8 @@
       cursor = self._dataConnection.cursor()
       cursor.execute(self._buildQuery(conditions))
     except self._DatabaseError, err: 
-      raise DBError, err
-    rs = self._resultSetClass(cursor=cursor)
+      raise GDataObjects.ConnectionError, err
+    rs = self._resultSetClass(self, cursor=cursor)
     if readOnly: 
       rs._readonly = readOnly
     return rs
@@ -105,7 +109,7 @@
     try: 
       connection.rollback()
     except self._DatabaseError, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def rollback(self): 
     GDebug.printMesg (5,"DB-SIG database driver: rollback()")
@@ -123,7 +127,23 @@
 
 class DBSIG_DataObject_Object(DBSIG_DataObject): 
   def _buildQuery(self, conditions={}): 
-    return None
+    GDebug.printMesg(7,'Implicit Fields: %s' % self._fieldReferences)
+    if len(self._fieldReferences): 
+      q = "select %s from %s" % \
+           (string.join(self._fieldReferences.keys(),","), self.table)
+    else: 
+      q = "select * from %s" % self.table
+
+    GDebug.printMesg (5, 'Conditions For Query: %s' % conditions)
+    if len(conditions): 
+      c = []
+      for key in conditions.keys(): 
+        c.append("%s='%s'" % (key, conditions[key])) 
+      q = q + " where (%s)" % string.join(c,') AND (')
+
+    GDebug.printMesg(5,q)
+
+    return q
 
 
 
Index: gnue/gnue-common/gnue/common/dbdrivers/postgresql/DBdriver.py
diff -u gnue/gnue-common/gnue/common/dbdrivers/postgresql/DBdriver.py:1.2 
gnue/gnue-common/gnue/common/dbdrivers/postgresql/DBdriver.py:1.3
--- gnue/gnue-common/gnue/common/dbdrivers/postgresql/DBdriver.py:1.2   Tue May 
15 08:15:39 2001
+++ gnue/gnue-common/gnue/common/dbdrivers/postgresql/DBdriver.py       Tue May 
29 19:20:57 2001
@@ -31,7 +31,7 @@
 import pgdb
 from string import lower
 import sys
-from gnue.common import GDebug 
+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
@@ -50,9 +50,9 @@
     
 
 class PG_ResultSet(DBSIG_ResultSet): 
-  def __init__(self, cursor=None, defaultValues={}, masterRecordSet=None): 
-    DBSIG_ResultSet.__init__(self, \
-            cursor,defaultValues,masterRecordSet)
+  def __init__(self, dataObject, cursor=None, defaultValues={}, 
masterRecordSet=None): 
+    DBSIG_ResultSet.__init__(self, dataObject, \
+            cursor, defaultValues, masterRecordSet)
     self._recordSetClass = PG_RecordSet
 
 
@@ -64,7 +64,7 @@
       try: 
         rsall = self._cursor.fetchall()
       except self._DatabaseError, err:
-        raise DBError, err
+        raise GDataObjects.ConnectionError, err
 
       if len(rsall): 
         for rs in(rsall):
@@ -108,7 +108,7 @@
                    host=connectData['host'], 
                    database=connectData['dbname'])
     except self._DatabaseError, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
 
 class PG_DataObject_Object(PG_DataObject, \
@@ -175,7 +175,7 @@
         self.connection.query("set encoding to '%s'" % GFOptions.Encoding)
        
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
     
 
@@ -183,25 +183,25 @@
     try:
       self.connection.close()
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def beginTransaction(self):
     try:
       self.connection.query('BEGIN')
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def commit(self):
     try:
       self.connection.query('END')
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def rollback(self):
     try:
       self.connection.query('ROLLBACK')
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def insert(self,table,mask):
     for fieldname in mask.keys():
@@ -210,7 +210,7 @@
     try:
       self.connection.insert(table,mask)
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
     return mask
   
   def delete(self,table,mask):
@@ -218,19 +218,19 @@
       print "deleting"
       self.connection.delete(table,mask)
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def update(self,table,mask):
     try:
       mask = self.connection.update(table,mask)
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   def getFieldList(self,table):
     try:
       return self.connection.get_attnames(table)
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
   #
   # The code below has been written to be compatible with
@@ -243,7 +243,7 @@
     try:
       resultset = self.connection.query(command).dictresult()
     except pg.error, value:
-      raise DBError, value
+      raise GDataObjects.ConnectionError, value
 
     return resultset
   



reply via email to

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