[Checkins] SVN: relstorage/trunk/relstorage/adapters/schema.py Manage Oracle package body versioning.

Shane Hathaway shane at hathawaymix.org
Mon Apr 12 15:09:23 EDT 2010


Log message for revision 110760:
  Manage Oracle package body versioning.
  

Changed:
  U   relstorage/trunk/relstorage/adapters/schema.py

-=-
Modified: relstorage/trunk/relstorage/adapters/schema.py
===================================================================
--- relstorage/trunk/relstorage/adapters/schema.py	2010-04-12 17:40:54 UTC (rev 110759)
+++ relstorage/trunk/relstorage/adapters/schema.py	2010-04-12 19:09:23 UTC (rev 110760)
@@ -16,8 +16,11 @@
 from relstorage.adapters.interfaces import ISchemaInstaller
 from ZODB.POSException import StorageError
 from zope.interface import implements
+import re
 import time
 
+relstorage_op_version = '1.4'
+
 history_preserving_schema = """
 
 # commit_lock: Held during commit.  Another kind of lock is used for MySQL.
@@ -357,6 +360,7 @@
 /
 
 CREATE OR REPLACE PACKAGE BODY relstorage_op AS
+/* Version: %s */
     PROCEDURE store_temp(
         zoids IN numlist,
         prev_tids IN numlist,
@@ -390,7 +394,7 @@
     END restore;
 END relstorage_op;
 /
-"""
+""" % relstorage_op_version
 
 
 history_free_schema = """
@@ -584,6 +588,7 @@
 /
 
 CREATE OR REPLACE PACKAGE BODY relstorage_op AS
+/* Version: %s */
     PROCEDURE store_temp(
         zoids IN numlist,
         prev_tids IN numlist,
@@ -610,7 +615,7 @@
     END restore;
 END relstorage_op;
 /
-"""
+""" % relstorage_op_version
 
 
 def filter_script(script, database_name):
@@ -795,8 +800,13 @@
             else:
                 self.check_compatibility(cursor, tables)
             packages = self.list_packages(cursor)
-            if not 'relstorage_op' in packages:
+            if packages.get('relstorage_op') != relstorage_op_version:
                 self.install_plsql(cursor)
+                packages = self.list_packages(cursor)
+                if packages.get('relstorage_op') != relstorage_op_version:
+                    raise AssertionError(
+                        "Could not get version information after "
+                        "installing the relstorage_op package.")
         self.connmanager.open_and_call(callback)
 
     def install_plsql(self, cursor):
@@ -824,10 +834,28 @@
         return [name.lower() for (name,) in cursor]
 
     def list_packages(self, cursor):
+        """Returns {package name: version}.  version may be None."""
         stmt = """
         SELECT object_name
         FROM user_objects
         WHERE object_type = 'PACKAGE'
         """
         cursor.execute(stmt)
-        return [name.lower() for (name,) in cursor]
+        names = [name for (name,) in cursor]
+
+        res = {}
+        for name in names:
+            version = None
+            stmt = """
+            SELECT TEXT FROM USER_SOURCE
+            WHERE TYPE='PACKAGE BODY'
+                AND NAME=:1
+            """
+            cursor.execute(stmt, (name,))
+            for (text,) in cursor:
+                match = re.search(r'Version:\s*([0-9a-zA-Z.]+)', text)
+                if match is not None:
+                    version = match.group(1)
+                    break
+            res[name.lower()] = version
+        return res



More information about the checkins mailing list