[CalendarServer-changes] [7078] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 24 10:06:03 PST 2011


Revision: 7078
          http://trac.macosforge.org/projects/calendarserver/changeset/7078
Author:   cdaboo at apple.com
Date:     2011-02-24 10:06:02 -0800 (Thu, 24 Feb 2011)
Log Message:
-----------
Minor re-factor of new savepoint work.

Modified Paths:
--------------
    CalendarServer/trunk/twext/enterprise/dal/syntax.py
    CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py
    CalendarServer/trunk/txdav/common/datastore/sql.py

Modified: CalendarServer/trunk/twext/enterprise/dal/syntax.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/syntax.py	2011-02-24 16:42:50 UTC (rev 7077)
+++ CalendarServer/trunk/twext/enterprise/dal/syntax.py	2011-02-24 18:06:02 UTC (rev 7078)
@@ -819,7 +819,20 @@
         return SQLFragment('release savepoint %s' % (self.name,))
 
 
+class SavepointAction(object):
+    
+    def __init__(self, name):
+        self._name = name
+    
+    def acquire(self, txn):
+        return Savepoint(self._name).on(txn)
 
+    def rollback(self, txn):
+        return RollbackToSavepoint(self._name).on(txn)
+
+    def release(self, txn):
+        return ReleaseSavepoint(self._name).on(txn)
+
 class SQLFragment(object):
     """
     Combination of SQL text and arguments; a statement which may be executed

Modified: CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py	2011-02-24 16:42:50 UTC (rev 7077)
+++ CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py	2011-02-24 18:06:02 UTC (rev 7078)
@@ -23,7 +23,7 @@
 from twext.enterprise.dal.syntax import (
     SchemaSyntax, Select, Insert, Update, Delete, Lock, SQLFragment,
     TableMismatch, Parameter, Max, Len, NotEnoughValues
-)
+, Savepoint, RollbackToSavepoint, ReleaseSavepoint, SavepointAction)
 
 from twext.enterprise.dal.syntax import FunctionInvocation
 from twisted.trial.unittest import TestCase
@@ -583,6 +583,33 @@
                           SQLFragment("lock table FOO in exclusive mode"))
 
 
+    def test_savepoint(self):
+        """
+        L{Savepoint} generates a ('savepoint') statement.
+        """
+        self.assertEquals(Savepoint("test").toSQL(),
+                          SQLFragment("savepoint test"))
+
+    def test_rollbacktosavepoint(self):
+        """
+        L{RollbackToSavepoint} generates a ('rollback to savepoint') statement.
+        """
+        self.assertEquals(RollbackToSavepoint("test").toSQL(),
+                          SQLFragment("rollback to savepoint test"))
+
+    def test_releasesavepoint(self):
+        """
+        L{ReleaseSavepoint} generates a ('release savepoint') statement.
+        """
+        self.assertEquals(ReleaseSavepoint("test").toSQL(),
+                          SQLFragment("release savepoint test"))
+
+    def test_savepointaction(self):
+        """
+        L{SavepointAction} generates a ('savepoint') statement.
+        """
+        self.assertEquals(SavepointAction("test")._name, "test")
+
     def test_limit(self):
         """
         A L{Select} object with a 'Limit' keyword parameter will generate

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2011-02-24 16:42:50 UTC (rev 7077)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2011-02-24 18:06:02 UTC (rev 7078)
@@ -58,17 +58,17 @@
 from txdav.common.inotifications import INotificationCollection, \
     INotificationObject
 
-from twext.enterprise.dal.syntax import Parameter, Max, Savepoint,\
-    RollbackToSavepoint, ReleaseSavepoint
 from twext.python.clsprop import classproperty
-from twext.enterprise.dal.syntax import Select
-from twext.enterprise.dal.syntax import Lock
-from twext.enterprise.dal.syntax import Insert
-from twext.enterprise.dal.syntax import Max
-from twext.enterprise.dal.syntax import default
 from twext.enterprise.dal.syntax import Delete
+from twext.enterprise.dal.syntax import Insert
 from twext.enterprise.dal.syntax import Len
+from twext.enterprise.dal.syntax import Lock
+from twext.enterprise.dal.syntax import Max
+from twext.enterprise.dal.syntax import Parameter
+from twext.enterprise.dal.syntax import SavepointAction
+from twext.enterprise.dal.syntax import Select
 from twext.enterprise.dal.syntax import Update
+from twext.enterprise.dal.syntax import default
 
 from txdav.base.propertystore.base import PropertyName
 from txdav.base.propertystore.none import PropertyStore as NonePropertyStore
@@ -77,8 +77,6 @@
 from twistedcaldav.customxml import NotificationType
 from twistedcaldav.dateops import datetimeMktime, parseSQLTimestamp
 
-import pg
-
 v1_schema = getModule(__name__).filePath.sibling("sql_schema_v1.sql").getContent()
 
 log = Logger()
@@ -2364,10 +2362,6 @@
         Return=_homeSchema.RESOURCE_ID
     )
 
-    _savePointNotificationsWithUID = Savepoint("notificationsWithUID")
-    _rollbackNotificationsWithUID = RollbackToSavepoint("notificationsWithUID")
-    _releaseNotificationsWithUID = ReleaseSavepoint("notificationsWithUID")
-
     @property
     def _home(self):
         """
@@ -2388,14 +2382,15 @@
         else:
             # Use savepoint so we can do a partial rollback if there is a race condition
             # where this row has already been inserted
-            yield cls._savePointNotificationsWithUID.on(txn)
+            savepoint = SavepointAction("notificationsWithUID")
+            yield savepoint.acquire(txn)
 
             try:
                 resourceID = str((
                     yield cls._provisionNewNotificationsQuery.on(txn, uid=uid)
                 )[0][0])
             except Exception: # FIXME: Really want to trap the pg.DatabaseError but in a non-DB specific manner
-                yield cls._rollbackNotificationsWithUID.on(txn)
+                yield savepoint.rollback(txn)
                 
                 # Retry the query - row may exist now, if not re-raise
                 rows = yield cls._resourceIDFromUIDQuery.on(txn, uid=uid)
@@ -2406,7 +2401,7 @@
                     raise
             else:
                 created = True
-                yield cls._releaseNotificationsWithUID.on(txn)
+                yield savepoint.release(txn)
                 
         collection = cls(txn, uid, resourceID)
         yield collection._loadPropertyStore()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110224/cc3b1bd6/attachment.html>


More information about the calendarserver-changes mailing list