[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