[Checkins] SVN: z3c.dobbin/trunk/src/z3c/dobbin/ Use native UUID data type on Postgresql; SQLite will use a string column type. This change awards a noticable speed difference.

Malthe Borch mborch at gmail.com
Wed Jul 2 17:56:03 EDT 2008


Log message for revision 87939:
  Use native UUID data type on Postgresql; SQLite will use a string column type. This change awards a noticable speed difference.

Changed:
  U   z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py
  U   z3c.dobbin/trunk/src/z3c/dobbin/mapper.py

-=-
Modified: z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py	2008-07-02 21:32:46 UTC (rev 87938)
+++ z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py	2008-07-02 21:56:01 UTC (rev 87939)
@@ -3,12 +3,15 @@
 import sqlalchemy as rdb
 from sqlalchemy import orm
         
-from ore.alchemist.interfaces import IDatabaseEngine
-
+import ore.alchemist.interfaces
 import relations
 
+class UUID(rdb.types.TypeEngine):
+    def get_col_spec(self):
+        return "UUID"
+
 def bootstrapDatabaseEngine(event):
-    engine = component.getUtility(IDatabaseEngine)
+    engine = component.getUtility(ore.alchemist.interfaces.IDatabaseEngine)
     engine.metadata = metadata = rdb.MetaData(engine)
     setUp(metadata)
     
@@ -19,13 +22,11 @@
     operation of the persistence and relational framework.
     """
     
-    soup_uuid = rdb.String(length=32)
-    
     soup = rdb.Table(
         'dobbin:soup',
         metadata,
         rdb.Column('id', rdb.Integer, primary_key=True, autoincrement=True),
-        rdb.Column('uuid', soup_uuid, unique=True, index=True),
+        rdb.Column('uuid', UUID, unique=True, index=True),
         rdb.Column('spec', rdb.String, index=True),
         )
 
@@ -35,16 +36,16 @@
         'dobbin:relation:int',
         metadata,
         rdb.Column('id', rdb.Integer, primary_key=True, autoincrement=True),
-        rdb.Column('left', soup_uuid, soup_fk, index=True),
-        rdb.Column('right', soup_uuid, soup_fk),
+        rdb.Column('left', UUID, soup_fk, index=True),
+        rdb.Column('right', UUID, soup_fk),
         rdb.Column('order', rdb.Integer, nullable=False))
 
     str_relation = rdb.Table(
         'dobbin:relation:str',
         metadata,
         rdb.Column('id', rdb.Integer, primary_key=True, autoincrement=True),
-        rdb.Column('left', soup_uuid, soup_fk, index=True),
-        rdb.Column('right', soup_uuid, soup_fk),
+        rdb.Column('left', UUID, soup_fk, index=True),
+        rdb.Column('right', UUID, soup_fk),
         rdb.Column('key', rdb.Unicode, nullable=False))
 
     # set up mappers

Modified: z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/mapper.py	2008-07-02 21:32:46 UTC (rev 87938)
+++ z3c.dobbin/trunk/src/z3c/dobbin/mapper.py	2008-07-02 21:56:01 UTC (rev 87939)
@@ -33,21 +33,13 @@
 
 import types
 
-def uuid():
-    """Return new unique id as string.
-
-    Force first character between 'a' and 'z'.
-    """
-    
-    return chr(randint(ord('a'), ord('z'))) + uuid1().hex[:-1]
-
 class ObjectTranslator(object):
     def __init__(self, column_type=None):
         self.column_type = column_type
 
     def __call__(self, field, metadata):
         return rdb.Column(
-            field.__name__+'_uuid', rdb.String(length=32), nullable=False)
+            field.__name__+'_uuid', bootstrap.UUID, nullable=False)
 
 class ObjectProperty(object):
     """Object property.
@@ -197,7 +189,7 @@
             super(Mapper, self).__init__(*args, **kwargs)
 
             # set soup metadata
-            self.uuid = uuid()
+            self.uuid = "{%s}" % uuid1()
             self.spec = self.__spec__
 
         def __cmp__(self, other):



More information about the Checkins mailing list