aboutsummaryrefslogtreecommitdiff
path: root/scripts/rpki/sql.py
blob: f0e2aa6d53ff5f7bd3b173a5e8eef20a05a790a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# $Id$

import MySQLdb

def connect(cfg, section="sql"):
  """Connect to a MySQL database using connection parameters from an
     rpki.config.parser object.
  """

  return MySQLdb.connect(user   = cfg.get(section, "sql-username"),
                         db     = cfg.get(section, "sql-database"),
                         passwd = cfg.get(section, "sql-password"))

class sql_persistant(object):
  """Mixin for persistant class that needs to be stored in SQL.
  """

  ## @var sql_children
  # Dictionary listing this class's children in the tree of SQL
  # tables.  Key is the class object of a child, value is the name of
  # the attribute in this class at which a list of the resulting child
  # objects are stored.
  sql_children = {}

  @classmethod
  def sql_fetch(cls, db, **kwargs):
    """Fetch rows from SQL based on a canned query and a set of
    keyword arguments, and instantiate them as objects, returning a
    list of the instantiated objects.

    This is a class method because in general we don't even know how
    many matches the SQL lookup will return until after we've
    performed it.
    """

    cur = db.cursor()
    cur.execute(self.sql_fetch_cmd % kwargs)
    rows = cur.fetchall()
    cur.close()
    objs = []
    for row in rows:
      obj = cls()
      obj.sql_objectify(row)
      objs.append(obj)
      if isinstance(obj, sql_persistant):
        for kid in obj.sql_children:
          setattr(obj, obj.sql_children[kid], kid.sql_fetch(db))
    return objs
      
  def sql_objectify(self, row):
    """Initialize self with values returned by self.sql_fetch().

    This method is also responsible for performing the
    fetch/objectify() cycle on any of its children in the tree of
    classes representing SQL tables in this database.  But I'm trying
    to move that responsibility to self.sql_fetch()....    
    """

    raise NotImplementedError