[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