[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