[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r9783 - in trunk: gnue-appserver/src gnue-common/src/datasources
From: |
johannes |
Subject: |
[gnue] r9783 - in trunk: gnue-appserver/src gnue-common/src/datasources gnue-common/src/datasources/drivers/Base gnue-common/src/datasources/drivers/DBSIG2 gnue-common/src/datasources/drivers/file gnue-common/src/datasources/drivers/other |
Date: |
Wed, 26 Sep 2007 07:44:16 -0500 (CDT) |
Author: johannes
Date: 2007-09-26 07:44:15 -0500 (Wed, 26 Sep 2007)
New Revision: 9783
Modified:
trunk/gnue-appserver/src/data.py
trunk/gnue-common/src/datasources/GDataSource.py
trunk/gnue-common/src/datasources/drivers/Base/Connection.py
trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py
trunk/gnue-common/src/datasources/drivers/file/inifile.py
trunk/gnue-common/src/datasources/drivers/other/appserver.py
Log:
Improved handing of row-id-fields. Do not automatically add
row-id-fields or primary-key-fields to read-only resultsets.
Modified: trunk/gnue-appserver/src/data.py
===================================================================
--- trunk/gnue-appserver/src/data.py 2007-09-26 08:16:07 UTC (rev 9782)
+++ trunk/gnue-appserver/src/data.py 2007-09-26 12:44:15 UTC (rev 9783)
@@ -677,7 +677,7 @@
datasource = _createDatasource (connections, database, content, order)
condition = GConditions.buildCondition (conditions)
- return datasource.createResultSet (condition)
+ return datasource.createResultSet (condition, True)
# =============================================================================
@@ -910,7 +910,7 @@
if self.__cache.inserted:
for (table, row) in self.__orderInserts ():
fields = tables [table] [row]
- self.__backend.insert (table, fields)
+ self.__backend.insert (table, {'gnue_id': row}, fields)
if not self.__backend._need_rollback_after_exception_:
self.__cache.makeClean (table, row)
Modified: trunk/gnue-common/src/datasources/GDataSource.py
===================================================================
--- trunk/gnue-common/src/datasources/GDataSource.py 2007-09-26 08:16:07 UTC
(rev 9782)
+++ trunk/gnue-common/src/datasources/GDataSource.py 2007-09-26 12:44:15 UTC
(rev 9783)
@@ -178,7 +178,7 @@
def __trigger_simpleQuery (self, maskDict):
conditions = GConditions.buildConditionFromDict (
maskDict, GConditions.GClike)
- resultSet = self.createResultSet (conditions)
+ resultSet = self.createResultSet (conditions, True)
return [record.getFieldsAsDict () for record in resultSet]
# ---------------------------------------------------------------------------
@@ -265,8 +265,6 @@
# primarykey attribute: remember them and reference them
if hasattr (self, 'primarykey'):
self.__primarykeyFields = self.primarykey.split (',')
- # Make sure the primary key is included in the field references
- self.referenceFields (self.__primarykeyFields)
if hasattr(self, 'rowid'):
self.__exp_rowid = self.rowid
@@ -314,17 +312,10 @@
primarykeyFields = self._connection._primarykeyFields_
if primarykeyFields:
self.__primarykeyFields = primarykeyFields
- self.referenceFields (self.__primarykeyFields)
- # Include the rowid in list of field references
rowidField = self._connection._rowidField_ or self.__exp_rowid
if rowidField:
- # TODO: checks if the rowid is available and should be used go here:
- # 1. if primary key should be prefered, don't set self.__rowidField
- # 2. try if rowidField is available in current table/view
- if not self.__primarykeyFields:
- self.__rowidField = rowidField
- self.referenceField (self.__rowidField)
+ self.__rowidField = rowidField
# Add ourselves into the "global" datasource dictionary
self._topObject._datasourceDictionary [self.name.lower ()] = self
@@ -640,10 +631,12 @@
resultset = self.__newResultSet (readOnly, masterRecord)
+ fields = self.__get_fields(readOnly)
+
if self.type == 'object':
resultset.query ('object', self.cache,
table = self.table,
- fieldnames = self.__fieldReferences.keys (),
+ fieldnames = fields,
condition = cond,
sortorder = self.__sortorder and self.__sortorder or [],
distinct = self.distinct)
@@ -692,6 +685,8 @@
self.__masterPkFields, self.__masterFkFields):
defaultData [detailfield] = masterRecord.getField (masterfield)
+ fields = self.__get_fields(readOnly)
+
# Create the ResultSet instance
return self.__resultSetClass (
defaultData = defaultData,
@@ -700,7 +695,7 @@
rowidField = self.__rowidField,
primarykeyFields = self.__primarykeyFields,
primarykeySeq = self.primarykeyseq,
- boundFields = self.__fieldReferences.keys (),
+ boundFields = fields,
requery = self.requery,
readonly = readOnly,
details = self.__details,
@@ -711,6 +706,24 @@
# Activate a result set
# ---------------------------------------------------------------------------
+ def __get_fields(self, readOnly):
+
+ fields = self.__fieldReferences.keys()
+ if not readOnly and self.type != 'unbound':
+ if self.__rowidField and not self.__rowidField in fields:
+ fields.append(self.__rowidField)
+
+ if self.__primarykeyFields:
+ for pkf in self.__primarykeyFields:
+ if not pkf in fields:
+ fields.append(pkf)
+ return fields
+
+
+ # ---------------------------------------------------------------------------
+ # Activate a result set
+ # ---------------------------------------------------------------------------
+
def _activateResultSet (self, resultSet):
"""
Make the given result set the active result set for this datasource.
Modified: trunk/gnue-common/src/datasources/drivers/Base/Connection.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/Connection.py
2007-09-26 08:16:07 UTC (rev 9782)
+++ trunk/gnue-common/src/datasources/drivers/Base/Connection.py
2007-09-26 12:44:15 UTC (rev 9783)
@@ -226,11 +226,13 @@
# Insert a new record in the backend
# ---------------------------------------------------------------------------
- def insert (self, table, newfields):
+ def insert (self, table, oldfields, newfields):
"""
Insert a new record in the backend.
@param table: Table name.
+ @param oldfields: Fieldname/Value dictionary of fields to find the existing
+ record (aka where-clause).
@param newfields: Fieldname/Value dictionary of data to insert.
@return: The rowid of the newly inserted record, or None if no rowid's are
supported.
@@ -242,7 +244,7 @@
checktype (newfields, dict)
assert gEnter (8)
- rowid = self._insert_ (table, newfields)
+ rowid = self._insert_ (table, oldfields, newfields)
self.__pending = True
assert gLeave (8, rowid)
return rowid
@@ -549,7 +551,7 @@
# ---------------------------------------------------------------------------
- def _insert_ (self, table, newfields):
+ def _insert_ (self, table, oldfields, newfields):
"""
Insert a new record in the backend (to be implemented by descendants).
@@ -558,6 +560,8 @@
record must be returned from this method.
@param table: Table name.
+ @param oldfields: Fieldname/Value dictionary of fields to find the existing
+ record (aka where-clause)
@param newfields: Fieldname/Value dictionary of data to insert.
@return: The rowid of the newly inserted record, or None if no rowid's are
supported.
Modified: trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2007-09-26
08:16:07 UTC (rev 9782)
+++ trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2007-09-26
12:44:15 UTC (rev 9783)
@@ -194,16 +194,11 @@
self.__fields = dict.fromkeys (self.__boundFields, None)
self.__initialData = self.__fields.copy ()
- # 3. Set the primary key fields to dirty, so they will be included in the
- # insert statement in any case.
- for fieldname in self.__primarykeyFields:
- self.__modifiedFlags [fieldname] = True
-
- # 4. Get default values from DataSource (includes link to master).
+ # 3. Get default values from DataSource (includes link to master).
for (fieldname, value) in defaultData.items ():
self [fieldname] = value
- # 5. Notify event listener about new record
+ # 4. Notify event listener about new record
self.__dispatchEvent ('dsRecordInserted')
self.__initializing = False
@@ -586,15 +581,27 @@
modifiedFields [field] = self.__fields [field]
if self.__inserted:
- rowid = self.__connection.insert (self.__tablename, modifiedFields)
+ rowid = self.__connection.insert (self.__tablename,
+ self.__wherefields(), modifiedFields)
+
+ id_field = None
if self.__rowidField:
- self.__fields [self.__rowidField] = rowid
+ id_field = self.__rowidField
+ else:
+ if len (self.__primarykeyFields) == 1 and \
+ self [self.__primarykeyFields [0]] is None and \
+ self.__primarykeySeq is None and rowid is not None:
+ id_field = self.__primarykeyFields[0]
+
+ if id_field:
+ self.__fields [id_field] = rowid
# Also set initialData so the requery can work
- self.__initialData [self.__rowidField] = rowid
+ self.__initialData [id_field] = rowid
# Requery all the fields that are important for inserting details.
# A backend trigger could have e.g. generated a primary key.
# TODO: We could save this work for cases where the detail
# resultsets don't have any inserted records.
+
if self.__detailLinkFlags:
self.__do_requery (self.__detailLinkFlags.keys ())
else:
Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2007-09-26
08:16:07 UTC (rev 9782)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2007-09-26
12:44:15 UTC (rev 9783)
@@ -780,10 +780,11 @@
@param otherResultSet: the other ResultSet to merge
"""
- if self.__primarykeyFields:
+ if self.__rowidField:
+ keyFields = [self.__rowidField]
+
+ elif self.__primarykeyFields:
keyFields = self.__primarykeyFields
- elif self.__rowidField:
- keyFields = [self.__rowidField]
else:
return
Modified: trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py
2007-09-26 08:16:07 UTC (rev 9782)
+++ trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py
2007-09-26 12:44:15 UTC (rev 9783)
@@ -123,7 +123,7 @@
# ---------------------------------------------------------------------------
- def _insert_ (self, table, newfields):
+ def _insert_ (self, table, oldfields, newfields):
fields = []
values = []
parameters = {}
Modified: trunk/gnue-common/src/datasources/drivers/file/inifile.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/file/inifile.py 2007-09-26
08:16:07 UTC (rev 9782)
+++ trunk/gnue-common/src/datasources/drivers/file/inifile.py 2007-09-26
12:44:15 UTC (rev 9783)
@@ -172,7 +172,7 @@
# Insert new record
# ---------------------------------------------------------------------------
- def _insert_ (self, table, newfields):
+ def _insert_ (self, table, oldfields, newfields):
parser = self.__getParser (self._getFilename (table), table)
Modified: trunk/gnue-common/src/datasources/drivers/other/appserver.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/other/appserver.py
2007-09-26 08:16:07 UTC (rev 9782)
+++ trunk/gnue-common/src/datasources/drivers/other/appserver.py
2007-09-26 12:44:15 UTC (rev 9783)
@@ -435,9 +435,9 @@
# ---------------------------------------------------------------------------
- def _insert_ (self, table, newfields):
+ def _insert_ (self, table, oldfields, newfields):
f = newfields.copy ()
- id = f.pop (u'gnue_id')
+ id = oldfields[u'gnue_id']
self._session.store (table, [id], f.keys (), [f.values ()])
# ---------------------------------------------------------------------------
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r9783 - in trunk: gnue-appserver/src gnue-common/src/datasources gnue-common/src/datasources/drivers/Base gnue-common/src/datasources/drivers/DBSIG2 gnue-common/src/datasources/drivers/file gnue-common/src/datasources/drivers/other,
johannes <=