import repository from arizona
[raven.git] / apps / logmon / db.py
1
2 # This is not the right way to implement database connections, but it will do for now
3
4 import MySQLdb
5 import traceback
6 from errlogging import *
7
8 class DB:
9     host = None
10     name = None
11     user = None
12     passwd = None
13     _conns = {}
14
15     def __init__(self, host=None, name=None, user=None, passwd=None):
16         if host == None:
17             host = DB.host
18         if user == None:
19             user = DB.user
20         if passwd == None:
21             passwd = DB.passwd
22         if name == None:
23             name = DB.name
24         key = "%s:%s:%s" % (host, name, user)
25         if key not in DB._conns:
26             debug(None, "DB connect %s %s %s %s" % (str(host),str(user),str(passwd),str(name)))
27             try:
28                 self._conn = MySQLdb.connect(host=host, user=user, passwd=passwd, db=name)
29             except MySQLdb.Error, e:
30                 debug(None, "DB Error %d: %s" % (e.args[0], e.args[1]))
31                 raise
32         #DB._conns[key] = self._conn
33         self._cursor = self._conn.cursor()
34
35     def cursor(self):
36         if self._cursor:
37             self._cursor.close()
38         self._cursor = self._conn.cursor()
39         return self._cursor
40
41     def dict_cursor(self):
42         if self._cursor:
43             self._cursor.close()
44         self._cursor = self._conn.cursor(MySQLdb.cursors.DictCursor)
45         return self._cursor
46
47     def execute(self, query, args=None):
48         if args is not None:
49              query = query % self._conn.literal(args)
50         debug(None, "DB execute: %s" % (query))
51         try:
52             self._cursor.execute(query)
53         except:
54             debug(None, traceback.format_exc())
55             raise
56         return self._cursor
57
58     def get_columns(self, table):
59         self.dict_cursor()
60         columns = self.execute("SHOW COLUMNS FROM `" + table + "`;").fetchall()
61         return columns
62
63     def get_column_names(self, table):
64         columns = self.get_columns(table)
65         column_names = [x["Field"] for x in columns]
66         return column_names
67
68     def close(self):
69         self._close()
70         return
71
72     def _close(self):
73         debug(None, "DB close %s" % (self.name))
74         try:
75             if self._cursor != None:
76                 self._cursor.close()
77             if self._conn != None:
78                 self._conn.close()
79             self._cursor = None
80             self._conn = None
81         except MySQLdb.Error, e:
82             #print "Error %d: %s" % (e.args[0], e.args[1])
83             raise
84