X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2FPostgreSQL.py;h=de6f9fab083f35c7f1cc9cd627dad64536a6705b;hb=0dc36703e0e611113d310d2b2a8e51210576bcc5;hp=34334de82a41da25e451d2009a59c460a71e2f6c;hpb=f9763b9c1463dd15120e880c4221f9b756e340dd;p=sfa.git diff --git a/sfa/util/PostgreSQL.py b/sfa/util/PostgreSQL.py index 34334de8..de6f9fab 100644 --- a/sfa/util/PostgreSQL.py +++ b/sfa/util/PostgreSQL.py @@ -4,21 +4,25 @@ # # +import re +import traceback +import commands +from pprint import pformat +from types import StringTypes, NoneType + import psycopg2 import psycopg2.extensions psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) # UNICODEARRAY not exported yet psycopg2.extensions.register_type(psycopg2._psycopg.UNICODEARRAY) -import pgdb -from types import StringTypes, NoneType -import traceback -import commands -import re -from pprint import pformat +# allow to run sfa2wsdl if this is missing (for mac) +import sys +try: import pgdb +except: print >> sys.stderr, "WARNING, could not import pgdb" -from sfa.util.faults import * -from sfa.util.debug import * +from sfa.util.faults import SfaDBError +from sfa.util.sfalogging import logger if not psycopg2: is8bit = re.compile("[\x80-\xff]").search @@ -44,6 +48,13 @@ if not psycopg2: pgdb.pgdbTypeCache.typecast = unicast(pgdb.pgdbTypeCache.typecast) +def handle_exception(f): + def wrapper(*args, **kwds): + try: return f(*args, **kwds) + except Exception, fault: + raise SfaDBError(str(fault)) + return wrapper + class PostgreSQL: def __init__(self, config): self.config = config @@ -51,28 +62,29 @@ class PostgreSQL: # self.debug = True self.connection = None + @handle_exception def cursor(self): if self.connection is None: # (Re)initialize database connection if psycopg2: try: # Try UNIX socket first - self.connection = psycopg2.connect(user = self.config.SFA_PLC_DB_USER, - password = self.config.SFA_PLC_DB_PASSWORD, - database = self.config.SFA_PLC_DB_NAME) + self.connection = psycopg2.connect(user = self.config.SFA_DB_USER, + password = self.config.SFA_DB_PASSWORD, + database = self.config.SFA_DB_NAME) except psycopg2.OperationalError: # Fall back on TCP - self.connection = psycopg2.connect(user = self.config.SFA_PLC_DB_USER, - password = self.config.SFA_PLC_DB_PASSWORD, - database = self.config.SFA_PLC_DB_NAME, - host = self.config.SFA_PLC_DB_HOST, - port = self.config.SFA_PLC_DB_PORT) + self.connection = psycopg2.connect(user = self.config.SFA_DB_USER, + password = self.config.SFA_DB_PASSWORD, + database = self.config.SFA_DB_NAME, + host = self.config.SFA_DB_HOST, + port = self.config.SFA_DB_PORT) self.connection.set_client_encoding("UNICODE") else: - self.connection = pgdb.connect(user = self.config.SFA_PLC_DB_USER, - password = self.config.SFA_PLC_DB_PASSWORD, - host = "%s:%d" % (self.config.SFA_PLC_DB_HOST, self.config.SFA_PLC_DB_PORT), - database = self.config.SFA_PLC_DB_NAME) + self.connection = pgdb.connect(user = self.config.SFA_DB_USER, + password = self.config.SFA_DB_PASSWORD, + host = "%s:%d" % (self.config.SFA_DB_HOST, self.config.SFA_DB_PORT), + database = self.config.SFA_DB_NAME) (self.rowcount, self.description, self.lastrowid) = \ (None, None, None) @@ -132,13 +144,12 @@ class PostgreSQL: return self.rowcount def next_id(self, table_name, primary_key): - sequence = "%(table_name)s_%(primary_key)s_seq" % locals() - sql = "SELECT nextval('%(sequence)s')" % locals() - rows = self.selectall(sql, hashref = False) - if rows: - return rows[0][0] - - return None + sequence = "%(table_name)s_%(primary_key)s_seq" % locals() + sql = "SELECT nextval('%(sequence)s')" % locals() + rows = self.selectall(sql, hashref = False) + if rows: + return rows[0][0] + return None def last_insert_id(self, table_name, primary_key): if isinstance(self.lastrowid, int): @@ -172,21 +183,21 @@ class PostgreSQL: if not params: if self.debug: - print >> log,'execute0',query + logger.debug('execute0 %r'%query) cursor.execute(query) elif isinstance(params,dict): if self.debug: - print >> log,'execute-dict: params',params,'query',query%params + logger.debug('execute-dict: params=[%r] query=[%r]'%(params,query%params)) cursor.execute(query,params) elif isinstance(params,tuple) and len(params)==1: if self.debug: - print >> log,'execute-tuple',query%params[0] + logger.debug('execute-tuple %r'%(query%params[0])) cursor.execute(query,params[0]) else: param_seq=(params,) if self.debug: for params in param_seq: - print >> log,'executemany',query%params + logger.debug('executemany %r'%(query%params)) cursor.executemany(query, param_seq) (self.rowcount, self.description, self.lastrowid) = \ (cursor.rowcount, cursor.description, cursor.lastrowid) @@ -196,13 +207,12 @@ class PostgreSQL: except: pass uuid = commands.getoutput("uuidgen") - print >> log, "Database error %s:" % uuid - print >> log, e - print >> log, "Query:" - print >> log, query - print >> log, "Params:" - print >> log, pformat(params) - raise SfaDBError("Please contact support: %s" % e) + logger.error("Database error %s:" % uuid) + logger.error("Exception=%r"%e) + logger.error("Query=%r"%query) + logger.error("Params=%r"%pformat(params)) + logger.log_exc("PostgreSQL.execute caught exception") + raise SfaDBError("Please contact support: %s" % str(e)) return cursor