commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r7304 - trunk/gnue-common/src/datasources/drivers/Base


From: reinhard
Subject: [gnue] r7304 - trunk/gnue-common/src/datasources/drivers/Base
Date: Wed, 6 Apr 2005 17:00:04 -0500 (CDT)

Author: reinhard
Date: 2005-04-06 17:00:03 -0500 (Wed, 06 Apr 2005)
New Revision: 7304

Modified:
   trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
Log:
Added support for new generator-based descendant implementation. Added readonly
as a parameter to ResultSet constructor.


Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-06 
18:30:21 UTC (rev 7303)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-06 
22:00:03 UTC (rev 7304)
@@ -41,12 +41,13 @@
   # Constructor
   # ---------------------------------------------------------------------------
 
-  def __init__ (self, dataObject, defaultValues = {}, masterRecordSet = None):
+  def __init__ (self, dataObject, defaultValues = {}, readonly = False,
+                masterRecordSet = None):
      self._dataObject = dataObject
      self._cachedRecords = []
      self._currentRecord = -1
      self._masterRecordSet = masterRecordSet
-     self._readonly = False
+     self._readonly = readonly
      self._recordCount = 0
      self._postingRecord = None
 
@@ -60,8 +61,13 @@
        self.__rowidField       = None
        self.__primarykeyFields = []
 
+     # Objects to get informed about record navigation events
      self.__listeners = []
 
+     # Generator to yield fieldname/value dictionaries
+     self.__generator = None
+
+     # Records that have to be requeried after the post
      self.__recordsToRequery = []
 
      self.current = None
@@ -71,6 +77,31 @@
 
 
   # ---------------------------------------------------------------------------
+  # Execute a query
+  # ---------------------------------------------------------------------------
+
+  def query (self, type, **kwargs):
+    """
+    Populate the resultset with data.
+
+    @param type: Type of the query, can be 'object' or 'sql'.
+    @param **kwargs: Depends on the type.
+    """
+
+    queryfunc = '_query_' + type
+    if not hasattr (self, queryfunc):
+      raise Exceptions.ObjectTypeNotAvailableError, type
+
+    getattr (self, queryfunc) (self._dataObject._dataSource._connection,
+                               **kwargs)
+
+    self.__generator = self._fetch (self._dataObject.cache)
+
+    # (TODO: could be delayed to first call of getRecordCount)
+    self._recordCount = self._count ()
+
+
+  # ---------------------------------------------------------------------------
   # Status information
   # ---------------------------------------------------------------------------
 
@@ -522,10 +553,26 @@
   # Virtual methods
   # ---------------------------------------------------------------------------
 
-  # Load cacheCount number of new records
-  def _loadNextRecord(self):
-    return False
+  # Load cacheCount number of new records (deprecated)
+  def _loadNextRecord (self):
 
+    if not self.__generator:
+      return False
+
+    try:
+      row = self.__generator.next ()
+    except StopIteration:
+      return False
+
+    record = RecordSet (parent           = self,
+                        initialData      = row,
+                        rowidField       = self.__rowidField,
+                        primarykeyFields = self.__primarykeyFields)
+
+    self._cachedRecords.append (record)
+    return True
+
+
   # ---------------------------------------------------------------------------
 
   # Create an empty recordset
@@ -534,8 +581,34 @@
         rowidField = self.__rowidField,
         primarykeyFields = self.__primarykeyFields)
 
+  # ---------------------------------------------------------------------------
 
+  def _count (self):
+    """
+    Return the number of records returned by the query.
+
+    @return: Number of records that will be yielded by @L{_fetch}.
+    """
+    return 0
+
   # ---------------------------------------------------------------------------
+
+  def _fetch (self, cachesize):
+    """
+    Yield records from the query.
+
+    Descendants must overwrite this function to return a sequence of
+    fieldname/value dictionaries.
+
+    @param cachesize: Recommended cache size the driver should use to
+    communicate with the backend.
+    @return: A generator for fieldname/value dictionaries.
+    """
+    for record in []:
+      yield record
+
+
+  # ---------------------------------------------------------------------------
   # Sequence behaviour
   # ---------------------------------------------------------------------------
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]