[CalendarServer-changes] [6994] CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 16 06:37:53 PST 2011


Revision: 6994
          http://trac.macosforge.org/projects/calendarserver/changeset/6994
Author:   glyph at apple.com
Date:     2011-02-16 06:37:53 -0800 (Wed, 16 Feb 2011)
Log Message:
-----------
support for sequences as syntax elements

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/syntax.py
    CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/test/test_sqlsyntax.py

Modified: CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/syntax.py
===================================================================
--- CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/syntax.py	2011-02-16 14:37:42 UTC (rev 6993)
+++ CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/syntax.py	2011-02-16 14:37:53 UTC (rev 6994)
@@ -19,7 +19,7 @@
 Syntax wrappers and generators for SQL.
 """
 
-from twext.enterprise.dal.model import Schema, Table, Column
+from twext.enterprise.dal.model import Schema, Table, Column, Sequence
 
 
 class TableMismatch(Exception):
@@ -208,11 +208,17 @@
         try:
             tableModel = self.model.tableNamed(attr)
         except KeyError:
-            raise AttributeError("schema has no table %r" % (attr,))
-        syntax = TableSyntax(tableModel)
-        # Needs to be preserved here so that aliasing will work.
-        setattr(self, attr, syntax)
-        return syntax
+            try:
+                seqModel = self.model.sequenceNamed(attr)
+            except KeyError:
+                raise AttributeError("schema has no table or sequence %r" % (attr,))
+            else:
+                return SequenceSyntax(seqModel)
+        else:
+            syntax = TableSyntax(tableModel)
+            # Needs to be preserved here so that aliasing will work.
+            setattr(self, attr, syntax)
+            return syntax
 
 
     def __iter__(self):
@@ -221,6 +227,21 @@
 
 
 
+class SequenceSyntax(ExpressionSyntax):
+    """
+    Syntactic convenience for L{Sequence}.
+    """
+
+    modelType = Sequence
+
+    def subSQL(self, placeholder, quote, allTables):
+        """
+        Convert to an SQL fragment.
+        """
+        return SQLFragment("nextval('%s')" % (self.model.name,))
+
+
+
 class TableSyntax(Syntax):
     """
     Syntactic convenience for L{Table}.

Modified: CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/test/test_sqlsyntax.py
===================================================================
--- CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/test/test_sqlsyntax.py	2011-02-16 14:37:42 UTC (rev 6993)
+++ CalendarServer/branches/users/glyph/dalify/twext/enterprise/dal/test/test_sqlsyntax.py	2011-02-16 14:37:53 UTC (rev 6994)
@@ -36,6 +36,7 @@
     def setUp(self):
         s = Schema(self.id())
         addSQLToSchema(schema=s, schemaData="""
+                       create sequence A_SEQ;
                        create table FOO (BAR integer, BAZ integer);
                        create table BOZ (QUX integer);
                        create table OTHER (BAR integer,
@@ -520,6 +521,18 @@
                    From=self.schema.FOO,
                    Limit=123).toSQL(),
             SQLFragment(
-                "select BAR from FOO limit ?", [123])
-        )
+                "select BAR from FOO limit ?", [123]))
 
+
+    def test_nextSequenceValue(self):
+        """
+        When a sequence is used as a value in an expression, it renders as the
+        call to 'nextval' that will produce its next value.
+        """
+        self.assertEquals(
+            Insert({self.schema.BOZ.QUX:
+                    self.schema.A_SEQ}).toSQL(),
+            SQLFragment("insert into BOZ (QUX) values (nextval('A_SEQ'))", []))
+
+
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110216/7381a369/attachment.html>


More information about the calendarserver-changes mailing list