From 2081fa095961bfa5685b38e17024a77070aceae9 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Sat, 28 Nov 2009 00:11:26 +0100 Subject: [FIX] connection pool when database password is provided (thanks to Syleam Crew) lp bug: https://launchpad.net/bugs/488234 fixed bzr revid: chs@tinyerp.com-20091127231126-lbdmz9i9tm50k8f7 --- bin/sql_db.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'bin/sql_db.py') diff --git a/bin/sql_db.py b/bin/sql_db.py index 5c288efd817..b36634c5956 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -235,7 +235,7 @@ class ConnectionPool(object): result = None for i, (cnx, used) in enumerate(self._connections): - if not used and cnx.dsn == dsn: + if not used and dsn_are_equals(cnx.dsn, dsn): self._debug('Existing connection found at index %d' % i) self._connections.pop(i) @@ -276,7 +276,7 @@ class ConnectionPool(object): @locked def close_all(self, dsn): for i, (cnx, used) in tools.reverse_enumerate(self._connections): - if cnx.dsn == dsn: + if dsn_are_equals(cnx.dsn, dsn): cnx.close() self._connections.pop(i) @@ -295,6 +295,7 @@ class Connection(object): def __del__(self): if self._unique: + close_db(self.dbname) self.__LOCKS[self.dbname].release() def cursor(self, serialized=False): @@ -313,6 +314,13 @@ for p in ('host', 'port', 'user', 'password'): def dsn(db_name): return '%sdbname=%s' % (_dsn, db_name) +def dsn_are_equals(first, second): + def key(dsn): + k = dict(x.split('=', 1) for x in dsn.strip().split()) + k.pop('password', None) # password is not relevant + return k + return key(first) == key(second) + _Pool = ConnectionPool(int(tools.config['db_maxconn'])) -- cgit v1.2.3 From f51520986054b7cc0eb84958c46840901b49d9ef Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Sat, 28 Nov 2009 00:47:26 +0100 Subject: [IMP] sql_log bzr revid: chs@tinyerp.com-20091127234726-1k4g37h036x0hy7a --- bin/sql_db.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'bin/sql_db.py') diff --git a/bin/sql_db.py b/bin/sql_db.py index b36634c5956..6d2d8b779ef 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -53,6 +53,7 @@ psycopg2.extensions.register_type(psycopg2.extensions.new_type((700, 701, 1700,) import tools from tools.func import wraps from datetime import datetime as mdt +from datetime import timedelta import threading import re @@ -128,18 +129,21 @@ class Cursor(object): raise if self.sql_log: + delay = mdt.now() - now + delay = delay.seconds * 1E6 + delay.microseconds + log("query: %s" % self._obj.query) self.sql_log_count+=1 res_from = re_from.match(query.lower()) if res_from: self.sql_from_log.setdefault(res_from.group(1), [0, 0]) self.sql_from_log[res_from.group(1)][0] += 1 - self.sql_from_log[res_from.group(1)][1] += mdt.now() - now + self.sql_from_log[res_from.group(1)][1] += delay res_into = re_into.match(query.lower()) if res_into: self.sql_into_log.setdefault(res_into.group(1), [0, 0]) self.sql_into_log[res_into.group(1)][0] += 1 - self.sql_into_log[res_into.group(1)][1] += mdt.now() - now + self.sql_into_log[res_into.group(1)][1] += delay return res def print_log(self): @@ -155,9 +159,11 @@ class Cursor(object): sum = 0 log("SQL LOG %s:" % (type,)) for r in sqllogitems: - log("table: %s: %s/%s" %(r[0], str(r[1][1]), r[1][0])) + delay = timedelta(microseconds=r[1][1]) + log("table: %s: %s/%s" %(r[0], str(delay), r[1][0])) sum+= r[1][1] - log("SUM:%s/%d" % (sum, self.sql_log_count)) + sum = timedelta(microseconds=sum) + log("SUM:%s/%d" % (str(sum), self.sql_log_count)) sqllogs[type].clear() process('from') process('into') -- cgit v1.2.3 From e345e91365f2ab3c9130a3903715b1e1db5a477d Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 1 Dec 2009 14:32:14 +0100 Subject: [FIX] db_exist method works as expected bzr revid: chs@tinyerp.com-20091201133214-8c6i1ohk5t5u79dz --- bin/sql_db.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'bin/sql_db.py') diff --git a/bin/sql_db.py b/bin/sql_db.py index 6d2d8b779ef..59d7bcaac1f 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -310,6 +310,15 @@ class Connection(object): def serialized_cursor(self): return self.cursor(True) + def __nonzero__(self): + """Check if connection is possible""" + try: + cr = self.cursor() + cr.close() + return True + except: + return False + _dsn = '' for p in ('host', 'port', 'user', 'password'): -- cgit v1.2.3