diff options
author | Egon Valdmees | 2011-06-16 12:09:57 +0000 |
---|---|---|
committer | Egon Valdmees | 2011-06-16 13:27:23 +0000 |
commit | 11f56c6e6e43c131052d4ab7f840866aaa373463 (patch) | |
tree | 740a4823b94fe335dab50af92099420f7787bbd4 | |
parent | 75fad39da732db9dec10d94c866b90df8a73cd10 (diff) |
fix: table rules are incorrect after londiste3 table (re)sync
-rw-r--r-- | python/skytools/dbstruct.py | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/python/skytools/dbstruct.py b/python/skytools/dbstruct.py index acdb8176..8f519d4c 100644 --- a/python/skytools/dbstruct.py +++ b/python/skytools/dbstruct.py @@ -176,24 +176,37 @@ class TIndex(TElem): class TRule(TElem): """Info about rule.""" type = T_RULE - SQL = """ - SELECT rulename as name, pg_get_ruledef(oid) as def - FROM pg_rewrite - WHERE ev_class = %(oid)s AND rulename <> '_RETURN'::name + SQL = """SELECT rw.*, pg_get_ruledef(rw.oid) as def + FROM pg_rewrite rw + WHERE rw.ev_class = %(oid)s AND rw.rulename <> '_RETURN'::name """ def __init__(self, table_name, row, new_name = None): self.table_name = table_name - self.name = row['name'] + self.name = row['rulename'] self.defn = row['def'] + self.enabled = row.get('ev_enabled', 'O') def get_create_sql(self, curs, new_table_name = None): """Generate creation SQL.""" if not new_table_name: - return self.defn - # fixme: broken / quoting - rx = r"\bTO[ ][a-z0-9._]+[ ]DO[ ]" - pnew = "TO %s DO " % new_table_name - return rx_replace(rx, self.defn, pnew) + sql = self.defn + table = self.table_name + else: + # fixme: broken / quoting + rx = r"\bTO[ ][a-z0-9._]+[ ]DO[ ]" + pnew = "TO %s DO " % new_table_name + sql = rx_replace(rx, self.defn, pnew) + table = new_table_name + if self.enabled != 'O': + # O - rule fires in origin and local modes + # D - rule is disabled + # R - rule fires in replica mode + # A - rule fires always + action = {'R': 'ENABLE REPLICA', + 'A': 'ENABLE ALWAYS', + 'D': 'DISABLE'} [self.enabled] + sql += ('\nALTER TABLE %s %s RULE %s;' % (table, action, self.name)) + return sql def get_drop_sql(self, curs): return 'DROP RULE %s ON %s' % (quote_ident(self.name), quote_fqident(self.table_name)) |