[CalendarServer-changes] [9286] CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/ datastore

source_changes at macosforge.org source_changes at macosforge.org
Thu May 24 13:34:09 PDT 2012


Revision: 9286
          http://trac.macosforge.org/projects/calendarserver/changeset/9286
Author:   glyph at apple.com
Date:     2012-05-24 13:34:09 -0700 (Thu, 24 May 2012)
Log Message:
-----------
Fix and test for UUID normalization on specific columns rather than dumb
uppercasing.

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py
    CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/test/test_sql.py

Modified: CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py	2012-05-24 20:34:06 UTC (rev 9285)
+++ CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py	2012-05-24 20:34:09 UTC (rev 9286)
@@ -85,9 +85,11 @@
 from twistedcaldav.dateops import datetimeMktime, parseSQLTimestamp,\
     pyCalendarTodatetime
 from txdav.xml.rfc2518 import DisplayName
-from twext.enterprise.dal.syntax import Upper
-from twext.enterprise.dal.syntax import Constant
 
+from txdav.base.datastore.util import normalizeUUIDOrNot
+from twext.enterprise.dal.syntax import ColumnSyntax
+from twext.enterprise.dal.syntax import TableSyntax
+
 from cStringIO import StringIO
 from sqlparse import parse
 import collections
@@ -4117,20 +4119,50 @@
 
 
 
-def _upcaseColumn(column):
+ at inlineCallbacks
+def _upcaseColumnUUIDs(txn, column):
     """
-    Generate query to upper-case a single column.
+    Upper-case the UUIDs in the given SQL DAL column.
 
-    @param column: the column to uppercase
+    @param txn: The transaction.
+    @type txn: L{CommonStoreTransaction}
+
+    @param column: the column to uppercase.  Note
     @type column: L{ColumnSyntax}
 
-    @return: a query that, when executed, will cause the given column to become
-        upper-case according to the database's C{UPPER} function.
+    @return: A L{Deferred} that will fire when the upper-casing of the given
+        column has completed.
     """
-    return Update({column: Upper(column)}, Where=Constant(True))
+    tableModel = column.model.table
+    pkey = [ColumnSyntax(columnModel)
+            for columnModel in tableModel.primaryKey]
+    for row in (yield Select([column] + pkey,
+                             From=TableSyntax(tableModel)).on(txn)):
+        before = row[0]
+        pkeyparts = row[1:]
+        after = normalizeUUIDOrNot(before)
+        if after != before:
+            where = _AndNothing
+            for pkeycol, pkeypart in zip(pkeyparts, pkey):
+                where = where.And(pkeycol == pkeypart)
+            yield Update({column: after}, Where=where).on(txn)
 
 
 
+class _AndNothing(object):
+    """
+    Simple placeholder for iteratively generating a 'Where' clause; the 'And'
+    just returns its argument, so it can be used at the start of the loop.
+    """
+    @staticmethod
+    def And(self):
+        """
+        Return the argument.
+        """
+        return self
+
+
+
 @inlineCallbacks
 def fixCaseNormalization(store):
     """
@@ -4140,8 +4172,8 @@
     try:
         yield _normalizeHomeUUIDsIn(t, ECALENDARTYPE)
         yield _normalizeHomeUUIDsIn(t, EADDRESSBOOKTYPE)
-        yield _upcaseColumn(schema.RESOURCE_PROPERTY.VIEWER_UID).on(t)
-        yield _upcaseColumn(schema.APN_SUBSCRIPTIONS.SUBSCRIBER_GUID).on(t)
+        yield _upcaseColumnUUIDs(t, schema.RESOURCE_PROPERTY.VIEWER_UID)
+        yield _upcaseColumnUUIDs(t, schema.APN_SUBSCRIPTIONS.SUBSCRIBER_GUID)
     except:
         log_err()
         yield t.abort()

Modified: CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/test/test_sql.py
===================================================================
--- CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/test/test_sql.py	2012-05-24 20:34:06 UTC (rev 9285)
+++ CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/test/test_sql.py	2012-05-24 20:34:09 UTC (rev 9286)
@@ -31,10 +31,11 @@
     CALENDAR_OBJECT_REVISIONS_TABLE
 from txdav.common.datastore.test.util import CommonCommonTests, buildStore
 from txdav.common.icommondatastore import AllRetriesFailed
+from twext.enterprise.dal.syntax import Insert
 
-class SubTransactionTests(CommonCommonTests, TestCase):
+class CommonSQLStoreTests(CommonCommonTests, TestCase):
     """
-    Tests for L{UpgradeToDatabaseService}.
+    Tests for shared functionality in L{txdav.common.datastore.sql}.
     """
 
     @inlineCallbacks
@@ -42,7 +43,7 @@
         """
         Set up two stores to migrate between.
         """
-        yield super(SubTransactionTests, self).setUp()
+        yield super(CommonSQLStoreTests, self).setUp()
         self._sqlStore = yield buildStore(self, self.notifierFactory)
 
 
@@ -304,4 +305,33 @@
         changed = yield homeChild.resourceNamesSinceToken(token)
         self.assertEqual(changed, ([], [],))
 
-        txn.abort()
+        yield txn.abort()
+
+
+    @inlineCallbacks
+    def test_upcaseColumnUUIDs(self):
+        """
+        L{_upcaseColumnUUIDs} upper-cases only UUIDs in a given column.
+        """
+        rp = schema.RESOURCE_PROPERTY
+        txn = self.transactionUnderTest()
+        # setup
+        yield Insert({rp.RESOURCE_ID: 1,
+                      rp.NAME: "asdf",
+                      rp.VALUE: "property-value",
+                      rp.VIEWER_UID: "not-a-uuid"}).on(txn)
+        yield Insert({rp.RESOURCE_ID: 2,
+                      rp.NAME: "fdsa",
+                      rp.VALUE: "another-value",
+                      rp.VIEWER_UID: "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}
+                    ).on(txn)
+        # test
+        from txdav.common.datastore.sql import _upcaseColumnUUIDs
+        yield _upcaseColumnUUIDs(txn, rp.VIEWER_UID)
+        self.assertEqual(
+            (yield Select([rp.RESOURCE_ID, rp.NAME,
+                           rp.VALUE, rp.VIEWER_UID], From=rp).on(txn)),
+            [[1, "asdf", "property-value", "not-a-uuid"],
+             [2, "fdsa", "another-value",
+              "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"]]
+        )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120524/d3225bce/attachment-0001.html>


More information about the calendarserver-changes mailing list