[CalendarServer-changes] [7144] CalendarServer/branches/users/glyph/oracle/txdav/common/datastore/ sql_legacy.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon Mar 7 19:05:55 PST 2011
Revision: 7144
http://trac.macosforge.org/projects/calendarserver/changeset/7144
Author: glyph at apple.com
Date: 2011-03-07 19:05:55 -0800 (Mon, 07 Mar 2011)
Log Message:
-----------
We already have numeric paramstyle implemented for sqlite, so just don't not inherit it for oracle
Modified Paths:
--------------
CalendarServer/branches/users/glyph/oracle/txdav/common/datastore/sql_legacy.py
Modified: CalendarServer/branches/users/glyph/oracle/txdav/common/datastore/sql_legacy.py
===================================================================
--- CalendarServer/branches/users/glyph/oracle/txdav/common/datastore/sql_legacy.py 2011-03-08 03:05:41 UTC (rev 7143)
+++ CalendarServer/branches/users/glyph/oracle/txdav/common/datastore/sql_legacy.py 2011-03-08 03:05:55 UTC (rev 7144)
@@ -842,10 +842,14 @@
key = self._key(uid)
return succeed(key in self.reservations)
-class postgresqlgenerator(sqlgenerator):
+
+
+class RealSQLBehaviorMixin(object):
"""
- Query generator for postgreSQL indexed searches. (Currently unused: work
- in progress.)
+ Class attributes for 'real' SQL behavior; avoid idiosyncracies of SQLite,
+ use standard SQL constructions, and depend on the full schema in
+ sql_schema_vX.sql rather than the partial one in twistedcaldav which depends
+ on the placement of the database in the filesystem for some information.
"""
ISOP = " = "
@@ -855,24 +859,20 @@
"TYPE": "CALENDAR_OBJECT.ICALENDAR_TYPE",
"UID": "CALENDAR_OBJECT.ICALENDAR_UID",
}
+ RESOURCEDB = "CALENDAR_OBJECT"
+ TIMESPANDB = "TIME_RANGE"
- def __init__(self, expr, calendarid, userid):
- self.RESOURCEDB = "CALENDAR_OBJECT"
- self.TIMESPANDB = "TIME_RANGE"
- self.TIMESPANTEST = "((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.START_DATE < %s AND TIME_RANGE.END_DATE > %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.START_DATE < %s AND TIME_RANGE.END_DATE > %s))"
- self.TIMESPANTEST_NOEND = "((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.END_DATE > %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.END_DATE > %s))"
- self.TIMESPANTEST_NOSTART = "((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.START_DATE < %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.START_DATE < %s))"
- self.TIMESPANTEST_TAIL_PIECE = " AND TIME_RANGE.CALENDAR_OBJECT_RESOURCE_ID = CALENDAR_OBJECT.RESOURCE_ID AND TIME_RANGE.CALENDAR_RESOURCE_ID = %s"
- self.TIMESPANTEST_JOIN_ON_PIECE = "TIME_RANGE.INSTANCE_ID = TRANSPARENCY.TIME_RANGE_INSTANCE_ID AND TRANSPARENCY.USER_ID = %s"
+ TIMESPANTEST = "((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.START_DATE < %s AND TIME_RANGE.END_DATE > %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.START_DATE < %s AND TIME_RANGE.END_DATE > %s))"
+ TIMESPANTEST_NOEND = "((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.END_DATE > %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.END_DATE > %s))"
+ TIMESPANTEST_NOSTART = "((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.START_DATE < %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.START_DATE < %s))"
+ TIMESPANTEST_TAIL_PIECE = " AND TIME_RANGE.CALENDAR_OBJECT_RESOURCE_ID = CALENDAR_OBJECT.RESOURCE_ID AND TIME_RANGE.CALENDAR_RESOURCE_ID = %s"
+ TIMESPANTEST_JOIN_ON_PIECE = "TIME_RANGE.INSTANCE_ID = TRANSPARENCY.TIME_RANGE_INSTANCE_ID AND TRANSPARENCY.USER_ID = %s"
- super(postgresqlgenerator, self).__init__(expr, calendarid, userid)
-
-
def generate(self):
"""
Generate the actual SQL 'where ...' expression from the passed in
expression tree.
-
+
@return: a C{tuple} of (C{str}, C{list}), where the C{str} is the
partial SQL statement, and the C{list} is the list of argument
substitutions to use with the SQL API execute method.
@@ -904,23 +904,50 @@
return select, self.arguments
+ def containsArgument(self, arg):
+ return "%%%s%%" % (arg,)
+
+
+
+class FormatParamStyleMixin(object):
+ """
+ Mixin for overriding methods on sqlgenerator that generate arguments
+ according to format/pyformat rules rather than the base class's 'numeric'
+ rules.
+ """
+
def addArgument(self, arg):
self.arguments.append(arg)
self.substitutions.append("%s")
self.sout.write("%s")
+
def setArgument(self, arg):
self.arguments.append(arg)
self.substitutions.append("%s")
+
def frontArgument(self, arg):
self.arguments.insert(0, arg)
self.substitutions.insert(0, "%s")
- def containsArgument(self, arg):
- return "%%%s%%" % (arg,)
+class postgresqlgenerator(FormatParamStyleMixin, RealSQLBehaviorMixin,
+ sqlgenerator):
+ """
+ Query generator for PostgreSQL indexed searches.
+ """
+
+
+
+class oraclesqlgenerator(RealSQLBehaviorMixin, sqlgenerator):
+ """
+ Query generator for Oracle indexed searches.
+ """
+
+
+
class LegacyIndexHelper(LoggingMixIn, object):
@inlineCallbacks
@@ -1064,6 +1091,15 @@
uid, type)}, where C{name} is the resource name, C{uid} is the
resource UID, and C{type} is the resource iCalendar component type.
"""
+ # Detect which style of parameter-generation we're using. Naming is a
+ # little off here, because the reason we're using the numeric one is
+ # that it happens to be used by the oracle binding that we're using,
+ # whereas the postgres binding happens to use the 'pyformat' (e.g. %s)
+ # parameter style.
+# if self.calendar._txn.paramstyle == 'numeric':
+# generator = oraclesqlgenerator
+# else:
+# generator = postgresqlgenerator
# Make sure we have a proper Filter element and get the partial SQL
# statement to use.
if isinstance(filter, calendarqueryfilter.Filter):
@@ -1204,10 +1240,9 @@
# CARDDAV
-class postgresqladbkgenerator(sqlgenerator):
+class oracleadbkgenerator(sqlgenerator):
"""
- Query generator for postgreSQL indexed searches. (Currently unused: work
- in progress.)
+ Query generator for Oracle indexed searches.
"""
ISOP = " = "
@@ -1216,18 +1251,17 @@
FIELDS = {
"UID": "ADDRESSBOOK_OBJECT.VCARD_UID",
}
+ RESOURCEDB = "ADDRESSBOOK_OBJECT"
- def __init__(self, expr, addressbookid):
- self.RESOURCEDB = "ADDRESSBOOK_OBJECT"
+ def containsArgument(self, arg):
+ return "%%%s%%" % (arg,)
- super(postgresqladbkgenerator, self).__init__(expr, addressbookid)
-
def generate(self):
"""
Generate the actual SQL 'where ...' expression from the passed in
expression tree.
-
+
@return: a C{tuple} of (C{str}, C{list}), where the C{str} is the
partial SQL statement, and the C{list} is the list of argument
substitutions to use with the SQL API execute method.
@@ -1251,24 +1285,16 @@
return select, self.arguments
- def addArgument(self, arg):
- self.arguments.append(arg)
- self.substitutions.append("%s")
- self.sout.write("%s")
- def setArgument(self, arg):
- self.arguments.append(arg)
- self.substitutions.append("%s")
+class postgresqladbkgenerator(FormatParamStyleMixin, oracleadbkgenerator):
+ """
+ Query generator for PostgreSQL indexed searches. Inherit 'real' database
+ behavior from L{oracleadbkgenerator}, and %s-style formatting from
+ L{FormatParamStyleMixin}.
+ """
- def frontArgument(self, arg):
- self.arguments.insert(0, arg)
- self.substitutions.insert(0, "%s")
- def containsArgument(self, arg):
- return "%%%s%%" % (arg,)
-
-
class PostgresLegacyABIndexEmulator(LegacyIndexHelper):
"""
Emulator for L{twistedcaldv.index.Index} and
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110307/29f59e21/attachment.html>
More information about the calendarserver-changes
mailing list