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 if isinstance(source, SQLiteAbstractSource): |
|
71 sqlcu.execute('ALTER TABLE cw_%s ADD COLUMN cw_%s' |
|
72 % (etype, rschema)) |
|
73 sqlcu.execute('UPDATE cw_%s SET %s=cw_%s' |
|
74 % (etype, rschema, rschema)) |
|
75 print 'added %s.cw_%s column for source %s' % ( |
|
76 etype, rschema, uri) |
|
77 else: |
|
78 sqlcu.execute('ALTER TABLE cw_%s RENAME %s TO cw_%s' |
|
79 % (etype, rschema, rschema)) |
|
80 print 'renamed %s.%s column for source %s' % ( |
|
81 etype, rschema, uri) |
|
82 pool.commit() |
|
83 repo._free_pool(pool) |
|
84 |
|
85 |
41 class ServerMigrationHelper(MigrationHelper): |
86 class ServerMigrationHelper(MigrationHelper): |
42 """specific migration helper for server side migration scripts, |
87 """specific migration helper for server side migration scripts, |
43 providind actions related to schema/data migration |
88 providind actions related to schema/data migration |
44 """ |
89 """ |
45 |
90 |
60 self.fs_schema = schema |
105 self.fs_schema = schema |
61 self._synchronized = set() |
106 self._synchronized = set() |
62 |
107 |
63 @cached |
108 @cached |
64 def repo_connect(self): |
109 def repo_connect(self): |
65 self.repo = get_repository(method='inmemory', config=self.config) |
110 try: |
|
111 self.repo = get_repository(method='inmemory', config=self.config) |
|
112 except: |
|
113 import traceback |
|
114 traceback.print_exc() |
|
115 print '3.1.5 migration' |
|
116 # XXX 3.1.5 migration |
|
117 set_sql_prefix('') |
|
118 self.repo = get_repository(method='inmemory', config=self.config) |
|
119 update_database(self.repo) |
|
120 set_sql_prefix('cw_') |
66 return self.repo |
121 return self.repo |
67 |
122 |
68 def shutdown(self): |
123 def shutdown(self): |
69 if self.repo is not None: |
124 if self.repo is not None: |
70 self.repo.shutdown() |
125 self.repo.shutdown() |
1032 """low level method to create the sql table for an existing entity. |
1087 """low level method to create the sql table for an existing entity. |
1033 This may be useful on accidental desync between the repository schema |
1088 This may be useful on accidental desync between the repository schema |
1034 and a sql database |
1089 and a sql database |
1035 """ |
1090 """ |
1036 dbhelper = self.repo.system_source.dbhelper |
1091 dbhelper = self.repo.system_source.dbhelper |
1037 tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype)) |
1092 tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype), |
|
1093 prefix=SQL_PREFIX) |
1038 for sql in tablesql.split(';'): |
1094 for sql in tablesql.split(';'): |
1039 if sql.strip(): |
1095 if sql.strip(): |
1040 self.sqlexec(sql) |
1096 self.sqlexec(sql) |
1041 if commit: |
1097 if commit: |
1042 self.commit() |
1098 self.commit() |