author | Julien Cristau <julien.cristau@logilab.fr> |
Tue, 21 Jan 2014 12:34:14 +0100 | |
changeset 9422 | 5a4fba9a02d7 |
parent 9421 | 6b673cb4d3b6 |
child 9478 | 2d7521881d3d |
child 9588 | fe267b7336f3 |
permissions | -rw-r--r-- |
9162
bf0a575d8da8
[migraction] rename_entity_type simply warn if old entity type isn't in the schema. Closes #3004069
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8807
diff
changeset
|
1 |
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5399
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
"""a class implementing basic actions used in migration scripts. |
19 |
||
20 |
The following schema actions are supported for now: |
|
21 |
* add/drop/rename attribute |
|
22 |
* add/drop entity/relation type |
|
23 |
* rename entity type |
|
24 |
||
25 |
The following data actions are supported for now: |
|
26 |
* add an entity |
|
27 |
* execute raw RQL queries |
|
5850
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
28 |
""" |
0 | 29 |
__docformat__ = "restructuredtext en" |
30 |
||
31 |
import sys |
|
32 |
import os |
|
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
33 |
import tarfile |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
34 |
import tempfile |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
35 |
import shutil |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
36 |
import os.path as osp |
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
972
diff
changeset
|
37 |
from datetime import datetime |
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
38 |
from glob import glob |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
39 |
from copy import copy |
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
40 |
from warnings import warn |
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
41 |
from contextlib import contextmanager |
0 | 42 |
|
2613
5e19c2bb370e
R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2493
diff
changeset
|
43 |
from logilab.common.deprecation import deprecated |
2107
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
44 |
from logilab.common.decorators import cached, clear_cache |
0 | 45 |
|
46 |
from yams.constraints import SizeConstraint |
|
9375
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
47 |
from yams.schema2sql import eschema2sql, rschema2sql, unique_index_name |
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
48 |
from yams.schema import RelationDefinitionSchema |
0 | 49 |
|
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
50 |
from cubicweb import CW_SOFTWARE_ROOT, AuthenticationError, ExecutionError |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8181
diff
changeset
|
51 |
from cubicweb.predicates import is_instance |
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
52 |
from cubicweb.schema import (ETYPE_NAME_MAP, META_RTYPES, VIRTUAL_RTYPES, |
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
53 |
PURE_VIRTUAL_RTYPES, |
2926
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
54 |
CubicWebRelationSchema, order_eschemas) |
6200
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
55 |
from cubicweb.cwvreg import CW_EVENT_MANAGER |
8673
8ea63a2cc2cc
[db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8669
diff
changeset
|
56 |
from cubicweb.dbapi import get_repository, _repo_connect |
4021
280c910c8710
move i18n / migration modules from cw.common to cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4017
diff
changeset
|
57 |
from cubicweb.migration import MigrationHelper, yes |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
58 |
from cubicweb.server import hook |
0 | 59 |
try: |
2107
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
60 |
from cubicweb.server import SOURCE_TYPES, schemaserial as ss |
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
61 |
from cubicweb.server.utils import manager_userpasswd |
1251
af40e615dc89
introduce a 'cw_' prefix on entity table and column names so we don't conflict with sql or DBMS specific keywords
sylvain.thenault@logilab.fr
parents:
1240
diff
changeset
|
62 |
from cubicweb.server.sqlutils import sqlexec, SQL_PREFIX |
0 | 63 |
except ImportError: # LAX |
64 |
pass |
|
65 |
||
6571
71b446d1cf93
[dependancy] do not use testlib from outside test: recent lgc versions recommends unittest2 while lgc.testlib needs it, and we don't want it to be necessary to run cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6323
diff
changeset
|
66 |
|
71b446d1cf93
[dependancy] do not use testlib from outside test: recent lgc versions recommends unittest2 while lgc.testlib needs it, and we don't want it to be necessary to run cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6323
diff
changeset
|
67 |
def mock_object(**params): |
71b446d1cf93
[dependancy] do not use testlib from outside test: recent lgc versions recommends unittest2 while lgc.testlib needs it, and we don't want it to be necessary to run cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6323
diff
changeset
|
68 |
return type('Mock', (), params)() |
71b446d1cf93
[dependancy] do not use testlib from outside test: recent lgc versions recommends unittest2 while lgc.testlib needs it, and we don't want it to be necessary to run cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6323
diff
changeset
|
69 |
|
6200
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
70 |
class ClearGroupMap(hook.Hook): |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
71 |
__regid__ = 'cw.migration.clear_group_mapping' |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
72 |
__select__ = hook.Hook.__select__ & is_instance('CWGroup') |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
73 |
events = ('after_add_entity', 'after_update_entity',) |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
74 |
def __call__(self): |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
75 |
clear_cache(self.mih, 'group_mapping') |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
76 |
self.mih._synchronized.clear() |
1251
af40e615dc89
introduce a 'cw_' prefix on entity table and column names so we don't conflict with sql or DBMS specific keywords
sylvain.thenault@logilab.fr
parents:
1240
diff
changeset
|
77 |
|
6205
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
78 |
@classmethod |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
79 |
def mih_register(cls, repo): |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
80 |
# may be already registered in tests (e.g. unittest_migractions at |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
81 |
# least) |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
82 |
if not cls.__regid__ in repo.vreg['after_add_entity_hooks']: |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
83 |
repo.vreg.register(ClearGroupMap) |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
84 |
|
0 | 85 |
class ServerMigrationHelper(MigrationHelper): |
9175
a7412e884d7b
fix typos in docstring, doc and comments
Julien Cristau <julien.cristau@logilab.fr>
parents:
9164
diff
changeset
|
86 |
"""specific migration helper for server side migration scripts, |
a7412e884d7b
fix typos in docstring, doc and comments
Julien Cristau <julien.cristau@logilab.fr>
parents:
9164
diff
changeset
|
87 |
providing actions related to schema/data migration |
0 | 88 |
""" |
89 |
||
90 |
def __init__(self, config, schema, interactive=True, |
|
91 |
repo=None, cnx=None, verbosity=1, connect=True): |
|
92 |
MigrationHelper.__init__(self, config, interactive, verbosity) |
|
93 |
if not interactive: |
|
94 |
assert cnx |
|
95 |
assert repo |
|
96 |
if cnx is not None: |
|
97 |
assert repo |
|
98 |
self._cnx = cnx |
|
99 |
self.repo = repo |
|
100 |
elif connect: |
|
101 |
self.repo_connect() |
|
5019
72734c210836
[c-c] new server_maintenance hook, called on c-c shell / upgrade
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4951
diff
changeset
|
102 |
# no config on shell to a remote instance |
5034
4781870e97d9
[maintainance] don't crash if we've no in-memory repository
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5019
diff
changeset
|
103 |
if config is not None and (cnx or connect): |
6203
d3dea5f84404
[test] during some tests (unittest_migrations), we should not register ClearGroupMap which is actually already there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6200
diff
changeset
|
104 |
repo = self.repo |
5019
72734c210836
[c-c] new server_maintenance hook, called on c-c shell / upgrade
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4951
diff
changeset
|
105 |
self.session.data['rebuild-infered'] = False |
6200
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
106 |
# register a hook to clear our group_mapping cache and the |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
107 |
# self._synchronized set when some group is added or updated |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
108 |
ClearGroupMap.mih = self |
6205
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
109 |
ClearGroupMap.mih_register(repo) |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
110 |
CW_EVENT_MANAGER.bind('after-registry-reload', |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
111 |
ClearGroupMap.mih_register, repo) |
6200
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
112 |
# notify we're starting maintenance (called instead of server_start |
6e8c847ae397
[migration] when some CWGroup is added during migration, we should reset migration handler's group mapping cache and the set telling what have been synchronized (we may be able to add some new groups on perms syncing...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6190
diff
changeset
|
113 |
# which is called on regular start |
6203
d3dea5f84404
[test] during some tests (unittest_migrations), we should not register ClearGroupMap which is actually already there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6200
diff
changeset
|
114 |
repo.hm.call_hooks('server_maintenance', repo=repo) |
5043
fe52dd3936cf
[repo config] cleanup read_instance_schema / bootstrap_schema / creating mess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5034
diff
changeset
|
115 |
if not schema and not getattr(config, 'quick_start', False): |
7797
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
116 |
insert_lperms = self.repo.get_versions()['cubicweb'] < (3, 14, 0) and 'localperms' in config.available_cubes() |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
117 |
if insert_lperms: |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
118 |
cubes = config._cubes |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
119 |
config._cubes += ('localperms',) |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
120 |
try: |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
121 |
schema = config.load_schema(expand_cubes=True) |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
122 |
finally: |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
123 |
if insert_lperms: |
a71618a75b53
backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
124 |
config._cubes = cubes |
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
125 |
self.fs_schema = schema |
0 | 126 |
self._synchronized = set() |
127 |
||
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
128 |
# overriden from base MigrationHelper ###################################### |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
129 |
|
0 | 130 |
@cached |
131 |
def repo_connect(self): |
|
8669
62213a34726e
[db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8645
diff
changeset
|
132 |
self.repo = get_repository(config=self.config) |
0 | 133 |
return self.repo |
1477 | 134 |
|
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
135 |
def cube_upgraded(self, cube, version): |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
136 |
self.cmd_set_property('system.version.%s' % cube.lower(), |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
137 |
unicode(version)) |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
138 |
self.commit() |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
139 |
|
0 | 140 |
def shutdown(self): |
141 |
if self.repo is not None: |
|
142 |
self.repo.shutdown() |
|
1477 | 143 |
|
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
144 |
def migrate(self, vcconf, toupgrade, options): |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
145 |
if not options.fs_only: |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
146 |
if options.backup_db is None: |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
147 |
self.backup_database() |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
148 |
elif options.backup_db: |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
149 |
self.backup_database(askconfirm=False) |
4925
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
150 |
# disable notification during migration |
8210
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
151 |
with self.session.allow_all_hooks_but('notification'): |
4925
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
152 |
super(ServerMigrationHelper, self).migrate(vcconf, toupgrade, options) |
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
153 |
|
3715
e3ccadb126d7
[shell] make process_script available throuhg c-c shell / migration script context
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3708
diff
changeset
|
154 |
def cmd_process_script(self, migrscript, funcname=None, *args, **kwargs): |
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
155 |
try: |
6042
df9cafb8062c
[migration] commit only sql script migration
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6035
diff
changeset
|
156 |
return super(ServerMigrationHelper, self).cmd_process_script( |
6035
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
157 |
migrscript, funcname, *args, **kwargs) |
8695
358d8bed9626
[toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8694
diff
changeset
|
158 |
except ExecutionError as err: |
7896
4c954e1e73ef
[lint] remove uses of "print >> sys.stderr" (closes #1908571)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7894
diff
changeset
|
159 |
sys.stderr.write("-> %s\n" % err) |
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
160 |
except BaseException: |
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
161 |
self.rollback() |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
162 |
raise |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
163 |
|
6035
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
164 |
# Adjust docstring |
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
165 |
cmd_process_script.__doc__ = MigrationHelper.cmd_process_script.__doc__ |
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
166 |
|
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
167 |
# server specific migration methods ######################################## |
1477 | 168 |
|
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
169 |
def backup_database(self, backupfile=None, askconfirm=True, format='native'): |
0 | 170 |
config = self.config |
2493
9806571ea790
major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2489
diff
changeset
|
171 |
repo = self.repo_connect() |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
172 |
# paths |
3192 | 173 |
timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
174 |
instbkdir = osp.join(config.appdatahome, 'backup') |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
175 |
if not osp.exists(instbkdir): |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
176 |
os.makedirs(instbkdir) |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
177 |
backupfile = backupfile or osp.join(instbkdir, '%s-%s.tar.gz' |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
178 |
% (config.appid, timestamp)) |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
179 |
# check backup has to be done |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
180 |
if osp.exists(backupfile) and not \ |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
181 |
self.confirm('Backup file %s exists, overwrite it?' % backupfile): |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
182 |
print '-> no backup done.' |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
183 |
return |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
184 |
elif askconfirm and not self.confirm('Backup %s database?' % config.appid): |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
185 |
print '-> no backup done.' |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
186 |
return |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
187 |
open(backupfile,'w').close() # kinda lock |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
188 |
os.chmod(backupfile, 0600) |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
189 |
# backup |
6918
9e607157d4cf
[cw-ctl] use default `mkdtemp()` behaviour to store backup file internally
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6816
diff
changeset
|
190 |
tmpdir = tempfile.mkdtemp() |
2960
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
191 |
try: |
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
192 |
failed = False |
2960
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
193 |
for source in repo.sources: |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
194 |
try: |
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
195 |
source.backup(osp.join(tmpdir, source.uri), self.confirm, format=format) |
8695
358d8bed9626
[toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8694
diff
changeset
|
196 |
except Exception as ex: |
4893
15ae9a33a7f2
[db backup] fix name error in backup_to_file: we've to pass .confirm all along the chain as for restore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
197 |
print '-> error trying to backup %s [%s]' % (source.uri, ex) |
2960
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
198 |
if not self.confirm('Continue anyway?', default='n'): |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
199 |
raise SystemExit(1) |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
200 |
else: |
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
201 |
failed = True |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
202 |
with open(osp.join(tmpdir, 'format.txt'), 'w') as format_file: |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
203 |
format_file.write('%s\n' % format) |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
204 |
with open(osp.join(tmpdir, 'versions.txt'), 'w') as version_file: |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
205 |
versions = repo.get_versions() |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
206 |
for cube, version in versions.iteritems(): |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
207 |
version_file.write('%s %s\n' % (cube, version)) |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
208 |
if not failed: |
2960
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
209 |
bkup = tarfile.open(backupfile, 'w|gz') |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
210 |
for filename in os.listdir(tmpdir): |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
211 |
bkup.add(osp.join(tmpdir, filename), filename) |
2960
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
212 |
bkup.close() |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
213 |
# call hooks |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
214 |
repo.hm.call_hooks('server_backup', repo=repo, timestamp=timestamp) |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
215 |
# done |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
216 |
print '-> backup file', backupfile |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
217 |
finally: |
1c6eafc68586
[db-dump] don't create tarball on failed dump, properly remove temporary directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2959
diff
changeset
|
218 |
shutil.rmtree(tmpdir) |
1477 | 219 |
|
2493
9806571ea790
major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2489
diff
changeset
|
220 |
def restore_database(self, backupfile, drop=True, systemonly=True, |
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
221 |
askconfirm=True, format='native'): |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
222 |
# check |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
223 |
if not osp.exists(backupfile): |
6323
a11c1e3c16c3
[c-c shell/upgrade] raise ExecutionError when traceback is not relevant
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6217
diff
changeset
|
224 |
raise ExecutionError("Backup file %s doesn't exist" % backupfile) |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
225 |
if askconfirm and not self.confirm('Restore %s database from %s ?' |
2959
daabb9bc5233
make db-restore command work even with no/corrupted database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2926
diff
changeset
|
226 |
% (self.config.appid, backupfile)): |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
227 |
return |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
228 |
# unpack backup |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
229 |
tmpdir = tempfile.mkdtemp() |
3105
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
230 |
try: |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
231 |
bkup = tarfile.open(backupfile, 'r|gz') |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
232 |
except tarfile.ReadError: |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
233 |
# assume restoring old backup |
4344
066e7884e57d
add source in backup/restore failure message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4339
diff
changeset
|
234 |
shutil.copy(backupfile, osp.join(tmpdir, 'system')) |
3105
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
235 |
else: |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
236 |
for name in bkup.getnames(): |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
237 |
if name[0] in '/.': |
6323
a11c1e3c16c3
[c-c shell/upgrade] raise ExecutionError when traceback is not relevant
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6217
diff
changeset
|
238 |
raise ExecutionError('Security check failed, path starts with "/" or "."') |
3105
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
239 |
bkup.close() # XXX seek error if not close+open !?! |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
240 |
bkup = tarfile.open(backupfile, 'r|gz') |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
241 |
bkup.extractall(path=tmpdir) |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
242 |
bkup.close() |
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
243 |
if osp.isfile(osp.join(tmpdir, 'format.txt')): |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
244 |
with open(osp.join(tmpdir, 'format.txt')) as format_file: |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
245 |
written_format = format_file.readline().strip() |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
246 |
if written_format in ('portable', 'native'): |
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
247 |
format = written_format |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
248 |
self.config.init_cnxset_pool = False |
2959
daabb9bc5233
make db-restore command work even with no/corrupted database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2926
diff
changeset
|
249 |
repo = self.repo_connect() |
2861
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
250 |
for source in repo.sources: |
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
251 |
if systemonly and source.uri != 'system': |
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
252 |
continue |
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
253 |
try: |
7342
d1c8b5b3531c
adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7295
diff
changeset
|
254 |
source.restore(osp.join(tmpdir, source.uri), self.confirm, drop, format) |
8695
358d8bed9626
[toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8694
diff
changeset
|
255 |
except Exception as exc: |
4344
066e7884e57d
add source in backup/restore failure message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4339
diff
changeset
|
256 |
print '-> error trying to restore %s [%s]' % (source.uri, exc) |
2861
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
257 |
if not self.confirm('Continue anyway?', default='n'): |
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
258 |
raise SystemExit(1) |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
259 |
shutil.rmtree(tmpdir) |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
260 |
# call hooks |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
261 |
repo.init_cnxset_pool() |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
262 |
repo.hm.call_hooks('server_restore', repo=repo, timestamp=backupfile) |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
263 |
print '-> database restored.' |
1477 | 264 |
|
0 | 265 |
@property |
266 |
def cnx(self): |
|
267 |
"""lazy connection""" |
|
268 |
try: |
|
269 |
return self._cnx |
|
270 |
except AttributeError: |
|
271 |
sourcescfg = self.repo.config.sources() |
|
272 |
try: |
|
273 |
login = sourcescfg['admin']['login'] |
|
274 |
pwd = sourcescfg['admin']['password'] |
|
275 |
except KeyError: |
|
276 |
login, pwd = manager_userpasswd() |
|
277 |
while True: |
|
278 |
try: |
|
8673
8ea63a2cc2cc
[db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8669
diff
changeset
|
279 |
self._cnx = _repo_connect(self.repo, login, password=pwd) |
0 | 280 |
if not 'managers' in self._cnx.user(self.session).groups: |
281 |
print 'migration need an account in the managers group' |
|
282 |
else: |
|
283 |
break |
|
284 |
except AuthenticationError: |
|
285 |
print 'wrong user/password' |
|
286 |
except (KeyboardInterrupt, EOFError): |
|
287 |
print 'aborting...' |
|
288 |
sys.exit(0) |
|
289 |
try: |
|
290 |
login, pwd = manager_userpasswd() |
|
291 |
except (KeyboardInterrupt, EOFError): |
|
292 |
print 'aborting...' |
|
293 |
sys.exit(0) |
|
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
294 |
self.session.keep_cnxset_mode('transaction') |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
295 |
self.session.data['rebuild-infered'] = False |
0 | 296 |
return self._cnx |
297 |
||
298 |
@property |
|
299 |
def session(self): |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
300 |
if self.config is not None: |
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4834
diff
changeset
|
301 |
session = self.repo._get_session(self.cnx.sessionid) |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
302 |
if session.cnxset is None: |
8807
d9aaad2c52e9
[session] drop useless getter and setter for security
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8794
diff
changeset
|
303 |
session.read_security = False |
d9aaad2c52e9
[session] drop useless getter and setter for security
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8794
diff
changeset
|
304 |
session.write_security = False |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
305 |
session.set_cnxset() |
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4834
diff
changeset
|
306 |
return session |
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
307 |
# no access to session on remote instance |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
308 |
return None |
1477 | 309 |
|
0 | 310 |
def commit(self): |
311 |
if hasattr(self, '_cnx'): |
|
312 |
self._cnx.commit() |
|
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4834
diff
changeset
|
313 |
if self.session: |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
314 |
self.session.set_cnxset() |
1477 | 315 |
|
0 | 316 |
def rollback(self): |
317 |
if hasattr(self, '_cnx'): |
|
318 |
self._cnx.rollback() |
|
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4834
diff
changeset
|
319 |
if self.session: |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
320 |
self.session.set_cnxset() |
1477 | 321 |
|
6186
8ada7df95877
[migration] set ask_confirm=False by default on rqlexec
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6179
diff
changeset
|
322 |
def rqlexecall(self, rqliter, ask_confirm=False): |
0 | 323 |
for rql, kwargs in rqliter: |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
324 |
self.rqlexec(rql, kwargs, ask_confirm=ask_confirm) |
0 | 325 |
|
326 |
@cached |
|
327 |
def _create_context(self): |
|
328 |
"""return a dictionary to use as migration script execution context""" |
|
329 |
context = super(ServerMigrationHelper, self)._create_context() |
|
4017
a5b4d4f2a1c7
use commit in migration script instead of checkpoint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
330 |
context.update({'commit': self.checkpoint, |
4330
cb7b68679501
make rollback available in shell (as commit is)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
331 |
'rollback': self.rollback, |
0 | 332 |
'sql': self.sqlexec, |
333 |
'rql': self.rqlexec, |
|
334 |
'rqliter': self.rqliter, |
|
3707
78596919ede3
[c-c] fixes for shell w/ pyro instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3700
diff
changeset
|
335 |
'schema': self.repo.get_schema(), |
78596919ede3
[c-c] fixes for shell w/ pyro instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3700
diff
changeset
|
336 |
'cnx': self.cnx, |
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
337 |
'fsschema': self.fs_schema, |
0 | 338 |
'session' : self.session, |
339 |
'repo' : self.repo, |
|
340 |
}) |
|
341 |
return context |
|
342 |
||
343 |
@cached |
|
344 |
def group_mapping(self): |
|
345 |
"""cached group mapping""" |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
346 |
return ss.group_mapping(self._cw) |
1477 | 347 |
|
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
348 |
@cached |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
349 |
def cstrtype_mapping(self): |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
350 |
"""cached constraint types mapping""" |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
351 |
return ss.cstrtype_mapping(self._cw) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
352 |
|
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
353 |
def cmd_exec_event_script(self, event, cube=None, funcname=None, |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
354 |
*args, **kwargs): |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
355 |
"""execute a cube event scripts `migration/<event>.py` where event |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
356 |
is one of 'precreate', 'postcreate', 'preremove' and 'postremove'. |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
357 |
""" |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
358 |
assert event in ('precreate', 'postcreate', 'preremove', 'postremove') |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
359 |
if cube: |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
360 |
cubepath = self.config.cube_dir(cube) |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
361 |
apc = osp.join(cubepath, 'migration', '%s.py' % event) |
7974
77eec6d6e144
[test] fix regression introduced in 7915:a7f3245e1728 leading to test's postcreate not being executed anymore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7948
diff
changeset
|
362 |
elif kwargs.pop('apphome', False): |
77eec6d6e144
[test] fix regression introduced in 7915:a7f3245e1728 leading to test's postcreate not being executed anymore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7948
diff
changeset
|
363 |
apc = osp.join(self.config.apphome, 'migration', '%s.py' % event) |
0 | 364 |
else: |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
365 |
apc = osp.join(self.config.migration_scripts_dir(), '%s.py' % event) |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
366 |
if osp.exists(apc): |
0 | 367 |
if self.config.free_wheel: |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
368 |
self.cmd_deactivate_verification_hooks() |
0 | 369 |
self.info('executing %s', apc) |
370 |
confirm = self.confirm |
|
371 |
execscript_confirm = self.execscript_confirm |
|
372 |
self.confirm = yes |
|
373 |
self.execscript_confirm = yes |
|
374 |
try: |
|
8210
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
375 |
if event == 'postcreate': |
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
376 |
with self.session.allow_all_hooks_but(): |
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
377 |
return self.cmd_process_script(apc, funcname, *args, **kwargs) |
3715
e3ccadb126d7
[shell] make process_script available throuhg c-c shell / migration script context
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3708
diff
changeset
|
378 |
return self.cmd_process_script(apc, funcname, *args, **kwargs) |
0 | 379 |
finally: |
380 |
self.confirm = confirm |
|
381 |
self.execscript_confirm = execscript_confirm |
|
382 |
if self.config.free_wheel: |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
383 |
self.cmd_reactivate_verification_hooks() |
0 | 384 |
|
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
385 |
def cmd_install_custom_sql_scripts(self, cube=None): |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
386 |
"""install a cube custom sql scripts `schema/*.<driver>.sql` where |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
387 |
<driver> depends on the instance main database backend (eg 'postgres', |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
388 |
'mysql'...) |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
389 |
""" |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
390 |
driver = self.repo.system_source.dbdriver |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
391 |
if cube is None: |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
392 |
directory = osp.join(CW_SOFTWARE_ROOT, 'schemas') |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
393 |
else: |
8047
972360b7677b
[instance creation] properly search for sql extension in the schema directory. Closes #2068117
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7974
diff
changeset
|
394 |
directory = osp.join(self.config.cube_dir(cube), 'schema') |
7990
a673d1d9a738
[diet] drop pre 3.6 API compatibility (but attempt to keep data cmopatibility). Closes #2017916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7979
diff
changeset
|
395 |
sql_scripts = glob(osp.join(directory, '*.%s.sql' % driver)) |
7479
b0603fc4ed6d
[sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7412
diff
changeset
|
396 |
for fpath in sql_scripts: |
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
397 |
print '-> installing', fpath |
9421
6b673cb4d3b6
[migractions] Don't silently ignore errors when installing sql procedures
Julien Cristau <julien.cristau@logilab.fr>
parents:
9375
diff
changeset
|
398 |
failed = sqlexec(open(fpath).read(), self.session.system_sql, False, |
6b673cb4d3b6
[migractions] Don't silently ignore errors when installing sql procedures
Julien Cristau <julien.cristau@logilab.fr>
parents:
9375
diff
changeset
|
399 |
delimiter=';;') |
6b673cb4d3b6
[migractions] Don't silently ignore errors when installing sql procedures
Julien Cristau <julien.cristau@logilab.fr>
parents:
9375
diff
changeset
|
400 |
if failed: |
6b673cb4d3b6
[migractions] Don't silently ignore errors when installing sql procedures
Julien Cristau <julien.cristau@logilab.fr>
parents:
9375
diff
changeset
|
401 |
print '-> ERROR, skipping', fpath |
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
402 |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
403 |
# schema synchronization internals ######################################## |
0 | 404 |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
405 |
def _synchronize_permissions(self, erschema, teid): |
0 | 406 |
"""permission synchronization for an entity or relation type""" |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
407 |
assert teid, erschema |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
408 |
if 'update' in erschema.ACTIONS or erschema.final: |
0 | 409 |
# entity type |
410 |
exprtype = u'ERQLExpression' |
|
411 |
else: |
|
412 |
# relation type |
|
413 |
exprtype = u'RRQLExpression' |
|
414 |
gm = self.group_mapping() |
|
415 |
confirm = self.verbosity >= 2 |
|
416 |
# * remove possibly deprecated permission (eg in the persistent schema |
|
417 |
# but not in the new schema) |
|
418 |
# * synchronize existing expressions |
|
419 |
# * add new groups/expressions |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
420 |
for action in erschema.ACTIONS: |
0 | 421 |
perm = '%s_permission' % action |
422 |
# handle groups |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
423 |
newgroups = list(erschema.get_groups(action)) |
0 | 424 |
for geid, gname in self.rqlexec('Any G, GN WHERE T %s G, G name GN, ' |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
425 |
'T eid %%(x)s' % perm, {'x': teid}, |
0 | 426 |
ask_confirm=False): |
427 |
if not gname in newgroups: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
428 |
if not confirm or self.confirm('Remove %s permission of %s to %s?' |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
429 |
% (action, erschema, gname)): |
0 | 430 |
self.rqlexec('DELETE T %s G WHERE G eid %%(x)s, T eid %s' |
431 |
% (perm, teid), |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
432 |
{'x': geid}, ask_confirm=False) |
0 | 433 |
else: |
434 |
newgroups.remove(gname) |
|
435 |
for gname in newgroups: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
436 |
if not confirm or self.confirm('Grant %s permission of %s to %s?' |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
437 |
% (action, erschema, gname)): |
6075
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
438 |
try: |
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
439 |
self.rqlexec('SET T %s G WHERE G eid %%(x)s, T eid %s' |
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
440 |
% (perm, teid), |
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
441 |
{'x': gm[gname]}, ask_confirm=False) |
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
442 |
except KeyError: |
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
443 |
self.error('can grant %s perm to unexistant group %s', |
6ebecb217efe
[migration] dont crash if a group doesn't exists (it may not exists yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6074
diff
changeset
|
444 |
action, gname) |
0 | 445 |
# handle rql expressions |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
446 |
newexprs = dict((expr.expression, expr) for expr in erschema.get_rqlexprs(action)) |
0 | 447 |
for expreid, expression in self.rqlexec('Any E, EX WHERE T %s E, E expression EX, ' |
448 |
'T eid %s' % (perm, teid), |
|
449 |
ask_confirm=False): |
|
450 |
if not expression in newexprs: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
451 |
if not confirm or self.confirm('Remove %s expression for %s permission of %s?' |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
452 |
% (expression, action, erschema)): |
0 | 453 |
# deleting the relation will delete the expression entity |
454 |
self.rqlexec('DELETE T %s E WHERE E eid %%(x)s, T eid %s' |
|
455 |
% (perm, teid), |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
456 |
{'x': expreid}, ask_confirm=False) |
0 | 457 |
else: |
458 |
newexprs.pop(expression) |
|
8696
0bb18407c053
[toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8695
diff
changeset
|
459 |
for expression in newexprs.itervalues(): |
0 | 460 |
expr = expression.expression |
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
461 |
if not confirm or self.confirm('Add %s expression for %s permission of %s?' |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
462 |
% (expr, action, erschema)): |
0 | 463 |
self.rqlexec('INSERT RQLExpression X: X exprtype %%(exprtype)s, ' |
464 |
'X expression %%(expr)s, X mainvars %%(vars)s, T %s X ' |
|
465 |
'WHERE T eid %%(x)s' % perm, |
|
466 |
{'expr': expr, 'exprtype': exprtype, |
|
7161
e3f69df8dac7
fix failing tests before 3.12 release
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7116
diff
changeset
|
467 |
'vars': u','.join(sorted(expression.mainvars)), |
e3f69df8dac7
fix failing tests before 3.12 release
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7116
diff
changeset
|
468 |
'x': teid}, |
0 | 469 |
ask_confirm=False) |
1477 | 470 |
|
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
471 |
def _synchronize_rschema(self, rtype, syncrdefs=True, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
472 |
syncperms=True, syncprops=True): |
0 | 473 |
"""synchronize properties of the persistent relation schema against its |
474 |
current definition: |
|
1477 | 475 |
|
0 | 476 |
* description |
4467
0e73d299730a
fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
477 |
* symmetric, meta |
0 | 478 |
* inlined |
479 |
* relation definitions if `syncrdefs` |
|
480 |
* permissions if `syncperms` |
|
1477 | 481 |
|
0 | 482 |
physical schema changes should be handled by repository's schema hooks |
483 |
""" |
|
484 |
rtype = str(rtype) |
|
485 |
if rtype in self._synchronized: |
|
486 |
return |
|
487 |
self._synchronized.add(rtype) |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
488 |
rschema = self.fs_schema.rschema(rtype) |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
489 |
reporschema = self.repo.schema.rschema(rtype) |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
490 |
if syncprops: |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
491 |
assert reporschema.eid, reporschema |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
492 |
self.rqlexecall(ss.updaterschema2rql(rschema, reporschema.eid), |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
493 |
ask_confirm=self.verbosity>=2) |
0 | 494 |
if syncrdefs: |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
495 |
for subj, obj in rschema.rdefs: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
496 |
if (subj, obj) not in reporschema.rdefs: |
0 | 497 |
continue |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
498 |
if rschema in VIRTUAL_RTYPES: |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
499 |
continue |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
500 |
self._synchronize_rdef_schema(subj, rschema, obj, |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
501 |
syncprops=syncprops, |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
502 |
syncperms=syncperms) |
1477 | 503 |
|
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
504 |
def _synchronize_eschema(self, etype, syncrdefs=True, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
505 |
syncperms=True, syncprops=True): |
0 | 506 |
"""synchronize properties of the persistent entity schema against |
507 |
its current definition: |
|
1477 | 508 |
|
0 | 509 |
* description |
510 |
* internationalizable, fulltextindexed, indexed, meta |
|
511 |
* relations from/to this entity |
|
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
512 |
* __unique_together__ |
0 | 513 |
* permissions if `syncperms` |
514 |
""" |
|
515 |
etype = str(etype) |
|
516 |
if etype in self._synchronized: |
|
517 |
return |
|
518 |
self._synchronized.add(etype) |
|
519 |
repoeschema = self.repo.schema.eschema(etype) |
|
520 |
try: |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
521 |
eschema = self.fs_schema.eschema(etype) |
0 | 522 |
except KeyError: |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
523 |
return # XXX somewhat unexpected, no?... |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
524 |
if syncprops: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
525 |
repospschema = repoeschema.specializes() |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
526 |
espschema = eschema.specializes() |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
527 |
if repospschema and not espschema: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
528 |
self.rqlexec('DELETE X specializes Y WHERE X is CWEType, X name %(x)s', |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
529 |
{'x': str(repoeschema)}, ask_confirm=False) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
530 |
elif not repospschema and espschema: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
531 |
self.rqlexec('SET X specializes Y WHERE X is CWEType, X name %(x)s, ' |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
532 |
'Y is CWEType, Y name %(y)s', |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
533 |
{'x': str(repoeschema), 'y': str(espschema)}, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
534 |
ask_confirm=False) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
535 |
self.rqlexecall(ss.updateeschema2rql(eschema, repoeschema.eid), |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
536 |
ask_confirm=self.verbosity >= 2) |
0 | 537 |
if syncperms: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
538 |
self._synchronize_permissions(eschema, repoeschema.eid) |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
539 |
if syncrdefs: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
540 |
for rschema, targettypes, role in eschema.relation_definitions(True): |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
541 |
if rschema in VIRTUAL_RTYPES: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
542 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
543 |
if role == 'subject': |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
544 |
if not rschema in repoeschema.subject_relations(): |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
545 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
546 |
subjtypes, objtypes = [etype], targettypes |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
547 |
else: # role == 'object' |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
548 |
if not rschema in repoeschema.object_relations(): |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
549 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
550 |
subjtypes, objtypes = targettypes, [etype] |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
551 |
self._synchronize_rschema(rschema, syncrdefs=False, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
552 |
syncprops=syncprops, syncperms=syncperms) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
553 |
reporschema = self.repo.schema.rschema(rschema) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
554 |
for subj in subjtypes: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
555 |
for obj in objtypes: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
556 |
if (subj, obj) not in reporschema.rdefs: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
557 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
558 |
self._synchronize_rdef_schema(subj, rschema, obj, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
559 |
syncprops=syncprops, syncperms=syncperms) |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
560 |
if syncprops: # need to process __unique_together__ after rdefs were processed |
9375
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
561 |
# mappings from constraint name to columns |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
562 |
# filesystem (fs) and repository (repo) wise |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
563 |
fs = {} |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
564 |
repo = {} |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
565 |
for cols in eschema._unique_together or (): |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
566 |
fs[unique_index_name(repoeschema, cols)] = sorted(cols) |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
567 |
schemaentity = self.session.entity_from_eid(repoeschema.eid) |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
568 |
for entity in schemaentity.related('constraint_of', 'object', |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
569 |
targettypes=('CWUniqueTogetherConstraint',)).entities(): |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
570 |
repo[entity.name] = sorted(rel.name for rel in entity.relations) |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
571 |
added = set(fs) - set(repo) |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
572 |
removed = set(repo) - set(fs) |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
573 |
|
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
574 |
for name in removed: |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
575 |
self.rqlexec('DELETE CWUniqueTogetherConstraint C WHERE C name %(name)s', |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
576 |
{'name': name}) |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
577 |
|
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
578 |
def possible_unique_constraint(cols): |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
579 |
for name in cols: |
9195
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
580 |
rschema = repoeschema.subjrels.get(name) |
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
581 |
if rschema is None: |
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
582 |
print 'dont add %s unique constraint on %s, missing %s' % ( |
9375
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
583 |
','.join(cols), eschema, name) |
9195
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
584 |
return False |
9241
cbee712dd310
[migractions] rschema.final.inlined -> rschema.inlined
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9195
diff
changeset
|
585 |
if not (rschema.final or rschema.inlined): |
9195
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
586 |
print 'dont add %s unique constraint on %s, %s is neither final nor inlined' % ( |
9375
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
587 |
','.join(cols), eschema, name) |
9195
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
588 |
return False |
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
589 |
return True |
9375
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
590 |
|
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
591 |
for name in added: |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
592 |
if possible_unique_constraint(fs[name]): |
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
593 |
rql, substs = ss._uniquetogether2rql(eschema, fs[name]) |
9195
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
594 |
substs['x'] = repoeschema.eid |
9375
8e88576787c3
[schema] fix unique together index handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9255
diff
changeset
|
595 |
substs['name'] = name |
9195
e9fb9377229e
[migration.sync_schema_props_perms] ensure all participants to a unique together constraint are there
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9175
diff
changeset
|
596 |
self.rqlexec(rql, substs) |
0 | 597 |
|
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
598 |
def _synchronize_rdef_schema(self, subjtype, rtype, objtype, |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
599 |
syncperms=True, syncprops=True): |
0 | 600 |
"""synchronize properties of the persistent relation definition schema |
601 |
against its current definition: |
|
602 |
* order and other properties |
|
603 |
* constraints |
|
604 |
""" |
|
605 |
subjtype, objtype = str(subjtype), str(objtype) |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
606 |
rschema = self.fs_schema.rschema(rtype) |
0 | 607 |
reporschema = self.repo.schema.rschema(rschema) |
608 |
if (subjtype, rschema, objtype) in self._synchronized: |
|
609 |
return |
|
610 |
self._synchronized.add((subjtype, rschema, objtype)) |
|
4467
0e73d299730a
fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
611 |
if rschema.symmetric: |
0 | 612 |
self._synchronized.add((objtype, rschema, subjtype)) |
4949
f4dce73da26b
[schema sync] don't try to synchronize infered relation defs, fixing a name error on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4947
diff
changeset
|
613 |
rdef = rschema.rdef(subjtype, objtype) |
f4dce73da26b
[schema sync] don't try to synchronize infered relation defs, fixing a name error on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4947
diff
changeset
|
614 |
if rdef.infered: |
f4dce73da26b
[schema sync] don't try to synchronize infered relation defs, fixing a name error on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4947
diff
changeset
|
615 |
return # don't try to synchronize infered relation defs |
4950
bca0873c0d6e
[schema sync] fix another potential name error on synchronizing rdefs
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4949
diff
changeset
|
616 |
repordef = reporschema.rdef(subjtype, objtype) |
0 | 617 |
confirm = self.verbosity >= 2 |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
618 |
if syncprops: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
619 |
# properties |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
620 |
self.rqlexecall(ss.updaterdef2rql(rdef, repordef.eid), |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
621 |
ask_confirm=confirm) |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
622 |
# constraints |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
623 |
newconstraints = list(rdef.constraints) |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
624 |
# 1. remove old constraints and update constraints of the same type |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
625 |
# NOTE: don't use rschema.constraint_by_type because it may be |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
626 |
# out of sync with newconstraints when multiple |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
627 |
# constraints of the same type are used |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
628 |
for cstr in repordef.constraints: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
629 |
for newcstr in newconstraints: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
630 |
if newcstr.type() == cstr.type(): |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
631 |
break |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
632 |
else: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
633 |
newcstr = None |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
634 |
if newcstr is None: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
635 |
self.rqlexec('DELETE X constrained_by C WHERE C eid %(x)s', |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
636 |
{'x': cstr.eid}, ask_confirm=confirm) |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
637 |
else: |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
638 |
newconstraints.remove(newcstr) |
4947
c3ded0287295
don't update constraints when it's not necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4904
diff
changeset
|
639 |
value = unicode(newcstr.serialize()) |
c3ded0287295
don't update constraints when it's not necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4904
diff
changeset
|
640 |
if value != unicode(cstr.serialize()): |
c3ded0287295
don't update constraints when it's not necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4904
diff
changeset
|
641 |
self.rqlexec('SET X value %(v)s WHERE X eid %(x)s', |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
642 |
{'x': cstr.eid, 'v': value}, |
4947
c3ded0287295
don't update constraints when it's not necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4904
diff
changeset
|
643 |
ask_confirm=confirm) |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
644 |
# 2. add new constraints |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
645 |
cstrtype_map = self.cstrtype_mapping() |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
646 |
self.rqlexecall(ss.constraints2rql(cstrtype_map, newconstraints, |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
647 |
repordef.eid), |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
648 |
ask_confirm=confirm) |
4188
b3258d2afe04
fix virtual relation detection: erschema is no more a relation type but a relation def in _synchronize_permissions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4099
diff
changeset
|
649 |
if syncperms and not rschema in VIRTUAL_RTYPES: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
650 |
self._synchronize_permissions(rdef, repordef.eid) |
1477 | 651 |
|
0 | 652 |
# base actions ############################################################ |
653 |
||
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3998
diff
changeset
|
654 |
def checkpoint(self, ask_confirm=True): |
0 | 655 |
"""checkpoint action""" |
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
656 |
if not ask_confirm or self.confirm('Commit now ?', shell=False): |
0 | 657 |
self.commit() |
658 |
||
659 |
def cmd_add_cube(self, cube, update_database=True): |
|
676
270eb87a768a
provide a new add_cubes() migration function for cases where the new cubes are linked together by new relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
447
diff
changeset
|
660 |
self.cmd_add_cubes( (cube,), update_database) |
1477 | 661 |
|
676
270eb87a768a
provide a new add_cubes() migration function for cases where the new cubes are linked together by new relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
447
diff
changeset
|
662 |
def cmd_add_cubes(self, cubes, update_database=True): |
0 | 663 |
"""update_database is telling if the database schema should be updated |
664 |
or if only the relevant eproperty should be inserted (for the case where |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2275
diff
changeset
|
665 |
a cube has been extracted from an existing instance, so the |
0 | 666 |
cube schema is already in there) |
667 |
""" |
|
676
270eb87a768a
provide a new add_cubes() migration function for cases where the new cubes are linked together by new relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
447
diff
changeset
|
668 |
newcubes = super(ServerMigrationHelper, self).cmd_add_cubes(cubes) |
0 | 669 |
if not newcubes: |
670 |
return |
|
2107
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
671 |
for cube in newcubes: |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
672 |
self.cmd_set_property('system.version.'+cube, |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
673 |
self.config.cube_version(cube)) |
3836
58c09f21f503
fix necessary when adding a cube which isn't listed in fs dependencies of the instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3715
diff
changeset
|
674 |
# ensure added cube is in config cubes |
58c09f21f503
fix necessary when adding a cube which isn't listed in fs dependencies of the instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3715
diff
changeset
|
675 |
# XXX worth restoring on error? |
58c09f21f503
fix necessary when adding a cube which isn't listed in fs dependencies of the instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3715
diff
changeset
|
676 |
if not cube in self.config._cubes: |
58c09f21f503
fix necessary when adding a cube which isn't listed in fs dependencies of the instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3715
diff
changeset
|
677 |
self.config._cubes += (cube,) |
0 | 678 |
if not update_database: |
679 |
self.commit() |
|
680 |
return |
|
1036
593df4919845
when reading the schema while adding/removing cubes, read schema in non-strict mode
sylvain.thenault@logilab.fr
parents:
1016
diff
changeset
|
681 |
newcubes_schema = self.config.load_schema(construction_mode='non-strict') |
3836
58c09f21f503
fix necessary when adding a cube which isn't listed in fs dependencies of the instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3715
diff
changeset
|
682 |
# XXX we have to replace fs_schema, used in cmd_add_relation_type |
58c09f21f503
fix necessary when adding a cube which isn't listed in fs dependencies of the instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3715
diff
changeset
|
683 |
# etc. and fsschema of migration script contexts |
6217
e2aeb40d5983
[migration] fix so that context modification are reflected on the currently executed migration script
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
684 |
self.fs_schema = newcubes_schema |
e2aeb40d5983
[migration] fix so that context modification are reflected on the currently executed migration script
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
685 |
self.update_context('fsschema', self.fs_schema) |
0 | 686 |
new = set() |
687 |
# execute pre-create files |
|
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
688 |
driver = self.repo.system_source.dbdriver |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
689 |
for cube in reversed(newcubes): |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
690 |
self.cmd_install_custom_sql_scripts(cube) |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
691 |
self.cmd_exec_event_script('precreate', cube) |
0 | 692 |
# add new entity and relation types |
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
693 |
for rschema in newcubes_schema.relations(): |
0 | 694 |
if not rschema in self.repo.schema: |
695 |
self.cmd_add_relation_type(rschema.type) |
|
696 |
new.add(rschema.type) |
|
2926
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
697 |
toadd = [eschema for eschema in newcubes_schema.entities() |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
698 |
if not eschema in self.repo.schema] |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
699 |
for eschema in order_eschemas(toadd): |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
700 |
self.cmd_add_entity_type(eschema.type) |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
701 |
new.add(eschema.type) |
0 | 702 |
# check if attributes has been added to existing entities |
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
703 |
for rschema in newcubes_schema.relations(): |
0 | 704 |
existingschema = self.repo.schema.rschema(rschema.type) |
4099
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
705 |
for (fromtype, totype) in rschema.rdefs: |
9164
4415209bea0a
[migration] when adding a cube, skip infered relations (closes #3005576)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9162
diff
changeset
|
706 |
# if rdef already exists or is infered from inheritance, |
4415209bea0a
[migration] when adding a cube, skip infered relations (closes #3005576)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9162
diff
changeset
|
707 |
# don't add it |
4415209bea0a
[migration] when adding a cube, skip infered relations (closes #3005576)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9162
diff
changeset
|
708 |
if (fromtype, totype) in existingschema.rdefs \ |
4415209bea0a
[migration] when adding a cube, skip infered relations (closes #3005576)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9162
diff
changeset
|
709 |
or rschema.rdefs[(fromtype, totype)].infered: |
0 | 710 |
continue |
711 |
# check we should actually add the relation definition |
|
712 |
if not (fromtype in new or totype in new or rschema in new): |
|
713 |
continue |
|
1477 | 714 |
self.cmd_add_relation_definition(str(fromtype), rschema.type, |
0 | 715 |
str(totype)) |
716 |
# execute post-create files |
|
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
717 |
for cube in reversed(newcubes): |
8210
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
718 |
with self.session.allow_all_hooks_but(): |
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
719 |
self.cmd_exec_event_script('postcreate', cube) |
1d1cfc97f6b9
[migration] fire hooks in postcreate by default (closes #1417110)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8190
diff
changeset
|
720 |
self.commit() |
1477 | 721 |
|
2124
5a0b02f37b23
set removedeps to False by default, raise an exception instead of a simple assertion for error, more remove_cube tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2122
diff
changeset
|
722 |
def cmd_remove_cube(self, cube, removedeps=False): |
2122
4ea13a828513
add removedeps option to remove_cube to control wether a cube's dependencies should be removed as well or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2107
diff
changeset
|
723 |
removedcubes = super(ServerMigrationHelper, self).cmd_remove_cube( |
4ea13a828513
add removedeps option to remove_cube to control wether a cube's dependencies should be removed as well or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2107
diff
changeset
|
724 |
cube, removedeps) |
0 | 725 |
if not removedcubes: |
726 |
return |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
727 |
fsschema = self.fs_schema |
1036
593df4919845
when reading the schema while adding/removing cubes, read schema in non-strict mode
sylvain.thenault@logilab.fr
parents:
1016
diff
changeset
|
728 |
removedcubes_schema = self.config.load_schema(construction_mode='non-strict') |
0 | 729 |
reposchema = self.repo.schema |
730 |
# execute pre-remove files |
|
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
731 |
for cube in reversed(removedcubes): |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
732 |
self.cmd_exec_event_script('preremove', cube) |
0 | 733 |
# remove cubes'entity and relation types |
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
734 |
for rschema in fsschema.relations(): |
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
735 |
if not rschema in removedcubes_schema and rschema in reposchema: |
0 | 736 |
self.cmd_drop_relation_type(rschema.type) |
2926
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
737 |
toremove = [eschema for eschema in fsschema.entities() |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
738 |
if not eschema in removedcubes_schema |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
739 |
and eschema in reposchema] |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
740 |
for eschema in reversed(order_eschemas(toremove)): |
4484387ed012
when adding/removing cubes, we should add/remove entity types in correct order if one inherits from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
741 |
self.cmd_drop_entity_type(eschema.type) |
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
742 |
for rschema in fsschema.relations(): |
1477 | 743 |
if rschema in removedcubes_schema and rschema in reposchema: |
744 |
# check if attributes/relations has been added to entities from |
|
0 | 745 |
# other cubes |
4099
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
746 |
for fromtype, totype in rschema.rdefs: |
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
747 |
if (fromtype, totype) not in removedcubes_schema[rschema.type].rdefs and \ |
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
748 |
(fromtype, totype) in reposchema[rschema.type].rdefs: |
0 | 749 |
self.cmd_drop_relation_definition( |
750 |
str(fromtype), rschema.type, str(totype)) |
|
751 |
# execute post-remove files |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
752 |
for cube in reversed(removedcubes): |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
753 |
self.cmd_exec_event_script('postremove', cube) |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
754 |
self.rqlexec('DELETE CWProperty X WHERE X pkey %(pk)s', |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
755 |
{'pk': u'system.version.'+cube}, ask_confirm=False) |
0 | 756 |
self.commit() |
1477 | 757 |
|
0 | 758 |
# schema migration actions ################################################ |
1477 | 759 |
|
0 | 760 |
def cmd_add_attribute(self, etype, attrname, attrtype=None, commit=True): |
761 |
"""add a new attribute on the given entity type""" |
|
762 |
if attrtype is None: |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
763 |
rschema = self.fs_schema.rschema(attrname) |
0 | 764 |
attrtype = rschema.objects(etype)[0] |
765 |
self.cmd_add_relation_definition(etype, attrname, attrtype, commit=commit) |
|
1477 | 766 |
|
0 | 767 |
def cmd_drop_attribute(self, etype, attrname, commit=True): |
768 |
"""drop an existing attribute from the given entity type |
|
1477 | 769 |
|
0 | 770 |
`attrname` is a string giving the name of the attribute to drop |
771 |
""" |
|
7556
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
772 |
try: |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
773 |
rschema = self.repo.schema.rschema(attrname) |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
774 |
attrtype = rschema.objects(etype)[0] |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
775 |
except KeyError: |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
776 |
print 'warning: attribute %s %s is not known, skip deletion' % ( |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
777 |
etype, attrname) |
7558
044135305359
[migration] litle enhancements and a fix to patch accidentally pushed two revisions ago
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7556
diff
changeset
|
778 |
else: |
044135305359
[migration] litle enhancements and a fix to patch accidentally pushed two revisions ago
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7556
diff
changeset
|
779 |
self.cmd_drop_relation_definition(etype, attrname, attrtype, |
044135305359
[migration] litle enhancements and a fix to patch accidentally pushed two revisions ago
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7556
diff
changeset
|
780 |
commit=commit) |
0 | 781 |
|
782 |
def cmd_rename_attribute(self, etype, oldname, newname, commit=True): |
|
783 |
"""rename an existing attribute of the given entity type |
|
1477 | 784 |
|
0 | 785 |
`oldname` is a string giving the name of the existing attribute |
786 |
`newname` is a string giving the name of the renamed attribute |
|
787 |
""" |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
788 |
eschema = self.fs_schema.eschema(etype) |
0 | 789 |
attrtype = eschema.destination(newname) |
790 |
# have to commit this first step anyway to get the definition |
|
791 |
# actually in the schema |
|
792 |
self.cmd_add_attribute(etype, newname, attrtype, commit=True) |
|
793 |
# skipp NULL values if the attribute is required |
|
794 |
rql = 'SET X %s VAL WHERE X is %s, X %s VAL' % (newname, etype, oldname) |
|
4633
a85b4361fb22
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4580
diff
changeset
|
795 |
card = eschema.rdef(newname).cardinality[0] |
0 | 796 |
if card == '1': |
797 |
rql += ', NOT X %s NULL' % oldname |
|
798 |
self.rqlexec(rql, ask_confirm=self.verbosity>=2) |
|
3548
4cf5a360952e
add some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3213
diff
changeset
|
799 |
# XXX if both attributes fulltext indexed, should skip fti rebuild |
4cf5a360952e
add some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3213
diff
changeset
|
800 |
# XXX if old attribute was fti indexed but not the new one old value |
4cf5a360952e
add some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3213
diff
changeset
|
801 |
# won't be removed from the index (this occurs on other kind of |
4cf5a360952e
add some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3213
diff
changeset
|
802 |
# fulltextindexed change...) |
0 | 803 |
self.cmd_drop_attribute(etype, oldname, commit=commit) |
1477 | 804 |
|
0 | 805 |
def cmd_add_entity_type(self, etype, auto=True, commit=True): |
806 |
"""register a new entity type |
|
1477 | 807 |
|
0 | 808 |
in auto mode, automatically register entity's relation where the |
809 |
targeted type is known |
|
810 |
""" |
|
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
811 |
instschema = self.repo.schema |
7166
dde161937d3e
[time zone] support for TZDatetime and TZTime data type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7161
diff
changeset
|
812 |
eschema = self.fs_schema.eschema(etype) |
7558
044135305359
[migration] litle enhancements and a fix to patch accidentally pushed two revisions ago
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7556
diff
changeset
|
813 |
if etype in instschema and not (eschema.final and eschema.eid is None): |
7556
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
814 |
print 'warning: %s already known, skip addition' % etype |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
815 |
return |
0 | 816 |
confirm = self.verbosity >= 2 |
4043
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
817 |
groupmap = self.group_mapping() |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
818 |
cstrtypemap = self.cstrtype_mapping() |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
819 |
# register the entity into CWEType |
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4834
diff
changeset
|
820 |
execute = self._cw.execute |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
821 |
ss.execschemarql(execute, eschema, ss.eschema2rql(eschema, groupmap)) |
0 | 822 |
# add specializes relation if needed |
5293
72e102a06709
[migration] fix bug when trying to add a new entity type that inherit from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5289
diff
changeset
|
823 |
specialized = eschema.specializes() |
72e102a06709
[migration] fix bug when trying to add a new entity type that inherit from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5289
diff
changeset
|
824 |
if specialized: |
72e102a06709
[migration] fix bug when trying to add a new entity type that inherit from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5289
diff
changeset
|
825 |
try: |
72e102a06709
[migration] fix bug when trying to add a new entity type that inherit from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5289
diff
changeset
|
826 |
specialized.eid = instschema[specialized].eid |
72e102a06709
[migration] fix bug when trying to add a new entity type that inherit from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5289
diff
changeset
|
827 |
except KeyError: |
6323
a11c1e3c16c3
[c-c shell/upgrade] raise ExecutionError when traceback is not relevant
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6217
diff
changeset
|
828 |
raise ExecutionError('trying to add entity type but parent type is ' |
a11c1e3c16c3
[c-c shell/upgrade] raise ExecutionError when traceback is not relevant
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6217
diff
changeset
|
829 |
'not yet in the database schema') |
5293
72e102a06709
[migration] fix bug when trying to add a new entity type that inherit from another
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5289
diff
changeset
|
830 |
self.rqlexecall(ss.eschemaspecialize2rql(eschema), ask_confirm=confirm) |
0 | 831 |
# register entity's attributes |
832 |
for rschema, attrschema in eschema.attribute_definitions(): |
|
833 |
# ignore those meta relations, they will be automatically added |
|
2617
89c62b855f2e
[R schema hooks] rename META_RELATIONS_TYPES into META_RTYPES, use it and other schema consts to avoid errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2616
diff
changeset
|
834 |
if rschema.type in META_RTYPES: |
0 | 835 |
continue |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
836 |
if not rschema.type in instschema: |
0 | 837 |
# need to add the relation type and to commit to get it |
838 |
# actually in the schema |
|
839 |
self.cmd_add_relation_type(rschema.type, False, commit=True) |
|
840 |
# register relation definition |
|
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
841 |
rdef = self._get_rdef(rschema, eschema, eschema.destination(rschema)) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
842 |
ss.execschemarql(execute, rdef, ss.rdef2rql(rdef, cstrtypemap, groupmap),) |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
843 |
# take care to newly introduced base class |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
844 |
# XXX some part of this should probably be under the "if auto" block |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
845 |
for spschema in eschema.specialized_by(recursive=False): |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
846 |
try: |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
847 |
instspschema = instschema[spschema] |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
848 |
except KeyError: |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
849 |
# specialized entity type not in schema, ignore |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
850 |
continue |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
851 |
if instspschema.specializes() != eschema: |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
852 |
self.rqlexec('SET D specializes P WHERE D eid %(d)s, P name %(pn)s', |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
853 |
{'d': instspschema.eid, 'pn': eschema.type}, |
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
854 |
ask_confirm=confirm) |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
855 |
for rschema, tschemas, role in spschema.relation_definitions(True): |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
856 |
for tschema in tschemas: |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
857 |
if not tschema in instschema: |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
858 |
continue |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
859 |
if role == 'subject': |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
860 |
subjschema = spschema |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
861 |
objschema = tschema |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3582
diff
changeset
|
862 |
if rschema.final and rschema in instspschema.subjrels: |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
863 |
# attribute already set, has_rdef would check if |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
864 |
# it's of the same type, we don't want this so |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
865 |
# simply skip here |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
866 |
continue |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
867 |
elif role == 'object': |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
868 |
subjschema = tschema |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
869 |
objschema = spschema |
4633
a85b4361fb22
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4580
diff
changeset
|
870 |
if (rschema.rdef(subjschema, objschema).infered |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
871 |
or (instschema.has_relation(rschema) and |
4633
a85b4361fb22
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4580
diff
changeset
|
872 |
(subjschema, objschema) in instschema[rschema].rdefs)): |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
873 |
continue |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
874 |
self.cmd_add_relation_definition( |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
875 |
subjschema.type, rschema.type, objschema.type) |
0 | 876 |
if auto: |
877 |
# we have commit here to get relation types actually in the schema |
|
878 |
self.commit() |
|
879 |
added = [] |
|
880 |
for rschema in eschema.subject_relations(): |
|
881 |
# attribute relation have already been processed and |
|
882 |
# 'owned_by'/'created_by' will be automatically added |
|
2617
89c62b855f2e
[R schema hooks] rename META_RELATIONS_TYPES into META_RTYPES, use it and other schema consts to avoid errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2616
diff
changeset
|
883 |
if rschema.final or rschema.type in META_RTYPES: |
0 | 884 |
continue |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
885 |
rtypeadded = rschema.type in instschema |
0 | 886 |
for targetschema in rschema.objects(etype): |
887 |
# ignore relations where the targeted type is not in the |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2275
diff
changeset
|
888 |
# current instance schema |
0 | 889 |
targettype = targetschema.type |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
890 |
if not targettype in instschema and targettype != etype: |
0 | 891 |
continue |
892 |
if not rtypeadded: |
|
893 |
# need to add the relation type and to commit to get it |
|
894 |
# actually in the schema |
|
895 |
added.append(rschema.type) |
|
896 |
self.cmd_add_relation_type(rschema.type, False, commit=True) |
|
897 |
rtypeadded = True |
|
898 |
# register relation definition |
|
4467
0e73d299730a
fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
899 |
# remember this two avoid adding twice non symmetric relation |
0 | 900 |
# such as "Emailthread forked_from Emailthread" |
901 |
added.append((etype, rschema.type, targettype)) |
|
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
902 |
rdef = self._get_rdef(rschema, eschema, targetschema) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
903 |
ss.execschemarql(execute, rdef, |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
904 |
ss.rdef2rql(rdef, cstrtypemap, groupmap)) |
0 | 905 |
for rschema in eschema.object_relations(): |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
906 |
if rschema.type in META_RTYPES: |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
907 |
continue |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
908 |
rtypeadded = rschema.type in instschema or rschema.type in added |
0 | 909 |
for targetschema in rschema.subjects(etype): |
910 |
# ignore relations where the targeted type is not in the |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2275
diff
changeset
|
911 |
# current instance schema |
0 | 912 |
targettype = targetschema.type |
913 |
# don't check targettype != etype since in this case the |
|
914 |
# relation has already been added as a subject relation |
|
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2962
diff
changeset
|
915 |
if not targettype in instschema: |
0 | 916 |
continue |
917 |
if not rtypeadded: |
|
918 |
# need to add the relation type and to commit to get it |
|
919 |
# actually in the schema |
|
920 |
self.cmd_add_relation_type(rschema.type, False, commit=True) |
|
921 |
rtypeadded = True |
|
922 |
elif (targettype, rschema.type, etype) in added: |
|
923 |
continue |
|
924 |
# register relation definition |
|
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
925 |
rdef = self._get_rdef(rschema, targetschema, eschema) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
926 |
ss.execschemarql(execute, rdef, |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
927 |
ss.rdef2rql(rdef, cstrtypemap, groupmap)) |
0 | 928 |
if commit: |
929 |
self.commit() |
|
1477 | 930 |
|
0 | 931 |
def cmd_drop_entity_type(self, etype, commit=True): |
932 |
"""unregister an existing entity type |
|
1477 | 933 |
|
0 | 934 |
This will trigger deletion of necessary relation types and definitions |
935 |
""" |
|
936 |
# XXX what if we delete an entity type which is specialized by other types |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
937 |
# unregister the entity from CWEType |
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
938 |
self.rqlexec('DELETE CWEType X WHERE X name %(etype)s', {'etype': etype}, |
0 | 939 |
ask_confirm=self.verbosity>=2) |
940 |
if commit: |
|
941 |
self.commit() |
|
942 |
||
6115
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
943 |
def cmd_rename_entity_type(self, oldname, newname, attrs=None, commit=True): |
0 | 944 |
"""rename an existing entity type in the persistent schema |
1477 | 945 |
|
0 | 946 |
`oldname` is a string giving the name of the existing entity type |
947 |
`newname` is a string giving the name of the renamed entity type |
|
948 |
""" |
|
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
949 |
schema = self.repo.schema |
9162
bf0a575d8da8
[migraction] rename_entity_type simply warn if old entity type isn't in the schema. Closes #3004069
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8807
diff
changeset
|
950 |
if oldname not in schema: |
bf0a575d8da8
[migraction] rename_entity_type simply warn if old entity type isn't in the schema. Closes #3004069
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8807
diff
changeset
|
951 |
print 'warning: entity type %s is unknown, skip renaming' % oldname |
bf0a575d8da8
[migraction] rename_entity_type simply warn if old entity type isn't in the schema. Closes #3004069
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8807
diff
changeset
|
952 |
return |
bf0a575d8da8
[migraction] rename_entity_type simply warn if old entity type isn't in the schema. Closes #3004069
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8807
diff
changeset
|
953 |
# if merging two existing entity types |
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
954 |
if newname in schema: |
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
955 |
assert oldname in ETYPE_NAME_MAP, \ |
6115
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
956 |
'%s should be mapped to %s in ETYPE_NAME_MAP' % (oldname, |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
957 |
newname) |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
958 |
if attrs is None: |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
959 |
attrs = ','.join(SQL_PREFIX + rschema.type |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
960 |
for rschema in schema[newname].subject_relations() |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
961 |
if (rschema.final or rschema.inlined) |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
962 |
and not rschema in PURE_VIRTUAL_RTYPES) |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
963 |
else: |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
964 |
attrs += ('eid', 'creation_date', 'modification_date', 'cwuri') |
56ec278b843e
[migration] we can now specify attributes to backport to rename_entity_type using its attrs argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6075
diff
changeset
|
965 |
attrs = ','.join(SQL_PREFIX + attr for attr in attrs) |
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
966 |
self.sqlexec('INSERT INTO %s%s(%s) SELECT %s FROM %s%s' % ( |
5999
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
967 |
SQL_PREFIX, newname, attrs, attrs, SQL_PREFIX, oldname), |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
968 |
ask_confirm=False) |
5897
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
969 |
# old entity type has not been added to the schema, can't gather it |
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
970 |
new = schema.eschema(newname) |
6117 | 971 |
oldeid = self.rqlexec('CWEType ET WHERE ET name %(on)s', |
972 |
{'on': oldname}, ask_confirm=False)[0][0] |
|
5897
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
973 |
# backport old type relations to new type |
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
974 |
# XXX workflows, other relations? |
5999
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
975 |
for r1, rr1 in [('from_entity', 'to_entity'), |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
976 |
('to_entity', 'from_entity')]: |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
977 |
self.rqlexec('SET X %(r1)s NET WHERE X %(r1)s OET, ' |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
978 |
'NOT EXISTS(X2 %(r1)s NET, X relation_type XRT, ' |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
979 |
'X2 relation_type XRT, X %(rr1)s XTE, X2 %(rr1)s XTE), ' |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
980 |
'OET eid %%(o)s, NET eid %%(n)s' % locals(), |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
981 |
{'o': oldeid, 'n': new.eid}, ask_confirm=False) |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
982 |
# backport is / is_instance_of relation to new type |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
983 |
for rtype in ('is', 'is_instance_of'): |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
984 |
self.sqlexec('UPDATE %s_relation SET eid_to=%s WHERE eid_to=%s' |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
985 |
% (rtype, new.eid, oldeid), ask_confirm=False) |
eaf8219f8b7d
[migration] fix rename_entity_type to avoid to loose some relations on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5928
diff
changeset
|
986 |
# delete relations using SQL to avoid relations content removal |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
987 |
# triggered by schema synchronization hooks. |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
988 |
session = self.session |
6116
2530e9c45296
[migration] fix rename_entity_type: avoid removal of attributes on the new entity type from the schema during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6115
diff
changeset
|
989 |
for rdeftype in ('CWRelation', 'CWAttribute'): |
7501
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
990 |
thispending = set( (eid for eid, in self.sqlexec( |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
991 |
'SELECT cw_eid FROM cw_%s WHERE cw_from_entity=%%(eid)s OR ' |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
992 |
' cw_to_entity=%%(eid)s' % rdeftype, |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
993 |
{'eid': oldeid}, ask_confirm=False)) ) |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
994 |
# we should add deleted eids into pending eids else we may |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
995 |
# get some validation error on commit since integrity hooks |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
996 |
# may think some required relation is missing... This also ensure |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
997 |
# repository caches are properly cleanup |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
998 |
hook.CleanupDeletedEidsCacheOp.get_instance(session).union(thispending) |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
999 |
# and don't forget to remove record from system tables |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
1000 |
entities = [session.entity_from_eid(eid, rdeftype) for eid in thispending] |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
1001 |
self.repo.system_source.delete_info_multi(session, entities, 'system') |
2983dd24494a
[repository] refactor/cleanup entity deletion methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7410
diff
changeset
|
1002 |
self.sqlexec('DELETE FROM cw_%s WHERE cw_from_entity=%%(eid)s OR ' |
6116
2530e9c45296
[migration] fix rename_entity_type: avoid removal of attributes on the new entity type from the schema during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6115
diff
changeset
|
1003 |
'cw_to_entity=%%(eid)s' % rdeftype, |
2530e9c45296
[migration] fix rename_entity_type: avoid removal of attributes on the new entity type from the schema during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6115
diff
changeset
|
1004 |
{'eid': oldeid}, ask_confirm=False) |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1005 |
# now we have to manually cleanup relations pointing to deleted |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1006 |
# entities |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1007 |
thiseids = ','.join(str(eid) for eid in thispending) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1008 |
for rschema, ttypes, role in schema[rdeftype].relation_definitions(): |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1009 |
if rschema.type in VIRTUAL_RTYPES: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1010 |
continue |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1011 |
sqls = [] |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1012 |
if role == 'object': |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1013 |
if rschema.inlined: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1014 |
for eschema in ttypes: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1015 |
sqls.append('DELETE FROM cw_%s WHERE cw_%s IN(%%s)' |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1016 |
% (eschema, rschema)) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1017 |
else: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1018 |
sqls.append('DELETE FROM %s_relation WHERE eid_to IN(%%s)' |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1019 |
% rschema) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1020 |
elif not rschema.inlined: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1021 |
sqls.append('DELETE FROM %s_relation WHERE eid_from IN(%%s)' |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1022 |
% rschema) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1023 |
for sql in sqls: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
1024 |
self.sqlexec(sql % thiseids, ask_confirm=False) |
5897
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
1025 |
# remove the old type: use rql to propagate deletion |
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
1026 |
self.rqlexec('DELETE CWEType ET WHERE ET name %(on)s', {'on': oldname}, |
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
1027 |
ask_confirm=False) |
9162
bf0a575d8da8
[migraction] rename_entity_type simply warn if old entity type isn't in the schema. Closes #3004069
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8807
diff
changeset
|
1028 |
# elif simply renaming an entity type |
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
1029 |
else: |
5897
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
1030 |
self.rqlexec('SET ET name %(newname)s WHERE ET is CWEType, ET name %(on)s', |
0c6f2f866202
[migration] fix rename_entity_type to an existant entity type: get back relation from the old entity type non existant on the target type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
1031 |
{'newname' : unicode(newname), 'on' : oldname}, |
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
1032 |
ask_confirm=False) |
0 | 1033 |
if commit: |
1034 |
self.commit() |
|
1477 | 1035 |
|
0 | 1036 |
def cmd_add_relation_type(self, rtype, addrdef=True, commit=True): |
1037 |
"""register a new relation type named `rtype`, as described in the |
|
1038 |
schema description file. |
|
1039 |
||
1040 |
`addrdef` is a boolean value; when True, it will also add all relations |
|
1041 |
of the type just added found in the schema definition file. Note that it |
|
1042 |
implies an intermediate "commit" which commits the relation type |
|
1043 |
creation (but not the relation definitions themselves, for which |
|
1044 |
committing depends on the `commit` argument value). |
|
1477 | 1045 |
|
0 | 1046 |
""" |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1047 |
reposchema = self.repo.schema |
8209
67660d5f1916
[migration] `add_relation_type` warns and add missing definitions on already existing rtypes (closes #2121979)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8049
diff
changeset
|
1048 |
rschema = self.fs_schema.rschema(rtype) |
67660d5f1916
[migration] `add_relation_type` warns and add missing definitions on already existing rtypes (closes #2121979)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8049
diff
changeset
|
1049 |
execute = self._cw.execute |
7558
044135305359
[migration] litle enhancements and a fix to patch accidentally pushed two revisions ago
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7556
diff
changeset
|
1050 |
if rtype in reposchema: |
7556
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
1051 |
print 'warning: relation type %s is already known, skip addition' % ( |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
1052 |
rtype) |
8209
67660d5f1916
[migration] `add_relation_type` warns and add missing definitions on already existing rtypes (closes #2121979)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8049
diff
changeset
|
1053 |
else: |
67660d5f1916
[migration] `add_relation_type` warns and add missing definitions on already existing rtypes (closes #2121979)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8049
diff
changeset
|
1054 |
# register the relation into CWRType and insert necessary relation |
67660d5f1916
[migration] `add_relation_type` warns and add missing definitions on already existing rtypes (closes #2121979)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8049
diff
changeset
|
1055 |
# definitions |
67660d5f1916
[migration] `add_relation_type` warns and add missing definitions on already existing rtypes (closes #2121979)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
8049
diff
changeset
|
1056 |
ss.execschemarql(execute, rschema, ss.rschema2rql(rschema, addrdef=False)) |
0 | 1057 |
if addrdef: |
1058 |
self.commit() |
|
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1059 |
gmap = self.group_mapping() |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1060 |
cmap = self.cstrtype_mapping() |
6073
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1061 |
done = set() |
8285
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1062 |
for subj, obj in rschema.rdefs: |
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1063 |
if not (reposchema.has_entity(subj) |
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1064 |
and reposchema.has_entity(obj)): |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1065 |
continue |
6073
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1066 |
# symmetric relations appears twice |
8285
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1067 |
if (subj, obj) in done: |
6073
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1068 |
continue |
8285
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1069 |
done.add( (subj, obj) ) |
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1070 |
self.cmd_add_relation_definition(subj, rtype, obj) |
2700
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1071 |
if rtype in META_RTYPES: |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1072 |
# if the relation is in META_RTYPES, ensure we're adding it for |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1073 |
# all entity types *in the persistent schema*, not only those in |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1074 |
# the fs schema |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1075 |
for etype in self.repo.schema.entities(): |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1076 |
if not etype in self.fs_schema: |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1077 |
# get sample object type and rproperties |
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1078 |
objtypes = rschema.objects() |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1079 |
assert len(objtypes) == 1, objtypes |
2700
ecf888c8a250
[migration] when adding a core meta-relation, it should be added to all entities *in the persistent schema*, not only those in the fs schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
1080 |
objtype = objtypes[0] |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1081 |
rdef = copy(rschema.rdef(rschema.subjects(objtype)[0], objtype)) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1082 |
rdef.subject = etype |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1083 |
rdef.rtype = self.repo.schema.rschema(rschema) |
8616
820cb9cee702
[migration] fix crash when adding a new meta relation type. Closes #2532483
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8530
diff
changeset
|
1084 |
rdef.object = self.repo.schema.eschema(objtype) |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1085 |
ss.execschemarql(execute, rdef, |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1086 |
ss.rdef2rql(rdef, cmap, gmap)) |
0 | 1087 |
if commit: |
1088 |
self.commit() |
|
1477 | 1089 |
|
0 | 1090 |
def cmd_drop_relation_type(self, rtype, commit=True): |
1091 |
"""unregister an existing relation type""" |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1092 |
# unregister the relation from CWRType |
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1093 |
self.rqlexec('DELETE CWRType X WHERE X name %r' % rtype, |
0 | 1094 |
ask_confirm=self.verbosity>=2) |
1095 |
if commit: |
|
1096 |
self.commit() |
|
1477 | 1097 |
|
8467
ad75430a2dc8
[migraction] rename rename_relation method to rename_relation_type for consistency
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8307
diff
changeset
|
1098 |
def cmd_rename_relation_type(self, oldname, newname, commit=True): |
0 | 1099 |
"""rename an existing relation |
1477 | 1100 |
|
0 | 1101 |
`oldname` is a string giving the name of the existing relation |
1102 |
`newname` is a string giving the name of the renamed relation |
|
1103 |
""" |
|
1104 |
self.cmd_add_relation_type(newname, commit=True) |
|
1105 |
self.rqlexec('SET X %s Y WHERE X %s Y' % (newname, oldname), |
|
1106 |
ask_confirm=self.verbosity>=2) |
|
1107 |
self.cmd_drop_relation_type(oldname, commit=commit) |
|
1108 |
||
1109 |
def cmd_add_relation_definition(self, subjtype, rtype, objtype, commit=True): |
|
1110 |
"""register a new relation definition, from its definition found in the |
|
1111 |
schema definition file |
|
1112 |
""" |
|
934
f94e34795586
better variable/attribute names; fix remove_cube, it should not alter the .fs_schema attribute (former .new_schema)
sylvain.thenault@logilab.fr
parents:
676
diff
changeset
|
1113 |
rschema = self.fs_schema.rschema(rtype) |
0 | 1114 |
if not rtype in self.repo.schema: |
1115 |
self.cmd_add_relation_type(rtype, addrdef=False, commit=True) |
|
7556
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
1116 |
if (subjtype, objtype) in self.repo.schema.rschema(rtype).rdefs: |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
1117 |
print 'warning: relation %s %s %s is already known, skip addition' % ( |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
1118 |
subjtype, rtype, objtype) |
867ec36530b8
[migration] closes #1777411: schema modification commands shouldn't crash if already exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7505
diff
changeset
|
1119 |
return |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1120 |
rdef = self._get_rdef(rschema, subjtype, objtype) |
8285
32098d98bf2f
[migration] fix add_relation_type in case it already exists, broken by 67660d5f1916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8278
diff
changeset
|
1121 |
ss.execschemarql(self._cw.execute, rdef, |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1122 |
ss.rdef2rql(rdef, self.cstrtype_mapping(), |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1123 |
self.group_mapping())) |
0 | 1124 |
if commit: |
1125 |
self.commit() |
|
1477 | 1126 |
|
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1127 |
def _get_rdef(self, rschema, subjtype, objtype): |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1128 |
return self._set_rdef_eid(rschema.rdefs[(subjtype, objtype)]) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1129 |
|
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1130 |
def _set_rdef_eid(self, rdef): |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1131 |
for attr in ('rtype', 'subject', 'object'): |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1132 |
schemaobj = getattr(rdef, attr) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1133 |
if getattr(schemaobj, 'eid', None) is None: |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1134 |
schemaobj.eid = self.repo.schema[schemaobj].eid |
8278
3e8b94d921e0
[migration] add schema obj into assertion failure message so we get a chance to understand the pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8232
diff
changeset
|
1135 |
assert schemaobj.eid is not None, schemaobj |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1136 |
return rdef |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
1137 |
|
0 | 1138 |
def cmd_drop_relation_definition(self, subjtype, rtype, objtype, commit=True): |
1139 |
"""unregister an existing relation definition""" |
|
1140 |
rschema = self.repo.schema.rschema(rtype) |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1141 |
# unregister the definition from CWAttribute or CWRelation |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3582
diff
changeset
|
1142 |
if rschema.final: |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1143 |
etype = 'CWAttribute' |
0 | 1144 |
else: |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1145 |
etype = 'CWRelation' |
0 | 1146 |
rql = ('DELETE %s X WHERE X from_entity FE, FE name "%s",' |
1147 |
'X relation_type RT, RT name "%s", X to_entity TE, TE name "%s"') |
|
1148 |
self.rqlexec(rql % (etype, subjtype, rtype, objtype), |
|
1149 |
ask_confirm=self.verbosity>=2) |
|
1150 |
if commit: |
|
1151 |
self.commit() |
|
1477 | 1152 |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1153 |
def cmd_sync_schema_props_perms(self, ertype=None, syncperms=True, |
1409
f4dee84a618f
sql attributes bugfix
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1399
diff
changeset
|
1154 |
syncprops=True, syncrdefs=True, commit=True): |
0 | 1155 |
"""synchronize the persistent schema against the current definition |
1156 |
schema. |
|
1477 | 1157 |
|
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1158 |
`ertype` can be : |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1159 |
- None, in that case everything will be synced ; |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1160 |
- a string, it should be an entity type or |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1161 |
a relation type. In that case, only the corresponding |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1162 |
entities / relations will be synced ; |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1163 |
- an rdef object to synchronize only this specific relation definition |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1164 |
|
0 | 1165 |
It will synch common stuff between the definition schema and the |
1166 |
actual persistent schema, it won't add/remove any entity or relation. |
|
1167 |
""" |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1168 |
assert syncperms or syncprops, 'nothing to do' |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1169 |
if ertype is not None: |
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1170 |
if isinstance(ertype, RelationDefinitionSchema): |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1171 |
ertype = ertype.as_triple() |
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1172 |
if isinstance(ertype, (tuple, list)): |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1173 |
assert len(ertype) == 3, 'not a relation definition' |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
1174 |
self._synchronize_rdef_schema(ertype[0], ertype[1], ertype[2], |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
1175 |
syncperms=syncperms, |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
1176 |
syncprops=syncprops) |
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
1177 |
else: |
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1178 |
erschema = self.repo.schema[ertype] |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1179 |
if isinstance(erschema, CubicWebRelationSchema): |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1180 |
self._synchronize_rschema(erschema, syncrdefs=syncrdefs, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1181 |
syncperms=syncperms, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1182 |
syncprops=syncprops) |
4041
be6e473e6b43
fix sync_schema*: new syncprops argument to sync relation definition as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4021
diff
changeset
|
1183 |
else: |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1184 |
self._synchronize_eschema(erschema, syncrdefs=syncrdefs, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1185 |
syncperms=syncperms, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1186 |
syncprops=syncprops) |
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1187 |
else: |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1188 |
for etype in self.repo.schema.entities(): |
7505
e04790a6eea8
[migration] this is needed to avoid pb with yams 0.33 / cw < 3.13
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7501
diff
changeset
|
1189 |
if etype.eid is None: |
e04790a6eea8
[migration] this is needed to avoid pb with yams 0.33 / cw < 3.13
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7501
diff
changeset
|
1190 |
# not yet added final etype (thing to BigInt defined in |
e04790a6eea8
[migration] this is needed to avoid pb with yams 0.33 / cw < 3.13
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7501
diff
changeset
|
1191 |
# yams though 3.13 migration not done yet) |
e04790a6eea8
[migration] this is needed to avoid pb with yams 0.33 / cw < 3.13
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7501
diff
changeset
|
1192 |
continue |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1193 |
self._synchronize_eschema(etype, syncrdefs=syncrdefs, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1194 |
syncprops=syncprops, syncperms=syncperms) |
0 | 1195 |
if commit: |
1196 |
self.commit() |
|
1477 | 1197 |
|
0 | 1198 |
def cmd_change_relation_props(self, subjtype, rtype, objtype, |
1199 |
commit=True, **kwargs): |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1200 |
"""change some properties of a relation definition |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1201 |
|
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1202 |
you usually want to use sync_schema_props_perms instead. |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1203 |
""" |
0 | 1204 |
assert kwargs |
1205 |
restriction = [] |
|
1206 |
if subjtype and subjtype != 'Any': |
|
1207 |
restriction.append('X from_entity FE, FE name "%s"' % subjtype) |
|
1208 |
if objtype and objtype != 'Any': |
|
1209 |
restriction.append('X to_entity TE, TE name "%s"' % objtype) |
|
1210 |
if rtype and rtype != 'Any': |
|
1211 |
restriction.append('X relation_type RT, RT name "%s"' % rtype) |
|
1212 |
assert restriction |
|
1213 |
values = [] |
|
1214 |
for k, v in kwargs.items(): |
|
1215 |
values.append('X %s %%(%s)s' % (k, k)) |
|
1216 |
if isinstance(v, str): |
|
1217 |
kwargs[k] = unicode(v) |
|
1218 |
rql = 'SET %s WHERE %s' % (','.join(values), ','.join(restriction)) |
|
1219 |
self.rqlexec(rql, kwargs, ask_confirm=self.verbosity>=2) |
|
1220 |
if commit: |
|
1221 |
self.commit() |
|
1222 |
||
1223 |
def cmd_set_size_constraint(self, etype, rtype, size, commit=True): |
|
1224 |
"""set change size constraint of a string attribute |
|
1225 |
||
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1226 |
if size is None any size constraint will be removed. |
1477 | 1227 |
|
1228 |
you usually want to use sync_schema_props_perms instead. |
|
0 | 1229 |
""" |
1230 |
oldvalue = None |
|
4695
4aaf87e7f79e
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4650
diff
changeset
|
1231 |
for constr in self.repo.schema.eschema(etype).rdef(rtype).constraints: |
0 | 1232 |
if isinstance(constr, SizeConstraint): |
1233 |
oldvalue = constr.max |
|
1234 |
if oldvalue == size: |
|
1235 |
return |
|
1236 |
if oldvalue is None and not size is None: |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1237 |
ceid = self.rqlexec('INSERT CWConstraint C: C value %(v)s, C cstrtype CT ' |
0 | 1238 |
'WHERE CT name "SizeConstraint"', |
1239 |
{'v': SizeConstraint(size).serialize()}, |
|
1240 |
ask_confirm=self.verbosity>=2)[0][0] |
|
1241 |
self.rqlexec('SET X constrained_by C WHERE X from_entity S, X relation_type R, ' |
|
1242 |
'S name "%s", R name "%s", C eid %s' % (etype, rtype, ceid), |
|
1243 |
ask_confirm=self.verbosity>=2) |
|
1244 |
elif not oldvalue is None: |
|
1245 |
if not size is None: |
|
1246 |
self.rqlexec('SET C value %%(v)s WHERE X from_entity S, X relation_type R,' |
|
1247 |
'X constrained_by C, C cstrtype CT, CT name "SizeConstraint",' |
|
1248 |
'S name "%s", R name "%s"' % (etype, rtype), |
|
1249 |
{'v': unicode(SizeConstraint(size).serialize())}, |
|
1250 |
ask_confirm=self.verbosity>=2) |
|
1251 |
else: |
|
1252 |
self.rqlexec('DELETE X constrained_by C WHERE X from_entity S, X relation_type R,' |
|
1253 |
'X constrained_by C, C cstrtype CT, CT name "SizeConstraint",' |
|
1254 |
'S name "%s", R name "%s"' % (etype, rtype), |
|
1255 |
ask_confirm=self.verbosity>=2) |
|
1256 |
# cleanup unused constraints |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1257 |
self.rqlexec('DELETE CWConstraint C WHERE NOT X constrained_by C') |
0 | 1258 |
if commit: |
1259 |
self.commit() |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1260 |
|
0 | 1261 |
# Workflows handling ###################################################### |
1477 | 1262 |
|
6805
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1263 |
def cmd_make_workflowable(self, etype): |
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1264 |
"""add workflow relations to an entity type to make it workflowable""" |
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1265 |
self.cmd_add_relation_definition(etype, 'in_state', 'State') |
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1266 |
self.cmd_add_relation_definition(etype, 'custom_workflow', 'Workflow') |
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1267 |
self.cmd_add_relation_definition('TrInfo', 'wf_info_for', etype) |
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1268 |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1269 |
def cmd_add_workflow(self, name, wfof, default=True, commit=False, |
6816
f61de39cd396
[wf migration] allow to deactivate assertion on wfable entity to quick-fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6815
diff
changeset
|
1270 |
ensure_workflowable=True, **kwargs): |
3582
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1271 |
""" |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1272 |
create a new workflow and links it to entity types |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1273 |
:type name: unicode |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1274 |
:param name: name of the workflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1275 |
|
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1276 |
:type wfof: string or list/tuple of strings |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1277 |
:param wfof: entity type(s) having this workflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1278 |
|
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1279 |
:type default: bool |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1280 |
:param default: tells wether this is the default workflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1281 |
for the specified entity type(s); set it to false in |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1282 |
the case of a subworkflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1283 |
|
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1284 |
:rtype: `Workflow` |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1285 |
""" |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1286 |
wf = self.cmd_create_entity('Workflow', name=unicode(name), |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1287 |
**kwargs) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1288 |
if not isinstance(wfof, (list, tuple)): |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1289 |
wfof = (wfof,) |
6805
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1290 |
def _missing_wf_rel(etype): |
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1291 |
return 'missing workflow relations, see make_workflowable(%s)' % etype |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1292 |
for etype in wfof: |
6805
d0d7345581d4
[migration] add_workflow now ensure the entity type is actually workflowable, and a new make_workflowable migration function is available to make an entity type workflowable (closes #1382720)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6686
diff
changeset
|
1293 |
eschema = self.repo.schema[etype] |
6816
f61de39cd396
[wf migration] allow to deactivate assertion on wfable entity to quick-fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6815
diff
changeset
|
1294 |
if ensure_workflowable: |
f61de39cd396
[wf migration] allow to deactivate assertion on wfable entity to quick-fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6815
diff
changeset
|
1295 |
assert 'in_state' in eschema.subjrels, _missing_wf_rel(etype) |
f61de39cd396
[wf migration] allow to deactivate assertion on wfable entity to quick-fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6815
diff
changeset
|
1296 |
assert 'custom_workflow' in eschema.subjrels, _missing_wf_rel(etype) |
f61de39cd396
[wf migration] allow to deactivate assertion on wfable entity to quick-fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6815
diff
changeset
|
1297 |
assert 'wf_info_for' in eschema.objrels, _missing_wf_rel(etype) |
2956
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1298 |
rset = self.rqlexec( |
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1299 |
'SET X workflow_of ET WHERE X eid %(x)s, ET name %(et)s', |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1300 |
{'x': wf.eid, 'et': etype}, ask_confirm=False) |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1301 |
assert rset, 'unexistant entity type %s' % etype |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1302 |
if default: |
2956
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1303 |
self.rqlexec( |
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1304 |
'SET ET default_workflow X WHERE X eid %(x)s, ET name %(et)s', |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1305 |
{'x': wf.eid, 'et': etype}, ask_confirm=False) |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1306 |
if commit: |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1307 |
self.commit() |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1308 |
return wf |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1309 |
|
7295
b6fd14ee491e
[migration] new command to get default workflow for an entity type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7166
diff
changeset
|
1310 |
def cmd_get_workflow_for(self, etype): |
b6fd14ee491e
[migration] new command to get default workflow for an entity type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7166
diff
changeset
|
1311 |
"""return default workflow for the given entity type""" |
b6fd14ee491e
[migration] new command to get default workflow for an entity type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7166
diff
changeset
|
1312 |
rset = self.rqlexec('Workflow X WHERE ET default_workflow X, ET name %(et)s', |
b6fd14ee491e
[migration] new command to get default workflow for an entity type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7166
diff
changeset
|
1313 |
{'et': etype}) |
b6fd14ee491e
[migration] new command to get default workflow for an entity type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7166
diff
changeset
|
1314 |
return rset.get_entity(0, 0) |
b6fd14ee491e
[migration] new command to get default workflow for an entity type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7166
diff
changeset
|
1315 |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1316 |
# CWProperty handling ###################################################### |
0 | 1317 |
|
1318 |
def cmd_property_value(self, pkey): |
|
7111
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1319 |
"""retreive the site-wide persistent property value for the given key. |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1320 |
|
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1321 |
To get a user specific property value, use appropriate method on CWUser |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1322 |
instance. |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1323 |
""" |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1324 |
rset = self.rqlexec( |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1325 |
'Any V WHERE X is CWProperty, X pkey %(k)s, X value V, NOT X for_user U', |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1326 |
{'k': pkey}, ask_confirm=False) |
0 | 1327 |
return rset[0][0] |
1328 |
||
1329 |
def cmd_set_property(self, pkey, value): |
|
7111
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1330 |
"""set the site-wide persistent property value for the given key to the |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1331 |
given value. |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1332 |
|
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1333 |
To set a user specific property value, use appropriate method on CWUser |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1334 |
instance. |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1335 |
""" |
0 | 1336 |
value = unicode(value) |
1337 |
try: |
|
7111
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1338 |
prop = self.rqlexec( |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1339 |
'CWProperty X WHERE X pkey %(k)s, NOT X for_user U', |
6c8e8747268d
[cwprops, migration] fix [set_]property to ensure we don't retrieve a user specific value. Add some docstring along the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7008
diff
changeset
|
1340 |
{'k': pkey}, ask_confirm=False).get_entity(0, 0) |
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
1341 |
except Exception: |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1342 |
self.cmd_create_entity('CWProperty', pkey=unicode(pkey), value=value) |
0 | 1343 |
else: |
8483
4ba11607d84a
[entity api] unify set_attributes / set_relations into a cw_set method. Closes #2423719
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8467
diff
changeset
|
1344 |
prop.cw_set(value=value) |
0 | 1345 |
|
1346 |
# other data migration commands ########################################### |
|
1477 | 1347 |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1348 |
@property |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1349 |
def _cw(self): |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1350 |
session = self.session |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1351 |
if session is not None: |
7398
26695dd703d8
[repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
1352 |
session.set_cnxset() |
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1353 |
return session |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1354 |
return self.cnx.request() |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1355 |
|
5397
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1356 |
def cmd_storage_changed(self, etype, attribute): |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1357 |
"""migrate entities to a custom storage. The new storage is expected to |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1358 |
be set, it will be temporarily removed for the migration. |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1359 |
""" |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1360 |
from logilab.common.shellutils import ProgressBar |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1361 |
source = self.repo.system_source |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1362 |
storage = source.storage(etype, attribute) |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1363 |
source.unset_storage(etype, attribute) |
5552 | 1364 |
rset = self.rqlexec('Any X WHERE X is %s' % etype, ask_confirm=False) |
5397
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1365 |
pb = ProgressBar(len(rset)) |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1366 |
for entity in rset.entities(): |
5551
e41cd3bf5080
[migration] fix storage_change migraction to avoid exhausting the server's memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
1367 |
# fill cache. Do not fetch that attribute using the global rql query |
e41cd3bf5080
[migration] fix storage_change migraction to avoid exhausting the server's memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
1368 |
# since we may exhaust memory doing that.... |
e41cd3bf5080
[migration] fix storage_change migraction to avoid exhausting the server's memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
1369 |
getattr(entity, attribute) |
5397
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1370 |
storage.migrate_entity(entity, attribute) |
5551
e41cd3bf5080
[migration] fix storage_change migraction to avoid exhausting the server's memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
1371 |
# remove from entity cache to avoid memory exhaustion |
8231
1bb43e31032d
[bfss, migration] fix storage migration (closes #2189206)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8047
diff
changeset
|
1372 |
del entity.cw_attr_cache[attribute] |
5397
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1373 |
pb.update() |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1374 |
print |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1375 |
source.set_storage(etype, attribute, storage) |
cdbf823450aa
[bfss] new storage_changed migration action to move an attribute to a custom storage. Closes #893941
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5302
diff
changeset
|
1376 |
|
5132
260d73ad4f24
[cleaning] simpler implementation of cmd_create_entity
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5043
diff
changeset
|
1377 |
def cmd_create_entity(self, etype, commit=False, **kwargs): |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1378 |
"""add a new entity of the given type""" |
3708
95e8c3a9698a
update prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3707
diff
changeset
|
1379 |
entity = self._cw.create_entity(etype, **kwargs) |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1380 |
if commit: |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1381 |
self.commit() |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1382 |
return entity |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1383 |
|
7116
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1384 |
def cmd_find_entities(self, etype, **kwargs): |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1385 |
"""find entities of the given type and attribute values""" |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1386 |
return self._cw.find_entities(etype, **kwargs) |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1387 |
|
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1388 |
def cmd_find_one_entity(self, etype, **kwargs): |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1389 |
"""find one entity of the given type and attribute values. |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1390 |
|
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1391 |
raise :exc:`cubicweb.req.FindEntityError` if can not return one and only |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1392 |
one entity. |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1393 |
""" |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1394 |
return self._cw.find_one_entity(etype, **kwargs) |
dfd4680a23f0
[session] add find_entities and find_one_entity to session/request API (closes #1550045)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7111
diff
changeset
|
1395 |
|
5928
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1396 |
def cmd_update_etype_fti_weight(self, etype, weight): |
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1397 |
if self.repo.system_source.dbdriver == 'postgres': |
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1398 |
self.sqlexec('UPDATE appears SET weight=%(weight)s ' |
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1399 |
'FROM entities as X ' |
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1400 |
'WHERE X.eid=appears.uid AND X.type=%(type)s', |
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1401 |
{'type': etype, 'weight': weight}, ask_confirm=False) |
d9936c39d478
[migration] new migration command to change fti weight for an entity t ype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5897
diff
changeset
|
1402 |
|
5850
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1403 |
def cmd_reindex_entities(self, etypes=None): |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1404 |
"""force reindexaction of entities of the given types or of all |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1405 |
indexable entity types |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1406 |
""" |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1407 |
from cubicweb.server.checkintegrity import reindex_entities |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1408 |
reindex_entities(self.repo.schema, self.session, etypes=etypes) |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1409 |
|
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1410 |
@contextmanager |
7409
47c8009dbbe2
[migractions] dropped_constraints should accept only droprequired without cstrtype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
1411 |
def cmd_dropped_constraints(self, etype, attrname, cstrtype=None, |
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1412 |
droprequired=False): |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1413 |
"""context manager to drop constraints temporarily on fs_schema |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1414 |
|
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1415 |
`cstrtype` should be a constraint class (or a tuple of classes) |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1416 |
and will be passed to isinstance directly |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1417 |
|
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1418 |
For instance:: |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1419 |
|
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1420 |
>>> with dropped_constraints('MyType', 'myattr', |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1421 |
... UniqueConstraint, droprequired=True): |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1422 |
... add_attribute('MyType', 'myattr') |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1423 |
... # + instructions to fill MyType.myattr column |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1424 |
... |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1425 |
>>> |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1426 |
|
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1427 |
""" |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1428 |
rdef = self.fs_schema.eschema(etype).rdef(attrname) |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1429 |
original_constraints = rdef.constraints |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1430 |
# remove constraints |
7409
47c8009dbbe2
[migractions] dropped_constraints should accept only droprequired without cstrtype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
1431 |
if cstrtype: |
47c8009dbbe2
[migractions] dropped_constraints should accept only droprequired without cstrtype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
1432 |
rdef.constraints = [cstr for cstr in original_constraints |
47c8009dbbe2
[migractions] dropped_constraints should accept only droprequired without cstrtype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7342
diff
changeset
|
1433 |
if not (cstrtype and isinstance(cstr, cstrtype))] |
6292
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1434 |
if droprequired: |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1435 |
original_cardinality = rdef.cardinality |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1436 |
rdef.cardinality = '?' + rdef.cardinality[1] |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1437 |
yield |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1438 |
# restore original constraints |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1439 |
rdef.constraints = original_constraints |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1440 |
if droprequired: |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1441 |
rdef.cardinality = original_cardinality |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1442 |
# update repository schema |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1443 |
self.cmd_sync_schema_props_perms(rdef, syncperms=False) |
054fa36060d5
[migractions] add a dropped_constraints() migration command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6217
diff
changeset
|
1444 |
|
0 | 1445 |
def sqlexec(self, sql, args=None, ask_confirm=True): |
1446 |
"""execute the given sql if confirmed |
|
1477 | 1447 |
|
0 | 1448 |
should only be used for low level stuff undoable with existing higher |
1449 |
level actions |
|
1450 |
""" |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1451 |
if not ask_confirm or self.confirm('Execute sql: %s ?' % sql): |
0 | 1452 |
try: |
1453 |
cu = self.session.system_sql(sql, args) |
|
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
1454 |
except Exception: |
0 | 1455 |
ex = sys.exc_info()[1] |
6187
348c7d93cda3
[migration] propose to open pdb on error during execution of rql/sql query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6186
diff
changeset
|
1456 |
if self.confirm('Error: %s\nabort?' % ex, pdb=True): |
0 | 1457 |
raise |
1458 |
return |
|
1459 |
try: |
|
1460 |
return cu.fetchall() |
|
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7782
diff
changeset
|
1461 |
except Exception: |
0 | 1462 |
# no result to fetch |
1463 |
return |
|
1477 | 1464 |
|
9255
46f41c3e1443
remove 3.8 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9241
diff
changeset
|
1465 |
def rqlexec(self, rql, kwargs=None, build_descr=True, |
6186
8ada7df95877
[migration] set ask_confirm=False by default on rqlexec
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6179
diff
changeset
|
1466 |
ask_confirm=False): |
0 | 1467 |
"""rql action""" |
1468 |
if not isinstance(rql, (tuple, list)): |
|
1469 |
rql = ( (rql, kwargs), ) |
|
1470 |
res = None |
|
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4834
diff
changeset
|
1471 |
execute = self._cw.execute |
0 | 1472 |
for rql, kwargs in rql: |
1473 |
if kwargs: |
|
1474 |
msg = '%s (%s)' % (rql, kwargs) |
|
1475 |
else: |
|
1476 |
msg = rql |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1477 |
if not ask_confirm or self.confirm('Execute rql: %s ?' % msg): |
0 | 1478 |
try: |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1479 |
res = execute(rql, kwargs, build_descr=build_descr) |
8695
358d8bed9626
[toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8694
diff
changeset
|
1480 |
except Exception as ex: |
6187
348c7d93cda3
[migration] propose to open pdb on error during execution of rql/sql query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6186
diff
changeset
|
1481 |
if self.confirm('Error: %s\nabort?' % ex, pdb=True): |
0 | 1482 |
raise |
1483 |
return res |
|
1484 |
||
1485 |
def rqliter(self, rql, kwargs=None, ask_confirm=True): |
|
6686
070e3b23160d
[migration] fix rqliter when some query arguments are given
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6582
diff
changeset
|
1486 |
return ForRqlIterator(self, rql, kwargs, ask_confirm) |
0 | 1487 |
|
8181
166ad5458ed8
[migractions] fix comment to avoid ambiguity. Closes #2015260
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8049
diff
changeset
|
1488 |
# low-level commands to repair broken system database ###################### |
0 | 1489 |
|
1490 |
def cmd_change_attribute_type(self, etype, attr, newtype, commit=True): |
|
1491 |
"""low level method to change the type of an entity attribute. This is |
|
1492 |
a quick hack which has some drawback: |
|
1493 |
* only works when the old type can be changed to the new type by the |
|
1494 |
underlying rdbms (eg using ALTER TABLE) |
|
1495 |
* the actual schema won't be updated until next startup |
|
1496 |
""" |
|
1497 |
rschema = self.repo.schema.rschema(attr) |
|
1498 |
oldtype = rschema.objects(etype)[0] |
|
7928
c65fd337fd1d
[migration] update old yams api in change_attribute_type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7915
diff
changeset
|
1499 |
rdefeid = rschema.rdef(etype, oldtype).eid |
7948
deb596dc343a
[migraction] fix cmd_change_attribute_type command (closes #2015073)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7928
diff
changeset
|
1500 |
allownull = rschema.rdef(etype, oldtype).cardinality[0] != '1' |
7410
1dbf9a83bb49
[migractions] fix change_attribute_type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7409
diff
changeset
|
1501 |
sql = ("UPDATE cw_CWAttribute " |
1dbf9a83bb49
[migractions] fix change_attribute_type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7409
diff
changeset
|
1502 |
"SET cw_to_entity=(SELECT cw_eid FROM cw_CWEType WHERE cw_name='%s')" |
1dbf9a83bb49
[migractions] fix change_attribute_type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7409
diff
changeset
|
1503 |
"WHERE cw_eid=%s") % (newtype, rdefeid) |
0 | 1504 |
self.sqlexec(sql, ask_confirm=False) |
1505 |
dbhelper = self.repo.system_source.dbhelper |
|
1506 |
sqltype = dbhelper.TYPE_MAPPING[newtype] |
|
7948
deb596dc343a
[migraction] fix cmd_change_attribute_type command (closes #2015073)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7928
diff
changeset
|
1507 |
cursor = self.session.cnxset[self.repo.system_source.uri] |
deb596dc343a
[migraction] fix cmd_change_attribute_type command (closes #2015073)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7928
diff
changeset
|
1508 |
dbhelper.change_col_type(cursor, 'cw_%s' % etype, 'cw_%s' % attr, sqltype, allownull) |
0 | 1509 |
if commit: |
1510 |
self.commit() |
|
1477 | 1511 |
|
0 | 1512 |
def cmd_add_entity_type_table(self, etype, commit=True): |
1513 |
"""low level method to create the sql table for an existing entity. |
|
1514 |
This may be useful on accidental desync between the repository schema |
|
1515 |
and a sql database |
|
1516 |
""" |
|
1517 |
dbhelper = self.repo.system_source.dbhelper |
|
1251
af40e615dc89
introduce a 'cw_' prefix on entity table and column names so we don't conflict with sql or DBMS specific keywords
sylvain.thenault@logilab.fr
parents:
1240
diff
changeset
|
1518 |
tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype), |
af40e615dc89
introduce a 'cw_' prefix on entity table and column names so we don't conflict with sql or DBMS specific keywords
sylvain.thenault@logilab.fr
parents:
1240
diff
changeset
|
1519 |
prefix=SQL_PREFIX) |
0 | 1520 |
for sql in tablesql.split(';'): |
1521 |
if sql.strip(): |
|
1522 |
self.sqlexec(sql) |
|
1523 |
if commit: |
|
1524 |
self.commit() |
|
1477 | 1525 |
|
0 | 1526 |
def cmd_add_relation_type_table(self, rtype, commit=True): |
1527 |
"""low level method to create the sql table for an existing relation. |
|
1528 |
This may be useful on accidental desync between the repository schema |
|
1529 |
and a sql database |
|
1530 |
""" |
|
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
1531 |
tablesql = rschema2sql(self.repo.schema.rschema(rtype)) |
0 | 1532 |
for sql in tablesql.split(';'): |
1533 |
if sql.strip(): |
|
1534 |
self.sqlexec(sql) |
|
1535 |
if commit: |
|
1536 |
self.commit() |
|
1477 | 1537 |
|
8530
2bceea9dee95
[migration] fix backward compat for rename_relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8467
diff
changeset
|
1538 |
@deprecated("[3.15] use rename_relation_type(oldname, newname)") |
8467
ad75430a2dc8
[migraction] rename rename_relation method to rename_relation_type for consistency
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8307
diff
changeset
|
1539 |
def cmd_rename_relation(self, oldname, newname, commit=True): |
8530
2bceea9dee95
[migration] fix backward compat for rename_relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8467
diff
changeset
|
1540 |
self.cmd_rename_relation_type(oldname, newname, commit) |
8467
ad75430a2dc8
[migraction] rename rename_relation method to rename_relation_type for consistency
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8307
diff
changeset
|
1541 |
|
0 | 1542 |
|
1543 |
class ForRqlIterator: |
|
1544 |
"""specific rql iterator to make the loop skipable""" |
|
1545 |
def __init__(self, helper, rql, kwargs, ask_confirm): |
|
1546 |
self._h = helper |
|
1547 |
self.rql = rql |
|
1548 |
self.kwargs = kwargs |
|
1549 |
self.ask_confirm = ask_confirm |
|
1550 |
self._rsetit = None |
|
1477 | 1551 |
|
0 | 1552 |
def __iter__(self): |
1553 |
return self |
|
1477 | 1554 |
|
6125
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1555 |
def _get_rset(self): |
0 | 1556 |
rql, kwargs = self.rql, self.kwargs |
1557 |
if kwargs: |
|
1558 |
msg = '%s (%s)' % (rql, kwargs) |
|
1559 |
else: |
|
1560 |
msg = rql |
|
1561 |
if self.ask_confirm: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1562 |
if not self._h.confirm('Execute rql: %s ?' % msg): |
0 | 1563 |
raise StopIteration |
1564 |
try: |
|
6125
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1565 |
return self._h._cw.execute(rql, kwargs) |
8695
358d8bed9626
[toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8694
diff
changeset
|
1566 |
except Exception as ex: |
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1567 |
if self._h.confirm('Error: %s\nabort?' % ex): |
0 | 1568 |
raise |
1569 |
else: |
|
1570 |
raise StopIteration |
|
6125
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1571 |
|
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1572 |
def next(self): |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1573 |
if self._rsetit is not None: |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1574 |
return self._rsetit.next() |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1575 |
rset = self._get_rset() |
0 | 1576 |
self._rsetit = iter(rset) |
1577 |
return self._rsetit.next() |
|
6125
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1578 |
|
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1579 |
def entities(self): |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1580 |
try: |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1581 |
rset = self._get_rset() |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1582 |
except StopIteration: |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1583 |
return [] |
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1584 |
return rset.entities() |