[CalendarServer-changes] [7403] CalendarServer/trunk/twext/enterprise/dal
source_changes at macosforge.org
source_changes at macosforge.org
Fri Apr 29 14:28:03 PDT 2011
Revision: 7403
http://trac.macosforge.org/projects/calendarserver/changeset/7403
Author: glyph at apple.com
Date: 2011-04-29 14:28:01 -0700 (Fri, 29 Apr 2011)
Log Message:
-----------
track indexes in the schema parser and model
Modified Paths:
--------------
CalendarServer/trunk/twext/enterprise/dal/model.py
CalendarServer/trunk/twext/enterprise/dal/parseschema.py
CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py
Modified: CalendarServer/trunk/twext/enterprise/dal/model.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/model.py 2011-04-29 19:52:59 UTC (rev 7402)
+++ CalendarServer/trunk/twext/enterprise/dal/model.py 2011-04-29 21:28:01 UTC (rev 7403)
@@ -329,7 +329,23 @@
yield set(constraint.affectsColumns)
+class Index(object):
+ """
+ An L{Index} is an SQL index.
+ """
+ def __init__(self, schema, name, table):
+ self.name = name
+ self.table = table
+ self.columns = []
+ schema.indexes.append(self)
+
+
+ def addColumn(self, column):
+ self.columns.append(column)
+
+
+
class Sequence(FancyEqMixin, object):
"""
A sequence object.
@@ -337,10 +353,11 @@
compareAttributes = 'name'.split()
- def __init__(self, name):
+ def __init__(self, schema, name):
_checkstr(name)
self.name = name
self.referringColumns = []
+ schema.sequences.append(self)
def __repr__(self):
@@ -348,6 +365,18 @@
+def _namedFrom(name, sequence):
+ """
+ Retrieve an item with a given name attribute from a given sequence, or raise
+ a L{KeyError}.
+ """
+ for item in sequence:
+ if item.name == name:
+ return item
+ raise KeyError(name)
+
+
+
class Schema(object):
"""
A schema containing tables, indexes, and sequences.
@@ -356,6 +385,7 @@
def __init__(self, filename='<string>'):
self.filename = filename
self.tables = []
+ self.indexes = []
self.sequences = []
@@ -364,17 +394,14 @@
def tableNamed(self, name):
- for table in self.tables:
- if table.name == name:
- return table
- raise KeyError(name)
+ return _namedFrom(name, self.tables)
def sequenceNamed(self, name):
- for sequence in self.sequences:
- if sequence.name == name:
- return sequence
- raise KeyError(name)
+ return _namedFrom(name, self.sequences)
+ def indexNamed(self, name):
+ return _namedFrom(name, self.indexes)
+
Modified: CalendarServer/trunk/twext/enterprise/dal/parseschema.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/parseschema.py 2011-04-29 19:52:59 UTC (rev 7402)
+++ CalendarServer/trunk/twext/enterprise/dal/parseschema.py 2011-04-29 21:28:01 UTC (rev 7403)
@@ -26,9 +26,8 @@
from sqlparse.sql import (Comment, Identifier, Parenthesis, IdentifierList,
Function)
-from twext.enterprise.dal.model import Schema, Table, SQLType, ProcedureCall
-from twext.enterprise.dal.model import Constraint
-from twext.enterprise.dal.model import Sequence
+from twext.enterprise.dal.model import (
+ Schema, Table, SQLType, ProcedureCall, Constraint, Sequence, Index)
@@ -116,9 +115,31 @@
t = tableFromCreateStatement(schema, stmt)
t.addComment(preface)
elif createType == u'SEQUENCE':
- schema.sequences.append(
- Sequence(
- stmt.token_next(2, True).get_name().encode('utf-8')))
+ Sequence(schema,
+ stmt.token_next(2, True).get_name().encode('utf-8'))
+ elif createType == u'INDEX':
+ signifindex = iterSignificant(stmt)
+ expect(signifindex, ttype=Keyword.DDL, value='CREATE')
+ expect(signifindex, ttype=Keyword, value='INDEX')
+ indexName = nameOrIdentifier(signifindex.next())
+ expect(signifindex, ttype=Keyword, value='ON')
+ [tableName, columnArgs] = iterSignificant(expect(signifindex,
+ cls=Function))
+ tableName = nameOrIdentifier(tableName)
+ arggetter = iterSignificant(columnArgs)
+
+ expect(arggetter, ttype=Punctuation, value=u'(')
+ valueOrValues = arggetter.next()
+ if isinstance(valueOrValues, IdentifierList):
+ valuelist = valueOrValues.get_identifiers()
+ else:
+ valuelist = [valueOrValues]
+ expect(arggetter, ttype=Punctuation, value=u')')
+
+ idx = Index(schema, indexName, schema.tableNamed(tableName))
+ for token in valuelist:
+ columnName = nameOrIdentifier(token)
+ idx.addColumn(idx.table.columnNamed(columnName))
elif stmt.get_type() == 'INSERT':
insertTokens = iterSignificant(stmt)
expect(insertTokens, ttype=Keyword.DML, value='INSERT')
@@ -412,7 +433,7 @@
"""
if ttype is not None:
if nextval.ttype != ttype:
- raise ViolatedExpectation(ttype, '%s:%s' % (nextval.ttype, nextval))
+ raise ViolatedExpectation(ttype, '%s:%r' % (nextval.ttype, nextval))
if value is not None:
if nextval.value.upper() != value.upper():
raise ViolatedExpectation(value, nextval.value)
Modified: CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py 2011-04-29 19:52:59 UTC (rev 7402)
+++ CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py 2011-04-29 21:28:01 UTC (rev 7403)
@@ -244,3 +244,29 @@
self.assertEquals(s.tableNamed("c").columnNamed("d").cascade, True)
+ def test_indexes(self):
+ """
+ A 'create index' statement will add an L{Index} object to a L{Schema}'s
+ C{indexes} list.
+ """
+ s = Schema()
+ addSQLToSchema(
+ s,
+ """
+ create table q (b integer); -- noise
+ create table a (b integer primary key, c integer);
+ create table z (c integer); -- make sure we get the right table
+
+ create index idx_a_b on a(b);
+ create index idx_a_b_c on a(c, b);
+ """)
+
+ a = s.tableNamed("a")
+ b = s.indexNamed("idx_a_b")
+ bc = s.indexNamed('idx_a_b_c')
+ self.assertEquals(b.table, a)
+ self.assertEquals(b.columns, [a.columnNamed("b")])
+ self.assertEquals(bc.table, a)
+ self.assertEquals(bc.columns, [a.columnNamed("c"), a.columnNamed("b")])
+
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110429/95fcab9f/attachment-0001.html>
More information about the calendarserver-changes
mailing list