server/sqlutils.py
changeset 2493 9806571ea790
parent 2396 8bfb99d7bbcc
child 2510 2aeac9d85a79
equal deleted inserted replaced
2492:c51be1cf8317 2493:9806571ea790
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 """
     7 """
     8 __docformat__ = "restructuredtext en"
     8 __docformat__ = "restructuredtext en"
     9 
     9 
       
    10 import os
       
    11 from os.path import exists
    10 from warnings import warn
    12 from warnings import warn
    11 from datetime import datetime, date, timedelta
    13 from datetime import datetime, date, timedelta
    12 
    14 
    13 import logilab.common as lgc
    15 import logilab.common as lgc
    14 from logilab.common.shellutils import ProgressBar
    16 from logilab.common.shellutils import ProgressBar
    19 from indexer import get_indexer
    21 from indexer import get_indexer
    20 
    22 
    21 from cubicweb import Binary, ConfigurationError
    23 from cubicweb import Binary, ConfigurationError
    22 from cubicweb.utils import todate, todatetime
    24 from cubicweb.utils import todate, todatetime
    23 from cubicweb.common.uilib import remove_html_tags
    25 from cubicweb.common.uilib import remove_html_tags
       
    26 from cubicweb.toolsutils import restrict_perms_to_user
    24 from cubicweb.server import SQL_CONNECT_HOOKS
    27 from cubicweb.server import SQL_CONNECT_HOOKS
    25 from cubicweb.server.utils import crypt_password
    28 from cubicweb.server.utils import crypt_password
    26 
    29 
    27 
    30 
    28 lgc.USE_MX_DATETIME = False
    31 lgc.USE_MX_DATETIME = False
   114     w(dropschema2sql(schema, prefix=SQL_PREFIX,
   117     w(dropschema2sql(schema, prefix=SQL_PREFIX,
   115                      skip_entities=skip_entities,
   118                      skip_entities=skip_entities,
   116                      skip_relations=skip_relations))
   119                      skip_relations=skip_relations))
   117     return '\n'.join(output)
   120     return '\n'.join(output)
   118 
   121 
       
   122 
       
   123 def sql_source_backup(source, sqladapter, confirm, backupfile,
       
   124                       askconfirm=False):
       
   125     if exists(backupfile):
       
   126         if not confirm('backup file %s exists, overwrite it?' % backupfile):
       
   127             return
       
   128     elif askconfirm and not confirm('backup %s %database?'
       
   129                                     % source.repo.config.appid):
       
   130         return
       
   131     # should close opened connection before backuping
       
   132     source.close_pool_connections()
       
   133     try:
       
   134         sqladapter.backup_to_file(backupfile, confirm)
       
   135     finally:
       
   136         source.open_pool_connections()
       
   137 
       
   138 def sql_source_restore(source, sqladapter, confirm, backupfile, drop=True,
       
   139                        askconfirm=False):
       
   140     if not exists(backupfile):
       
   141         raise Exception("backup file %s doesn't exist" % backupfile)
       
   142     app = source.repo.config.appid
       
   143     if askconfirm and not confirm('restore %s %s database from %s ?'
       
   144                                   % (app, source.uri, backupfile)):
       
   145         return
       
   146     # should close opened connection before restoring
       
   147     source.close_pool_connections()
       
   148     try:
       
   149         sqladapter.restore_from_file(backupfile, confirm, drop=drop)
       
   150     finally:
       
   151         source.open_pool_connections()
       
   152 
       
   153 
   119 try:
   154 try:
   120     from mx.DateTime import DateTimeType, DateTimeDeltaType
   155     from mx.DateTime import DateTimeType, DateTimeDeltaType
   121 except ImportError:
   156 except ImportError:
   122     DateTimeType = DateTimeDeltaType = None
   157     DateTimeType = DateTimeDeltaType = None
   123 
   158 
   156                                         password or self.dbpasswd,
   191                                         password or self.dbpasswd,
   157                                         port=self.dbport)
   192                                         port=self.dbport)
   158         init_cnx(self.dbdriver, cnx)
   193         init_cnx(self.dbdriver, cnx)
   159         #self.dbapi_module.type_code_test(cnx.cursor())
   194         #self.dbapi_module.type_code_test(cnx.cursor())
   160         return cnx
   195         return cnx
       
   196 
       
   197     def backup_to_file(self, backupfile, confirm):
       
   198         cmd = self.dbhelper.backup_command(self.dbname, self.dbhost,
       
   199                                            self.dbuser, backupfile,
       
   200                                            keepownership=False)
       
   201         while True:
       
   202             print cmd
       
   203             if os.system(cmd):
       
   204                 print 'error while backuping the base'
       
   205                 answer = confirm('continue anyway?',
       
   206                                  shell=False, abort=False, retry=True)
       
   207                 if not answer:
       
   208                     raise SystemExit(1)
       
   209                 if answer == 1: # 1: continue, 2: retry
       
   210                     break
       
   211             else:
       
   212                 print 'database backup:', backupfile
       
   213                 restrict_perms_to_user(backupfile, self.info)
       
   214                 break
       
   215 
       
   216     def restore_from_file(self, backupfile, confirm, drop=True):
       
   217         for cmd in self.dbhelper.restore_commands(self.dbname, self.dbhost,
       
   218                                                   self.dbuser, backupfile,
       
   219                                                   self.encoding,
       
   220                                                   keepownership=False,
       
   221                                                   drop=drop):
       
   222             while True:
       
   223                 print cmd
       
   224                 if os.system(cmd):
       
   225                     print 'error while restoring the base'
       
   226                     print 'OOOOOPS', confirm
       
   227                     answer = confirm('continue anyway?',
       
   228                                      shell=False, abort=False, retry=True)
       
   229                     if not answer:
       
   230                         raise SystemExit(1)
       
   231                     if answer == 1: # 1: continue, 2: retry
       
   232                         break
       
   233                 else:
       
   234                     break
       
   235         print 'database restored'
   161 
   236 
   162     def merge_args(self, args, query_args):
   237     def merge_args(self, args, query_args):
   163         if args is not None:
   238         if args is not None:
   164             args = dict(args)
   239             args = dict(args)
   165             for key, val in args.items():
   240             for key, val in args.items():