[CalendarServer-changes] [11895] CalendarServer/branches/users/sagen/groupcacher

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 12 11:19:23 PDT 2014


Revision: 11895
          http://trac.calendarserver.org//changeset/11895
Author:   sagen at apple.com
Date:     2013-11-06 14:20:51 -0800 (Wed, 06 Nov 2013)
Log Message:
-----------
Checkpoint -- groupByGUID will handle adding the row

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/groupcacher/twext/who/delegates.py
    CalendarServer/branches/users/sagen/groupcacher/twext/who/groups.py
    CalendarServer/branches/users/sagen/groupcacher/twext/who/test/test_groups.py
    CalendarServer/branches/users/sagen/groupcacher/txdav/common/datastore/sql.py

Modified: CalendarServer/branches/users/sagen/groupcacher/twext/who/delegates.py
===================================================================
--- CalendarServer/branches/users/sagen/groupcacher/twext/who/delegates.py	2013-11-06 22:19:12 UTC (rev 11894)
+++ CalendarServer/branches/users/sagen/groupcacher/twext/who/delegates.py	2013-11-06 22:20:51 UTC (rev 11895)
@@ -47,6 +47,7 @@
     else:
         yield txn.addDelegate(delegator.guid, delegate.guid,
             1 if readWrite else 0, False)
+        
 
 def removeDelegate(txn, delegator, delegate, readWrite):
     """
@@ -55,6 +56,7 @@
     return txn.removeDelegate(delegator.guid, delegate.guid,
         1 if readWrite else 0, delegate.recordType==RecordType.group)
 
+
 @inlineCallbacks
 def delegatesOf(txn, delegator, readWrite):
     """
@@ -70,6 +72,7 @@
                 records.append(record)
     returnValue(records)
 
+
 @inlineCallbacks
 def delegateFor(txn, delegate, readWrite):
     """

Modified: CalendarServer/branches/users/sagen/groupcacher/twext/who/groups.py
===================================================================
--- CalendarServer/branches/users/sagen/groupcacher/twext/who/groups.py	2013-11-06 22:19:12 UTC (rev 11894)
+++ CalendarServer/branches/users/sagen/groupcacher/twext/who/groups.py	2013-11-06 22:20:51 UTC (rev 11895)
@@ -92,8 +92,8 @@
     @inlineCallbacks
     def doWork(self):
 
-        # Delete all other work items
-        yield Delete(From=self.table, Where=None).on(self.transaction)
+        # Delete all other work items for this group
+        yield Delete(From=self.table, Where=(self.table.GROUP_GUID == self.groupGUID)).on(self.transaction)
 
         groupCacher = getattr(self.transaction, "_groupCacher", None)
         if groupCacher is not None:
@@ -182,15 +182,8 @@
         for member in members:
             membershipHashContent.update(member.guid)
         membershipHash = membershipHashContent.hexdigest()
-        results = (yield txn.groupByGUID(groupGUID))
-        if not results:
-            # Group is not yet in the DB
-            cachedName = ""
-            cachedMembershipHash = ""
-            addGroup = True
-        else:
-            groupID, cachedName, cachedMembershipHash = results[0]
-            addGroup = False
+        groupID, cachedName, cachedMembershipHash = (yield
+            txn.groupByGUID(groupGUID))
 
         if cachedMembershipHash != membershipHash:
             membershipChanged = True
@@ -198,11 +191,7 @@
         else:
             membershipChanged = False
 
-        if addGroup:
-            yield txn.addGroup(groupGUID, record.fullNames[0], membershipHash)
-        else:
-            yield txn.updateGroup(groupGUID, record.fullNames[0],
-                membershipHash)
+        yield txn.updateGroup(groupGUID, record.fullNames[0], membershipHash)
 
         results = (yield txn.groupByGUID(groupGUID))
         if len(results) == 1:

Modified: CalendarServer/branches/users/sagen/groupcacher/twext/who/test/test_groups.py
===================================================================
--- CalendarServer/branches/users/sagen/groupcacher/twext/who/test/test_groups.py	2013-11-06 22:19:12 UTC (rev 11894)
+++ CalendarServer/branches/users/sagen/groupcacher/twext/who/test/test_groups.py	2013-11-06 22:20:51 UTC (rev 11895)
@@ -23,6 +23,7 @@
 from twext.who.idirectory import RecordType
 from twisted.internet.defer import inlineCallbacks
 from twistedcaldav.test.util import StoreTestCase
+from txdav.common.icommondatastore import NotFoundError
 
 class GroupCacherTest(StoreTestCase):
 
@@ -65,10 +66,10 @@
         guid = "49b350c69611477b94d95516b13856ab"
         yield self.groupCacher.refreshGroup(txn, guid)
 
-        groupID, name, membershipHash = (yield txn.groupByGUID(guid))[0]
+        groupID, name, membershipHash = (yield txn.groupByGUID(guid))
         self.assertEquals(membershipHash, "e90052eb63d47f32d5b03df0073f7854")
 
-        groupGUID, name, membershipHash = (yield txn.groupByID(groupID))[0]
+        groupGUID, name, membershipHash = (yield txn.groupByID(groupID))
         self.assertEquals(groupGUID, guid)
         self.assertEquals(name, "Top Group 1")
         self.assertEquals(membershipHash, "e90052eb63d47f32d5b03df0073f7854")
@@ -99,7 +100,7 @@
         # Refresh the group so it's assigned a group_id
         guid = "49b350c69611477b94d95516b13856ab"
         yield self.groupCacher.refreshGroup(txn, guid)
-        groupID, name, membershipHash = (yield txn.groupByGUID(guid))[0]
+        groupID, name, membershipHash = (yield txn.groupByGUID(guid))
 
         # Remove two members, and add one member
         newSet = set()
@@ -126,6 +127,23 @@
         self.assertEquals(len(records), 0)
 
 
+    @inlineCallbacks
+    def test_groupByID(self):
+
+        store = self.storeUnderTest()
+        txn = store.newTransaction()
+
+        # Non-existent groupID
+        self.failUnlessFailure(txn.groupByID(42), NotFoundError)
+
+        guid = "49b350c69611477b94d95516b13856ab"
+        hash = "e90052eb63d47f32d5b03df0073f7854"
+        yield self.groupCacher.refreshGroup(txn, guid)
+        groupID, name, membershipHash = (yield txn.groupByGUID(guid))
+        results = (yield txn.groupByID(groupID))
+        self.assertEquals([guid, "Top Group 1", hash], results)
+
+
 testXMLConfig = """<?xml version="1.0" encoding="utf-8"?>
 
 <directory realm="xyzzy">

Modified: CalendarServer/branches/users/sagen/groupcacher/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/sagen/groupcacher/txdav/common/datastore/sql.py	2013-11-06 22:19:12 UTC (rev 11894)
+++ CalendarServer/branches/users/sagen/groupcacher/txdav/common/datastore/sql.py	2013-11-06 22:20:51 UTC (rev 11895)
@@ -68,7 +68,7 @@
     HomeChildNameAlreadyExistsError, NoSuchHomeChildError, \
     ObjectResourceNameNotAllowedError, ObjectResourceNameAlreadyExistsError, \
     NoSuchObjectResourceError, AllRetriesFailed, InvalidSubscriptionValues, \
-    InvalidIMIPTokenValues, TooManyObjectResourcesError
+    InvalidIMIPTokenValues, TooManyObjectResourcesError, NotFoundError
 from txdav.common.idirectoryservice import IStoreDirectoryService
 from txdav.common.inotifications import INotificationCollection, \
     INotificationObject
@@ -876,7 +876,8 @@
         gr = schema.GROUPS
         return Insert({gr.NAME: Parameter("name"),
                        gr.GROUP_GUID: Parameter("groupGUID"),
-                       gr.MEMBERSHIP_HASH: Parameter("membershipHash")})
+                       gr.MEMBERSHIP_HASH: Parameter("membershipHash")},
+                       Return=gr.GROUP_ID)
 
 
     @classproperty
@@ -926,12 +927,41 @@
             membershipHash=membershipHash)
 
 
+    @inlineCallbacks
     def groupByGUID(self, groupGUID):
-        return self._groupByGUID.on(self, groupGUID=groupGUID)
+        results = (yield self._groupByGUID.on(self, groupGUID=groupGUID))
+        if results:
+            returnValue(results[0])
+        else:
+            savepoint = SavepointAction("groupByGUID")
+            yield savepoint.acquire(self)
+            try:
+                groupID = (yield self.addGroup(groupGUID, "", ""))[0][0]
+            except Exception:
+                yield savepoint.rollback(self)
+                results = (yield self._groupByGUID.on(self,
+                    groupGUID=groupGUID))
+                if results:
+                    returnValue(results[0])
+                else:
+                    raise
+            else:
+                yield savepoint.release(self)
+                results = (yield self._groupByGUID.on(self,
+                    groupGUID=groupGUID))
+                if results:
+                    returnValue(results[0])
+                else:
+                    raise
 
 
+    @inlineCallbacks
     def groupByID(self, groupID):
-        return self._groupByID.on(self, groupID=groupID)
+        try:
+            results = (yield self._groupByID.on(self, groupID=groupID))[0]
+            returnValue(results)
+        except IndexError:
+            raise NotFoundError
 
 
     def deleteGroup(self, groupID):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140312/1ded20b5/attachment.html>


More information about the calendarserver-changes mailing list