[CalendarServer-changes] [8775] CalendarServer/branches/users/glyph/case-insensitive-uid

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 29 10:14:58 PST 2012


Revision: 8775
          http://trac.macosforge.org/projects/calendarserver/changeset/8775
Author:   glyph at apple.com
Date:     2012-02-29 10:14:58 -0800 (Wed, 29 Feb 2012)
Log Message:
-----------
add support for the constraint we want, working around another odd corner of sqlparse's AST

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/parseschema.py
    CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/test/test_parseschema.py

Property Changed:
----------------
    CalendarServer/branches/users/glyph/case-insensitive-uid/

Modified: CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/parseschema.py
===================================================================
--- CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/parseschema.py	2012-02-29 18:14:54 UTC (rev 8774)
+++ CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/parseschema.py	2012-02-29 18:14:58 UTC (rev 8775)
@@ -22,7 +22,9 @@
 from itertools import chain
 
 from sqlparse import parse, keywords
-from sqlparse.tokens import Keyword, Punctuation, Number, String, Name
+from sqlparse.tokens import (
+    Keyword, Punctuation, Number, String, Name, Comparison as CompTok
+)
 from sqlparse.sql import (Comment, Identifier, Parenthesis, IdentifierList,
                           Function, Comparison)
 
@@ -30,7 +32,7 @@
     Schema, Table, SQLType, ProcedureCall, Constraint, Sequence, Index)
 
 from twext.enterprise.dal.syntax import (
-    ColumnSyntax, CompoundComparison, Constant
+    ColumnSyntax, CompoundComparison, Constant, Function as FunctionSyntax
 )
 
 
@@ -269,7 +271,18 @@
                                         op.value.encode("ascii"),
                                         self.nameOrValue(rhs))
         elif isinstance(nexttok, Identifier):
-            result = None
+            # our version of SQLParse seems to break down and not create a nice
+            # "Comparison" object when a keyword is present.  This is just a
+            # simple workaround.
+            lhs = self.nameOrValue(nexttok)
+            op = expect(parens, ttype=CompTok).value.encode("ascii")
+            funcName = expect(parens, ttype=Keyword).value.encode("ascii")
+            rhs = FunctionSyntax(funcName)(*[
+                ColumnSyntax(self.table.columnNamed(x)) for x in
+                self.namesInParens(expect(parens, cls=Parenthesis))
+            ])
+            result = CompoundComparison(lhs, op, rhs)
+
         expect(parens, ttype=Punctuation, value=")")
         return result
 
@@ -480,7 +493,8 @@
             raise ViolatedExpectation(value, nextval.value)
     if cls is not None:
         if nextval.__class__ != cls:
-            raise ViolatedExpectation(cls, repr(nextval))
+            raise ViolatedExpectation(cls, '%s:%r' %
+                                      (nextval.__class__.__name__, nextval))
     return nextval
 
 

Modified: CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/test/test_parseschema.py
===================================================================
--- CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/test/test_parseschema.py	2012-02-29 18:14:54 UTC (rev 8774)
+++ CalendarServer/branches/users/glyph/case-insensitive-uid/twext/enterprise/dal/test/test_parseschema.py	2012-02-29 18:14:58 UTC (rev 8775)
@@ -20,8 +20,10 @@
 """
 
 from twext.enterprise.dal.model import Schema
+from twext.enterprise.dal.syntax import CompoundComparison, ColumnSyntax
 
 from twext.enterprise.dal.parseschema import addSQLToSchema
+
 from twisted.trial.unittest import TestCase
 
 
@@ -214,7 +216,6 @@
             table = s.tableNamed('sample')
             self.assertEquals(len(table.constraints), 1)
             constraint = table.constraints[0]
-            from twext.enterprise.dal.syntax import CompoundComparison
             expr = constraint.expression
             self.assertIsInstance(expr, CompoundComparison)
             self.assertEqual(expr.a.model, table.columnNamed('example'))
@@ -242,6 +243,14 @@
             s = self.schemaFromString(sqlText)
             table = s.tableNamed('sample')
             self.assertEquals(len(table.constraints), 1)
+            expr = table.constraints[0].expression
+            self.assertEquals(expr.a.model, table.columnNamed("example"))
+            self.assertEquals(expr.op, "=")
+            self.assertEquals(expr.b.function.name, "lower")
+            self.assertEquals(
+                expr.b.args,
+                tuple([ColumnSyntax(table.columnNamed("example"))])
+            )
         checkOneConstraint(
             "create table sample "
             "(example integer check(example = lower(example)));"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120229/255e9bb2/attachment.html>


More information about the calendarserver-changes mailing list