diff --git a/bin/service/web_services.py b/bin/service/web_services.py index 69d8015f241..55ecdf91f04 100644 --- a/bin/service/web_services.py +++ b/bin/service/web_services.py @@ -65,8 +65,8 @@ class db(netsvc.Service): self.actions[id] = {'clean': False} db = sql_db.db_connect('template1', serialize=1) - db.truedb.autocommit() cr = db.cursor() + cr.autocommit(True) time.sleep(0.2) cr.execute('CREATE DATABASE ' + db_name + ' ENCODING \'unicode\'') cr.close() @@ -140,12 +140,12 @@ class db(netsvc.Service): def drop(self, password, db_name): security.check_super(password) - pooler.close_db(db_name) + sql_db.close_db(db_name) logger = netsvc.Logger() db = sql_db.db_connect('template1', serialize=1) - db.truedb.autocommit() cr = db.cursor() + cr.autocommit(True) try: try: cr.execute('DROP DATABASE ' + db_name) @@ -195,8 +195,8 @@ class db(netsvc.Service): raise Exception, "Database already exists" db = sql_db.db_connect('template1', serialize=1) - db.truedb.autocommit() cr = db.cursor() + cr.autocommit(True) cr.execute('CREATE DATABASE ' + db_name + ' ENCODING \'unicode\'') cr.close() @@ -231,7 +231,6 @@ class db(netsvc.Service): def db_exist(self, db_name): try: db = sql_db.db_connect(db_name) - db.truedb.close() return True except: return False @@ -256,7 +255,6 @@ class db(netsvc.Service): cr.close() except: res = [] - db.truedb.close() res.sort() return res diff --git a/bin/sql_db.py b/bin/sql_db.py index e52b94d89fa..ccf57d0c718 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -28,6 +28,21 @@ from psycopg2.psycopg1 import cursor as psycopg1cursor import psycopg2.extensions psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) +types_mapping = { + 'date': (1082,), + 'time': (1083,), + 'datetime': (1114,), +} + +def undecimalize(symb, cr): + if symb is None: return None + return float(symb) + +for name, typeoid in types_mapping.items(): + psycopg2.extensions.register_type(psycopg2.extensions.new_type(typeoid, name, lambda x, cr: x)) +psycopg2.extensions.register_type(psycopg2.extensions.new_type((700, 701, 1700,), 'float', undecimalize)) + + import tools import re @@ -64,16 +79,19 @@ class Cursor(object): query = base_string(query) if '%d' in query or '%f' in query: - log(queyr, netsvc.LOG_WARNING) + #import traceback + #traceback.print_stack() + log(query, netsvc.LOG_WARNING) log("SQL queries mustn't containt %d or %f anymore. Use only %s", netsvc.LOG_WARNING) - query = query.replace('%d', '%s').replace('%f', '%s') + if p: + query = query.replace('%d', '%s').replace('%f', '%s') if self.sql_log: now = mdt.now() log("SQL LOG query: %s" % (query,)) log("SQL LOG params: %r" % (p,)) - res = self._obj.execute(query, p) + res = self._obj.execute(query, p or None) if self.sql_log: self.count+=1 @@ -103,7 +121,7 @@ class Cursor(object): log("SUM:%s/%d" % (sum, self.count)) def close(self): - if self.sql_log: + if self.sql_from_log or self.sql_into_log: self.print_log('from') self.print_log('into') self._obj.close() @@ -166,8 +184,17 @@ class PoolManager(object): return PoolManager._pools[db_name] get = staticmethod(get) + def close(db_name): + if db_name is PoolManager._pools: + PoolManager._pools[db_name].closeall() + del PoolManager._pools[db_name] + close = staticmethod(close) + def db_connect(db_name, serialize=0): return PoolManager.get(db_name) +def close_db(db_name): + return PoolManager.close(db_name) + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: