[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