diff options
author | Rob Austein <sra@hactrn.net> | 2007-09-11 19:46:06 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2007-09-11 19:46:06 +0000 |
commit | 63acecdc38a602eafb5beb49fb0b9b4a291c3378 (patch) | |
tree | b4cc6eb007b394e0ae54f6dd744518c1aa4f7000 /scripts/rpki | |
parent | 39f8909f26b1e58329796077f09bcdac0dc39cdf (diff) |
Checkpoint
svn path=/scripts/rpki/left_right.py; revision=942
Diffstat (limited to 'scripts/rpki')
-rw-r--r-- | scripts/rpki/left_right.py | 94 | ||||
-rw-r--r-- | scripts/rpki/sql.py | 32 |
2 files changed, 78 insertions, 48 deletions
diff --git a/scripts/rpki/left_right.py b/scripts/rpki/left_right.py index 0e3dcb78..62fc69ec 100644 --- a/scripts/rpki/left_right.py +++ b/scripts/rpki/left_right.py @@ -58,9 +58,9 @@ class extension_preference_elt(base_elt, rpki.sql.sql_persistant): attributes = ("name",) sql_select_cmd = """SELECT pref_name, pref_value FROM self_pref WHERE self_id = %(self_id)s""" - sql_insert_cmd = """INSERT self_pref (self_id, pref_name, pref_value) VALUES (%(self_id)s, %(name)s, %(value)""" - sql_update_cmd = """UPDATE self_pref SET pref_value = %(value)s WHERE self_id = %(self_id) AND pref_name = %(name)s""" - sql_delete_cmd = """DELETE FROM self_pref WHERE self_id = %(self_id) AND pref_name = %(name)s""" + sql_insert_cmd = """INSERT self_pref (self_id, pref_name, pref_value) VALUES (%(self_id)s, %(name)s, %(value)s""" + sql_update_cmd = """UPDATE self_pref SET pref_value = %(value)s WHERE self_id = %(self_id)s AND pref_name = %(name)s""" + sql_delete_cmd = """DELETE FROM self_pref WHERE self_id = %(self_id)s AND pref_name = %(name)s""" def sql_decode(self, sql_parent, self_id, name, value): self.self_obj = sql_parent @@ -88,38 +88,6 @@ class extension_preference_elt(base_elt, rpki.sql.sql_persistant): elt.text = self.value return elt -class self_elt(base_elt, rpki.sql.sql_persistant): - """<self/> element.""" - - element_name = "self" - attributes = ("action", "type", "self_id") - booleans = ("rekey", "reissue", "revoke", "run_now", "publish_world_now") - - def __init__(self): - self.prefs = [] - - def startElement(self, stack, name, attrs): - """Handle <self/> element.""" - if name == "extension_preference": - pref = extension_preference_elt() - self.prefs.append(pref) - stack.append(pref) - pref.startElement(stack, name, attrs) - else: - assert name == "self", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def endElement(self, stack, name, text): - """Handle <self/> element.""" - assert name == "self", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <self/> element.""" - elt = self.make_elt() - elt.extend([i.toXML() for i in self.prefs]) - return elt - class bsc_elt(base_elt, rpki.sql.sql_persistant): """<bsc/> (Business Signing Context) element.""" @@ -277,6 +245,62 @@ class route_origin_elt(base_elt, rpki.sql.sql_persistant): """Generate <route_origin/> element.""" return self.make_elt() +class self_elt(base_elt, rpki.sql.sql_persistant): + """<self/> element.""" + + element_name = "self" + attributes = ("action", "type", "self_id") + booleans = ("rekey", "reissue", "revoke", "run_now", "publish_world_now") + + sql_id_name = "self_id" + sql_select_cmd = """SELECT self_id, use_hsm FROM self WHERE self_id = %(self_id)s""" + sql_insert_cmd = """INSERT self (use_hsm) VALUES (%(use_hsm)s""" + sql_update_cmd = """UPDATE self SET use_hsm = %(use_hsm)s WHERE self_id = %(self_id)s""" + sql_delete_cmd = """DELETE FROM self WHERE self_id = %(self_id)s""" + sql_children = (("prefs", extension_preference_elt), + ("bscs", bsc_elt), + ("repos", repository_elt), + ("parents", parent_elt), + ("children", child_elt), + ("route_origins", route_origin_elt)) + + self_id = None + + def __init__(self): + for k,v in self.sql_children: + setattr(self, k, []) + + def sql_decode(self, sql_parent, self_id, use_hsm): + assert sql_parent is None + self.self_id = self_id + self.use_hsm = use_hsm + + def sql_encode(self): + return { "self_id" : self.self_id, + "use_hsm" : self.use_hsm } + + def startElement(self, stack, name, attrs): + """Handle <self/> element.""" + if name == "extension_preference": + pref = extension_preference_elt() + self.prefs.append(pref) + stack.append(pref) + pref.startElement(stack, name, attrs) + else: + assert name == "self", "Unexpected name %s, stack %s" % (name, stack) + self.read_attrs(attrs) + + def endElement(self, stack, name, text): + """Handle <self/> element.""" + assert name == "self", "Unexpected name %s, stack %s" % (name, stack) + stack.pop() + + def toXML(self): + """Generate <self/> element.""" + elt = self.make_elt() + elt.extend([i.toXML() for i in self.prefs]) + return elt + class resource_class_elt(base_elt): """<resource_class/> element.""" diff --git a/scripts/rpki/sql.py b/scripts/rpki/sql.py index ed8bfe58..c7c0fe0d 100644 --- a/scripts/rpki/sql.py +++ b/scripts/rpki/sql.py @@ -16,15 +16,21 @@ class sql_persistant(object): """ ## @var sql_children - # Dictionary listing this class's children in the tree of SQL - # tables. Key the name of the attribute in this class at which a - # list of the resulting child objects are stored; value is is the - # class object of a child. - sql_children = {} + # Tuple of tuples associating this class's children in the tree of + # SQL tables with the attribute names by which this class refers to + # them. Conceptually, this is an ordered dictionary; not being able + # to use a real Python dictionary here is a minor inconvenience. + # Making this an ordered data structure allows us to defer the + # objects with complex cross-linking until after the simpler objects + # to which they link have already been loaded. + # + # "Key" is the name of the attribute in this class at which a list + # of the resulting child objects are stored; "value" is is the class + # object of a child. + sql_children = () ## @var sql_in_db - # Whether this object is already in SQL or not. Perhaps this should - # instead be a None value in the object's ID field? + # Whether this object is already in SQL or not. sql_in_db = False ## @var sql_dirty @@ -75,8 +81,8 @@ class sql_persistant(object): self.sql_decode(sql_parent, *row) result.append(self) self_dict = self.sql_encode() - for kid_name,kid_type in self.sql_children.items(): - setattr(self, kid_name, kid_type.sql_fetch(db, cur, self_dict, self)) + for k,v in self.sql_children: + setattr(self, k, v.sql_fetch(db, cur, self_dict, self)) return result def sql_store(self, db, cur=None): @@ -92,8 +98,8 @@ class sql_persistant(object): cur.execute(self.sql_update_cmd, self.sql_encode()) self.sql_dirty = False self.sql_in_db = True - for kids in self.sql_children: - for kid in getattr(self, kids): + for k,v in self.sql_children: + for kid in getattr(self, k): kid.sql_store(db, cur) def sql_delete(self, db, cur=None): @@ -104,8 +110,8 @@ class sql_persistant(object): if self.sql_in_db: cur.execute(self.sql_delete_cmd, self.sql_encode()) self.sql_in_db = False - for kids in self.sql_children: - for kid in getattr(self, kids): + for k,v in self.sql_children: + for kid in getattr(self, k): kid.sql_delete(db, cur) def sql_encode(self): |