diff options
author | Marko Kreen | 2011-12-09 07:08:14 +0000 |
---|---|---|
committer | Marko Kreen | 2011-12-09 07:08:14 +0000 |
commit | 7a8c702d865196477e4bf42db62d468452f824cc (patch) | |
tree | 9192374cc00922c5a55e39f0f3bb1a4f581c97a7 | |
parent | 17c92fba298477e619c57a971708edbea76ddf06 (diff) |
londiste repair: some cleanups
- get_pkeys, get_columns: use functions from skytools
- replace os.system with subprocess
-rw-r--r-- | python/londiste/repair.py | 70 |
1 files changed, 27 insertions, 43 deletions
diff --git a/python/londiste/repair.py b/python/londiste/repair.py index 984920b8..101fe6e0 100644 --- a/python/londiste/repair.py +++ b/python/londiste/repair.py @@ -5,7 +5,7 @@ Walks tables by primary key and searcher missing inserts/updates/deletes. """ -import sys, os, skytools +import sys, os, skytools, subprocess from londiste.syncer import Syncer @@ -15,34 +15,6 @@ def unescape(s): """Remove copy escapes.""" return skytools.unescape_copy(s) -def get_pkey_list(curs, tbl): - """Get list of pkey fields in right order.""" - - oid = skytools.get_table_oid(curs, tbl) - q = """SELECT k.attname FROM pg_index i, pg_attribute k - WHERE i.indrelid = %s AND k.attrelid = i.indexrelid - AND i.indisprimary AND k.attnum > 0 AND NOT k.attisdropped - ORDER BY k.attnum""" - curs.execute(q, [oid]) - list = [] - for row in curs.fetchall(): - list.append(row[0]) - return list - -def get_column_list(curs, tbl): - """Get list of columns in right order.""" - - oid = skytools.get_table_oid(curs, tbl) - q = """SELECT a.attname FROM pg_attribute a - WHERE a.attrelid = %s - AND a.attnum > 0 AND NOT a.attisdropped - ORDER BY a.attnum""" - curs.execute(q, [oid]) - list = [] - for row in curs.fetchall(): - list.append(row[0]) - return list - class Repairer(Syncer): """Walks tables in primary key order and checks if data matches.""" @@ -78,17 +50,9 @@ class Repairer(Syncer): dst_db.commit() self.log.info("Sorting src table: %s" % dump_src) - - s_in, s_out = os.popen4("sort --version") - s_ver = s_out.read() - del s_in, s_out - if s_ver.find("coreutils") > 0: - args = "-S 30%" - else: - args = "" - os.system("sort %s -T . -o %s.sorted %s" % (args, dump_src, dump_src)) + self.do_sort(dump_src, dump_src + '.sorted') self.log.info("Sorting dst table: %s" % dump_dst) - os.system("sort %s -T . -o %s.sorted %s" % (args, dump_dst, dump_dst)) + self.do_sort(dump_dst, dump_dst + '.sorted') self.dump_compare(dst_tbl, dump_src + ".sorted", dump_dst + ".sorted") @@ -97,17 +61,37 @@ class Repairer(Syncer): os.unlink(dump_src + ".sorted") os.unlink(dump_dst + ".sorted") + def do_sort(self, src, dst): + p = subprocess.Popen(["sort", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + s_ver = p.communicate()[0] + del p + + xenv = os.environ.copy() + xenv['LANG'] = 'C' + xenv['LC_ALL'] = 'C' + + cmdline = ['sort', '-T', '.'] + if s_ver.find("coreutils") > 0: + cmdline.append('-S') + cmdline.append('30%') + cmdline.append('-o') + cmdline.append(dst) + cmdline.append(src) + p = subprocess.Popen(cmdline, env = xenv) + if p.wait() != 0: + raise Exception('sort failed') + def load_common_columns(self, src_tbl, dst_tbl, src_curs, dst_curs): """Get common fields, put pkeys in start.""" - self.pkey_list = get_pkey_list(src_curs, src_tbl) - dst_pkey = get_pkey_list(dst_curs, dst_tbl) + self.pkey_list = skytools.get_table_pkeys(src_curs, src_tbl) + dst_pkey = skytools.get_table_pkeys(dst_curs, dst_tbl) if dst_pkey != self.pkey_list: self.log.error('pkeys do not match') sys.exit(1) - src_cols = get_column_list(src_curs, src_tbl) - dst_cols = get_column_list(dst_curs, dst_tbl) + src_cols = skytools.get_table_columns(src_curs, src_tbl) + dst_cols = skytools.get_table_columns(dst_curs, dst_tbl) field_list = [] for f in self.pkey_list: field_list.append(f) |