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(): |