summaryrefslogtreecommitdiff
path: root/scripts/skytools_upgrade.py
diff options
context:
space:
mode:
authorMarko Kreen2008-02-28 09:41:55 +0000
committerMarko Kreen2008-02-28 09:41:55 +0000
commitfa7ec0f1916cd3b78480a04e8663da62d34ad723 (patch)
tree293e1e784e78d4d96bfc48273b57ea99f54152f3 /scripts/skytools_upgrade.py
parent293060a25822dfa33cd5cd7096445b6222636193 (diff)
include upgrade script from -stable
Diffstat (limited to 'scripts/skytools_upgrade.py')
-rwxr-xr-xscripts/skytools_upgrade.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/scripts/skytools_upgrade.py b/scripts/skytools_upgrade.py
new file mode 100755
index 00000000..69439863
--- /dev/null
+++ b/scripts/skytools_upgrade.py
@@ -0,0 +1,73 @@
+#! /usr/bin/env python
+
+import sys, os, re, skytools
+
+ver_rx = r"(\d+)([.](\d+)([.](\d+))?)?"
+ver_rc = re.compile(ver_rx)
+
+def detect_londiste215(curs):
+ return skytools.exists_table(curs, 'londiste.subscriber_pending_fkeys')
+
+version_list = [
+ ['pgq', '2.1.5', 'v2.1.5_pgq_core.sql', None],
+ # those vers did not have version func
+ ['pgq_ext', '2.1.5', 'v2.1.5_pgq_ext.sql', None], # ok to reapply
+ ['londiste', '2.1.5', 'v2.1.5_londiste.sql', detect_londiste215], # not ok to reapply
+
+ ['pgq_ext', '2.1.6', 'v2.1.6_pgq_ext.sql', None],
+ ['londiste', '2.1.6', 'v2.1.6_londiste.sql', None],
+]
+
+def parse_ver(ver):
+ m = ver_rc.match(ver)
+ if not ver: return 0
+ v0 = int(m.group(1) or "0")
+ v1 = int(m.group(3) or "0")
+ v2 = int(m.group(5) or "0")
+ return ((v0 * 100) + v1) * 100 + v2
+
+def check_version(curs, schema, new_ver_str, recheck_func=None):
+ funcname = "%s.version" % schema
+ if not skytools.exists_function(curs, funcname, 0):
+ if recheck_func is not None:
+ return recheck_func(curs)
+ else:
+ return 0
+ q = "select %s()" % funcname
+ curs.execute(q)
+ old_ver_str = curs.fetchone()[0]
+ new_ver = parse_ver(new_ver_str)
+ old_ver = parse_ver(old_ver_str)
+ return old_ver >= new_ver
+
+
+class DbUpgrade(skytools.DBScript):
+ def upgrade(self, db):
+ curs = db.cursor()
+ for schema, ver, sql, recheck_fn in version_list:
+ if not skytools.exists_schema(curs, schema):
+ continue
+
+ if check_version(curs, schema, ver, recheck_fn):
+ continue
+
+ fn = "upgrade/final/%s" % sql
+ skytools.installer_apply_file(db, fn, self.log)
+
+ def work(self):
+ self.set_single_loop(1)
+
+ # loop over hosts
+ for cstr in self.args:
+ db = self.get_database('db', connstr = cstr, autocommit = 1)
+ self.upgrade(db)
+ self.close_database('db')
+
+ def load_config(self):
+ return skytools.Config(self.service_name, None,
+ user_defs = {'use_skylog': '0', 'job_name': 'db_upgrade'})
+
+if __name__ == '__main__':
+ script = DbUpgrade('db_upgrade', sys.argv[1:])
+ script.start()
+