londiste repair: some cleanups
authorMarko Kreen <markokr@gmail.com>
Fri, 9 Dec 2011 07:08:14 +0000 (09:08 +0200)
committerMarko Kreen <markokr@gmail.com>
Fri, 9 Dec 2011 07:08:14 +0000 (09:08 +0200)
- get_pkeys, get_columns: use functions from skytools
- replace os.system with subprocess

python/londiste/repair.py

index 984920b812a8dbf0afa797b3aec6fa538d3e1cbc..101fe6e0cd368b5890e51d231944a359a439b717 100644 (file)
@@ -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)