[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/gnue-common src/GDataObjects.py doc/Trigge...
From: |
Jason Cater |
Subject: |
gnue/gnue-common src/GDataObjects.py doc/Trigge... |
Date: |
Thu, 30 Aug 2001 14:57:48 -0700 |
CVSROOT: /home/cvs
Module name: gnue
Changes by: Jason Cater <address@hidden> 01/08/30 14:57:48
Modified files:
gnue-common/src: GDataObjects.py
Added files:
gnue-common/doc: TriggerSpecifications.txt
Log message:
Changes to master/detail to support auto-populating of primary keys
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/doc/TriggerSpecifications.txt?cvsroot=OldCVS&rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/GDataObjects.py.diff?cvsroot=OldCVS&tr1=1.10&tr2=1.11&r1=text&r2=text
Patches:
Index: gnue/gnue-common/src/GDataObjects.py
diff -u gnue/gnue-common/src/GDataObjects.py:1.10
gnue/gnue-common/src/GDataObjects.py:1.11
--- gnue/gnue-common/src/GDataObjects.py:1.10 Thu Aug 30 14:34:48 2001
+++ gnue/gnue-common/src/GDataObjects.py Thu Aug 30 14:57:47 2001
@@ -65,7 +65,7 @@
class MasterDetailFieldMismatch(Exception):
# Raised when a the number of master fields doesn't match the
- # number of detail fields. (e.g., masterlink="id,subid"
+ # number of detail fields. (e.g., masterlink="id,subid"
# and detaillink="id" would be a problem; must be 1:1)
pass
@@ -76,11 +76,11 @@
#
#
###########################################################
-class DataObject:
+class DataObject:
- def __init__(self):
- # Set by
- self.masterlink = ""
+ def __init__(self):
+ # Set by
+ self.masterlink = ""
self.detaillink = ""
self._masterfields = []
@@ -100,28 +100,33 @@
# Do we have a master datasource?
- def hasMaster(self):
+ def hasMaster(self):
return self._masterObject != None
# Do not over-ride by vendor code
- def createResultSet(self, conditions={}, readOnly=0):
+ 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):
+ # Designed to be replaced by vendor-specific code
+ def _createResultSet(self, conditions={}, readOnly=0):
pass
- def createEmptyResultSet(self, readOnly=0):
+ # Do not over-ride by vendor code
+ def createEmptyResultSet(self, readOnly=0):
+ return self._createEmptyResultSet(readOnly)
+
+ # Designed to be replaced by vendor-specific code
+ def _createEmptyResultSet(self, readOnly=0):
return self.createResultSet(conditions={'1':2}, readOnly=readOnly)
- # Add a detail data object. This dataobject will create a new resultset
- # everytime this dataobject changes (new record, etc). The optional
- # handler will be called after the detail dataobject is notified. The
+ # Add a detail data object. This dataobject will create a new resultset
+ # everytime this dataobject changes (new record, etc). The optional
+ # handler will be called after the detail dataobject is notified. The
# client application may wish 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):
+ # 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")
dataObject._masterObject = self
dataObject._masterfields = string.split(hasattr(dataObject,'masterlink')
and \
@@ -129,7 +134,7 @@
dataObject._detailfields = string.split(hasattr(dataObject,'detaillink')
and \
dataObject.detaillink or "", ',')
- if len(dataObject._masterfields) != len(dataObject._detailfields):
+ if len(dataObject._masterfields) != len(dataObject._detailfields):
raise MasterDetailFieldMismatch, "master=%s; detail=%s" % \
(dataObject._masterfields, dataObject._detailfields)
@@ -140,9 +145,9 @@
self._detailObjects.append ([dataObject, handler])
- # Return a list of necessary login fields (e.g., user/pass).
+ # Return a list of necessary login fields (e.g., user/pass).
# Each list item is another list of ["field label", isPassword?]
- def getLoginFields(self):
+ def getLoginFields(self):
return []
@@ -157,7 +162,7 @@
#
# As such, if the vendor-specific drivers replace this method, the last
# line of the new method should be self._postConnect()!
- #
+ #
def connect(self, connectData={}):
self._postConnect()
@@ -167,7 +172,7 @@
#
# NOTE: See note for connect()
#
- def _postConnect(self):
+ def _postConnect(self):
pass
@@ -177,12 +182,12 @@
#
# NOTE: See note for connect()
#
- def setDataConnection(self, connection):
+ def setDataConnection(self, connection):
self._dataConnection = connection
self._postConnect()
- def getDataConnection(self):
+ def getDataConnection(self):
return self._dataConnection
@@ -196,14 +201,14 @@
def _masterRecordChanged(self, master):
GDebug.printMesg (5, 'Master Record Changed')
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,
+ # 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)):
+ 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]))
@@ -215,10 +220,10 @@
###########################################################
#
-#
-#
+#
+#
###########################################################
-class ResultSet:
+class ResultSet:
def __init__(self, dataObject,
cursor=None,defaultValues={},masterRecordSet=None):
self._dataObject = dataObject
@@ -230,22 +235,22 @@
self._readonly = 0
self._boundFields = {}
self._unboundFields = {}
-
- self._defaultValues = {}
- for key in defaultValues.keys():
+
+ self._defaultValues = {}
+ for key in defaultValues.keys():
self._defaultValues[key] = defaultValues[key]
self.current = None
- if masterRecordSet:
+ if masterRecordSet:
masterRecordSet.addDetailResultSet(self)
# Returns whether this result set is read only or not
- def isReadOnly(self):
+ def isReadOnly(self):
return self._readonly
-
+
# Returns 1=At first record, 0=Not first record
def isFirstRecord(self):
return (self._currentRecord == 1)
@@ -275,7 +280,7 @@
# move to record #, returns 1=New record loaded, 0=invalid #
def setRecord(self, record):
- while (record - 1 > len(self._cachedRecords)) and self._loadNextRecord():
+ while (record - 1 > len(self._cachedRecords)) and self._loadNextRecord():
pass
if record - 1 > len(self._cachedRecords):
@@ -288,10 +293,10 @@
# returns 1=New record loaded, 0=No more records
def nextRecord(self):
- if self._currentRecord + 1 == len(self._cachedRecords):
- if not self._loadNextRecord():
+ if self._currentRecord + 1 == len(self._cachedRecords):
+ if not self._loadNextRecord():
return 0
-
+
self._currentRecord = self._currentRecord + 1
self.current = self._cachedRecords[self._currentRecord]
self.notifyDetailObjects()
@@ -311,23 +316,23 @@
# returns 1=at first record, 0=No records loaded
def firstRecord(self):
- if self._currentRecord < 0:
- if not self._loadNextRecord():
+ if self._currentRecord < 0:
+ if not self._loadNextRecord():
return 0
self._currentRecord = 0
self.current = self._cachedRecords[0]
self.notifyDetailObjects()
return 1
-
+
# returns 1=at last record, 0=No records loaded
def lastRecord(self):
- if self._currentRecord == -1:
+ if self._currentRecord == -1:
return 0
else:
- while self._loadNextRecord():
+ while self._loadNextRecord():
pass
self._currentRecord = len(self._cachedRecords) - 1
self.current = self._cachedRecords[self._currentRecord]
@@ -337,24 +342,30 @@
# Insert a blank record after the current record
def insertRecord(self):
- if self.isReadOnly():
- # Provide better feedback??
+ if self.isReadOnly():
+ # Provide better feedback??
raise ReadOnlyError, "Attempted to insert into a read only datasource"
- else:
+ else:
GDebug.printMesg(7,'Inserting a blank record')
self._currentRecord = self._currentRecord+1
self._cachedRecords.insert(self._currentRecord,
self._createEmptyRecord())
self.current = self._cachedRecords[self._currentRecord]
+ if self._masterRecordSet != None and has_attr(self._dataObject,
'_masterfields'):
+ for field in self._dataObject._masterfields:
+ # We will not call setField because we don't wan't want
auto-populated
+ # fields to report the record as pending a post.
+ self.current._fields[field] = self._masterRecordSet.getField(field)
+
self.notifyDetailObjects()
return 1
- # Returns 1=DataObject has uncommitted changes
+ # Returns 1=DataObject has uncommitted changes
def isPending(self):
- isPending = 0
+ isPending = 0
for rec in (self._cachedRecords):
isPending = isPending or rec.isPending()
- if isPending:
+ if isPending:
break
return isPending
@@ -365,14 +376,14 @@
# Post changes to the database
def post(self):
# post our changes
- for record in (self._cachedRecords):
+ for record in (self._cachedRecords):
record.post()
def notifyDetailObjects(self):
GDebug.printMesg(5,'Master record changed; Notifying Detail Objects')
for detail in self._dataObject._detailObjects:
rs = detail[0]._masterRecordChanged(self)
- if detail[1]:
+ if detail[1]:
detail[1].masterResultSetChanged(self, rs)
@@ -403,13 +414,13 @@
###########################################################
class RecordSet:
- def __init__(self, parent, initialData={}, dbIdentifier=None,
defaultData={}):
+ def __init__(self, parent, initialData={}, dbIdentifier=None,
defaultData={}):
self._detailObjects = []
self._dbIdentifier = dbIdentifier
self._deleteFlag = 0
self._updateFlag = 0
self._parent = parent
- self._modifiedFlags = {} # If field name is present as a key,
+ self._modifiedFlags = {} # If field name is present as a key,
# then field has been modified
self._cachedDetailResultSets = {}
@@ -418,17 +429,17 @@
self._unboundFields = {}
- if len(initialData):
+ if len(initialData):
self._insertFlag = 0
self._emptyFlag = 0
- self._fields = {}
- for key in initialData.keys():
+ self._fields = {}
+ for key in initialData.keys():
self._fields[key] = initialData[key]
- else:
+ else:
self._insertFlag = 1
self._emptyFlag = 1
- self._fields = {}
- for key in defaultData.keys():
+ self._fields = {}
+ for key in defaultData.keys():
self._fields[key] = defaultData[key]
@@ -437,25 +448,25 @@
# The _insertFlag and _deleteFlag takes care of records that
# were inserted, but then deleted before a save (i.e., nothing to do)
- if self._emptyFlag or self._insertFlag and self._deleteFlag:
+ if self._emptyFlag or self._insertFlag and self._deleteFlag:
return 0
- else:
+ else:
return self._insertFlag or self._deleteFlag or self._updateFlag
# Returns 1=Record is pending a deletion
def isDeleted(self):
- if self._emptyFlag:
+ if self._emptyFlag:
return 0
- else:
+ else:
return self._deleteFlag
# Returns 1=Record is pending an update
def isModified(self):
- if self._emptyFlag or self._insertFlag:
+ if self._emptyFlag or self._insertFlag:
return 0
- else:
+ else:
return self._updateFlag
@@ -474,43 +485,43 @@
# Returns current value of "field"
def getField(self, field):
- if self._fields.has_key(string.lower(field)):
+ if self._fields.has_key(string.lower(field)):
return self._fields[string.lower(field)]
- else:
+ else:
return None
# Sets current value of "field"
def setField(self, field, value):
- # If this field is bound to a datasource and the datasource is read only,
+ # If this field is bound to a datasource and the datasource is read only,
# generate an error.
- if self._parent.isFieldBound(field) and self._parent.isReadOnly():
+ if self._parent.isFieldBound(field) and self._parent.isReadOnly():
# Provide better feedback??
raise ReadOnlyError, "Attempted to modify read only field '%s'" % field
- else:
+ else:
self._emptyFlag = 0
fn = string.lower(field)
self._fields[fn] = "%s" % value
- if self._parent.isFieldBound(field):
+ if self._parent.isFieldBound(field):
self._updateFlag = 1
- if self._modifiedFlags.has_key(fn):
+ if self._modifiedFlags.has_key(fn):
flag = self._modifiedFlags[fn] + 1
- else:
+ else:
flag = 1
self._modifiedFlags[fn] = flag
# Returns 1=Field has been modified
def isFieldModified(self, fieldName):
- return self._modifiedFlags.has_key (string.lower(fieldName))
+ return self._modifiedFlags.has_key (string.lower(fieldName))
# Mark the current record as deleted
- def delete(self):
- if self._parent.isReadOnly():
- # Provide better feedback??
+ def delete(self):
+ if self._parent.isReadOnly():
+ # Provide better feedback??
raise ReadOnlyError, "Attempted to delete from a read only datasource"
- else:
+ else:
self._deleteFlag = 1
@@ -522,12 +533,12 @@
GDebug.printMesg(5,'Preparing to post datasource %s' %
self._parent._dataObject.name)
- if self.isPending():
+ if self.isPending():
GDebug.printMesg(5,'Posting datasource %s' %
self._parent._dataObject.name)
self._postChanges()
- # Post all details in
- for child in (self._cachedDetailResultSets.keys()):
+ # Post all details in
+ for child in (self._cachedDetailResultSets.keys()):
self._cachedDetailResultSets[child].post()
@@ -541,7 +552,7 @@
###
# Post any changes to database
- def _postChanges(self):
+ def _postChanges(self):
return 1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/gnue-common src/GDataObjects.py doc/Trigge...,
Jason Cater <=