[CalendarServer-changes] [6196] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 26 19:26:49 PDT 2010


Revision: 6196
          http://trac.macosforge.org/projects/calendarserver/changeset/6196
Author:   cdaboo at apple.com
Date:     2010-08-26 19:26:49 -0700 (Thu, 26 Aug 2010)
Log Message:
-----------
Fix last few sharing issues.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/sharing.py
    CalendarServer/trunk/txdav/common/datastore/sql_legacy.py

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2010-08-26 23:38:36 UTC (rev 6195)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2010-08-27 02:26:49 UTC (rev 6196)
@@ -853,10 +853,6 @@
 
         self._db_execute("delete from INVITE where USERID = :1", userid)
     
-    def removeRecordForPrincipalURL(self, principalURL):
-
-        self._db_execute("delete from INVITE where PRINCIPALURL = :1", principalURL)
-    
     def removeRecordForInviteUID(self, inviteUID):
 
         self._db_execute("delete from INVITE where INVITEUID = :1", inviteUID)

Modified: CalendarServer/trunk/txdav/common/datastore/sql_legacy.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_legacy.py	2010-08-26 23:38:36 UTC (rev 6195)
+++ CalendarServer/trunk/txdav/common/datastore/sql_legacy.py	2010-08-27 02:26:49 UTC (rev 6196)
@@ -100,30 +100,25 @@
                 order by
                     INVITE.NAME asc
                 """, [self._calendar._resourceID]):
-            [inviteuid, common_name, userid, ownerUID,
-                bindMode, bindStatus, summary] = row
-            # FIXME: this is really the responsibility of the protocol layer.
-            state = {
-                _BIND_STATUS_INVITED: "NEEDS-ACTION",
-                _BIND_STATUS_ACCEPTED: "ACCEPTED",
-                _BIND_STATUS_DECLINED: "DECLINED",
-                _BIND_STATUS_INVALID: "INVALID",
-            }[bindStatus]
-            access = {
-                _BIND_MODE_READ: "read-only",
-                _BIND_MODE_WRITE: "read-write"
-            }[bindMode]
-            principalURL = "/principals/__uids__/%s/" % (ownerUID,)
-            yield Invite(
-                inviteuid, userid, principalURL, common_name,
-                access, state, summary
-            )
+            yield self._makeInvite(row)
 
-
     def recordForUserID(self, userid):
-        for record in self.allRecords():
-            if record.userid == userid:
-                return record
+        rows = self._txn.execSQL(
+            """
+            select
+                INVITE.INVITE_UID, INVITE.NAME, INVITE.RECIPIENT_ADDRESS,
+                CALENDAR_HOME.OWNER_UID, CALENDAR_BIND.BIND_MODE,
+                CALENDAR_BIND.BIND_STATUS, CALENDAR_BIND.MESSAGE
+            from
+                INVITE, CALENDAR_HOME, CALENDAR_BIND
+            where INVITE.RECIPIENT_ADDRESS = %s
+             and INVITE.HOME_RESOURCE_ID = CALENDAR_HOME.RESOURCE_ID
+             and CALENDAR_BIND.CALENDAR_RESOURCE_ID = INVITE.RESOURCE_ID
+             and CALENDAR_BIND.CALENDAR_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID
+            """,
+            [userid]
+        )
+        return self._makeInvite(rows[0]) if rows else None
 
 
     def recordForPrincipalURL(self, principalURL):
@@ -133,10 +128,43 @@
 
 
     def recordForInviteUID(self, inviteUID):
-        for record in self.allRecords():
-            if record.inviteuid == inviteUID:
-                return record
+        rows = self._txn.execSQL(
+            """
+            select
+                INVITE.INVITE_UID, INVITE.NAME, INVITE.RECIPIENT_ADDRESS,
+                CALENDAR_HOME.OWNER_UID, CALENDAR_BIND.BIND_MODE,
+                CALENDAR_BIND.BIND_STATUS, CALENDAR_BIND.MESSAGE
+            from
+                INVITE, CALENDAR_HOME, CALENDAR_BIND
+            where INVITE.INVITE_UID = %s
+             and INVITE.HOME_RESOURCE_ID = CALENDAR_HOME.RESOURCE_ID
+             and CALENDAR_BIND.CALENDAR_RESOURCE_ID = INVITE.RESOURCE_ID
+             and CALENDAR_BIND.CALENDAR_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID
+            """,
+            [inviteUID]
+        )
+        return self._makeInvite(rows[0]) if rows else None
 
+    def _makeInvite(self, row):
+        [inviteuid, common_name, userid, ownerUID,
+            bindMode, bindStatus, summary] = row
+        # FIXME: this is really the responsibility of the protocol layer.
+        state = {
+            _BIND_STATUS_INVITED: "NEEDS-ACTION",
+            _BIND_STATUS_ACCEPTED: "ACCEPTED",
+            _BIND_STATUS_DECLINED: "DECLINED",
+            _BIND_STATUS_INVALID: "INVALID",
+        }[bindStatus]
+        access = {
+            _BIND_MODE_OWN: "own",
+            _BIND_MODE_READ: "read-only",
+            _BIND_MODE_WRITE: "read-write"
+        }[bindMode]
+        principalURL = "/principals/__uids__/%s/" % (ownerUID,)
+        return Invite(
+            inviteuid, userid, principalURL, common_name,
+            access, state, summary
+        )
 
     def addOrUpdateRecord(self, record):
         bindMode = {'read-only': _BIND_MODE_READ,
@@ -212,30 +240,33 @@
 
 
     def removeRecordForUserID(self, userid):
-        rec = self.recordForUserID(userid)
-        self.removeRecordForInviteUID(rec.inviteuid)
+        self._txn.execSQL(
+            "delete from CALENDAR_BIND using INVITE "
+            "where INVITE.RECIPIENT_ADDRESS = %s "
+            " and CALENDAR_BIND.CALENDAR_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID "
+            " and CALENDAR_BIND.CALENDAR_RESOURCE_ID = INVITE.RESOURCE_ID",
+            [userid]
+        )
+        self._txn.execSQL(
+            "delete from INVITE where RECIPIENT_ADDRESS = %s",
+            [userid]
+        )
 
 
-    def removeRecordForPrincipalURL(self, principalURL):
-        raise NotImplementedError("removeRecordForPrincipalURL")
-
-
     def removeRecordForInviteUID(self, inviteUID):
-        rows = self._txn.execSQL("""
-                select HOME_RESOURCE_ID, RESOURCE_ID from INVITE where
-                INVITE_UID = %s
-            """, [inviteUID])
-        if rows:
-            [[homeID, resourceID]] = rows
-            self._txn.execSQL(
-                "delete from CALENDAR_BIND where "
-                "CALENDAR_HOME_RESOURCE_ID = %s and CALENDAR_RESOURCE_ID = %s",
-                [homeID, resourceID])
-            self._txn.execSQL("delete from INVITE where INVITE_UID = %s",
-                [inviteUID])
+        self._txn.execSQL(
+            "delete from CALENDAR_BIND using INVITE "
+            "where INVITE.INVITE_UID = %s "
+            " and CALENDAR_BIND.CALENDAR_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID "
+            " and CALENDAR_BIND.CALENDAR_RESOURCE_ID = INVITE.RESOURCE_ID",
+            [inviteUID]
+        )
+        self._txn.execSQL(
+            "delete from INVITE where INVITE_UID = %s",
+            [inviteUID]
+        )
 
 
-
 class PostgresLegacySharesEmulator(object):
 
     def __init__(self, home):
@@ -338,23 +369,23 @@
 
     def removeRecordForLocalName(self, localname):
         self._txn.execSQL(
-            "delete from CALENDAR_BIND where CALENDAR_RESOURCE_NAME = %s "
-            "and CALENDAR_HOME_RESOURCE_ID = %s",
+            "update CALENDAR_BIND set CALENDAR_RESOURCE_NAME = NULL "
+            "where CALENDAR_RESOURCE_NAME = %s and CALENDAR_HOME_RESOURCE_ID = %s",
             [localname, self._home._resourceID]
         )
 
 
     def removeRecordForShareUID(self, shareUID):
-        pass
-#        c = self._home._cursor()
-#        c.execute(
-#            "delete from CALENDAR_BIND where CALENDAR_RESOURCE_NAME = %s "
-#            "and CALENDAR_HOME_RESOURCE_ID = %s",
-#            [self._home._resourceID]
-#        )
+        self._txn.execSQL(
+            "update CALENDAR_BIND set CALENDAR_RESOURCE_NAME = NULL "
+            "from INVITE "
+            "where INVITE.INVITE_UID = %s "
+            " and CALENDAR_BIND.CALENDAR_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID"
+            " and CALENDAR_BIND.CALENDAR_RESOURCE_ID = INVITE.RESOURCE_ID",
+            [shareUID,]
+        )
 
 
-
 class postgresqlgenerator(sqlgenerator):
     """
     Query generator for postgreSQL indexed searches.  (Currently unused: work
@@ -1071,30 +1102,26 @@
                 order by
                     INVITE.NAME asc
                 """, [self._addressbook._resourceID]):
-            [inviteuid, common_name, userid, ownerUID,
-                bindMode, bindStatus, summary] = row
-            # FIXME: this is really the responsibility of the protocol layer.
-            state = {
-                _BIND_STATUS_INVITED: "NEEDS-ACTION",
-                _BIND_STATUS_ACCEPTED: "ACCEPTED",
-                _BIND_STATUS_DECLINED: "DECLINED",
-                _BIND_STATUS_INVALID: "INVALID",
-            }[bindStatus]
-            access = {
-                _BIND_MODE_READ: "read-only",
-                _BIND_MODE_WRITE: "read-write"
-            }[bindMode]
-            principalURL = "/principals/__uids__/%s/" % (ownerUID,)
-            yield Invite(
-                inviteuid, userid, principalURL, common_name,
-                access, state, summary
-            )
+            yield self._makeInvite(row)
 
 
     def recordForUserID(self, userid):
-        for record in self.allRecords():
-            if record.userid == userid:
-                return record
+        rows = self._txn.execSQL(
+            """
+            select
+                INVITE.INVITE_UID, INVITE.NAME, INVITE.RECIPIENT_ADDRESS,
+                ADDRESSBOOK_HOME.OWNER_UID, ADDRESSBOOK_BIND.BIND_MODE,
+                ADDRESSBOOK_BIND.BIND_STATUS, ADDRESSBOOK_BIND.MESSAGE
+            from
+                INVITE, ADDRESSBOOK_HOME, ADDRESSBOOK_BIND
+            where INVITE.RECIPIENT_ADDRESS = %s
+             and INVITE.HOME_RESOURCE_ID = ADDRESSBOOK_HOME.RESOURCE_ID
+             and ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_ID = INVITE.RESOURCE_ID
+             and ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID
+            """,
+            [userid]
+        )
+        return self._makeInvite(rows[0]) if rows else None
 
 
     def recordForPrincipalURL(self, principalURL):
@@ -1104,11 +1131,45 @@
 
 
     def recordForInviteUID(self, inviteUID):
-        for record in self.allRecords():
-            if record.inviteuid == inviteUID:
-                return record
+        rows = self._txn.execSQL(
+            """
+            select
+                INVITE.INVITE_UID, INVITE.NAME, INVITE.RECIPIENT_ADDRESS,
+                ADDRESSBOOK_HOME.OWNER_UID, ADDRESSBOOK_BIND.BIND_MODE,
+                ADDRESSBOOK_BIND.BIND_STATUS, ADDRESSBOOK_BIND.MESSAGE
+            from
+                INVITE, ADDRESSBOOK_HOME, ADDRESSBOOK_BIND
+            where INVITE.INVITE_UID = %s
+             and INVITE.HOME_RESOURCE_ID = ADDRESSBOOK_HOME.RESOURCE_ID
+             and ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_ID = INVITE.RESOURCE_ID
+             and ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID
+            """,
+            [inviteUID]
+        )
+        return self._makeInvite(rows[0]) if rows else None
 
 
+    def _makeInvite(self, row):
+        [inviteuid, common_name, userid, ownerUID,
+            bindMode, bindStatus, summary] = row
+        # FIXME: this is really the responsibility of the protocol layer.
+        state = {
+            _BIND_STATUS_INVITED: "NEEDS-ACTION",
+            _BIND_STATUS_ACCEPTED: "ACCEPTED",
+            _BIND_STATUS_DECLINED: "DECLINED",
+            _BIND_STATUS_INVALID: "INVALID",
+        }[bindStatus]
+        access = {
+            _BIND_MODE_OWN: "own",
+            _BIND_MODE_READ: "read-only",
+            _BIND_MODE_WRITE: "read-write"
+        }[bindMode]
+        principalURL = "/principals/__uids__/%s/" % (ownerUID,)
+        return Invite(
+            inviteuid, userid, principalURL, common_name,
+            access, state, summary
+        )
+
     def addOrUpdateRecord(self, record):
         bindMode = {'read-only': _BIND_MODE_READ,
                     'read-write': _BIND_MODE_WRITE}[record.access]
@@ -1183,27 +1244,31 @@
 
 
     def removeRecordForUserID(self, userid):
-        rec = self.recordForUserID(userid)
-        self.removeRecordForInviteUID(rec.inviteuid)
+        self._txn.execSQL(
+            "delete from ADDRESSBOOK_BIND using INVITE "
+            "where INVITE.RECIPIENT_ADDRESS = %s "
+            " and ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID "
+            " and ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_ID = INVITE.RESOURCE_ID",
+            [userid]
+        )
+        self._txn.execSQL(
+            "delete from INVITE where RECIPIENT_ADDRESS = %s",
+            [userid]
+        )
 
 
-    def removeRecordForPrincipalURL(self, principalURL):
-        raise NotImplementedError("removeRecordForPrincipalURL")
-
-
     def removeRecordForInviteUID(self, inviteUID):
-        rows = self._txn.execSQL("""
-                select HOME_RESOURCE_ID, RESOURCE_ID from INVITE where
-                INVITE_UID = %s
-            """, [inviteUID])
-        if rows:
-            [[homeID, resourceID]] = rows
-            self._txn.execSQL(
-                "delete from ADDRESSBOOK_BIND where "
-                "ADDRESSBOOK_HOME_RESOURCE_ID = %s and ADDRESSBOOK_RESOURCE_ID = %s",
-                [homeID, resourceID])
-            self._txn.execSQL("delete from INVITE where INVITE_UID = %s",
-                [inviteUID])
+        self._txn.execSQL(
+            "delete from ADDRESSBOOK_BIND using INVITE "
+            "where INVITE.INVITE_UID = %s "
+            " and ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID "
+            " and ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_ID = INVITE.RESOURCE_ID",
+            [inviteUID]
+        )
+        self._txn.execSQL(
+            "delete from INVITE where INVITE_UID = %s",
+            [inviteUID]
+        )
 
 
 
@@ -1309,17 +1374,18 @@
 
     def removeRecordForLocalName(self, localname):
         self._txn.execSQL(
-            "delete from ADDRESSBOOK_BIND where ADDRESSBOOK_RESOURCE_NAME = %s "
-            "and ADDRESSBOOK_HOME_RESOURCE_ID = %s",
+            "update ADDRESSBOOK_BIND set ADDRESSBOOK_RESOURCE_NAME = NULL "
+            "where ADDRESSBOOK_RESOURCE_NAME = %s and ADDRESSBOOK_HOME_RESOURCE_ID = %s",
             [localname, self._home._resourceID]
         )
 
 
     def removeRecordForShareUID(self, shareUID):
-        pass
-#        c = self._home._cursor()
-#        c.execute(
-#            "delete from ADDRESSBOOK_BIND where ADDRESSBOOK_RESOURCE_NAME = %s "
-#            "and ADDRESSBOOK_HOME_RESOURCE_ID = %s",
-#            [self._home._resourceID]
-#        )
+        self._txn.execSQL(
+            "update ADDRESSBOOK_BIND set ADDRESSBOOK_RESOURCE_NAME = NULL "
+            "from INVITE "
+            "where INVITE.INVITE_UID = %s "
+            " and ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID = INVITE.HOME_RESOURCE_ID"
+            " and ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_ID = INVITE.RESOURCE_ID",
+            [shareUID,]
+        )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100826/bec7c163/attachment-0001.html>


More information about the calendarserver-changes mailing list