[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/gnue-common/gnue/common GDataObjects.py GD...,
Jason Cater <=