[CalendarServer-changes] [5448] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 8 13:15:10 PDT 2010


Revision: 5448
          http://trac.macosforge.org/projects/calendarserver/changeset/5448
Author:   cdaboo at apple.com
Date:     2010-04-08 13:15:09 -0700 (Thu, 08 Apr 2010)
Log Message:
-----------
Changed timespan query to cope with missing per-user data (e.g. when upgrading from an older calendar store).

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/index.py
    CalendarServer/trunk/twistedcaldav/query/sqlgenerator.py

Modified: CalendarServer/trunk/twistedcaldav/index.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/index.py	2010-04-08 20:08:34 UTC (rev 5447)
+++ CalendarServer/trunk/twistedcaldav/index.py	2010-04-08 20:15:09 UTC (rev 5448)
@@ -339,20 +339,11 @@
                     "select PERUSERID from PERUSER where USERUID == :1",
                     useruid,
                 )
-                count = self._db_value_for_sql(
-                    "select COUNT(PERUSERID) from TRANSPARENCY where PERUSERID == :1",
-                    dbuseruid,
-                )
-                if dbuseruid is None or count == 0:
-                    dbuseruid = self._db_value_for_sql(
-                        "select PERUSERID from PERUSER where USERUID == :1",
-                        "",
-                    )
-                    
+
                 # For a free-busy time-range query we return all instances
                 rowiter = self._db_execute(
-                    "select RESOURCE.NAME, RESOURCE.UID, RESOURCE.TYPE, RESOURCE.ORGANIZER, TIMESPAN.FLOAT, TIMESPAN.START, TIMESPAN.END, TIMESPAN.FBTYPE, TRANSPARENCY.TRANSPARENT" + 
-                    qualifiers[0] + " AND TRANSPARENCY.PERUSERID == '%s'" % (dbuseruid,),
+                    "select DISTINCT RESOURCE.NAME, RESOURCE.UID, RESOURCE.TYPE, RESOURCE.ORGANIZER, TIMESPAN.FLOAT, TIMESPAN.START, TIMESPAN.END, TIMESPAN.FBTYPE, TIMESPAN.TRANSPARENT, TRANSPARENCY.TRANSPARENT" + 
+                    qualifiers[0] % (dbuseruid if dbuseruid else "",),
                     *qualifiers[1]
                 )
             else:
@@ -363,6 +354,11 @@
         for row in rowiter:
             name = row[0]
             if self.resource.getChild(name.encode("utf-8")):
+                if fbtype:
+                    row = list(row)
+                    if row[9]:
+                        row[8] = row[9]
+                    del row[9]
                 yield row
             else:
                 log.err("Calendar resource %s is missing from %s. Removing from index."
@@ -466,6 +462,7 @@
         #     'B' - busy
         #     'U' - busy-unavailable
         #     'T' - busy-tentative
+        #   TRANSPARENT: Y if transparent, N if opaque (default non-per-user value)
         #
         q.execute(
             """
@@ -475,7 +472,8 @@
                 FLOAT        text(1),
                 START        date,
                 END          date,
-                FBTYPE       text(1)
+                FBTYPE       text(1),
+                TRANSPARENT  text(1)
             )
             """
         )
@@ -683,11 +681,18 @@
             start = instance.start.replace(tzinfo=utc)
             end = instance.end.replace(tzinfo=utc)
             float = 'Y' if instance.start.tzinfo is None else 'N'
+            transp = 'T' if instance.component.propertyValue("TRANSP") == "TRANSPARENT" else 'F'
             self._db_execute(
                 """
-                insert into TIMESPAN (RESOURCEID, FLOAT, START, END, FBTYPE)
-                values (:1, :2, :3, :4, :5)
-                """, resourceid, float, start, end, icalfbtype_to_indexfbtype.get(instance.component.getFBType(), 'F')
+                insert into TIMESPAN (RESOURCEID, FLOAT, START, END, FBTYPE, TRANSPARENT)
+                values (:1, :2, :3, :4, :5, :6)
+                """,
+                resourceid,
+                float,
+                start,
+                end,
+                icalfbtype_to_indexfbtype.get(instance.component.getFBType(), 'F'),
+                transp
             )
             instanceid = self.lastrowid
             peruserdata = calendar.perUserTransparency(instance.rid)
@@ -709,9 +714,9 @@
             float = 'N'
             self._db_execute(
                 """
-                insert into TIMESPAN (RESOURCEID, FLOAT, START, END, FBTYPE)
-                values (:1, :2, :3, :4, :5)
-                """, resourceid, float, start, end, '?'
+                insert into TIMESPAN (RESOURCEID, FLOAT, START, END, FBTYPE, TRANSPARENT)
+                values (:1, :2, :3, :4, :5, :6)
+                """, resourceid, float, start, end, '?', '?'
             )
             instanceid = self.lastrowid
             peruserdata = calendar.perUserTransparency(None)

Modified: CalendarServer/trunk/twistedcaldav/query/sqlgenerator.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/query/sqlgenerator.py	2010-04-08 20:08:34 UTC (rev 5447)
+++ CalendarServer/trunk/twistedcaldav/query/sqlgenerator.py	2010-04-08 20:15:09 UTC (rev 5448)
@@ -49,7 +49,8 @@
     TIMESPANTEST         = "((TIMESPAN.FLOAT == 'N' AND TIMESPAN.START < %s AND TIMESPAN.END > %s) OR (TIMESPAN.FLOAT == 'Y' AND TIMESPAN.START < %s AND TIMESPAN.END > %s))"
     TIMESPANTEST_NOEND   = "((TIMESPAN.FLOAT == 'N' AND TIMESPAN.END > %s) OR (TIMESPAN.FLOAT == 'Y' AND TIMESPAN.END > %s))"
     TIMESPANTEST_NOSTART = "((TIMESPAN.FLOAT == 'N' AND TIMESPAN.START < %s) OR (TIMESPAN.FLOAT == 'Y' AND TIMESPAN.START < %s))"
-    TIMESPANTEST_TAIL_PIECE = " AND TIMESPAN.RESOURCEID == RESOURCE.RESOURCEID AND TIMESPAN.INSTANCEID == TRANSPARENCY.INSTANCEID"
+    TIMESPANTEST_TAIL_PIECE = " AND TIMESPAN.RESOURCEID == RESOURCE.RESOURCEID"
+    TIMESPANTEST_JOIN_ON_PIECE = "TIMESPAN.INSTANCEID == TRANSPARENCY.INSTANCEID AND TRANSPARENCY.PERUSERID == '%s'"
 
     def __init__(self, expr):
         self.expression = expr
@@ -75,7 +76,11 @@
         # Prefix with ' from ...' partial statement
         select = self.FROM + self.RESOURCEDB
         if self.usedtimespan:
-            select += ", %s, %s, %s" % (self.TIMESPANDB, self.TRANSPARENCYDB, self.PERUSERDB,)
+            select += ", %s, %s LEFT OUTER JOIN %s ON (%s)" % (
+                self.TIMESPANDB,
+                self.PERUSERDB,
+                self.TRANSPARENCYDB,
+                self.TIMESPANTEST_JOIN_ON_PIECE)
         select += self.sout.getvalue()
         return select, self.arguments
         
@@ -207,7 +212,7 @@
         @param arg: the C{str} of the argument to add
         """
         
-        # Append argument to the list and add the appropriate substituion string to the output stream.
+        # Append argument to the list and add the appropriate substitution string to the output stream.
         self.arguments.append(arg)
         self.sout.write(":" + str(len(self.arguments)))
     
@@ -218,7 +223,7 @@
         @return: C{str} for argument substitution text
         """
         
-        # Append argument to the list and add the appropriate substituion string to the output stream.
+        # Append argument to the list and add the appropriate substitution string to the output stream.
         self.arguments.append(arg)
         return ":" + str(len(self.arguments))
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100408/4f270eec/attachment-0001.html>


More information about the calendarserver-changes mailing list