[CalendarServer-changes] [10127] CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/ datastore/sql.py
source_changes at macosforge.org
source_changes at macosforge.org
Tue Dec 4 16:02:05 PST 2012
Revision: 10127
http://trac.calendarserver.org//changeset/10127
Author: gaya at apple.com
Date: 2012-12-04 16:02:05 -0800 (Tue, 04 Dec 2012)
Log Message:
-----------
fix dynamic generation of group vcard md5 and size
Modified Paths:
--------------
CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2012-12-04 23:39:34 UTC (rev 10126)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2012-12-05 00:02:05 UTC (rev 10127)
@@ -347,6 +347,10 @@
self._kind = None
self._ownerAddressBookResourceID = None
+ # _self._component is the cached, current component
+ # super._objectText now contains the text as read of the database only,
+ # not including group member text
+ self._component = None
super(AddressBookObject, self).__init__(addressbook, name, uid, resourceID)
@@ -427,6 +431,7 @@
yield super(AddressBookObject, self).remove()
self._kind = None
self._ownerAddressBookResourceID = None
+ self._component = None
@classmethod
@@ -487,7 +492,16 @@
if rows:
self._initFromRow(tuple(rows[0]))
+
+ if self._kind == _ABO_KIND_GROUP:
+ # generate "X-ADDRESSBOOKSERVER-MEMBER" properties
+ # calc md5 and set size
+ componentText = str((yield self.component()))
+ self._md5 = hashlib.md5(componentText).hexdigest()
+ self._size = len(componentText)
+
yield self._loadPropertyStore()
+
returnValue(self)
else:
returnValue(None)
@@ -585,7 +599,9 @@
ownerAddressBook = yield self.ownerAddressBook()
yield self._changeAddressBookRevision(ownerAddressBook, inserting)
+ self._component = component
+
@inlineCallbacks
def _ownerGroupAndAddressBook(self):
"""
@@ -836,71 +852,70 @@
the caller - that is not ideal but in theory we should have checked everything on the way in and
only allowed in good data.
"""
- text = yield self._text()
- try:
- component = VCard.fromString(text)
- except InvalidVCardDataError, e:
- # This is a really bad situation, so do raise
- raise InternalDataStoreError(
- "Data corruption detected (%s) in id: %s"
- % (e, self._resourceID)
- )
+ if self._component is None:
- # Fix any bogus data we can
- fixed, unfixed = component.validVCardData(doFix=True, doRaise=False)
+ text = yield self._text()
- if unfixed:
- self.log_error("Address data id=%s had unfixable problems:\n %s" % (self._resourceID, "\n ".join(unfixed),))
+ try:
+ component = VCard.fromString(text)
+ except InvalidVCardDataError, e:
+ # This is a really bad situation, so do raise
+ raise InternalDataStoreError(
+ "Data corruption detected (%s) in id: %s"
+ % (e, self._resourceID)
+ )
- if fixed:
- self.log_error("Address data id=%s had fixable problems:\n %s" % (self._resourceID, "\n ".join(fixed),))
+ # Fix any bogus data we can
+ fixed, unfixed = component.validVCardData(doFix=True, doRaise=False)
- if self._kind == _ABO_KIND_GROUP:
- assert not component.hasProperty("X-ADDRESSBOOKSERVER-MEMBER"), "database group vCard text contains members %s" % (component,)
- # component.removeProperties("X-ADDRESSBOOKSERVER-MEMBER")
+ if unfixed:
+ self.log_error("Address data id=%s had unfixable problems:\n %s" % (self._resourceID, "\n ".join(unfixed),))
- # generate member properties
- # first get member resource ids
- aboMembers = schema.ABO_MEMBERS
- memberRows = yield Select([aboMembers.MEMBER_ID],
- From=aboMembers,
- Where=aboMembers.GROUP_ID == self._resourceID,).on(self._txn)
- memberIDs = [memberRow[0] for memberRow in memberRows]
+ if fixed:
+ self.log_error("Address data id=%s had fixable problems:\n %s" % (self._resourceID, "\n ".join(fixed),))
- # then get member UIDs
- abo = schema.ADDRESSBOOK_OBJECT
- memberUIDRows = (yield self._abObjectColumnsWithResourceIDsQuery(
- [abo.VCARD_UID],
- memberIDs).on(
- self._txn, resourceIDs=memberIDs)
- ) if memberIDs else []
- memberUIDs = [memberUIDRow[0] for memberUIDRow in memberUIDRows]
+ if self._kind == _ABO_KIND_GROUP:
+ assert not component.hasProperty("X-ADDRESSBOOKSERVER-MEMBER"), "database group vCard text contains members %s" % (component,)
- # add prefix to get property string
- memberAddresses = ["urn:uuid:" + memberUID for memberUID in memberUIDs]
+ # generate "X-ADDRESSBOOKSERVER-MEMBER" properties
+ # first get member resource ids
+ aboMembers = schema.ABO_MEMBERS
+ memberRows = yield Select([aboMembers.MEMBER_ID],
+ From=aboMembers,
+ Where=aboMembers.GROUP_ID == self._resourceID,).on(self._txn)
+ memberIDs = [memberRow[0] for memberRow in memberRows]
- # get foreign members
- aboForeignMembers = schema.ABO_FOREIGN_MEMBERS
- foreignMemberRows = yield Select([aboForeignMembers.MEMBER_ADDRESS],
- From=aboForeignMembers,
- Where=aboForeignMembers.GROUP_ID == self._resourceID,
- ).on(self._txn)
- foreignMembers = [foreignMemberRow[0] for foreignMemberRow in foreignMemberRows]
+ # then get member UIDs
+ abo = schema.ADDRESSBOOK_OBJECT
+ memberUIDRows = (yield self._abObjectColumnsWithResourceIDsQuery(
+ [abo.VCARD_UID],
+ memberIDs).on(
+ self._txn, resourceIDs=memberIDs)
+ ) if memberIDs else []
+ memberUIDs = [memberUIDRow[0] for memberUIDRow in memberUIDRows]
+ # add prefix to get property string
+ memberAddresses = ["urn:uuid:" + memberUID for memberUID in memberUIDs]
- # now add the properties to the component
- for memberAddress in sorted(memberAddresses + foreignMembers):
- component.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
+ # get foreign members
+ aboForeignMembers = schema.ABO_FOREIGN_MEMBERS
+ foreignMemberRows = yield Select([aboForeignMembers.MEMBER_ADDRESS],
+ From=aboForeignMembers,
+ Where=aboForeignMembers.GROUP_ID == self._resourceID,
+ ).on(self._txn)
+ foreignMembers = [foreignMemberRow[0] for foreignMemberRow in foreignMemberRows]
- # FIXME, this should be set in the database
- componentText = str(component)
- self._md5 = hashlib.md5(componentText).hexdigest()
- self._size = len(componentText)
- returnValue(component)
+ # now add the properties to the component
+ for memberAddress in sorted(memberAddresses + foreignMembers):
+ component.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
+ self._component = component
+ returnValue(self._component)
+
+
# IDataStoreObject
def contentType(self):
"""
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121204/54699056/attachment.html>
More information about the calendarserver-changes
mailing list