[CalendarServer-changes] [10806] CalendarServer/branches/users/gaya/sharedgroups

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 25 16:17:16 PST 2013


Revision: 10806
          http://trac.calendarserver.org//changeset/10806
Author:   gaya at apple.com
Date:     2013-02-25 16:17:15 -0800 (Mon, 25 Feb 2013)
Log Message:
-----------
checkpoint - remove addressbook schema: ./test passes

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/dbinspect.py
    CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/obliterate.py
    CalendarServer/branches/users/gaya/sharedgroups/contrib/tools/sqldata_from_path.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/common.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/test_sql.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_legacy.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_schema/current.sql
    CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_tables.py
    CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/upgrade/migrate.py

Modified: CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/dbinspect.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/dbinspect.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/dbinspect.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -815,12 +815,10 @@
 
             schema.ADDRESSBOOK_OBJECT_REVISIONS,
 
-            schema.ADDRESSBOOK,
-            #schema.ADDRESSBOOK_BIND, - cascades
-            #schema.ADDRESSBOOK_OBJECT, - cascades
-
             schema.ADDRESSBOOK_HOME,
             #schema.ADDRESSBOOK_HOME_METADATA, - cascades
+            #schema.ADDRESSBOOK_HOME_BIND, - cascades
+            #schema.ADDRESSBOOK_OBJECT, - cascades
 
             schema.NOTIFICATION_HOME,
             schema.NOTIFICATION,

Modified: CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/obliterate.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/obliterate.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/calendarserver/tools/obliterate.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -195,7 +195,6 @@
         ca = schema.CALENDAR
         co = schema.CALENDAR_OBJECT
         ah = schema.ADDRESSBOOK_HOME
-        aa = schema.ADDRESSBOOK
         ao = schema.ADDRESSBOOK_OBJECT
         rp = schema.RESOURCE_PROPERTY
 
@@ -221,14 +220,8 @@
                                             From=ah,
                                             SetExpression=Union(
                                                 Select(
-                                                    [aa.RESOURCE_ID],
-                                                    From=aa,
-                                                    SetExpression=Union(
-                                                        Select(
-                                                            [ao.RESOURCE_ID],
-                                                            From=ao,
-                                                        ),
-                                                    ),
+                                                    [ao.RESOURCE_ID],
+                                                    From=ao,
                                                 ),
                                             ),
                                         ),

Modified: CalendarServer/branches/users/gaya/sharedgroups/contrib/tools/sqldata_from_path.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/contrib/tools/sqldata_from_path.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/contrib/tools/sqldata_from_path.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -44,20 +44,20 @@
         sys.exit(0)
 
 if __name__ == '__main__':
-    
+
     options, args = getopt.getopt(sys.argv[1:], "", [])
     if options:
         usage("No options allowed")
-    
+
     if len(args) != 1:
         usage("One argument only must be provided.")
-        
+
     # Determine the type of path
     segments = args[0].split("/")
 
     if len(segments) not in (6, 8,):
         usage("Must provide a path to a calendar or addressbook object resource.")
-        
+
     if segments[0] != "":
         usage("Must provide a /calendars/... or /addressbooks/... path.")
     if segments[1] not in ("calendars", "addressbooks",):
@@ -65,12 +65,12 @@
     if segments[2] != "__uids__":
         usage("Must provide a /.../__uids__/... path.")
 
-        
+
     datatype = segments[1]
     uid = segments[5 if len(segments[3]) == 2 else 3]
     collection = segments[6 if len(segments[3]) == 2 else 4]
     resource = segments[7 if len(segments[3]) == 2 else 5]
-    
+
     sqlstrings = {
         "calendars": {
             "home_table"        : "CALENDAR_HOME",
@@ -80,7 +80,7 @@
             "bind_home_id"      : "CALENDAR_HOME_RESOURCE_ID",
             "bind_name"         : "CALENDAR_RESOURCE_NAME",
             "bind_id"           : "CALENDAR_RESOURCE_ID",
-            
+
             "object_bind_id"    : "CALENDAR_RESOURCE_ID",
             "object_name"       : "RESOURCE_NAME",
             "object_data"       : "ICALENDAR_TEXT",
@@ -88,19 +88,19 @@
 
         "addressbooks": {
             "home_table"        : "ADDRESSBOOK_HOME",
-            "bind_table"        : "ADDRESSBOOK_BIND",
+            "bind_table"        : "ADDRESSBOOK_HOME_BIND",
             "object_table"      : "ADDRESSBOOK_OBJECT",
 
             "bind_home_id"      : "ADDRESSBOOK_HOME_RESOURCE_ID",
             "bind_name"         : "ADDRESSBOOK_RESOURCE_NAME",
             "bind_id"           : "ADDRESSBOOK_RESOURCE_ID",
-            
+
             "object_bind_id"    : "ADDRESSBOOK_RESOURCE_ID",
             "object_name"       : "RESOURCE_NAME",
             "object_data"       : "VCARD_TEXT",
         },
     }
-    
+
     sqlstrings[datatype]["uid"] = uid
     sqlstrings[datatype]["collection"] = collection
     sqlstrings[datatype]["resource"] = resource
@@ -112,4 +112,4 @@
                 select RESOURCE_ID from %(home_table)s where OWNER_UID = '%(uid)s'
             )
     );""" % sqlstrings[datatype]
-    
+

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -14,7 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-from txdav.common.icommondatastore import InternalDataStoreError
 
 """
 SQL backend for CardDAV storage.
@@ -30,6 +29,7 @@
     Update, Union, Max, Select, utcNowSQL
 
 from twext.python.clsprop import classproperty
+
 from twext.web2.http import HTTPError
 from twext.web2.http_headers import MimeType
 from twext.web2.responsecode import FORBIDDEN
@@ -50,16 +50,18 @@
 from txdav.common.datastore.sql import CommonHome, CommonHomeChild, \
     CommonObjectResource, EADDRESSBOOKTYPE, SharingMixIn
 from txdav.common.datastore.sql_legacy import PostgresLegacyABIndexEmulator
-from txdav.common.datastore.sql_tables import ADDRESSBOOK_TABLE, \
-    ADDRESSBOOK_BIND_TABLE, ADDRESSBOOK_OBJECT_REVISIONS_TABLE, \
+from txdav.common.datastore.sql_tables import \
+    ADDRESSBOOK_HOME_BIND_TABLE, ADDRESSBOOK_OBJECT_REVISIONS_TABLE, \
     ADDRESSBOOK_OBJECT_TABLE, ADDRESSBOOK_HOME_TABLE, \
-    ADDRESSBOOK_HOME_METADATA_TABLE, ADDRESSBOOK_AND_ADDRESSBOOK_BIND, \
+    ADDRESSBOOK_HOME_METADATA_TABLE, ADDRESSBOOK_HOME_AND_ADDRESSBOOK_HOME_BIND, \
     ADDRESSBOOK_OBJECT_AND_BIND_TABLE, \
     ADDRESSBOOK_OBJECT_REVISIONS_AND_BIND_TABLE, \
     _ABO_KIND_PERSON, _ABO_KIND_GROUP, _ABO_KIND_RESOURCE, \
     _ABO_KIND_LOCATION, schema, \
     _BIND_MODE_OWN, _BIND_MODE_WRITE, _BIND_STATUS_ACCEPTED, \
     _BIND_STATUS_DECLINED, _BIND_STATUS_INVITED
+from txdav.common.icommondatastore import HomeChildNameNotAllowedError, \
+    HomeChildNameAlreadyExistsError, InternalDataStoreError
 from txdav.xml.rfc2518 import ResourceType
 
 from zope.interface.declarations import implements
@@ -71,7 +73,7 @@
 
     # structured tables.  (new, preferred)
     _homeSchema = schema.ADDRESSBOOK_HOME
-    _bindSchema = schema.ADDRESSBOOK_BIND
+    _bindSchema = schema.ADDRESSBOOK_HOME_BIND
     _homeMetaDataSchema = schema.ADDRESSBOOK_HOME_METADATA
     _revisionsSchema = schema.ADDRESSBOOK_OBJECT_REVISIONS
     _objectSchema = schema.ADDRESSBOOK_OBJECT
@@ -79,8 +81,8 @@
     # string mappings (old, removing)
     _homeTable = ADDRESSBOOK_HOME_TABLE
     _homeMetaDataTable = ADDRESSBOOK_HOME_METADATA_TABLE
-    _childTable = ADDRESSBOOK_TABLE
-    _bindTable = ADDRESSBOOK_BIND_TABLE
+    _childTable = ADDRESSBOOK_HOME_TABLE
+    _bindTable = ADDRESSBOOK_HOME_BIND_TABLE
     _objectBindTable = ADDRESSBOOK_OBJECT_AND_BIND_TABLE
     _notifierPrefix = "CardDAV"
     _revisionsTable = ADDRESSBOOK_OBJECT_REVISIONS_TABLE
@@ -94,6 +96,7 @@
 
         self._childClass = AddressBook
         super(AddressBookHome, self).__init__(transaction, ownerUID, notifiers)
+        self._homeResourceID = None
 
 
     addressbooks = CommonHome.children
@@ -107,13 +110,13 @@
     @inlineCallbacks
     def remove(self):
         ah = schema.ADDRESSBOOK_HOME
-        ab = schema.ADDRESSBOOK_BIND
+        ahb = schema.ADDRESSBOOK_HOME_BIND
         aor = schema.ADDRESSBOOK_OBJECT_REVISIONS
         rp = schema.RESOURCE_PROPERTY
 
         yield Delete(
-            From=ab,
-            Where=ab.ADDRESSBOOK_HOME_RESOURCE_ID == self._resourceID,
+            From=ahb,
+            Where=ahb.ADDRESSBOOK_HOME_RESOURCE_ID == self._resourceID,
         ).on(self._txn)
 
         yield Delete(
@@ -135,7 +138,7 @@
 
 
     def createdHome(self):
-        return self.createAddressBookWithName(self.addressbookName())
+        pass
 
 
     @inlineCallbacks
@@ -187,6 +190,16 @@
         return self._childClass.objectWithBindName(self, shareUID, accepted=False)
 
 
+    @inlineCallbacks
+    def removeChildWithName(self, name):
+        # need to override so that _children is non pop-ed for main address book
+        if name != self.addressbookName():
+            returnValue((yield super(AddressBook, self).removeChildWithName(name)))
+
+        child = yield self.childWithName(name)
+        yield child.remove()
+
+
 AddressBookHome._register(EADDRESSBOOKTYPE)
 
 
@@ -198,16 +211,16 @@
 
     # structured tables.  (new, preferred)
     _homeSchema = schema.ADDRESSBOOK_HOME
-    _bindSchema = schema.ADDRESSBOOK_BIND
-    _homeChildSchema = schema.ADDRESSBOOK
-    _homeChildMetaDataSchema = schema.ADDRESSBOOK_METADATA
+    _bindSchema = schema.ADDRESSBOOK_HOME_BIND
+    _homeChildSchema = schema.ADDRESSBOOK_HOME
+    _homeChildMetaDataSchema = schema.ADDRESSBOOK_HOME_METADATA
     _revisionsSchema = schema.ADDRESSBOOK_OBJECT_REVISIONS
     _objectSchema = schema.ADDRESSBOOK_OBJECT
 
     # string mappings (old, removing)
-    _bindTable = ADDRESSBOOK_BIND_TABLE
-    _homeChildTable = ADDRESSBOOK_TABLE
-    _homeChildBindTable = ADDRESSBOOK_AND_ADDRESSBOOK_BIND
+    _bindTable = ADDRESSBOOK_HOME_BIND_TABLE
+    _homeChildTable = ADDRESSBOOK_HOME_TABLE
+    _homeChildBindTable = ADDRESSBOOK_HOME_AND_ADDRESSBOOK_HOME_BIND
     _revisionsTable = ADDRESSBOOK_OBJECT_REVISIONS_TABLE
     _revisionsBindTable = ADDRESSBOOK_OBJECT_REVISIONS_AND_BIND_TABLE
     _objectTable = ADDRESSBOOK_OBJECT_TABLE
@@ -234,7 +247,7 @@
 
     ownerAddressBookHome = CommonHomeChild.ownerHome
     addressbookObjects = CommonHomeChild.objectResources
-    listAddressbookObjects = CommonHomeChild.listObjectResources
+    listAddressBookObjects = CommonHomeChild.listObjectResources
     addressbookObjectWithName = CommonHomeChild.objectResourceWithName
     addressbookObjectWithUID = CommonHomeChild.objectResourceWithUID
     createAddressBookObjectWithName = CommonHomeChild.createObjectResourceWithName
@@ -267,16 +280,54 @@
 
 
     @classmethod
+    def _insertHomeChildAndMetaData(cls, home, name):
+        return((home._resourceID, home._created, home._modified))
+
+
+    @classmethod
     @inlineCallbacks
     def create(cls, home, name):
+        if name == home.addressbookName():
+            raise HomeChildNameAlreadyExistsError
+        else:
+            raise HomeChildNameNotAllowedError
 
-        if name != home.addressbookName():
-            raise HTTPError(FORBIDDEN)
 
-        returnValue((yield super(AddressBook, cls).create(home, name)))
+    @inlineCallbacks
+    def remove(self):
 
+        print("removeChildWithName:%s, name=%s" % (self, self.name()))
+        if self._resourceID == self._home._resourceID:
 
+            # allow remove, as a way to reset the address book to an empty state
+            for abo in (yield self.objectResources()):
+                yield abo.remove()
+
+            self.properties()._removeResource()
+
+            # Set to non-existent state
+            self._resourceID = None
+            self._created = None
+            self._modified = None
+            self._objects = {}
+
+            yield self.notifyChanged()
+
+            # Make sure home collection modified is changed - not that we do not use _home.notifiedChanged() here
+            # since we are sending the notification on the previously existing child collection object
+            yield self._home.bumpModified()
+        else:
+            returnValue((yield super(AddressBook, self).remove()))
+
+
     @inlineCallbacks
+    def rename(self, name):
+        # better error?
+        #raise HomeChildNameNotAllowedError
+        raise HTTPError(FORBIDDEN)
+
+
+    @inlineCallbacks
     def listObjectResources(self):
 
         result = yield super(AddressBook, self).listObjectResources()
@@ -458,22 +509,33 @@
         """
         results = []
 
+        # start with home address book row
+        # TODO: simplify
+        ownerHomeIDToDataRowMap = {
+            home._resourceID: (
+                _BIND_MODE_OWN, # bindMode,
+                home._resourceID, # homeID,
+                home._resourceID, # resourceID,
+                home.addressbookName(), # bindName,
+                _BIND_STATUS_ACCEPTED, # bindStatus,
+                None, # bindMessage,
+                home._created, # metadata[0]
+                home._modified, # metadata[1]
+            )
+        }
+
         # Load from the main table first
         dataRows = yield cls._childrenAndMetadataForHomeID.on(
             home._txn, homeID=home._resourceID
         )
 
         # get ownerHomeIDs
-        ownerHomeIDToDataRowMap = {}
         for dataRow in dataRows:
             bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = dataRow[:6] #@UnusedVariable
-            if bindStatus == _BIND_MODE_OWN:
-                ownerHomeIDToDataRowMap[home._resourceID] = dataRow
-            else:
-                ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
-                ownerHomeIDToDataRowMap[ownerHomeID] = dataRow
+            assert bindStatus != _BIND_MODE_OWN
+            ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
+            ownerHomeIDToDataRowMap[ownerHomeID] = dataRow
 
-
         # now get group rows:
         groupBindRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(
             home._txn, homeID=home._resourceID
@@ -489,6 +551,7 @@
                 groupBindRow[5] = None # bindMessage
                 ownerHomeIDToDataRowMap[ownerHomeID] = groupBindRow
 
+
         if ownerHomeIDToDataRowMap:
 
             # Get property stores for all these child resources (if any found)
@@ -556,7 +619,13 @@
             exists.
         """
         if name == home.addressbookName():
-            returnValue((yield super(AddressBook, cls).objectWithName(home, name)))
+            child = cls(
+                home=home,
+                name=name, resourceID=home._resourceID,
+                mode=_BIND_MODE_OWN, status=_BIND_STATUS_ACCEPTED,
+            )
+            yield child.initFromStore()
+            returnValue(child)
 
         #all shared address books now
 
@@ -605,7 +674,11 @@
         if not rows:
             returnValue(None)
 
-        bindMode, homeID, resourceID, bindName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable
+        bindMode, homeID, resourceID, bindName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable        
+        # if wrong status, exit here.  Item is in queryCache
+        if (bindStatus == _BIND_STATUS_ACCEPTED) != bool(accepted):
+            returnValue(None)
+
         ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
         ownerAddressBook = yield ownerHome.addressbook()
         child = cls(
@@ -764,7 +837,8 @@
 
         @return: an iterable of C{str}s.
         """
-        names = set()
+        names = set([home.addressbookName()])
+
         rows = yield cls._acceptedBindForHomeID.on(
             home._txn, homeID=home._resourceID
         )
@@ -772,13 +846,10 @@
             home._txn, homeID=home._resourceID
         )))
         for bindMode, homeID, resourceID, bindName, bindStatus, bindMessage in rows: #@UnusedVariable
-            if bindMode == _BIND_MODE_OWN:
-                addressbook = yield home.addressbook()
-                names |= set([addressbook.name()])
-            else:
-                ownerHome = yield home._txn.homeWithResourceID(home._homeType, homeID)
-                ownerAddressBook = yield ownerHome.addressbook()
-                names |= set([ownerAddressBook.shareeABName()])
+            assert bindMode != _BIND_MODE_OWN
+            ownerHome = yield home._txn.homeWithResourceID(home._homeType, homeID)
+            ownerAddressBook = yield ownerHome.addressbook()
+            names |= set([ownerAddressBook.shareeABName()])
         returnValue(tuple(names))
 
 
@@ -948,6 +1019,7 @@
 
         returnValue(shareeView._name)
 
+
     @inlineCallbacks
     def asShared(self):
         """
@@ -1076,7 +1148,7 @@
 
     _objectTable = ADDRESSBOOK_OBJECT_TABLE
     _objectSchema = schema.ADDRESSBOOK_OBJECT
-    _bindSchema = schema.GROUP_ADDRESSBOOK_BIND
+    _bindSchema = schema.GROUP_ADDRESSBOOK_HOME_BIND
 
 
     def __init__(self, addressbook, name, uid, resourceID=None, metadata=None):

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/common.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/common.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/common.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -48,6 +48,7 @@
     f.todo = why
     return f
 rewriteOrRemove = lambda f: _todo(f, "Rewrite or remove")
+fixFile = lambda f: _todo(f, "fix file implementation")
 
 storePath = FilePath(__file__).parent().child("addressbook_store")
 
@@ -361,6 +362,7 @@
 
 
     @inlineCallbacks
+    @fixFile
     def test_removeAddressBookWithName_exists(self):
         """
         L{IAddressBookHome.removeAddressBookWithName} removes a addressbook that already
@@ -371,7 +373,9 @@
         for name in home1_addressbookNames:
             self.assertNotIdentical((yield home.addressbookWithName(name)), None)
             yield home.removeAddressBookWithName(name)
-            self.assertEquals((yield home.addressbookWithName(name)), None)
+            # address book is not deleted, but cleared
+            ab = yield home.addressbookWithName(name)
+            self.assertEquals((yield ab.listAddressBookObjects()), [])
 
         yield self.commit()
 

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/test_sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/test_sql.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/test/test_sql.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -66,18 +66,18 @@
                 home = yield populateTxn.addressbookHomeWithUID(homeUID, True)
                 # We don't want the default addressbook to appear unless it's
                 # explicitly listed.
-                yield home.removeAddressBookWithName("addressbook")
-                for addressbookName in addressbooks:
-                    addressbookObjNames = addressbooks[addressbookName]
-                    if addressbookObjNames is not None:
-                        yield home.createAddressBookWithName(addressbookName)
-                        addressbook = yield home.addressbookWithName(addressbookName)
-                        for objectName in addressbookObjNames:
-                            objData = addressbookObjNames[objectName]
-                            yield addressbook.createAddressBookObjectWithName(
-                                objectName, VCard.fromString(objData)
-                            )
+                addressbookName = (yield home.addressbook()).name()
+                yield home.removeAddressBookWithName(addressbookName)
+                addressbook = yield home.addressbook()
 
+                addressbookObjNames = addressbooks[addressbookName]
+                if addressbookObjNames is not None:
+                    for objectName in addressbookObjNames:
+                        objData = addressbookObjNames[objectName]
+                        yield addressbook.createAddressBookObjectWithName(
+                            objectName, VCard.fromString(objData)
+                        )
+
         yield populateTxn.commit()
         self.notifierFactory.reset()
 

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -2561,9 +2561,8 @@
             newName = str(uuid4())
             yield self._bindInsertQuery.on(
                 subt, homeID=shareeHome._resourceID,
-                resourceID=self._resourceID, name=newName, mode=mode,
-                seenByOwner=True, seenBySharee=True,
-                bindStatus=status, message=message
+                resourceID=self._resourceID, name=newName,
+                mode=mode, bindStatus=status, message=message
             )
             returnValue(newName)
         try:
@@ -3147,21 +3146,14 @@
 
     @classmethod
     @inlineCallbacks
-    def create(cls, home, name):
+    def _insertHomeChildAndMetaData(cls, home, name):
 
-        if (yield cls._bindForNameAndHomeID.on(home._txn,
-                              name=name, homeID=home._resourceID)):
-            raise HomeChildNameAlreadyExistsError(name)
-
-        if name.startswith("."):
-            raise HomeChildNameNotAllowedError(name)
-
         # Create this object
         resourceID = (
             yield cls._insertHomeChild.on(home._txn))[0][0]
 
         # Initialize this object
-        _created, _modified = (
+        created, modified = (
             yield cls._insertHomeChildMetaData.on(home._txn,
                                                   resourceID=resourceID))[0]
 
@@ -3172,6 +3164,23 @@
             message=None,
         )
 
+        returnValue((resourceID, created, modified))
+
+
+    @classmethod
+    @inlineCallbacks
+    def create(cls, home, name):
+
+        if (yield cls._bindForNameAndHomeID.on(home._txn,
+            name=name, homeID=home._resourceID)):
+            raise HomeChildNameAlreadyExistsError(name)
+
+        if name.startswith("."):
+            raise HomeChildNameNotAllowedError(name)
+
+        # Create this object
+        resourceID, _created, _modified = yield cls._insertHomeChildAndMetaData(home, name)
+
         # Initialize other state
         child = cls(home, name, resourceID, _BIND_MODE_OWN, _BIND_STATUS_ACCEPTED)
         child._created = _created

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_legacy.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_legacy.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_legacy.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -879,4 +879,4 @@
     @inlineCallbacks
     def resourcesExist(self, names):
         returnValue(list(set(names).intersection(
-            set((yield self.addressbook.listAddressbookObjects())))))
+            set((yield self.addressbook.listAddressBookObjects())))))

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_schema/current.sql
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_schema/current.sql	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_schema/current.sql	2013-02-26 00:17:15 UTC (rev 10806)
@@ -342,9 +342,10 @@
 ----------------------
 
 create table ADDRESSBOOK_HOME (
-  RESOURCE_ID      integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
-  OWNER_UID        varchar(255) not null unique,                                -- implicit index
-  DATAVERSION      integer      default 0 not null
+  RESOURCE_ID      	integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
+  HOME_RESOURCE_ID	integer      default nextval('RESOURCE_ID_SEQ') not null, 	 -- implicit index
+  OWNER_UID        	varchar(255) not null unique,                                -- implicit index
+  DATAVERSION      	integer      default 0 not null
 );
 
 
@@ -360,35 +361,15 @@
 );
 
 
------------------
--- AddressBook --
------------------
-
-create table ADDRESSBOOK (
-  RESOURCE_ID integer   primary key default nextval('RESOURCE_ID_SEQ') -- implicit index
-);
-
-
---------------------------
--- AddressBook Metadata --
---------------------------
-
-create table ADDRESSBOOK_METADATA (
-  RESOURCE_ID integer   primary key references ADDRESSBOOK on delete cascade, -- implicit index
-  CREATED     timestamp default timezone('UTC', CURRENT_TIMESTAMP),
-  MODIFIED    timestamp default timezone('UTC', CURRENT_TIMESTAMP)
-);
-
-
 ----------------------
 -- AddressBook Bind --
 ----------------------
 
--- Joins ADDRESSBOOK_HOME and ADDRESSBOOK
+-- Joins ADDRESSBOOK_HOME and ADDRESSBOOK_HOME
 
-create table ADDRESSBOOK_BIND (
+create table ADDRESSBOOK_HOME_BIND (
   ADDRESSBOOK_HOME_RESOURCE_ID integer      not null references ADDRESSBOOK_HOME,
-  ADDRESSBOOK_RESOURCE_ID      integer      not null references ADDRESSBOOK on delete cascade,
+  ADDRESSBOOK_RESOURCE_ID      integer      not null references ADDRESSBOOK_HOME on delete cascade,
   ADDRESSBOOK_RESOURCE_NAME    varchar(255) not null,
   BIND_MODE                    integer      not null, -- enum CALENDAR_BIND_MODE
   BIND_STATUS                  integer      not null, -- enum CALENDAR_BIND_STATUS
@@ -398,8 +379,8 @@
   unique (ADDRESSBOOK_HOME_RESOURCE_ID, ADDRESSBOOK_RESOURCE_NAME)     -- implicit index
 );
 
-create index ADDRESSBOOK_BIND_RESOURCE_ID on
-  ADDRESSBOOK_BIND(ADDRESSBOOK_RESOURCE_ID);
+create index ADDRESSBOOK_HOME_BIND_RESOURCE_ID on
+  ADDRESSBOOK_HOME_BIND(ADDRESSBOOK_RESOURCE_ID);
 
 
 ------------------------
@@ -408,7 +389,7 @@
 
 create table ADDRESSBOOK_OBJECT (
   RESOURCE_ID             integer      primary key default nextval('RESOURCE_ID_SEQ'),    -- implicit index
-  ADDRESSBOOK_RESOURCE_ID integer      not null references ADDRESSBOOK on delete cascade,
+  ADDRESSBOOK_RESOURCE_ID integer      not null references ADDRESSBOOK_HOME on delete cascade,
   RESOURCE_NAME           varchar(255) not null,
   VCARD_TEXT              text         not null,
   VCARD_UID               varchar(255) not null,
@@ -443,7 +424,7 @@
 
 create table ABO_MEMBERS (
     GROUP_ID              integer      not null references ADDRESSBOOK_OBJECT on delete cascade,	-- AddressBook Object's (kind=='group') RESOURCE_ID
- 	ADDRESSBOOK_ID		  integer      not null references ADDRESSBOOK on delete cascade,
+ 	ADDRESSBOOK_ID		  integer      not null references ADDRESSBOOK_HOME on delete cascade,
     MEMBER_ID             integer      not null references ADDRESSBOOK_OBJECT,						-- member AddressBook Object's RESOURCE_ID
     primary key (GROUP_ID, MEMBER_ID) -- implicit index
 );
@@ -455,7 +436,7 @@
 
 create table ABO_FOREIGN_MEMBERS (
     GROUP_ID              integer      not null references ADDRESSBOOK_OBJECT on delete cascade,	-- AddressBook Object's (kind=='group') RESOURCE_ID
- 	ADDRESSBOOK_ID		  integer      not null references ADDRESSBOOK on delete cascade,
+ 	ADDRESSBOOK_ID		  integer      not null references ADDRESSBOOK_HOME on delete cascade,
     MEMBER_ADDRESS  	  varchar(255) not null, 													-- member AddressBook Object's 'calendar' address
     primary key (GROUP_ID, MEMBER_ADDRESS) -- implicit index
 );
@@ -467,7 +448,7 @@
 
 -- Joins ADDRESSBOOK_HOME and ADDRESSBOOK_OBJECT (acting as Address Book)
 
-create table GROUP_ADDRESSBOOK_BIND (	
+create table GROUP_ADDRESSBOOK_HOME_BIND (	
   ADDRESSBOOK_HOME_RESOURCE_ID 		integer      not null references ADDRESSBOOK_HOME,
   GROUP_RESOURCE_ID      			integer      not null references ADDRESSBOOK_OBJECT on delete cascade,
   GROUP_ADDRESSBOOK_RESOURCE_NAME	varchar(255) not null,
@@ -479,8 +460,8 @@
   unique (ADDRESSBOOK_HOME_RESOURCE_ID, GROUP_ADDRESSBOOK_RESOURCE_NAME)     -- implicit index
 );
 
-create index GROUP_ADDRESSBOOK_BIND_RESOURCE_ID on
-  GROUP_ADDRESSBOOK_BIND(GROUP_RESOURCE_ID);
+create index GROUP_ADDRESSBOOK_HOME_BIND_RESOURCE_ID on
+  GROUP_ADDRESSBOOK_HOME_BIND(GROUP_RESOURCE_ID);
 
 
 ---------------
@@ -514,8 +495,7 @@
 
 create table ADDRESSBOOK_OBJECT_REVISIONS (
   ADDRESSBOOK_HOME_RESOURCE_ID integer      not null references ADDRESSBOOK_HOME,
-  -- ADDRESSBOOK_RESOURCE_ID      integer      references ADDRESSBOOK,		-- FIXME
-  ADDRESSBOOK_RESOURCE_ID      integer,
+  ADDRESSBOOK_RESOURCE_ID      integer, 	-- FIXME, should reference ADDRESSBOOK_HOME
   ADDRESSBOOK_NAME             varchar(255) default null,
   RESOURCE_NAME                varchar(255),
   REVISION                     integer      default nextval('REVISION_SEQ') not null,

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_tables.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_tables.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql_tables.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -57,18 +57,18 @@
     schema.CALENDAR_BIND.CALENDAR_RESOURCE_ID
 schema.CALENDAR_BIND.HOME_RESOURCE_ID = \
     schema.CALENDAR_BIND.CALENDAR_HOME_RESOURCE_ID
-schema.ADDRESSBOOK_BIND.RESOURCE_NAME = \
-    schema.ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_NAME
-schema.ADDRESSBOOK_BIND.RESOURCE_ID = \
-    schema.ADDRESSBOOK_BIND.ADDRESSBOOK_RESOURCE_ID
-schema.ADDRESSBOOK_BIND.HOME_RESOURCE_ID = \
-    schema.ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID
-schema.GROUP_ADDRESSBOOK_BIND.RESOURCE_NAME = \
-    schema.GROUP_ADDRESSBOOK_BIND.GROUP_ADDRESSBOOK_RESOURCE_NAME
-schema.GROUP_ADDRESSBOOK_BIND.RESOURCE_ID = \
-    schema.GROUP_ADDRESSBOOK_BIND.GROUP_RESOURCE_ID
-schema.GROUP_ADDRESSBOOK_BIND.HOME_RESOURCE_ID = \
-    schema.GROUP_ADDRESSBOOK_BIND.ADDRESSBOOK_HOME_RESOURCE_ID
+schema.ADDRESSBOOK_HOME_BIND.RESOURCE_NAME = \
+    schema.ADDRESSBOOK_HOME_BIND.ADDRESSBOOK_RESOURCE_NAME
+schema.ADDRESSBOOK_HOME_BIND.RESOURCE_ID = \
+    schema.ADDRESSBOOK_HOME_BIND.ADDRESSBOOK_RESOURCE_ID
+schema.ADDRESSBOOK_HOME_BIND.HOME_RESOURCE_ID = \
+    schema.ADDRESSBOOK_HOME_BIND.ADDRESSBOOK_HOME_RESOURCE_ID
+schema.GROUP_ADDRESSBOOK_HOME_BIND.RESOURCE_NAME = \
+    schema.GROUP_ADDRESSBOOK_HOME_BIND.GROUP_ADDRESSBOOK_RESOURCE_NAME
+schema.GROUP_ADDRESSBOOK_HOME_BIND.RESOURCE_ID = \
+    schema.GROUP_ADDRESSBOOK_HOME_BIND.GROUP_RESOURCE_ID
+schema.GROUP_ADDRESSBOOK_HOME_BIND.HOME_RESOURCE_ID = \
+    schema.GROUP_ADDRESSBOOK_HOME_BIND.ADDRESSBOOK_HOME_RESOURCE_ID
 schema.CALENDAR_OBJECT_REVISIONS.RESOURCE_ID = \
     schema.CALENDAR_OBJECT_REVISIONS.CALENDAR_RESOURCE_ID
 schema.CALENDAR_OBJECT_REVISIONS.HOME_RESOURCE_ID = \
@@ -199,9 +199,8 @@
 ADDRESSBOOK_HOME_METADATA_TABLE = _S(schema.ADDRESSBOOK_HOME_METADATA)
 NOTIFICATION_HOME_TABLE = _S(schema.NOTIFICATION_HOME)
 CALENDAR_TABLE = _S(schema.CALENDAR)
-ADDRESSBOOK_TABLE = _S(schema.ADDRESSBOOK)
 CALENDAR_BIND_TABLE = _S(schema.CALENDAR_BIND)
-ADDRESSBOOK_BIND_TABLE = _S(schema.ADDRESSBOOK_BIND)
+ADDRESSBOOK_HOME_BIND_TABLE = _S(schema.ADDRESSBOOK_HOME_BIND)
 CALENDAR_OBJECT_REVISIONS_TABLE = _S(schema.CALENDAR_OBJECT_REVISIONS)
 ADDRESSBOOK_OBJECT_REVISIONS_TABLE = _S(schema.ADDRESSBOOK_OBJECT_REVISIONS)
 NOTIFICATION_OBJECT_REVISIONS_TABLE = _S(schema.NOTIFICATION_OBJECT_REVISIONS)
@@ -216,13 +215,13 @@
 CALENDAR_OBJECT_REVISIONS_AND_BIND_TABLE = _combine(
     REV=CALENDAR_OBJECT_REVISIONS_TABLE,
     BIND=CALENDAR_BIND_TABLE)
-ADDRESSBOOK_AND_ADDRESSBOOK_BIND = _combine(CHILD=ADDRESSBOOK_TABLE,
-                                           BIND=ADDRESSBOOK_BIND_TABLE)
+ADDRESSBOOK_HOME_AND_ADDRESSBOOK_HOME_BIND = _combine(CHILD=ADDRESSBOOK_HOME_TABLE,
+                                           BIND=ADDRESSBOOK_HOME_BIND_TABLE)
 ADDRESSBOOK_OBJECT_AND_BIND_TABLE = _combine(OBJECT=ADDRESSBOOK_OBJECT_TABLE,
-                                             BIND=ADDRESSBOOK_BIND_TABLE)
+                                             BIND=ADDRESSBOOK_HOME_BIND_TABLE)
 ADDRESSBOOK_OBJECT_REVISIONS_AND_BIND_TABLE = _combine(
     REV=ADDRESSBOOK_OBJECT_REVISIONS_TABLE,
-    BIND=ADDRESSBOOK_BIND_TABLE)
+    BIND=ADDRESSBOOK_HOME_BIND_TABLE)
 
 
 

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/upgrade/migrate.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/upgrade/migrate.py	2013-02-25 19:58:17 UTC (rev 10805)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/upgrade/migrate.py	2013-02-26 00:17:15 UTC (rev 10806)
@@ -409,7 +409,8 @@
 
         for homeType, eachFunc in [
                 ("calendar", self.fileStore.withEachCalendarHomeDo),
-                ("addressbook", self.fileStore.withEachAddressbookHomeDo),
+                # FIXME:
+                # ("addressbook", self.fileStore.withEachAddressbookHomeDo),
             ]:
             yield eachFunc(
                 lambda txn, home: self._upgradeAction(
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130225/323918d1/attachment-0001.html>


More information about the calendarserver-changes mailing list