Antony Lesuisse has proposed merging
lp:~openerp-dev/openobject-server/6.0-dbcreatecache into
lp:openobject-server/6.0.
Requested reviews:
OpenERP Core Team (openerp)
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/6.0-dbcreatecache/+merge/63185
It's freaking fast !!!
Actually, this should be ported into 6.1 and should stay as a patch for the 6.0
serie.
--
https://code.launchpad.net/~openerp-dev/openobject-server/6.0-dbcreatecache/+merge/63185
Your team OpenERP R&D Team is subscribed to branch
lp:~openerp-dev/openobject-server/6.0-dbcreatecache.
=== modified file 'bin/service/web_services.py'
--- bin/service/web_services.py 2011-01-15 17:04:10 +0000
+++ bin/service/web_services.py 2011-06-02 00:24:31 +0000
@@ -37,8 +37,103 @@
import tools
import locale
import logging
+import traceback
+import zlib
from cStringIO import StringIO
+DBInitializerCache = {}
+
+class DBInitializer(object):
+ def __init__(self, service, action_id, db_name, db_demo, db_lang, db_user_password='admin'):
+ self.service = service
+ self.action_id = action_id
+ self.action = self.service.actions[action_id]
+ self.db_name = db_name
+ self.db_lang = db_lang
+ self.db_demo = db_demo
+ self.db_user_password = db_user_password
+ self.registry = None
+
+ def __call__(self):
+ self.run()
+
+ def with_cr(self,f):
+ cr = None
+ try:
+ cr = sql_db.db_connect(self.db_name).cursor()
+ f(cr)
+ finally:
+ if cr:
+ cr.close()
+
+ def run(self):
+ try:
+ self.action['progress'] = 0
+ key = (self.db_lang, self.db_demo)
+ if key not in DBInitializerCache:
+ self.run_new(key)
+ else:
+ self.run_cached(key)
+ except Exception, e:
+ e_str = StringIO()
+ traceback.print_exc(file=e_str)
+ traceback_str = e_str.getvalue()
+ e_str.close()
+ netsvc.Logger().notifyChannel('web-services', netsvc.LOG_ERROR, 'CREATE DATABASE\n%s' % (traceback_str))
+ self.action['clean'] = False
+ self.action['exception'] = e
+ self.action['traceback'] = traceback_str
+
+ def run_new(self,key):
+ self.service._create_empty_database(self.db_name)
+ self.with_cr(self.init_base)
+ self.with_cr(self.init_lang)
+ try:
+ s = zlib.compress(self.service.exp_dump(self.db_name), 9)
+ DBInitializerCache[key] = s
+ print "saved",key,"size",len(s)
+ except Exception,e:
+ pass
+ self.with_cr(self.init_user)
+
+ def run_cached(self,key):
+ s = DBInitializerCache[key]
+ self.service.exp_restore(self.db_name, zlib.decompress(s))
+ self.registry = pooler.get_pool(self.db_name, self.db_demo, None)
+ self.with_cr(self.init_user)
+ self.with_cr(self.init_cached)
+
+ def init_base(self,cr):
+ tools.init_db(cr)
+ cr.commit()
+ tools.config['lang'] = self.db_lang
+ self.registry = pooler.restart_pool(self.db_name, self.db_demo, self.action, update_module=True)[1]
+
+ def init_lang(self,cr):
+ if self.db_lang:
+ modobj = self.registry.get('ir.module.module')
+ mids = modobj.search(cr, 1, [('state', '=', 'installed')])
+ modobj.update_translations(cr, 1, mids, self.db_lang)
+ cr.commit()
+
+ def init_user(self,cr):
+ cr.execute('UPDATE res_users SET password=%s, context_lang=%s, active=True WHERE login=%s', ( self.db_user_password, self.db_lang, 'admin'))
+ cr.execute('SELECT login, password, name FROM res_users ORDER BY login')
+ self.action['users'] = cr.dictfetchall()
+ self.action['clean'] = True
+ cr.commit()
+
+ def init_cached(self,cr):
+ cr.execute('DELETE from ir_config_parameter')
+ self.registry.get('ir.config_parameter').init(cr)
+ for i in self.registry.obj_list():
+ table = self.registry.get(i)._table
+ cr.execute("SELECT c.relname FROM pg_class c, pg_attribute a WHERE c.oid=a.attrelid AND c.relname=%s AND a.attname=%s """, (table, 'create_date'))
+ if len(cr.fetchall()) > 0:
+ cr.execute('UPDATE %s SET create_date = NOW() WHERE create_date IS NOT NULL'%table)
+ cr.execute('UPDATE %s SET write_date = NOW() WHERE write_date IS NOT NULL'%table)
+ cr.commit()
+
class db(netsvc.ExportService):
def __init__(self, name="db"):
netsvc.ExportService.__init__(self, name)
@@ -67,6 +162,7 @@
def new_dispatch(self,method,auth,params):
pass
+
def _create_empty_database(self, name):
db = sql_db.db_connect('template1')
cr = db.cursor()
@@ -84,55 +180,14 @@
self.actions[id] = {'clean': False}
- self._create_empty_database(db_name)
-
- class DBInitialize(object):
- def __call__(self, serv, id, db_name, demo, lang, user_password='admin'):
- cr = None
- try:
- serv.actions[id]['progress'] = 0
- cr = sql_db.db_connect(db_name).cursor()
- tools.init_db(cr)
- tools.config['lang'] = lang
- cr.commit()
- cr.close()
- cr = None
- pool = pooler.restart_pool(db_name, demo, serv.actions[id],
- update_module=True)[1]
-
- cr = sql_db.db_connect(db_name).cursor()
-
- if lang:
- modobj = pool.get('ir.module.module')
- mids = modobj.search(cr, 1, [('state', '=', 'installed')])
- modobj.update_translations(cr, 1, mids, lang)
-
- cr.execute('UPDATE res_users SET password=%s, context_lang=%s, active=True WHERE login=%s', (
- user_password, lang, 'admin'))
- cr.execute('SELECT login, password, name ' \
- ' FROM res_users ' \
- ' ORDER BY login')
- serv.actions[id]['users'] = cr.dictfetchall()
- serv.actions[id]['clean'] = True
- cr.commit()
- cr.close()
- except Exception, e:
- serv.actions[id]['clean'] = False
- serv.actions[id]['exception'] = e
- import traceback
- e_str = StringIO()
- traceback.print_exc(file=e_str)
- traceback_str = e_str.getvalue()
- e_str.close()
- netsvc.Logger().notifyChannel('web-services', netsvc.LOG_ERROR, 'CREATE DATABASE\n%s' % (traceback_str))
- serv.actions[id]['traceback'] = traceback_str
- if cr:
- cr.close()
+ if self.exp_db_exist(db_name):
+ logger.notifyChannel("web-services", netsvc.LOG_WARNING, 'CREATE DATABASE: %s already exists' % (db_name,))
+ raise Exception, "Database already exists"
+
logger = netsvc.Logger()
logger.notifyChannel("web-services", netsvc.LOG_INFO, 'CREATE DATABASE: %s' % (db_name.lower()))
- dbi = DBInitialize()
- create_thread = threading.Thread(target=dbi,
- args=(self, id, db_name, demo, lang, user_password))
+ dbi = DBInitializer(self, id, db_name, demo, lang, user_password)
+ create_thread = threading.Thread(target=dbi)
create_thread.start()
self.actions[id]['thread'] = create_thread
return id
@@ -217,8 +272,7 @@
self._set_pg_psw_env_var()
if self.exp_db_exist(db_name):
- logger.notifyChannel("web-services", netsvc.LOG_WARNING,
- 'RESTORE DB: %s already exists' % (db_name,))
+ logger.notifyChannel("web-services", netsvc.LOG_WARNING, 'RESTORE DB: %s already exists' % (db_name,))
raise Exception, "Database already exists"
self._create_empty_database(db_name)
@@ -346,6 +400,7 @@
l.notifyChannel('web-services', netsvc.LOG_ERROR, tb_s)
raise
return True
+
db()
class _ObjectService(netsvc.ExportService):
@@ -397,7 +452,6 @@
fn = getattr(self, 'exp_'+method)
return fn(*params)
-
def new_dispatch(self,method,auth,params):
pass
@@ -423,16 +477,7 @@
@param extended: if True then return version info
@return string if extended is False else tuple
"""
-
- info = _('''
-
-OpenERP is an ERP+CRM program for small and medium businesses.
-
-The whole source code is distributed under the terms of the
-GNU Public Licence.
-
-(c) 2003-TODAY, Fabien Pinckaers - Tiny sprl''')
-
+ info = 'OpenERP'
if extended:
return info, release.version
return info
@@ -452,7 +497,6 @@
except tm.RemoteContractException, e:
self.abortResponse(1, 'Migration Error', 'warning', str(e))
-
def exp_get_migration_scripts(self, contract_id, contract_password):
l = netsvc.Logger()
import tools.maintenance as tm
@@ -665,6 +709,7 @@
raise Exception, 'AccessDenied'
else:
raise Exception, 'WizardNotFound'
+
wizard()
#
@@ -781,6 +826,4 @@
report_spool()
-
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help : https://help.launchpad.net/ListHelp