Revision: 9291 http://trac.macosforge.org/projects/calendarserver/changeset/9291 Author: glyph@apple.com Date: 2012-05-24 13:34:24 -0700 (Thu, 24 May 2012) Log Message: ----------- Skip the upgrade if it's immediately obvious you can do so. Modified Paths: -------------- CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/upgrade/sql/upgrades/upgrade_from_2_to_3.py Modified: CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py =================================================================== --- CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py 2012-05-24 20:34:21 UTC (rev 9290) +++ CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py 2012-05-24 20:34:24 UTC (rev 9291) @@ -67,15 +67,11 @@ from twext.python.clsprop import classproperty from twext.enterprise.ienterprise import AlreadyFinishedError from twext.enterprise.dal.parseschema import significant -from twext.enterprise.dal.syntax import Delete, utcNowSQL, Union -from twext.enterprise.dal.syntax import Insert -from twext.enterprise.dal.syntax import Len -from twext.enterprise.dal.syntax import Max -from twext.enterprise.dal.syntax import Parameter -from twext.enterprise.dal.syntax import SavepointAction -from twext.enterprise.dal.syntax import Select -from twext.enterprise.dal.syntax import Update +from twext.enterprise.dal.syntax import \ + Delete, utcNowSQL, Union, Insert, Len, Max, Parameter, SavepointAction, \ + Select, Update, ColumnSyntax, TableSyntax, Upper + from txdav.base.propertystore.base import PropertyName from txdav.base.propertystore.none import PropertyStore as NonePropertyStore from txdav.base.propertystore.sql import PropertyStore @@ -87,8 +83,6 @@ from txdav.xml.rfc2518 import DisplayName from txdav.base.datastore.util import normalizeUUIDOrNot -from twext.enterprise.dal.syntax import ColumnSyntax -from twext.enterprise.dal.syntax import TableSyntax from cStringIO import StringIO from sqlparse import parse @@ -4205,11 +4199,27 @@ @inlineCallbacks -def fixCaseNormalization(store): +def fixUUIDNormalization(store): """ - Fix all case normalization for a given store. + Fix all UUIDs in the given SQL store to be in a canonical form; + 00000000-0000-0000-0000-000000000000 format and upper-case. """ t = store.newTransaction(disableCache=True) + + # First, let's see if there are any calendar or addressbook homes that have + # a lower-case OWNER_UID. If there are none, then we can early-out and + # avoid the tedious and potentially expensive inspection of oodles of + # calendar data. + for x in [schema.CALENDAR_HOME, schema.ADDRESSBOOK_HOME]: + slct = Select([x.OWNER_UID], From=x, + Where=x.OWNER_UID != Upper(x.OWNER_UID)) + rows = yield slct.on(t) + if rows: + break + else: + log.msg("No potentially denormalized UUIDs detected, " + "skipping normalization upgrade.") + returnValue(None) try: yield _normalizeHomeUUIDsIn(t, ECALENDARTYPE) yield _normalizeHomeUUIDsIn(t, EADDRESSBOOKTYPE) Modified: CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/upgrade/sql/upgrades/upgrade_from_2_to_3.py =================================================================== --- CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/upgrade/sql/upgrades/upgrade_from_2_to_3.py 2012-05-24 20:34:21 UTC (rev 9290) +++ CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/upgrade/sql/upgrades/upgrade_from_2_to_3.py 2012-05-24 20:34:24 UTC (rev 9291) @@ -21,7 +21,7 @@ as in calendar data and properties. """ -from txdav.common.datastore.sql import fixCaseNormalization +from txdav.common.datastore.sql import fixUUIDNormalization from twisted.internet.defer import inlineCallbacks from txdav.common.datastore.upgrade.sql.upgrades.util import updateDataVersion @@ -30,10 +30,10 @@ @inlineCallbacks def doUpgrade(sqlStore): """ - Do the case-normalization upgrade if necessary and then bump the data + Do the UUID-normalization upgrade if necessary and then bump the data version to indicate that it's been done. """ - yield fixCaseNormalization(sqlStore) + yield fixUUIDNormalization(sqlStore) # Always bump the DB value yield updateDataVersion(