16 |
# write to the Free Software Foundation, Inc., 59 Temple Place |
# write to the Free Software Foundation, Inc., 59 Temple Place |
17 |
# - Suite 330, Boston, MA 02111-1307, USA. |
# - Suite 330, Boston, MA 02111-1307, USA. |
18 |
# |
# |
19 |
# Copyright 2000-2002 Free Software Foundation |
# Copyright 2000-2003 Free Software Foundation |
20 |
# |
# |
21 |
# FILE: |
# FILE: |
22 |
# GDataObjects.py |
# GDataObjects.py |
125 |
return self._createResultSet( |
return self._createResultSet( |
126 |
GConditions.combineConditions(conditions, self._staticCondition), |
GConditions.combineConditions(conditions, self._staticCondition), |
127 |
readOnly=readOnly, masterRecordSet=masterRecordSet, sql=sql) |
readOnly=readOnly, masterRecordSet=masterRecordSet, sql=sql) |
128 |
|
|
129 |
# Designed to be replaced by vendor-specific code |
# Designed to be replaced by vendor-specific code |
130 |
def _createResultSet(self, conditions={}, readOnly=0, masterRecordSet=None): |
def _createResultSet(self, conditions={}, readOnly=0, masterRecordSet=None): |
131 |
pass |
pass |
133 |
# Do not over-ride by vendor code |
# Do not over-ride by vendor code |
134 |
def getQueryString(self,conditions={},forDetailSQL=None,additionalSQL=""): |
def getQueryString(self,conditions={},forDetailSQL=None,additionalSQL=""): |
135 |
return self._buildQuery(conditions,forDetailSQL,additionalSQL) |
return self._buildQuery(conditions,forDetailSQL,additionalSQL) |
136 |
|
|
137 |
def createEmptyResultSet(self, readOnly=0, masterRecordSet=None): |
def createEmptyResultSet(self, readOnly=0, masterRecordSet=None): |
138 |
return self._createEmptyResultSet(readOnly, masterRecordSet) |
return self._createEmptyResultSet(readOnly, masterRecordSet) |
139 |
|
|
165 |
string.lower(dataObject.detaillink) or "", ',') |
string.lower(dataObject.detaillink) or "", ',') |
166 |
|
|
167 |
if len(dataObject._masterfields) != len(dataObject._detailfields): |
if len(dataObject._masterfields) != len(dataObject._detailfields): |
168 |
raise MasterDetailFieldMismatch, "master=%s; detail=%s" % \ |
tmsg = _("master=%s; detail=%s") % (dataObject._masterfields, dataObject._detailfields) |
169 |
(dataObject._masterfields, dataObject._detailfields) |
raise MasterDetailFieldMismatch, tmsg |
170 |
|
|
171 |
# Make sure "master" fields will be in our future query |
# Make sure "master" fields will be in our future query |
172 |
for field in dataObject._masterfields: |
for field in dataObject._masterfields: |
251 |
|
|
252 |
# write Schema to Database |
# write Schema to Database |
253 |
def writeSchema(self,obj,overwrite=0): |
def writeSchema(self,obj,overwrite=0): |
254 |
raise NoWriteSchemaSupport,"This database adapter doesn't have 'schema writing' support" |
tmsg = _("This database adapter doesn't have 'schema writing' support") |
255 |
|
raise NoWriteSchemaSupport, tmsg |
256 |
|
|
257 |
# Called when new record master in master/detail is queried |
# Called when new record master in master/detail is queried |
258 |
def _masterRecordChanged(self, master): |
def _masterRecordChanged(self, master): |
265 |
if (not master.current._cachedDetailResultSets.has_key(self)) or \ |
if (not master.current._cachedDetailResultSets.has_key(self)) or \ |
266 |
( not int(gConfig('CacheDetailRecords')) and \ |
( not int(gConfig('CacheDetailRecords')) and \ |
267 |
not master.current._cachedDetailResultSets[self].isPending() ): |
not master.current._cachedDetailResultSets[self].isPending() ): |
268 |
|
doQuery = None |
269 |
for i in range(0, len(self._masterfields)): |
for i in range(0, len(self._masterfields)): |
270 |
GDebug.printMesg(10,"Adding criteria") |
GDebug.printMesg(10,"Adding criteria") |
271 |
criteria[string.strip(self._detailfields[i])] = \ |
criteria[string.strip(self._detailfields[i])] = \ |
272 |
master.current.getField(string.strip(self._masterfields[i])) |
master.current.getField(string.strip(self._masterfields[i])) |
273 |
|
|
274 |
|
#If all are set to None then this will prevent the details |
275 |
|
#from being queried. This happens are startup with blank master |
276 |
|
#datasources. |
277 |
|
doQuery = doQuery or master.current.getField(string.strip(self._masterfields[i])) |
278 |
|
|
279 |
GDebug.printMesg(10,master.current.getField(self._masterfields[i])) |
GDebug.printMesg(10,master.current.getField(self._masterfields[i])) |
280 |
master.current.addDetailResultSet(self.createResultSet(\ |
if doQuery: |
281 |
|
master.current.addDetailResultSet(self.createResultSet(\ |
282 |
conditions=criteria, masterRecordSet=master.current)) |
conditions=criteria, masterRecordSet=master.current)) |
283 |
|
else: |
284 |
|
master.current.addDetailResultSet(self.createEmptyResultSet()) |
285 |
## master.current._cachedDetailResultSets[self] = \ |
## master.current._cachedDetailResultSets[self] = \ |
286 |
## self.createResultSet(conditions=criteria, masterRecordSet=master.current) |
## self.createResultSet(conditions=criteria, masterRecordSet=master.current) |
287 |
return master.current._cachedDetailResultSets[self] |
return master.current._cachedDetailResultSets[self] |
321 |
|
|
322 |
# Returns 1=At first record, 0=Not first record |
# Returns 1=At first record, 0=Not first record |
323 |
def isFirstRecord(self): |
def isFirstRecord(self): |
324 |
return (self._currentRecord == 1) |
return (self._currentRecord == 0) |
325 |
|
|
326 |
|
|
327 |
|
# Returns 1=At last record, 0=Not last record |
328 |
|
def isLastRecord(self): |
329 |
|
if self._currentRecord < len(self._cachedRecords) - 1 or \ |
330 |
|
self._cacheNextRecord(): |
331 |
|
return 0 |
332 |
|
else: |
333 |
|
return 1 |
334 |
|
|
335 |
|
|
336 |
# returns -1=No records in memory, #=Current record # |
# returns -1=No records in memory, #=Current record # |
355 |
|
|
356 |
# Get a specific record (0=based) |
# Get a specific record (0=based) |
357 |
def getRecord(self, record): |
def getRecord(self, record): |
358 |
while (record + 1 > len(self._cachedRecords)) and self._loadNextRecord(): |
while (record + 1 > len(self._cachedRecords)) and self._cacheNextRecord(): |
359 |
pass |
pass |
360 |
|
|
361 |
if record + 1 > len(self._cachedRecords): |
if record + 1 > len(self._cachedRecords): |
367 |
# move to record #, returns 1=New record loaded, 0=invalid # |
# move to record #, returns 1=New record loaded, 0=invalid # |
368 |
def setRecord(self, record): |
def setRecord(self, record): |
369 |
|
|
370 |
while (record > len(self._cachedRecords) -1) and self._loadNextRecord(): |
while (record > len(self._cachedRecords) -1) and self._cacheNextRecord(): |
371 |
pass |
pass |
372 |
|
|
373 |
if record >= len(self._cachedRecords): |
if record >= len(self._cachedRecords): |
381 |
# returns 1=New record loaded, 0=No more records |
# returns 1=New record loaded, 0=No more records |
382 |
def nextRecord(self): |
def nextRecord(self): |
383 |
if self._currentRecord + 1 == len(self._cachedRecords): |
if self._currentRecord + 1 == len(self._cachedRecords): |
384 |
if not self._loadNextRecord(): |
if not self._cacheNextRecord(): |
385 |
return 0 |
return 0 |
386 |
|
|
387 |
self._currentRecord += 1 |
self._currentRecord += 1 |
404 |
# returns 1=at first record, 0=No records loaded |
# returns 1=at first record, 0=No records loaded |
405 |
def firstRecord(self): |
def firstRecord(self): |
406 |
if self._currentRecord < 0: |
if self._currentRecord < 0: |
407 |
if not self._loadNextRecord(): |
if not self._cacheNextRecord(): |
408 |
return 0 |
return 0 |
409 |
|
|
410 |
self._currentRecord = 0 |
self._currentRecord = 0 |
419 |
if self._currentRecord == -1: |
if self._currentRecord == -1: |
420 |
return 0 |
return 0 |
421 |
else: |
else: |
422 |
while self._loadNextRecord(): |
while self._cacheNextRecord(): |
423 |
pass |
pass |
424 |
self._currentRecord = len(self._cachedRecords) - 1 |
self._currentRecord = len(self._cachedRecords) - 1 |
425 |
self.current = self._cachedRecords[self._currentRecord] |
self.current = self._cachedRecords[self._currentRecord] |
432 |
def insertRecord(self): |
def insertRecord(self): |
433 |
if self.isReadOnly(): |
if self.isReadOnly(): |
434 |
# Provide better feedback?? |
# Provide better feedback?? |
435 |
raise ReadOnlyError, _("Attempted to insert into a read only datasource") |
tmsg = _("Attempted to insert into a read only datasource") |
436 |
|
raise ReadOnlyError, tmsg |
437 |
else: |
else: |
438 |
GDebug.printMesg(7,'Inserting a blank record') |
GDebug.printMesg(7,'Inserting a blank record') |
439 |
self._currentRecord += 1 |
self._currentRecord += 1 |
543 |
return self._dataObject._fieldReferences.has_key(string.lower(fieldName)) |
return self._dataObject._fieldReferences.has_key(string.lower(fieldName)) |
544 |
|
|
545 |
|
|
546 |
|
# Load cacheCount number of new records |
547 |
|
def _cacheNextRecord(self): |
548 |
|
rs = self._loadNextRecord() |
549 |
|
if rs: |
550 |
|
self._dataObject._dataSource._onRecordLoaded(self._cachedRecords[-1]) |
551 |
|
return rs |
552 |
|
|
553 |
|
|
554 |
|
|
555 |
### |
### |
556 |
### Methods below should be overridden by Vendor Specific functions |
### Methods below should be overridden by Vendor Specific functions |
557 |
### (_createEmptyRecord may not need to be overridden in all cases) |
### (_createEmptyRecord may not need to be overridden in all cases) |
561 |
def _loadNextRecord(self): |
def _loadNextRecord(self): |
562 |
return 0 |
return 0 |
563 |
|
|
|
|
|
564 |
# Create an empty recordset |
# Create an empty recordset |
565 |
def _createEmptyRecord(self): |
def _createEmptyRecord(self): |
566 |
return self._recordSetClass(self) |
return self._recordSetClass(self) |
597 |
self._fields = {} |
self._fields = {} |
598 |
self._fields.update(defaultData) |
self._fields.update(defaultData) |
599 |
|
|
|
|
|
600 |
# Returns 1=Record has uncommitted changes |
# Returns 1=Record has uncommitted changes |
601 |
def isPending(self): |
def isPending(self): |
602 |
|
|
640 |
self._updateFlag = value |
self._updateFlag = value |
641 |
if not value: |
if not value: |
642 |
self._modifiedFlags.clear() |
self._modifiedFlags.clear() |
643 |
|
|
644 |
def getInitialData(self): |
def getInitialData(self): |
645 |
return self._initialData |
return self._initialData |
646 |
|
|
647 |
def getFields(self): |
def getFields(self): |
648 |
return self._fields |
return self._fields |
649 |
|
|
650 |
|
|
651 |
# Returns current value of "field" |
# Returns current value of "field" |
652 |
def getField(self, field): |
def getField(self, field): |
653 |
try: |
try: |
676 |
# generate an error. |
# generate an error. |
677 |
if self._parent.isFieldBound(field) and self._parent.isReadOnly(): |
if self._parent.isFieldBound(field) and self._parent.isReadOnly(): |
678 |
# Provide better feedback?? |
# Provide better feedback?? |
679 |
raise ReadOnlyError, _("Attempted to modify read only field '%s'") % field |
tmsg = _("Attempted to modify read only field '%s'") % field |
680 |
|
raise ReadOnlyError, tmsg |
681 |
else: |
else: |
682 |
fn = string.lower(field) |
fn = string.lower(field) |
683 |
self._fields[fn] = value |
self._fields[fn] = value |
684 |
if trackMod == 1: |
if trackMod == 1: |
|
self._emptyFlag = 0 |
|
685 |
if self._parent.isFieldBound(field): |
if self._parent.isFieldBound(field): |
686 |
|
self._emptyFlag = 0 |
687 |
self._updateFlag = 1 |
self._updateFlag = 1 |
688 |
self._modifiedFlags[fn] = 1 |
self._modifiedFlags[fn] = 1 |
689 |
|
|
715 |
def delete(self): |
def delete(self): |
716 |
if self._parent.isReadOnly(): |
if self._parent.isReadOnly(): |
717 |
# Provide better feedback?? |
# Provide better feedback?? |
718 |
raise ReadOnlyError, _("Attempted to delete from a read only datasource") |
tmsg = _("Attempted to delete from a read only datasource") |
719 |
|
raise ReadOnlyError, tmsg |
720 |
else: |
else: |
721 |
self._deleteFlag = 1 |
self._deleteFlag = 1 |
722 |
|
|