[CalendarServer-changes] [7129] CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal

source_changes at macosforge.org source_changes at macosforge.org
Mon Mar 7 19:02:42 PST 2011


Revision: 7129
          http://trac.macosforge.org/projects/calendarserver/changeset/7129
Author:   glyph at apple.com
Date:     2011-03-07 19:02:42 -0800 (Mon, 07 Mar 2011)
Log Message:
-----------
Always specify sequences in oracle insert statements.

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

Modified: CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal/syntax.py
===================================================================
--- CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal/syntax.py	2011-03-08 03:02:30 UTC (rev 7128)
+++ CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal/syntax.py	2011-03-08 03:02:42 UTC (rev 7129)
@@ -21,9 +21,8 @@
 
 import itertools
 
-from twext.enterprise.ienterprise import POSTGRES_DIALECT
+from twext.enterprise.ienterprise import POSTGRES_DIALECT, ORACLE_DIALECT
 
-from twext.enterprise.ienterprise import ORACLE_DIALECT
 from twext.enterprise.dal.model import Schema, Table, Column, Sequence
 
 
@@ -759,13 +758,22 @@
 
         @rtype: L{SQLFragment}
         """
-        sortedColumns = sorted(self.columnMap.items(),
+        columnsAndValues = self.columnMap.items()
+        tableModel = columnsAndValues[0][0].model.table
+        if metadata.dialect == ORACLE_DIALECT:
+            # See test_nextSequenceDefaultImplicitExplicitOracle.
+            for column in tableModel.columns:
+                if isinstance(column.default, Sequence):
+                    columnSyntax = ColumnSyntax(column)
+                    if columnSyntax not in self.columnMap:
+                        columnsAndValues.append(
+                            (columnSyntax, SequenceSyntax(column.default))
+                        )
+        sortedColumns = sorted(columnsAndValues,
                                key=lambda (c, v): c.model.name)
         allTables = []
         stmt = SQLFragment('insert into ')
-        stmt.append(
-            TableSyntax(sortedColumns[0][0].model.table)
-            .subSQL(metadata, allTables))
+        stmt.append(TableSyntax(tableModel).subSQL(metadata, allTables))
         stmt.append(SQLFragment(" "))
         stmt.append(_inParens(_commaJoined(
             [c.subSQL(metadata, allTables) for (c, v) in

Modified: CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal/test/test_sqlsyntax.py
===================================================================
--- CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal/test/test_sqlsyntax.py	2011-03-08 03:02:30 UTC (rev 7128)
+++ CalendarServer/branches/users/glyph/oracle/twext/enterprise/dal/test/test_sqlsyntax.py	2011-03-08 03:02:42 UTC (rev 7129)
@@ -707,6 +707,26 @@
             SQLFragment("insert into BOZ (QUX) values (A_SEQ.nextval)", []))
 
 
+    def test_nextSequenceDefaultImplicitExplicitOracle(self):
+        """
+        In Oracle's dialect, sequence defaults can't be implemented without
+        using triggers, so instead we just explicitly always include the
+        sequence default value.
+        """
+        addSQLToSchema(
+            schema=self.schema.model, schemaData=
+            "create table DFLTR (a varchar(255), "
+            "b integer default nextval('A_SEQ'));"
+        )
+        self.assertEquals(
+            Insert({self.schema.DFLTR.a: 'hello'}).toSQL(
+                FixedPlaceholder(ORACLE_DIALECT, "?")
+            ),
+            SQLFragment("insert into DFLTR (a, b) values "
+                        "(?, A_SEQ.nextval)", ['hello']),
+        )
+
+
     def test_nestedLogicalExpressions(self):
         """
         Make sure that logical operator precedence inserts proper parenthesis
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110307/4358f8e4/attachment.html>


More information about the calendarserver-changes mailing list