32 from cubicweb.common.migration import MigrationHelper, yes |
32 from cubicweb.common.migration import MigrationHelper, yes |
33 |
33 |
34 try: |
34 try: |
35 from cubicweb.server import schemaserial as ss |
35 from cubicweb.server import schemaserial as ss |
36 from cubicweb.server.utils import manager_userpasswd |
36 from cubicweb.server.utils import manager_userpasswd |
37 from cubicweb.server.sqlutils import sqlexec |
37 from cubicweb.server.sqlutils import sqlexec, SQL_PREFIX |
38 except ImportError: # LAX |
38 except ImportError: # LAX |
39 pass |
39 pass |
40 |
40 |
|
41 def set_sql_prefix(prefix): |
|
42 """3.1.5 migration function: allow to unset/reset SQL_PREFIX""" |
|
43 for module in ('checkintegrity', 'migractions', 'schemahooks', |
|
44 'sources.rql2sql', 'sources.native'): |
|
45 try: |
|
46 sys.modules['cubicweb.server.%s' % module].SQL_PREFIX = prefix |
|
47 print 'changed SQL_PREFIX for %s' % module |
|
48 except KeyError: |
|
49 pass |
|
50 |
|
51 def update_database(repo): |
|
52 """3.1.3 migration function: update database schema by adding SQL_PREFIX to |
|
53 entity type tables and columns |
|
54 """ |
|
55 pool = repo._get_pool() |
|
56 source = repo.system_source |
|
57 sqlcu = pool['system'] |
|
58 for etype in repo.schema.entities(): |
|
59 if etype.is_final(): |
|
60 continue |
|
61 try: |
|
62 sqlcu.execute('ALTER TABLE %s RENAME TO cw_%s' % (etype, etype)) |
|
63 print 'renamed %s table for source %s' % (etype, uri) |
|
64 except: |
|
65 pass |
|
66 for rschema in etype.subject_relations(): |
|
67 if rschema == 'has_text': |
|
68 continue |
|
69 if rschema.is_final() or rschema.inlined: |
|
70 sqlcu.execute('ALTER TABLE cw_%s RENAME %s TO cw_%s' |
|
71 % (etype, rschema, rschema)) |
|
72 print 'renamed %s.%s column for source %s' % ( |
|
73 etype, rschema, uri) |
|
74 pool.commit() |
|
75 repo._free_pool(pool) |
|
76 |
|
77 |
41 class ServerMigrationHelper(MigrationHelper): |
78 class ServerMigrationHelper(MigrationHelper): |
42 """specific migration helper for server side migration scripts, |
79 """specific migration helper for server side migration scripts, |
43 providind actions related to schema/data migration |
80 providind actions related to schema/data migration |
44 """ |
81 """ |
45 |
82 |
60 self.fs_schema = schema |
97 self.fs_schema = schema |
61 self._synchronized = set() |
98 self._synchronized = set() |
62 |
99 |
63 @cached |
100 @cached |
64 def repo_connect(self): |
101 def repo_connect(self): |
65 self.repo = get_repository(method='inmemory', config=self.config) |
102 try: |
|
103 self.repo = get_repository(method='inmemory', config=self.config) |
|
104 except: |
|
105 import traceback |
|
106 traceback.print_exc() |
|
107 print '3.1.5 migration' |
|
108 # XXX 3.1.5 migration |
|
109 set_sql_prefix('') |
|
110 self.repo = get_repository(method='inmemory', config=self.config) |
|
111 update_database(self.repo) |
|
112 set_sql_prefix('cw_') |
66 return self.repo |
113 return self.repo |
67 |
114 |
68 def shutdown(self): |
115 def shutdown(self): |
69 if self.repo is not None: |
116 if self.repo is not None: |
70 self.repo.shutdown() |
117 self.repo.shutdown() |
104 if not answer: |
151 if not answer: |
105 raise SystemExit(1) |
152 raise SystemExit(1) |
106 if answer == 1: # 1: continue, 2: retry |
153 if answer == 1: # 1: continue, 2: retry |
107 break |
154 break |
108 else: |
155 else: |
|
156 from cubicweb.toolsutils import restrict_perms_to_user |
109 print 'database backup:', backupfile |
157 print 'database backup:', backupfile |
|
158 restrict_perms_to_user(backupfile, self.info) |
110 break |
159 break |
111 |
160 |
112 def restore_database(self, backupfile, drop=True): |
161 def restore_database(self, backupfile, drop=True): |
113 config = self.config |
162 config = self.config |
114 source = config.sources()['system'] |
163 source = config.sources()['system'] |
192 |
241 |
193 @property |
242 @property |
194 @cached |
243 @cached |
195 def rqlcursor(self): |
244 def rqlcursor(self): |
196 """lazy rql cursor""" |
245 """lazy rql cursor""" |
197 return self.cnx.cursor(self.session) |
246 # should not give session as cnx.cursor(), else we may try to execute |
|
247 # some query while no pool is set on the session (eg on entity attribute |
|
248 # access for instance) |
|
249 return self.cnx.cursor() |
198 |
250 |
199 def commit(self): |
251 def commit(self): |
200 if hasattr(self, '_cnx'): |
252 if hasattr(self, '_cnx'): |
201 self._cnx.commit() |
253 self._cnx.commit() |
202 |
254 |
1027 """low level method to create the sql table for an existing entity. |
1079 """low level method to create the sql table for an existing entity. |
1028 This may be useful on accidental desync between the repository schema |
1080 This may be useful on accidental desync between the repository schema |
1029 and a sql database |
1081 and a sql database |
1030 """ |
1082 """ |
1031 dbhelper = self.repo.system_source.dbhelper |
1083 dbhelper = self.repo.system_source.dbhelper |
1032 tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype)) |
1084 tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype), |
|
1085 prefix=SQL_PREFIX) |
1033 for sql in tablesql.split(';'): |
1086 for sql in tablesql.split(';'): |
1034 if sql.strip(): |
1087 if sql.strip(): |
1035 self.sqlexec(sql) |
1088 self.sqlexec(sql) |
1036 if commit: |
1089 if commit: |
1037 self.commit() |
1090 self.commit() |