33 |
import GConditions |
import GConditions |
34 |
import string |
import string |
35 |
|
|
36 |
|
postingRecordset = None |
37 |
|
|
38 |
class Error(StandardError): |
class Error(StandardError): |
39 |
# Base exception |
# Base exception |
40 |
pass |
pass |
75 |
# Generic error reading from the database connection |
# Generic error reading from the database connection |
76 |
pass |
pass |
77 |
|
|
78 |
|
class DataTypeNotAvailable(Error): |
79 |
|
# Raised when a datatype is not supported by an database |
80 |
|
# during writing a schema definition to the database |
81 |
|
pass |
82 |
|
|
83 |
|
class NoWriteSchemaSupport(Error): |
84 |
|
# Raised when a database adapter doesn't support |
85 |
|
# writing Schema to datasource |
86 |
|
pass |
87 |
|
|
88 |
|
|
89 |
|
|
90 |
########################################################### |
########################################################### |
116 |
self._defaultValues = {} |
self._defaultValues = {} |
117 |
self.triggerExtensions = None |
self.triggerExtensions = None |
118 |
|
|
|
|
|
119 |
# Do we have a master datasource? |
# Do we have a master datasource? |
120 |
def hasMaster(self): |
def hasMaster(self): |
121 |
return self._masterObject != None |
return self._masterObject != None |
122 |
|
|
123 |
# Do not over-ride by vendor code |
# Do not over-ride by vendor code |
124 |
def createResultSet(self, conditions={}, readOnly=0, masterRecordSet=None): |
def createResultSet(self, conditions={}, readOnly=0, masterRecordSet=None, sql=""): |
125 |
return self._createResultSet( |
return self._createResultSet( |
126 |
GConditions.combineConditions(conditions, self._staticCondition), |
GConditions.combineConditions(conditions, self._staticCondition), |
127 |
readOnly=readOnly, masterRecordSet=masterRecordSet) |
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 |
132 |
|
|
133 |
# Do not over-ride by vendor code |
# Do not over-ride by vendor code |
134 |
|
def getQueryString(self,conditions={},forDetailSQL=None,additionalSQL=""): |
135 |
|
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 |
|
|
249 |
def getSchemaByName(self, name, type=None): |
def getSchemaByName(self, name, type=None): |
250 |
return None |
return None |
251 |
|
|
252 |
|
# write Schema to Database |
253 |
|
def writeSchema(self,obj,overwrite=0): |
254 |
|
raise NoWriteSchemaSupport,"This database adapter doesn't have 'schema writing' support" |
255 |
|
|
256 |
# Called when new record master in master/detail is queried |
# Called when new record master in master/detail is queried |
257 |
def _masterRecordChanged(self, master): |
def _masterRecordChanged(self, master): |
292 |
self._masterRecordSet = masterRecordSet |
self._masterRecordSet = masterRecordSet |
293 |
self._readonly = 0 |
self._readonly = 0 |
294 |
self._recordCount = 0 |
self._recordCount = 0 |
295 |
|
self._postingRecord = None |
296 |
|
|
297 |
self._defaultValues = {} |
self._defaultValues = {} |
298 |
self._defaultValues.update(defaultValues) |
self._defaultValues.update(defaultValues) |
452 |
return self.current.isPending() |
return self.current.isPending() |
453 |
|
|
454 |
|
|
455 |
|
def getPostingRecordset(self): |
456 |
|
global postingRecordset |
457 |
|
print postingRecordset |
458 |
|
return postingRecordset |
459 |
|
|
460 |
# Post changes to the database |
# Post changes to the database |
461 |
def post(self, foreign_keys={}): |
def post(self, foreign_keys={}): |
462 |
|
global postingRecordset |
463 |
# post our changes |
# post our changes |
464 |
self._update_cursor = self._dataObject._dataConnection.cursor() |
self._update_cursor = self._dataObject._dataConnection.cursor() |
465 |
|
|
466 |
recordPosition = 0 |
recordPosition = 0 |
467 |
while recordPosition < len(self._cachedRecords): |
while recordPosition < len(self._cachedRecords): |
468 |
record = self._cachedRecords[recordPosition] |
self._postingRecord = self._cachedRecords[recordPosition] |
469 |
|
postingRecordset = self._postingRecord |
470 |
delete = record._emptyFlag or record._deleteFlag |
delete = self._postingRecord._emptyFlag or self._postingRecord._deleteFlag |
471 |
if not delete: |
if not delete: |
472 |
# Flip the flag for 'default' values to true so that hidden |
# Flip the flag for 'default' values to true so that hidden |
473 |
# default fields are included in insert statements |
# default fields are included in insert statements |
474 |
if record.isPending(): |
if self._postingRecord.isPending(): |
475 |
for field in self._dataObject._defaultValues.keys(): |
for field in self._dataObject._defaultValues.keys(): |
476 |
record._modifiedFlags[field] = 1 |
self._postingRecord._modifiedFlags[field] = 1 |
477 |
|
|
478 |
for field in foreign_keys.keys(): |
for field in foreign_keys.keys(): |
479 |
record._fields[field] = foreign_keys[field] |
self._postingRecord._fields[field] = foreign_keys[field] |
480 |
# Some DBs will throw an exception if you update a Primary Key |
# Some DBs will throw an exception if you update a Primary Key |
481 |
# (even if you are updating to the same value) |
# (even if you are updating to the same value) |
482 |
if record._insertFlag: |
if self._postingRecord._insertFlag: |
483 |
record._modifiedFlags[field] = 1 |
self._postingRecord._modifiedFlags[field] = 1 |
484 |
|
|
485 |
recordPosition += 1 |
recordPosition += 1 |
486 |
else: |
else: |
491 |
self._cachedRecords.pop(recordPosition) |
self._cachedRecords.pop(recordPosition) |
492 |
self._recordCount -= 1 |
self._recordCount -= 1 |
493 |
|
|
494 |
record.post() |
self._postingRecord.post() |
495 |
|
|
496 |
# Move to record 0 if all preceding records were deleted |
# Move to record 0 if all preceding records were deleted |
497 |
# (or set to -1 if all records were deleted) |
# (or set to -1 if all records were deleted) |
662 |
except AttributeError: |
except AttributeError: |
663 |
pass |
pass |
664 |
|
|
665 |
|
# Batch mode of above setField method |
666 |
|
# If trackMod is set to 0 then the modification flag isn't raised |
667 |
|
def setFields(self, updateDict, trackMod = 1): |
668 |
|
# If this field is bound to a datasource and the datasource is read only, |
669 |
|
# generate an error. |
670 |
|
for field in updateDict.keys(): |
671 |
|
self.setField(field, updateDict[field], trackMod) |
672 |
|
|
673 |
|
|
674 |
# Returns 1=Field has been modified |
# Returns 1=Field has been modified |
675 |
def isFieldModified(self, fieldName): |
def isFieldModified(self, fieldName): |