author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 19 Oct 2010 14:07:52 +0200 | |
branch | stable |
changeset 6552 | 256725d4e3ec |
parent 6323 | a11c1e3c16c3 |
child 6333 | e3994fcc21c3 |
child 6571 | 71b446d1cf93 |
permissions | -rw-r--r-- |
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
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
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 |
|
4925
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
30 |
from __future__ import with_statement |
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
31 |
|
0 | 32 |
__docformat__ = "restructuredtext en" |
33 |
||
34 |
import sys |
|
35 |
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
|
36 |
import tarfile |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
37 |
import tempfile |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
38 |
import shutil |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
39 |
import os.path as osp |
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
972
diff
changeset
|
40 |
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
|
41 |
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
|
42 |
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
|
43 |
from warnings import warn |
0 | 44 |
|
2613
5e19c2bb370e
R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2493
diff
changeset
|
45 |
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
|
46 |
from logilab.common.decorators import cached, clear_cache |
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
|
47 |
from logilab.common.testlib import mock_object |
0 | 48 |
|
49 |
from yams.constraints import SizeConstraint |
|
50 |
from yams.schema2sql import eschema2sql, rschema2sql |
|
51 |
||
6035
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
52 |
from cubicweb import AuthenticationError, ExecutionError |
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
|
53 |
from cubicweb.selectors 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
|
54 |
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
|
55 |
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
|
56 |
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
|
57 |
from cubicweb.cwvreg import CW_EVENT_MANAGER |
0 | 58 |
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
|
59 |
from cubicweb.migration import MigrationHelper, yes |
4925
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
60 |
from cubicweb.server.session import hooks_control |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
61 |
from cubicweb.server import hook |
0 | 62 |
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
|
63 |
from cubicweb.server import SOURCE_TYPES, schemaserial as ss |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
64 |
from cubicweb.server.utils import manager_userpasswd, ask_source_config |
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
|
65 |
from cubicweb.server.sqlutils import sqlexec, SQL_PREFIX |
0 | 66 |
except ImportError: # LAX |
67 |
pass |
|
68 |
||
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
|
69 |
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
|
70 |
__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
|
71 |
__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
|
72 |
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
|
73 |
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
|
74 |
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
|
75 |
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
|
76 |
|
6205
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
77 |
@classmethod |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
78 |
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
|
79 |
# 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
|
80 |
# least) |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
81 |
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
|
82 |
repo.vreg.register(ClearGroupMap) |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
83 |
|
0 | 84 |
class ServerMigrationHelper(MigrationHelper): |
85 |
"""specific migration helper for server side migration scripts, |
|
86 |
providind actions related to schema/data migration |
|
87 |
""" |
|
88 |
||
89 |
def __init__(self, config, schema, interactive=True, |
|
90 |
repo=None, cnx=None, verbosity=1, connect=True): |
|
91 |
MigrationHelper.__init__(self, config, interactive, verbosity) |
|
92 |
if not interactive: |
|
93 |
assert cnx |
|
94 |
assert repo |
|
95 |
if cnx is not None: |
|
96 |
assert repo |
|
97 |
self._cnx = cnx |
|
98 |
self.repo = repo |
|
99 |
elif connect: |
|
100 |
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
|
101 |
# 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
|
102 |
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
|
103 |
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
|
104 |
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
|
105 |
# 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
|
106 |
# 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
|
107 |
ClearGroupMap.mih = self |
6205
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
108 |
ClearGroupMap.mih_register(repo) |
41e0e13e10b7
[test] fix in 6203:d3dea5f84404 wasn't enough
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6203
diff
changeset
|
109 |
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
|
110 |
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
|
111 |
# 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
|
112 |
# 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
|
113 |
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
|
114 |
if not schema and not getattr(config, 'quick_start', False): |
0 | 115 |
schema = config.load_schema(expand_cubes=True) |
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
|
116 |
self.fs_schema = schema |
0 | 117 |
self._synchronized = set() |
118 |
||
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
119 |
# overriden from base MigrationHelper ###################################### |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
120 |
|
0 | 121 |
@cached |
122 |
def repo_connect(self): |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
123 |
self.repo = get_repository(method='inmemory', config=self.config) |
0 | 124 |
return self.repo |
1477 | 125 |
|
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
126 |
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
|
127 |
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
|
128 |
unicode(version)) |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
129 |
self.commit() |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
130 |
|
0 | 131 |
def shutdown(self): |
132 |
if self.repo is not None: |
|
133 |
self.repo.shutdown() |
|
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 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
|
136 |
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
|
137 |
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
|
138 |
self.backup_database() |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
139 |
elif options.backup_db: |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
140 |
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
|
141 |
# disable notification during migration |
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
142 |
with hooks_control(self.session, self.session.HOOKS_ALLOW_ALL, 'notification'): |
0d66fbe050c6
[migration] disable notification by default during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4905
diff
changeset
|
143 |
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
|
144 |
|
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
|
145 |
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
|
146 |
try: |
6042
df9cafb8062c
[migration] commit only sql script migration
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6035
diff
changeset
|
147 |
return super(ServerMigrationHelper, self).cmd_process_script( |
6035
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
148 |
migrscript, funcname, *args, **kwargs) |
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
149 |
except ExecutionError, err: |
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
150 |
print >> sys.stderr, "-> %s" % err |
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
151 |
except: |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
152 |
self.rollback() |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
153 |
raise |
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
154 |
|
6035
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
155 |
# Adjust docstring |
f8c7aa251782
[migration] unify process_script command
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5999
diff
changeset
|
156 |
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
|
157 |
|
2275
bc0bed0616a3
fix #344387, remember upgraded version step by step
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2124
diff
changeset
|
158 |
# server specific migration methods ######################################## |
1477 | 159 |
|
0 | 160 |
def backup_database(self, backupfile=None, askconfirm=True): |
161 |
config = self.config |
|
2493
9806571ea790
major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2489
diff
changeset
|
162 |
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
|
163 |
# paths |
3192 | 164 |
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
|
165 |
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
|
166 |
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
|
167 |
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
|
168 |
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
|
169 |
% (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
|
170 |
# 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
|
171 |
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
|
172 |
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
|
173 |
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
|
174 |
return |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
175 |
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
|
176 |
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
|
177 |
return |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
178 |
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
|
179 |
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
|
180 |
# backup |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
181 |
tmpdir = tempfile.mkdtemp(dir=instbkdir) |
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
|
182 |
try: |
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
|
183 |
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
|
184 |
try: |
4904
a5250dafdcac
[backup] fix misplaced paren
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4893
diff
changeset
|
185 |
source.backup(osp.join(tmpdir, source.uri), self.confirm) |
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
|
186 |
except Exception, ex: |
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
|
187 |
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
|
188 |
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
|
189 |
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
|
190 |
else: |
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 |
break |
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
|
192 |
else: |
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 |
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
|
194 |
for filename in os.listdir(tmpdir): |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
195 |
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
|
196 |
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
|
197 |
# 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
|
198 |
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
|
199 |
# 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
|
200 |
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
|
201 |
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
|
202 |
shutil.rmtree(tmpdir) |
1477 | 203 |
|
2493
9806571ea790
major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2489
diff
changeset
|
204 |
def restore_database(self, backupfile, drop=True, systemonly=True, |
9806571ea790
major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2489
diff
changeset
|
205 |
askconfirm=True): |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
206 |
# check |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
207 |
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
|
208 |
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
|
209 |
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
|
210 |
% (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
|
211 |
return |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
212 |
# unpack backup |
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
213 |
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
|
214 |
try: |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
215 |
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
|
216 |
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
|
217 |
# assume restoring old backup |
4344
066e7884e57d
add source in backup/restore failure message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4339
diff
changeset
|
218 |
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
|
219 |
else: |
b788903e77d5
be able to restore pre cw 3.4 database dumps #370595
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2963
diff
changeset
|
220 |
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
|
221 |
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
|
222 |
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
|
223 |
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
|
224 |
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
|
225 |
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
|
226 |
bkup.close() |
2959
daabb9bc5233
make db-restore command work even with no/corrupted database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2926
diff
changeset
|
227 |
self.config.open_connections_pools = False |
daabb9bc5233
make db-restore command work even with no/corrupted database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2926
diff
changeset
|
228 |
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
|
229 |
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
|
230 |
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
|
231 |
continue |
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
232 |
try: |
4195
86dcaf6bb92f
closes #601987
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3935
diff
changeset
|
233 |
source.restore(osp.join(tmpdir, source.uri), self.confirm, drop) |
2861
9cb3027407aa
B offer to continue even when failed to restore systemonly
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
234 |
except Exception, exc: |
4344
066e7884e57d
add source in backup/restore failure message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4339
diff
changeset
|
235 |
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
|
236 |
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
|
237 |
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
|
238 |
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
|
239 |
# call hooks |
2959
daabb9bc5233
make db-restore command work even with no/corrupted database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2926
diff
changeset
|
240 |
repo.open_connections_pools() |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
241 |
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
|
242 |
print '-> database restored.' |
1477 | 243 |
|
0 | 244 |
@property |
245 |
def cnx(self): |
|
246 |
"""lazy connection""" |
|
247 |
try: |
|
248 |
return self._cnx |
|
249 |
except AttributeError: |
|
250 |
sourcescfg = self.repo.config.sources() |
|
251 |
try: |
|
252 |
login = sourcescfg['admin']['login'] |
|
253 |
pwd = sourcescfg['admin']['password'] |
|
254 |
except KeyError: |
|
255 |
login, pwd = manager_userpasswd() |
|
256 |
while True: |
|
257 |
try: |
|
3659 | 258 |
self._cnx = repo_connect(self.repo, login, password=pwd) |
0 | 259 |
if not 'managers' in self._cnx.user(self.session).groups: |
260 |
print 'migration need an account in the managers group' |
|
261 |
else: |
|
262 |
break |
|
263 |
except AuthenticationError: |
|
264 |
print 'wrong user/password' |
|
265 |
except (KeyboardInterrupt, EOFError): |
|
266 |
print 'aborting...' |
|
267 |
sys.exit(0) |
|
268 |
try: |
|
269 |
login, pwd = manager_userpasswd() |
|
270 |
except (KeyboardInterrupt, EOFError): |
|
271 |
print 'aborting...' |
|
272 |
sys.exit(0) |
|
2571
5c837feca73a
oops, this is a method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2570
diff
changeset
|
273 |
self.session.keep_pool_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
|
274 |
self.session.data['rebuild-infered'] = False |
0 | 275 |
return self._cnx |
276 |
||
277 |
@property |
|
278 |
def session(self): |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
279 |
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
|
280 |
session = self.repo._get_session(self.cnx.sessionid) |
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
|
281 |
if session.pool is None: |
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
|
282 |
session.set_read_security(False) |
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
|
283 |
session.set_write_security(False) |
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
|
284 |
session.set_pool() |
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
|
285 |
return session |
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
286 |
# 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
|
287 |
return None |
1477 | 288 |
|
0 | 289 |
def commit(self): |
290 |
if hasattr(self, '_cnx'): |
|
291 |
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
|
292 |
if self.session: |
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
|
293 |
self.session.set_pool() |
1477 | 294 |
|
0 | 295 |
def rollback(self): |
296 |
if hasattr(self, '_cnx'): |
|
297 |
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
|
298 |
if self.session: |
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
|
299 |
self.session.set_pool() |
1477 | 300 |
|
6186
8ada7df95877
[migration] set ask_confirm=False by default on rqlexec
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6179
diff
changeset
|
301 |
def rqlexecall(self, rqliter, ask_confirm=False): |
0 | 302 |
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
|
303 |
self.rqlexec(rql, kwargs, ask_confirm=ask_confirm) |
0 | 304 |
|
305 |
@cached |
|
306 |
def _create_context(self): |
|
307 |
"""return a dictionary to use as migration script execution context""" |
|
308 |
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
|
309 |
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
|
310 |
'rollback': self.rollback, |
4017
a5b4d4f2a1c7
use commit in migration script instead of checkpoint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
311 |
'checkpoint': deprecated('[3.6] use commit')(self.checkpoint), |
0 | 312 |
'sql': self.sqlexec, |
313 |
'rql': self.rqlexec, |
|
314 |
'rqliter': self.rqliter, |
|
3707
78596919ede3
[c-c] fixes for shell w/ pyro instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3700
diff
changeset
|
315 |
'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
|
316 |
'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
|
317 |
'fsschema': self.fs_schema, |
0 | 318 |
'session' : self.session, |
319 |
'repo' : self.repo, |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
320 |
'synchronize_schema': deprecated()(self.cmd_sync_schema_props_perms), # 3.4 |
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
321 |
'synchronize_eschema': deprecated()(self.cmd_sync_schema_props_perms), # 3.4 |
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2759
diff
changeset
|
322 |
'synchronize_rschema': deprecated()(self.cmd_sync_schema_props_perms), # 3.4 |
0 | 323 |
}) |
324 |
return context |
|
325 |
||
326 |
@cached |
|
327 |
def group_mapping(self): |
|
328 |
"""cached group mapping""" |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
329 |
return ss.group_mapping(self._cw) |
1477 | 330 |
|
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
|
331 |
@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
|
332 |
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
|
333 |
"""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
|
334 |
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
|
335 |
|
0 | 336 |
def exec_event_script(self, event, cubepath=None, funcname=None, |
1477 | 337 |
*args, **kwargs): |
0 | 338 |
if cubepath: |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
339 |
apc = osp.join(cubepath, 'migration', '%s.py' % event) |
0 | 340 |
else: |
2759
23d7a75693f8
R refactor backup and use tar.gz to store all sources
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2700
diff
changeset
|
341 |
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
|
342 |
if osp.exists(apc): |
0 | 343 |
if self.config.free_wheel: |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
344 |
self.cmd_deactivate_verification_hooks() |
0 | 345 |
self.info('executing %s', apc) |
346 |
confirm = self.confirm |
|
347 |
execscript_confirm = self.execscript_confirm |
|
348 |
self.confirm = yes |
|
349 |
self.execscript_confirm = yes |
|
350 |
try: |
|
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
|
351 |
return self.cmd_process_script(apc, funcname, *args, **kwargs) |
0 | 352 |
finally: |
353 |
self.confirm = confirm |
|
354 |
self.execscript_confirm = execscript_confirm |
|
355 |
if self.config.free_wheel: |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
356 |
self.cmd_reactivate_verification_hooks() |
0 | 357 |
|
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
358 |
def install_custom_sql_scripts(self, directory, driver): |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
359 |
for fpath in glob(osp.join(directory, '*.sql.%s' % driver)): |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
360 |
newname = osp.basename(fpath).replace('.sql.%s' % driver, |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
361 |
'.%s.sql' % driver) |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
362 |
warn('[3.5.6] rename %s into %s' % (fpath, newname), |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
363 |
DeprecationWarning) |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
364 |
print '-> installing', fpath |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
365 |
sqlexec(open(fpath).read(), self.session.system_sql, False, |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
366 |
delimiter=';;') |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
367 |
for fpath in glob(osp.join(directory, '*.%s.sql' % driver)): |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
368 |
print '-> installing', fpath |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
369 |
sqlexec(open(fpath).read(), self.session.system_sql, False, |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
370 |
delimiter=';;') |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
371 |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
372 |
# schema synchronization internals ######################################## |
0 | 373 |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
374 |
def _synchronize_permissions(self, erschema, teid): |
0 | 375 |
"""permission synchronization for an entity or relation type""" |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
376 |
assert teid, erschema |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
377 |
if 'update' in erschema.ACTIONS or erschema.final: |
0 | 378 |
# entity type |
379 |
exprtype = u'ERQLExpression' |
|
380 |
else: |
|
381 |
# relation type |
|
382 |
exprtype = u'RRQLExpression' |
|
383 |
gm = self.group_mapping() |
|
384 |
confirm = self.verbosity >= 2 |
|
385 |
# * remove possibly deprecated permission (eg in the persistent schema |
|
386 |
# but not in the new schema) |
|
387 |
# * synchronize existing expressions |
|
388 |
# * add new groups/expressions |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
389 |
for action in erschema.ACTIONS: |
0 | 390 |
perm = '%s_permission' % action |
391 |
# handle groups |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
392 |
newgroups = list(erschema.get_groups(action)) |
0 | 393 |
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
|
394 |
'T eid %%(x)s' % perm, {'x': teid}, |
0 | 395 |
ask_confirm=False): |
396 |
if not gname in newgroups: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
397 |
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
|
398 |
% (action, erschema, gname)): |
0 | 399 |
self.rqlexec('DELETE T %s G WHERE G eid %%(x)s, T eid %s' |
400 |
% (perm, teid), |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
401 |
{'x': geid}, ask_confirm=False) |
0 | 402 |
else: |
403 |
newgroups.remove(gname) |
|
404 |
for gname in newgroups: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
405 |
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
|
406 |
% (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
|
407 |
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
|
408 |
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
|
409 |
% (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
|
410 |
{'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
|
411 |
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
|
412 |
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
|
413 |
action, gname) |
0 | 414 |
# handle rql expressions |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
415 |
newexprs = dict((expr.expression, expr) for expr in erschema.get_rqlexprs(action)) |
0 | 416 |
for expreid, expression in self.rqlexec('Any E, EX WHERE T %s E, E expression EX, ' |
417 |
'T eid %s' % (perm, teid), |
|
418 |
ask_confirm=False): |
|
419 |
if not expression in newexprs: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
420 |
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
|
421 |
% (expression, action, erschema)): |
0 | 422 |
# deleting the relation will delete the expression entity |
423 |
self.rqlexec('DELETE T %s E WHERE E eid %%(x)s, T eid %s' |
|
424 |
% (perm, teid), |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
425 |
{'x': expreid}, ask_confirm=False) |
0 | 426 |
else: |
427 |
newexprs.pop(expression) |
|
428 |
for expression in newexprs.values(): |
|
429 |
expr = expression.expression |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
430 |
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
|
431 |
% (expr, action, erschema)): |
0 | 432 |
self.rqlexec('INSERT RQLExpression X: X exprtype %%(exprtype)s, ' |
433 |
'X expression %%(expr)s, X mainvars %%(vars)s, T %s X ' |
|
434 |
'WHERE T eid %%(x)s' % perm, |
|
435 |
{'expr': expr, 'exprtype': exprtype, |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
436 |
'vars': expression.mainvars, 'x': teid}, |
0 | 437 |
ask_confirm=False) |
1477 | 438 |
|
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
439 |
def _synchronize_rschema(self, rtype, syncrdefs=True, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
440 |
syncperms=True, syncprops=True): |
0 | 441 |
"""synchronize properties of the persistent relation schema against its |
442 |
current definition: |
|
1477 | 443 |
|
0 | 444 |
* 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
|
445 |
* symmetric, meta |
0 | 446 |
* inlined |
447 |
* relation definitions if `syncrdefs` |
|
448 |
* permissions if `syncperms` |
|
1477 | 449 |
|
0 | 450 |
physical schema changes should be handled by repository's schema hooks |
451 |
""" |
|
452 |
rtype = str(rtype) |
|
453 |
if rtype in self._synchronized: |
|
454 |
return |
|
455 |
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
|
456 |
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
|
457 |
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
|
458 |
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
|
459 |
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
|
460 |
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
|
461 |
ask_confirm=self.verbosity>=2) |
0 | 462 |
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
|
463 |
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
|
464 |
if (subj, obj) not in reporschema.rdefs: |
0 | 465 |
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
|
466 |
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
|
467 |
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
|
468 |
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
|
469 |
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
|
470 |
syncperms=syncperms) |
1477 | 471 |
|
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
472 |
def _synchronize_eschema(self, etype, syncrdefs=True, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
473 |
syncperms=True, syncprops=True): |
0 | 474 |
"""synchronize properties of the persistent entity schema against |
475 |
its current definition: |
|
1477 | 476 |
|
0 | 477 |
* description |
478 |
* internationalizable, fulltextindexed, indexed, meta |
|
479 |
* relations from/to this entity |
|
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
480 |
* __unique_together__ |
0 | 481 |
* permissions if `syncperms` |
482 |
""" |
|
483 |
etype = str(etype) |
|
484 |
if etype in self._synchronized: |
|
485 |
return |
|
486 |
self._synchronized.add(etype) |
|
487 |
repoeschema = self.repo.schema.eschema(etype) |
|
488 |
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
|
489 |
eschema = self.fs_schema.eschema(etype) |
0 | 490 |
except KeyError: |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
491 |
return # XXX somewhat unexpected, no?... |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
492 |
if syncprops: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
493 |
repospschema = repoeschema.specializes() |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
494 |
espschema = eschema.specializes() |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
495 |
if repospschema and not espschema: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
496 |
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
|
497 |
{'x': str(repoeschema)}, ask_confirm=False) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
498 |
elif not repospschema and espschema: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
499 |
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
|
500 |
'Y is CWEType, Y name %(y)s', |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
501 |
{'x': str(repoeschema), 'y': str(espschema)}, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
502 |
ask_confirm=False) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
503 |
self.rqlexecall(ss.updateeschema2rql(eschema, repoeschema.eid), |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
504 |
ask_confirm=self.verbosity >= 2) |
0 | 505 |
if syncperms: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
506 |
self._synchronize_permissions(eschema, repoeschema.eid) |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
507 |
if syncrdefs: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
508 |
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
|
509 |
if rschema in VIRTUAL_RTYPES: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
510 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
511 |
if role == 'subject': |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
512 |
if not rschema in repoeschema.subject_relations(): |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
513 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
514 |
subjtypes, objtypes = [etype], targettypes |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
515 |
else: # role == 'object' |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
516 |
if not rschema in repoeschema.object_relations(): |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
517 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
518 |
subjtypes, objtypes = targettypes, [etype] |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
519 |
self._synchronize_rschema(rschema, syncrdefs=False, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
520 |
syncprops=syncprops, syncperms=syncperms) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
521 |
reporschema = self.repo.schema.rschema(rschema) |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
522 |
for subj in subjtypes: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
523 |
for obj in objtypes: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
524 |
if (subj, obj) not in reporschema.rdefs: |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
525 |
continue |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
526 |
self._synchronize_rdef_schema(subj, rschema, obj, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
527 |
syncprops=syncprops, syncperms=syncperms) |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
528 |
if syncprops: # need to process __unique_together__ after rdefs were processed |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
529 |
repo_unique_together = set([frozenset(ut) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
530 |
for ut in repoeschema._unique_together]) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
531 |
unique_together = set([frozenset(ut) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
532 |
for ut in eschema._unique_together]) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
533 |
for ut in repo_unique_together - unique_together: |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
534 |
restrictions = ', '.join(['C relations R%(i)d, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
535 |
'R%(i)d relation_type T%(i)d, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
536 |
'R%(i)d from_entity X, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
537 |
'T%(i)d name %%(T%(i)d)s' % {'i': i, |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
538 |
'col':col} |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
539 |
for (i, col) in enumerate(ut)]) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
540 |
substs = {'etype': etype} |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
541 |
for i, col in enumerate(ut): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
542 |
substs['T%d'%i] = col |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
543 |
self.rqlexec('DELETE CWUniqueTogetherConstraint C ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
544 |
'WHERE C constraint_of E, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
545 |
' E name %%(etype)s,' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
546 |
' %s' % restrictions, |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
547 |
substs) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
548 |
for ut in unique_together - repo_unique_together: |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
549 |
relations = ', '.join(['C relations R%d' % i |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
550 |
for (i, col) in enumerate(ut)]) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
551 |
restrictions = ', '.join(['R%(i)d relation_type T%(i)d, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
552 |
'R%(i)d from_entity E, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
553 |
'T%(i)d name %%(T%(i)d)s' % {'i': i, |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
554 |
'col':col} |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
555 |
for (i, col) in enumerate(ut)]) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
556 |
substs = {'etype': etype} |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
557 |
for i, col in enumerate(ut): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
558 |
substs['T%d'%i] = col |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
559 |
self.rqlexec('INSERT CWUniqueTogetherConstraint C:' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
560 |
' C constraint_of E, ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
561 |
' %s ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
562 |
'WHERE ' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
563 |
' E name %%(etype)s,' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
564 |
' %s' % (relations, restrictions), |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6205
diff
changeset
|
565 |
substs) |
0 | 566 |
|
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
|
567 |
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
|
568 |
syncperms=True, syncprops=True): |
0 | 569 |
"""synchronize properties of the persistent relation definition schema |
570 |
against its current definition: |
|
571 |
* order and other properties |
|
572 |
* constraints |
|
573 |
""" |
|
574 |
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
|
575 |
rschema = self.fs_schema.rschema(rtype) |
0 | 576 |
reporschema = self.repo.schema.rschema(rschema) |
577 |
if (subjtype, rschema, objtype) in self._synchronized: |
|
578 |
return |
|
579 |
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
|
580 |
if rschema.symmetric: |
0 | 581 |
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
|
582 |
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
|
583 |
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
|
584 |
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
|
585 |
repordef = reporschema.rdef(subjtype, objtype) |
0 | 586 |
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
|
587 |
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
|
588 |
# 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
|
589 |
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
|
590 |
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
|
591 |
# 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
|
592 |
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
|
593 |
# 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
|
594 |
# 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
|
595 |
# 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
|
596 |
# 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
|
597 |
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
|
598 |
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
|
599 |
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
|
600 |
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
|
601 |
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
|
602 |
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
|
603 |
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
|
604 |
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
|
605 |
{'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
|
606 |
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
|
607 |
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
|
608 |
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
|
609 |
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
|
610 |
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
|
611 |
{'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
|
612 |
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
|
613 |
# 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
|
614 |
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
|
615 |
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
|
616 |
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
|
617 |
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
|
618 |
if syncperms and not rschema in VIRTUAL_RTYPES: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
619 |
self._synchronize_permissions(rdef, repordef.eid) |
1477 | 620 |
|
0 | 621 |
# base actions ############################################################ |
622 |
||
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3998
diff
changeset
|
623 |
def checkpoint(self, ask_confirm=True): |
0 | 624 |
"""checkpoint action""" |
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
625 |
if not ask_confirm or self.confirm('Commit now ?', shell=False): |
0 | 626 |
self.commit() |
627 |
||
628 |
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
|
629 |
self.cmd_add_cubes( (cube,), update_database) |
1477 | 630 |
|
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
|
631 |
def cmd_add_cubes(self, cubes, update_database=True): |
0 | 632 |
"""update_database is telling if the database schema should be updated |
633 |
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
|
634 |
a cube has been extracted from an existing instance, so the |
0 | 635 |
cube schema is already in there) |
636 |
""" |
|
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
|
637 |
newcubes = super(ServerMigrationHelper, self).cmd_add_cubes(cubes) |
0 | 638 |
if not newcubes: |
639 |
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
|
640 |
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
|
641 |
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
|
642 |
self.config.cube_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
|
643 |
if cube in SOURCE_TYPES: |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
644 |
# don't use config.sources() in case some sources have been |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
645 |
# disabled for migration |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
646 |
sourcescfg = self.config.read_sources_file() |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
647 |
sourcescfg[cube] = ask_source_config(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
|
648 |
self.config.write_sources_file(sourcescfg) |
6c4a4c514ac2
add source to sources configuration when adding a cube defining a source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
649 |
clear_cache(self.config, 'read_sources_file') |
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
|
650 |
# 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
|
651 |
# 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
|
652 |
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
|
653 |
self.config._cubes += (cube,) |
0 | 654 |
if not update_database: |
655 |
self.commit() |
|
656 |
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
|
657 |
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
|
658 |
# 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
|
659 |
# 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
|
660 |
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
|
661 |
self.update_context('fsschema', self.fs_schema) |
0 | 662 |
new = set() |
663 |
# 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
|
664 |
driver = self.repo.system_source.dbdriver |
0 | 665 |
for pack in reversed(newcubes): |
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
666 |
cubedir = self.config.cube_dir(pack) |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
667 |
self.install_custom_sql_scripts(osp.join(cubedir, 'schema'), driver) |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3872
diff
changeset
|
668 |
self.exec_event_script('precreate', cubedir) |
0 | 669 |
# 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
|
670 |
for rschema in newcubes_schema.relations(): |
0 | 671 |
if not rschema in self.repo.schema: |
672 |
self.cmd_add_relation_type(rschema.type) |
|
673 |
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
|
674 |
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
|
675 |
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
|
676 |
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
|
677 |
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
|
678 |
new.add(eschema.type) |
0 | 679 |
# 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
|
680 |
for rschema in newcubes_schema.relations(): |
0 | 681 |
existingschema = self.repo.schema.rschema(rschema.type) |
4099
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
682 |
for (fromtype, totype) in rschema.rdefs: |
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
683 |
if (fromtype, totype) in existingschema.rdefs: |
0 | 684 |
continue |
685 |
# check we should actually add the relation definition |
|
686 |
if not (fromtype in new or totype in new or rschema in new): |
|
687 |
continue |
|
1477 | 688 |
self.cmd_add_relation_definition(str(fromtype), rschema.type, |
0 | 689 |
str(totype)) |
690 |
# execute post-create files |
|
691 |
for pack in reversed(newcubes): |
|
692 |
self.exec_event_script('postcreate', self.config.cube_dir(pack)) |
|
1477 | 693 |
self.commit() |
694 |
||
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
|
695 |
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
|
696 |
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
|
697 |
cube, removedeps) |
0 | 698 |
if not removedcubes: |
699 |
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
|
700 |
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
|
701 |
removedcubes_schema = self.config.load_schema(construction_mode='non-strict') |
0 | 702 |
reposchema = self.repo.schema |
703 |
# execute pre-remove files |
|
704 |
for pack in reversed(removedcubes): |
|
705 |
self.exec_event_script('preremove', self.config.cube_dir(pack)) |
|
706 |
# 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
|
707 |
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
|
708 |
if not rschema in removedcubes_schema and rschema in reposchema: |
0 | 709 |
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
|
710 |
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
|
711 |
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
|
712 |
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
|
713 |
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
|
714 |
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
|
715 |
for rschema in fsschema.relations(): |
1477 | 716 |
if rschema in removedcubes_schema and rschema in reposchema: |
717 |
# check if attributes/relations has been added to entities from |
|
0 | 718 |
# other cubes |
4099
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
719 |
for fromtype, totype in rschema.rdefs: |
59ff385f7348
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
720 |
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
|
721 |
(fromtype, totype) in reposchema[rschema.type].rdefs: |
0 | 722 |
self.cmd_drop_relation_definition( |
723 |
str(fromtype), rschema.type, str(totype)) |
|
724 |
# 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
|
725 |
for cube in reversed(removedcubes): |
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
726 |
self.exec_event_script('postremove', self.config.cube_dir(cube)) |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
727 |
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
|
728 |
{'pk': u'system.version.'+cube}, ask_confirm=False) |
0 | 729 |
self.commit() |
1477 | 730 |
|
0 | 731 |
# schema migration actions ################################################ |
1477 | 732 |
|
0 | 733 |
def cmd_add_attribute(self, etype, attrname, attrtype=None, commit=True): |
734 |
"""add a new attribute on the given entity type""" |
|
735 |
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
|
736 |
rschema = self.fs_schema.rschema(attrname) |
0 | 737 |
attrtype = rschema.objects(etype)[0] |
738 |
self.cmd_add_relation_definition(etype, attrname, attrtype, commit=commit) |
|
1477 | 739 |
|
0 | 740 |
def cmd_drop_attribute(self, etype, attrname, commit=True): |
741 |
"""drop an existing attribute from the given entity type |
|
1477 | 742 |
|
0 | 743 |
`attrname` is a string giving the name of the attribute to drop |
744 |
""" |
|
745 |
rschema = self.repo.schema.rschema(attrname) |
|
746 |
attrtype = rschema.objects(etype)[0] |
|
747 |
self.cmd_drop_relation_definition(etype, attrname, attrtype, commit=commit) |
|
748 |
||
749 |
def cmd_rename_attribute(self, etype, oldname, newname, commit=True): |
|
750 |
"""rename an existing attribute of the given entity type |
|
1477 | 751 |
|
0 | 752 |
`oldname` is a string giving the name of the existing attribute |
753 |
`newname` is a string giving the name of the renamed attribute |
|
754 |
""" |
|
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
|
755 |
eschema = self.fs_schema.eschema(etype) |
0 | 756 |
attrtype = eschema.destination(newname) |
757 |
# have to commit this first step anyway to get the definition |
|
758 |
# actually in the schema |
|
759 |
self.cmd_add_attribute(etype, newname, attrtype, commit=True) |
|
760 |
# skipp NULL values if the attribute is required |
|
761 |
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
|
762 |
card = eschema.rdef(newname).cardinality[0] |
0 | 763 |
if card == '1': |
764 |
rql += ', NOT X %s NULL' % oldname |
|
765 |
self.rqlexec(rql, ask_confirm=self.verbosity>=2) |
|
3548
4cf5a360952e
add some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3213
diff
changeset
|
766 |
# 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
|
767 |
# 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
|
768 |
# 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
|
769 |
# fulltextindexed change...) |
0 | 770 |
self.cmd_drop_attribute(etype, oldname, commit=commit) |
1477 | 771 |
|
0 | 772 |
def cmd_add_entity_type(self, etype, auto=True, commit=True): |
773 |
"""register a new entity type |
|
1477 | 774 |
|
0 | 775 |
in auto mode, automatically register entity's relation where the |
776 |
targeted type is known |
|
777 |
""" |
|
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
|
778 |
instschema = self.repo.schema |
6189 | 779 |
assert not etype in instschema, \ |
780 |
'%s already defined in the instance schema' % etype |
|
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
|
781 |
eschema = self.fs_schema.eschema(etype) |
0 | 782 |
confirm = self.verbosity >= 2 |
4043
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
783 |
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
|
784 |
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
|
785 |
# 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
|
786 |
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
|
787 |
ss.execschemarql(execute, eschema, ss.eschema2rql(eschema, groupmap)) |
0 | 788 |
# 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
|
789 |
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
|
790 |
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
|
791 |
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
|
792 |
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
|
793 |
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
|
794 |
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
|
795 |
'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
|
796 |
self.rqlexecall(ss.eschemaspecialize2rql(eschema), ask_confirm=confirm) |
0 | 797 |
# register entity's attributes |
798 |
for rschema, attrschema in eschema.attribute_definitions(): |
|
799 |
# 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
|
800 |
if rschema.type in META_RTYPES: |
0 | 801 |
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
|
802 |
if not rschema.type in instschema: |
0 | 803 |
# need to add the relation type and to commit to get it |
804 |
# actually in the schema |
|
805 |
self.cmd_add_relation_type(rschema.type, False, commit=True) |
|
806 |
# 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
|
807 |
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
|
808 |
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
|
809 |
# 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
|
810 |
# 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
|
811 |
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
|
812 |
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
|
813 |
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
|
814 |
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
|
815 |
# 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
|
816 |
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
|
817 |
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
|
818 |
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
|
819 |
{'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
|
820 |
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
|
821 |
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
|
822 |
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
|
823 |
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
|
824 |
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
|
825 |
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
|
826 |
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
|
827 |
objschema = tschema |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3582
diff
changeset
|
828 |
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
|
829 |
# 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
|
830 |
# 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
|
831 |
# 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
|
832 |
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
|
833 |
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
|
834 |
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
|
835 |
objschema = spschema |
4633
a85b4361fb22
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4580
diff
changeset
|
836 |
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
|
837 |
or (instschema.has_relation(rschema) and |
4633
a85b4361fb22
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4580
diff
changeset
|
838 |
(subjschema, objschema) in instschema[rschema].rdefs)): |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
839 |
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
|
840 |
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
|
841 |
subjschema.type, rschema.type, objschema.type) |
0 | 842 |
if auto: |
843 |
# we have commit here to get relation types actually in the schema |
|
844 |
self.commit() |
|
845 |
added = [] |
|
846 |
for rschema in eschema.subject_relations(): |
|
847 |
# attribute relation have already been processed and |
|
848 |
# '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
|
849 |
if rschema.final or rschema.type in META_RTYPES: |
0 | 850 |
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
|
851 |
rtypeadded = rschema.type in instschema |
0 | 852 |
for targetschema in rschema.objects(etype): |
853 |
# 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
|
854 |
# current instance schema |
0 | 855 |
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
|
856 |
if not targettype in instschema and targettype != etype: |
0 | 857 |
continue |
858 |
if not rtypeadded: |
|
859 |
# need to add the relation type and to commit to get it |
|
860 |
# actually in the schema |
|
861 |
added.append(rschema.type) |
|
862 |
self.cmd_add_relation_type(rschema.type, False, commit=True) |
|
863 |
rtypeadded = True |
|
864 |
# 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
|
865 |
# remember this two avoid adding twice non symmetric relation |
0 | 866 |
# such as "Emailthread forked_from Emailthread" |
867 |
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
|
868 |
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
|
869 |
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
|
870 |
ss.rdef2rql(rdef, cstrtypemap, groupmap)) |
0 | 871 |
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
|
872 |
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
|
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 |
rtypeadded = rschema.type in instschema or rschema.type in added |
0 | 875 |
for targetschema in rschema.subjects(etype): |
876 |
# 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
|
877 |
# current instance schema |
0 | 878 |
targettype = targetschema.type |
879 |
# don't check targettype != etype since in this case the |
|
880 |
# 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
|
881 |
if not targettype in instschema: |
0 | 882 |
continue |
883 |
if not rtypeadded: |
|
884 |
# need to add the relation type and to commit to get it |
|
885 |
# actually in the schema |
|
886 |
self.cmd_add_relation_type(rschema.type, False, commit=True) |
|
887 |
rtypeadded = True |
|
888 |
elif (targettype, rschema.type, etype) in added: |
|
889 |
continue |
|
890 |
# 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
|
891 |
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
|
892 |
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
|
893 |
ss.rdef2rql(rdef, cstrtypemap, groupmap)) |
0 | 894 |
if commit: |
895 |
self.commit() |
|
1477 | 896 |
|
0 | 897 |
def cmd_drop_entity_type(self, etype, commit=True): |
898 |
"""unregister an existing entity type |
|
1477 | 899 |
|
0 | 900 |
This will trigger deletion of necessary relation types and definitions |
901 |
""" |
|
902 |
# 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
|
903 |
# 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
|
904 |
self.rqlexec('DELETE CWEType X WHERE X name %(etype)s', {'etype': etype}, |
0 | 905 |
ask_confirm=self.verbosity>=2) |
906 |
if commit: |
|
907 |
self.commit() |
|
908 |
||
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
|
909 |
def cmd_rename_entity_type(self, oldname, newname, attrs=None, commit=True): |
0 | 910 |
"""rename an existing entity type in the persistent schema |
1477 | 911 |
|
0 | 912 |
`oldname` is a string giving the name of the existing entity type |
913 |
`newname` is a string giving the name of the renamed entity type |
|
914 |
""" |
|
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
|
915 |
schema = self.repo.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
|
916 |
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
|
917 |
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
|
918 |
'%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
|
919 |
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
|
920 |
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
|
921 |
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
|
922 |
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
|
923 |
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
|
924 |
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
|
925 |
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
|
926 |
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
|
927 |
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
|
928 |
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
|
929 |
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
|
930 |
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
|
931 |
# 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
|
932 |
new = schema.eschema(newname) |
6117 | 933 |
oldeid = self.rqlexec('CWEType ET WHERE ET name %(on)s', |
934 |
{'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
|
935 |
# 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
|
936 |
# 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
|
937 |
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
|
938 |
('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
|
939 |
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
|
940 |
'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
|
941 |
'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
|
942 |
'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
|
943 |
{'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
|
944 |
# 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
|
945 |
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
|
946 |
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
|
947 |
% (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
|
948 |
# 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
|
949 |
# triggered by schema synchronization hooks. |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
950 |
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
|
951 |
for rdeftype in ('CWRelation', 'CWAttribute'): |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
952 |
thispending = set() |
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
|
953 |
for eid, in self.sqlexec('SELECT cw_eid FROM cw_%s ' |
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
|
954 |
'WHERE cw_from_entity=%%(eid)s OR ' |
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
|
955 |
' 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
|
956 |
{'eid': oldeid}, ask_confirm=False): |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
957 |
# we should add deleted eids into pending eids else we may |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
958 |
# get some validation error on commit since integrity hooks |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
959 |
# may think some required relation is missing... This also ensure |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
960 |
# repository caches are properly cleanup |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
961 |
hook.set_operation(session, 'pendingeids', eid, |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
962 |
hook.CleanupDeletedEidsCacheOp) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
963 |
# and don't forget to remove record from system tables |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
964 |
self.repo.system_source.delete_info( |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
965 |
session, session.entity_from_eid(eid, rdeftype), |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
966 |
'system', None) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
967 |
thispending.add(eid) |
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
|
968 |
self.sqlexec('DELETE FROM cw_%s ' |
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
|
969 |
'WHERE cw_from_entity=%%(eid)s OR ' |
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
|
970 |
'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
|
971 |
{'eid': oldeid}, ask_confirm=False) |
6190
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
972 |
# 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
|
973 |
# entities |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
974 |
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
|
975 |
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
|
976 |
if rschema.type in VIRTUAL_RTYPES: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
977 |
continue |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
978 |
sqls = [] |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
979 |
if role == 'object': |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
980 |
if rschema.inlined: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
981 |
for eschema in ttypes: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
982 |
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
|
983 |
% (eschema, rschema)) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
984 |
else: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
985 |
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
|
986 |
% rschema) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
987 |
elif not rschema.inlined: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
988 |
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
|
989 |
% rschema) |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
990 |
for sql in sqls: |
564a6028067c
[migration] more rename_entity_type fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6189
diff
changeset
|
991 |
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
|
992 |
# 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
|
993 |
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
|
994 |
ask_confirm=False) |
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
|
995 |
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
|
996 |
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
|
997 |
{'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
|
998 |
ask_confirm=False) |
0 | 999 |
if commit: |
1000 |
self.commit() |
|
1477 | 1001 |
|
0 | 1002 |
def cmd_add_relation_type(self, rtype, addrdef=True, commit=True): |
1003 |
"""register a new relation type named `rtype`, as described in the |
|
1004 |
schema description file. |
|
1005 |
||
1006 |
`addrdef` is a boolean value; when True, it will also add all relations |
|
1007 |
of the type just added found in the schema definition file. Note that it |
|
1008 |
implies an intermediate "commit" which commits the relation type |
|
1009 |
creation (but not the relation definitions themselves, for which |
|
1010 |
committing depends on the `commit` argument value). |
|
1477 | 1011 |
|
0 | 1012 |
""" |
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
|
1013 |
reposchema = self.repo.schema |
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
|
1014 |
rschema = self.fs_schema.rschema(rtype) |
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
|
1015 |
execute = self._cw.execute |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1016 |
# register the relation into CWRType and insert necessary relation |
0 | 1017 |
# definitions |
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
|
1018 |
ss.execschemarql(execute, rschema, ss.rschema2rql(rschema, addrdef=False)) |
0 | 1019 |
if addrdef: |
1020 |
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
|
1021 |
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
|
1022 |
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
|
1023 |
done = set() |
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
|
1024 |
for rdef in rschema.rdefs.itervalues(): |
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
|
1025 |
if not (reposchema.has_entity(rdef.subject) |
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
|
1026 |
and reposchema.has_entity(rdef.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
|
1027 |
continue |
6073
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1028 |
# symmetric relations appears twice |
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1029 |
if (rdef.subject, rdef.object) in done: |
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1030 |
continue |
bf684f1022bf
[migration] fix crash when adding symmetric relation type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6042
diff
changeset
|
1031 |
done.add( (rdef.subject, rdef.object) ) |
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
|
1032 |
self._set_rdef_eid(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
|
1033 |
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
|
1034 |
ss.rdef2rql(rdef, cmap, gmap)) |
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
|
1035 |
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
|
1036 |
# 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
|
1037 |
# 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
|
1038 |
# 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
|
1039 |
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
|
1040 |
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
|
1041 |
# 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
|
1042 |
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
|
1043 |
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
|
1044 |
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
|
1045 |
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
|
1046 |
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
|
1047 |
rdef.rtype = self.repo.schema.rschema(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
|
1048 |
rdef.object = self.repo.schema.rschema(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
|
1049 |
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
|
1050 |
ss.rdef2rql(rdef, cmap, gmap)) |
0 | 1051 |
if commit: |
1052 |
self.commit() |
|
1477 | 1053 |
|
0 | 1054 |
def cmd_drop_relation_type(self, rtype, commit=True): |
1055 |
"""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
|
1056 |
# 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
|
1057 |
self.rqlexec('DELETE CWRType X WHERE X name %r' % rtype, |
0 | 1058 |
ask_confirm=self.verbosity>=2) |
1059 |
if commit: |
|
1060 |
self.commit() |
|
1477 | 1061 |
|
0 | 1062 |
def cmd_rename_relation(self, oldname, newname, commit=True): |
1063 |
"""rename an existing relation |
|
1477 | 1064 |
|
0 | 1065 |
`oldname` is a string giving the name of the existing relation |
1066 |
`newname` is a string giving the name of the renamed relation |
|
1067 |
""" |
|
1068 |
self.cmd_add_relation_type(newname, commit=True) |
|
1069 |
self.rqlexec('SET X %s Y WHERE X %s Y' % (newname, oldname), |
|
1070 |
ask_confirm=self.verbosity>=2) |
|
1071 |
self.cmd_drop_relation_type(oldname, commit=commit) |
|
1072 |
||
1073 |
def cmd_add_relation_definition(self, subjtype, rtype, objtype, commit=True): |
|
1074 |
"""register a new relation definition, from its definition found in the |
|
1075 |
schema definition file |
|
1076 |
""" |
|
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
|
1077 |
rschema = self.fs_schema.rschema(rtype) |
0 | 1078 |
if not rtype in self.repo.schema: |
1079 |
self.cmd_add_relation_type(rtype, addrdef=False, commit=True) |
|
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
|
1080 |
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
|
1081 |
rdef = self._get_rdef(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
|
1082 |
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
|
1083 |
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
|
1084 |
self.group_mapping())) |
0 | 1085 |
if commit: |
1086 |
self.commit() |
|
1477 | 1087 |
|
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
|
1088 |
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
|
1089 |
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
|
1090 |
|
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
|
1091 |
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
|
1092 |
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
|
1093 |
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
|
1094 |
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
|
1095 |
schemaobj.eid = self.repo.schema[schemaobj].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
|
1096 |
assert schemaobj.eid is not 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
|
1097 |
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
|
1098 |
|
0 | 1099 |
def cmd_drop_relation_definition(self, subjtype, rtype, objtype, commit=True): |
1100 |
"""unregister an existing relation definition""" |
|
1101 |
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
|
1102 |
# 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
|
1103 |
if rschema.final: |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1104 |
etype = 'CWAttribute' |
0 | 1105 |
else: |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1106 |
etype = 'CWRelation' |
0 | 1107 |
rql = ('DELETE %s X WHERE X from_entity FE, FE name "%s",' |
1108 |
'X relation_type RT, RT name "%s", X to_entity TE, TE name "%s"') |
|
1109 |
self.rqlexec(rql % (etype, subjtype, rtype, objtype), |
|
1110 |
ask_confirm=self.verbosity>=2) |
|
1111 |
if commit: |
|
1112 |
self.commit() |
|
1477 | 1113 |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1114 |
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
|
1115 |
syncprops=True, syncrdefs=True, commit=True): |
0 | 1116 |
"""synchronize the persistent schema against the current definition |
1117 |
schema. |
|
1477 | 1118 |
|
0 | 1119 |
It will synch common stuff between the definition schema and the |
1120 |
actual persistent schema, it won't add/remove any entity or relation. |
|
1121 |
""" |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1122 |
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
|
1123 |
if ertype is not None: |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1124 |
if isinstance(ertype, (tuple, list)): |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1125 |
assert len(ertype) == 3, 'not a relation definition' |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3836
diff
changeset
|
1126 |
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
|
1127 |
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
|
1128 |
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
|
1129 |
else: |
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1130 |
erschema = self.repo.schema[ertype] |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1131 |
if isinstance(erschema, CubicWebRelationSchema): |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1132 |
self._synchronize_rschema(erschema, syncrdefs=syncrdefs, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1133 |
syncperms=syncperms, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1134 |
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
|
1135 |
else: |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1136 |
self._synchronize_eschema(erschema, syncrdefs=syncrdefs, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1137 |
syncperms=syncperms, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1138 |
syncprops=syncprops) |
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1139 |
else: |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1140 |
for etype in self.repo.schema.entities(): |
5666
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1141 |
self._synchronize_eschema(etype, syncrdefs=syncrdefs, |
58d6c2c96500
[migration] fix schema synchronization bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1142 |
syncprops=syncprops, syncperms=syncperms) |
0 | 1143 |
if commit: |
1144 |
self.commit() |
|
1477 | 1145 |
|
0 | 1146 |
def cmd_change_relation_props(self, subjtype, rtype, objtype, |
1147 |
commit=True, **kwargs): |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1148 |
"""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
|
1149 |
|
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1150 |
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
|
1151 |
""" |
0 | 1152 |
assert kwargs |
1153 |
restriction = [] |
|
1154 |
if subjtype and subjtype != 'Any': |
|
1155 |
restriction.append('X from_entity FE, FE name "%s"' % subjtype) |
|
1156 |
if objtype and objtype != 'Any': |
|
1157 |
restriction.append('X to_entity TE, TE name "%s"' % objtype) |
|
1158 |
if rtype and rtype != 'Any': |
|
1159 |
restriction.append('X relation_type RT, RT name "%s"' % rtype) |
|
1160 |
assert restriction |
|
1161 |
values = [] |
|
1162 |
for k, v in kwargs.items(): |
|
1163 |
values.append('X %s %%(%s)s' % (k, k)) |
|
1164 |
if isinstance(v, str): |
|
1165 |
kwargs[k] = unicode(v) |
|
1166 |
rql = 'SET %s WHERE %s' % (','.join(values), ','.join(restriction)) |
|
1167 |
self.rqlexec(rql, kwargs, ask_confirm=self.verbosity>=2) |
|
1168 |
if commit: |
|
1169 |
self.commit() |
|
1170 |
||
1171 |
def cmd_set_size_constraint(self, etype, rtype, size, commit=True): |
|
1172 |
"""set change size constraint of a string attribute |
|
1173 |
||
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1174 |
if size is None any size constraint will be removed. |
1477 | 1175 |
|
1176 |
you usually want to use sync_schema_props_perms instead. |
|
0 | 1177 |
""" |
1178 |
oldvalue = None |
|
4695
4aaf87e7f79e
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4650
diff
changeset
|
1179 |
for constr in self.repo.schema.eschema(etype).rdef(rtype).constraints: |
0 | 1180 |
if isinstance(constr, SizeConstraint): |
1181 |
oldvalue = constr.max |
|
1182 |
if oldvalue == size: |
|
1183 |
return |
|
1184 |
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
|
1185 |
ceid = self.rqlexec('INSERT CWConstraint C: C value %(v)s, C cstrtype CT ' |
0 | 1186 |
'WHERE CT name "SizeConstraint"', |
1187 |
{'v': SizeConstraint(size).serialize()}, |
|
1188 |
ask_confirm=self.verbosity>=2)[0][0] |
|
1189 |
self.rqlexec('SET X constrained_by C WHERE X from_entity S, X relation_type R, ' |
|
1190 |
'S name "%s", R name "%s", C eid %s' % (etype, rtype, ceid), |
|
1191 |
ask_confirm=self.verbosity>=2) |
|
1192 |
elif not oldvalue is None: |
|
1193 |
if not size is None: |
|
1194 |
self.rqlexec('SET C value %%(v)s WHERE X from_entity S, X relation_type R,' |
|
1195 |
'X constrained_by C, C cstrtype CT, CT name "SizeConstraint",' |
|
1196 |
'S name "%s", R name "%s"' % (etype, rtype), |
|
1197 |
{'v': unicode(SizeConstraint(size).serialize())}, |
|
1198 |
ask_confirm=self.verbosity>=2) |
|
1199 |
else: |
|
1200 |
self.rqlexec('DELETE X constrained_by C WHERE X from_entity S, X relation_type R,' |
|
1201 |
'X constrained_by C, C cstrtype CT, CT name "SizeConstraint",' |
|
1202 |
'S name "%s", R name "%s"' % (etype, rtype), |
|
1203 |
ask_confirm=self.verbosity>=2) |
|
1204 |
# cleanup unused constraints |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1205 |
self.rqlexec('DELETE CWConstraint C WHERE NOT X constrained_by C') |
0 | 1206 |
if commit: |
1207 |
self.commit() |
|
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1208 |
|
3577
067610a0e12f
add version number to deprecation messages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3548
diff
changeset
|
1209 |
@deprecated('[3.2] use sync_schema_props_perms(ertype, syncprops=False)') |
1399
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1210 |
def cmd_synchronize_permissions(self, ertype, commit=True): |
3f408c7a164e
unify schema sync migration commands with (hopefuly) a clearer name
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
1211 |
self.cmd_sync_schema_props_perms(ertype, syncprops=False, commit=commit) |
1477 | 1212 |
|
0 | 1213 |
# Workflows handling ###################################################### |
1477 | 1214 |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1215 |
def cmd_add_workflow(self, name, wfof, default=True, commit=False, |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1216 |
**kwargs): |
3582
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1217 |
""" |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1218 |
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
|
1219 |
:type name: unicode |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1220 |
:param name: name of the workflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1221 |
|
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1222 |
:type wfof: string or list/tuple of strings |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1223 |
:param wfof: entity type(s) having this workflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1224 |
|
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1225 |
:type default: bool |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1226 |
:param default: tells wether this is the default workflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1227 |
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
|
1228 |
the case of a subworkflow |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1229 |
|
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1230 |
:rtype: `Workflow` |
28547f21308e
two bits of docstring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3577
diff
changeset
|
1231 |
""" |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1232 |
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
|
1233 |
**kwargs) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1234 |
if not isinstance(wfof, (list, tuple)): |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1235 |
wfof = (wfof,) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1236 |
for etype in wfof: |
2956
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1237 |
rset = self.rqlexec( |
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1238 |
'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
|
1239 |
{'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
|
1240 |
assert rset, 'unexistant entity type %s' % etype |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1241 |
if default: |
2956
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1242 |
self.rqlexec( |
6a57c0be0e58
[migration] don't ask confirm here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2943
diff
changeset
|
1243 |
'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
|
1244 |
{'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
|
1245 |
if commit: |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1246 |
self.commit() |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1247 |
return wf |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1248 |
|
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1249 |
# XXX remove once cmd_add_[state|transition] are removed |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1250 |
def _get_or_create_wf(self, etypes): |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1251 |
if not isinstance(etypes, (list, tuple)): |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1252 |
etypes = (etypes,) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1253 |
rset = self.rqlexec('Workflow X WHERE X workflow_of ET, ET name %(et)s', |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1254 |
{'et': etypes[0]}) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1255 |
if rset: |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1256 |
return rset.get_entity(0, 0) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1257 |
return self.cmd_add_workflow('%s workflow' % ';'.join(etypes), etypes) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1258 |
|
4339
fe93b670343d
some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4330
diff
changeset
|
1259 |
@deprecated('[3.5] use add_workflow and Workflow.add_state method', |
fe93b670343d
some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4330
diff
changeset
|
1260 |
stacklevel=3) |
0 | 1261 |
def cmd_add_state(self, name, stateof, initial=False, commit=False, **kwargs): |
1262 |
"""method to ease workflow definition: add a state for one or more |
|
1263 |
entity type(s) |
|
1264 |
""" |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1265 |
wf = self._get_or_create_wf(stateof) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1266 |
state = wf.add_state(name, initial, **kwargs) |
0 | 1267 |
if commit: |
1268 |
self.commit() |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1269 |
return state.eid |
1477 | 1270 |
|
4339
fe93b670343d
some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4330
diff
changeset
|
1271 |
@deprecated('[3.5] use add_workflow and Workflow.add_transition method', |
fe93b670343d
some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4330
diff
changeset
|
1272 |
stacklevel=3) |
0 | 1273 |
def cmd_add_transition(self, name, transitionof, fromstates, tostate, |
1274 |
requiredgroups=(), conditions=(), commit=False, **kwargs): |
|
1275 |
"""method to ease workflow definition: add a transition for one or more |
|
1276 |
entity type(s), from one or more state and to a single state |
|
1277 |
""" |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1278 |
wf = self._get_or_create_wf(transitionof) |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1279 |
tr = wf.add_transition(name, fromstates, tostate, requiredgroups, |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1280 |
conditions, **kwargs) |
0 | 1281 |
if commit: |
1282 |
self.commit() |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1283 |
return tr.eid |
0 | 1284 |
|
4339
fe93b670343d
some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4330
diff
changeset
|
1285 |
@deprecated('[3.5] use Transition.set_transition_permissions method', |
fe93b670343d
some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4330
diff
changeset
|
1286 |
stacklevel=3) |
0 | 1287 |
def cmd_set_transition_permissions(self, treid, |
1288 |
requiredgroups=(), conditions=(), |
|
1289 |
reset=True, commit=False): |
|
1290 |
"""set or add (if `reset` is False) groups and conditions for a |
|
1291 |
transition |
|
1292 |
""" |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1293 |
tr = self._cw.entity_from_eid(treid) |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1294 |
tr.set_transition_permissions(requiredgroups, conditions, reset) |
0 | 1295 |
if commit: |
1296 |
self.commit() |
|
1297 |
||
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1298 |
@deprecated('[3.5] use iworkflowable.fire_transition("transition") or ' |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1299 |
'iworkflowable.change_state("state")', stacklevel=3) |
972 | 1300 |
def cmd_set_state(self, eid, statename, commit=False): |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5552
diff
changeset
|
1301 |
self._cw.entity_from_eid(eid).cw_adapt_to('IWorkflowable').change_state(statename) |
972 | 1302 |
if commit: |
1303 |
self.commit() |
|
1477 | 1304 |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1305 |
# CWProperty handling ###################################################### |
0 | 1306 |
|
1307 |
def cmd_property_value(self, pkey): |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1308 |
rql = 'Any V WHERE X is CWProperty, X pkey %(k)s, X value V' |
0 | 1309 |
rset = self.rqlexec(rql, {'k': pkey}, ask_confirm=False) |
1310 |
return rset[0][0] |
|
1311 |
||
1312 |
def cmd_set_property(self, pkey, value): |
|
1313 |
value = unicode(value) |
|
1314 |
try: |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1315 |
prop = self.rqlexec('CWProperty X WHERE X pkey %(k)s', {'k': pkey}, |
0 | 1316 |
ask_confirm=False).get_entity(0, 0) |
1317 |
except: |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1318 |
self.cmd_create_entity('CWProperty', pkey=unicode(pkey), value=value) |
0 | 1319 |
else: |
1320 |
self.rqlexec('SET X value %(v)s WHERE X pkey %(k)s', |
|
1321 |
{'k': pkey, 'v': value}, ask_confirm=False) |
|
1322 |
||
1323 |
# other data migration commands ########################################### |
|
1477 | 1324 |
|
3700
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1325 |
@property |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1326 |
def _cw(self): |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1327 |
session = self.session |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1328 |
if session is not None: |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1329 |
session.set_pool() |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1330 |
return session |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1331 |
return self.cnx.request() |
fd550e4dc515
#481017: cubicweb-ctl shell on remote instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
1332 |
|
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
|
1333 |
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
|
1334 |
"""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
|
1335 |
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
|
1336 |
""" |
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
|
1337 |
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
|
1338 |
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
|
1339 |
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
|
1340 |
source.unset_storage(etype, attribute) |
5552 | 1341 |
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
|
1342 |
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
|
1343 |
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
|
1344 |
# 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
|
1345 |
# 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
|
1346 |
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
|
1347 |
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
|
1348 |
# remove from entity cache to avoid memory exhaustion |
e41cd3bf5080
[migration] fix storage_change migraction to avoid exhausting the server's memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
1349 |
del 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
|
1350 |
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
|
1351 |
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
|
1352 |
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
|
1353 |
|
5132
260d73ad4f24
[cleaning] simpler implementation of cmd_create_entity
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5043
diff
changeset
|
1354 |
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
|
1355 |
"""add a new entity of the given type""" |
3708
95e8c3a9698a
update prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3707
diff
changeset
|
1356 |
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
|
1357 |
if commit: |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1358 |
self.commit() |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1359 |
return entity |
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1360 |
|
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
|
1361 |
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
|
1362 |
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
|
1363 |
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
|
1364 |
'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
|
1365 |
'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
|
1366 |
{'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
|
1367 |
|
5850
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1368 |
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
|
1369 |
"""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
|
1370 |
indexable entity types |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1371 |
""" |
fabff2813ee4
[migration] schema should be accessed through .repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5666
diff
changeset
|
1372 |
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
|
1373 |
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
|
1374 |
|
4367
fa02f7dccfe4
fix deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4344
diff
changeset
|
1375 |
@deprecated('[3.5] use create_entity', stacklevel=3) |
0 | 1376 |
def cmd_add_entity(self, etype, *args, **kwargs): |
1377 |
"""add a new entity of the given type""" |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2903
diff
changeset
|
1378 |
return self.cmd_create_entity(etype, *args, **kwargs).eid |
1477 | 1379 |
|
0 | 1380 |
def sqlexec(self, sql, args=None, ask_confirm=True): |
1381 |
"""execute the given sql if confirmed |
|
1477 | 1382 |
|
0 | 1383 |
should only be used for low level stuff undoable with existing higher |
1384 |
level actions |
|
1385 |
""" |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1386 |
if not ask_confirm or self.confirm('Execute sql: %s ?' % sql): |
0 | 1387 |
try: |
1388 |
cu = self.session.system_sql(sql, args) |
|
1389 |
except: |
|
1390 |
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
|
1391 |
if self.confirm('Error: %s\nabort?' % ex, pdb=True): |
0 | 1392 |
raise |
1393 |
return |
|
1394 |
try: |
|
1395 |
return cu.fetchall() |
|
1396 |
except: |
|
1397 |
# no result to fetch |
|
1398 |
return |
|
1477 | 1399 |
|
4945
356662a6f06c
[migration] new build_descr argument to rqlexec on the migration helper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4925
diff
changeset
|
1400 |
def rqlexec(self, rql, kwargs=None, cachekey=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
|
1401 |
ask_confirm=False): |
0 | 1402 |
"""rql action""" |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1403 |
if cachekey is not None: |
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1404 |
warn('[3.8] cachekey is deprecated, you can safely remove this argument', |
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1405 |
DeprecationWarning, stacklevel=2) |
0 | 1406 |
if not isinstance(rql, (tuple, list)): |
1407 |
rql = ( (rql, kwargs), ) |
|
1408 |
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
|
1409 |
execute = self._cw.execute |
0 | 1410 |
for rql, kwargs in rql: |
1411 |
if kwargs: |
|
1412 |
msg = '%s (%s)' % (rql, kwargs) |
|
1413 |
else: |
|
1414 |
msg = rql |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1415 |
if not ask_confirm or self.confirm('Execute rql: %s ?' % msg): |
0 | 1416 |
try: |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5132
diff
changeset
|
1417 |
res = execute(rql, kwargs, build_descr=build_descr) |
0 | 1418 |
except Exception, 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
|
1419 |
if self.confirm('Error: %s\nabort?' % ex, pdb=True): |
0 | 1420 |
raise |
1421 |
return res |
|
1422 |
||
1423 |
def rqliter(self, rql, kwargs=None, ask_confirm=True): |
|
1424 |
return ForRqlIterator(self, rql, None, ask_confirm) |
|
1425 |
||
1426 |
# broken db commands ###################################################### |
|
1427 |
||
1428 |
def cmd_change_attribute_type(self, etype, attr, newtype, commit=True): |
|
1429 |
"""low level method to change the type of an entity attribute. This is |
|
1430 |
a quick hack which has some drawback: |
|
1431 |
* only works when the old type can be changed to the new type by the |
|
1432 |
underlying rdbms (eg using ALTER TABLE) |
|
1433 |
* the actual schema won't be updated until next startup |
|
1434 |
""" |
|
1435 |
rschema = self.repo.schema.rschema(attr) |
|
1436 |
oldtype = rschema.objects(etype)[0] |
|
1437 |
rdefeid = rschema.rproperty(etype, oldtype, 'eid') |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1438 |
sql = ("UPDATE CWAttribute " |
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
1439 |
"SET to_entity=(SELECT eid FROM CWEType WHERE name='%s')" |
0 | 1440 |
"WHERE eid=%s") % (newtype, rdefeid) |
1441 |
self.sqlexec(sql, ask_confirm=False) |
|
1442 |
dbhelper = self.repo.system_source.dbhelper |
|
1443 |
sqltype = dbhelper.TYPE_MAPPING[newtype] |
|
1444 |
sql = 'ALTER TABLE %s ALTER COLUMN %s TYPE %s' % (etype, attr, sqltype) |
|
1445 |
self.sqlexec(sql, ask_confirm=False) |
|
1446 |
if commit: |
|
1447 |
self.commit() |
|
1477 | 1448 |
|
0 | 1449 |
def cmd_add_entity_type_table(self, etype, commit=True): |
1450 |
"""low level method to create the sql table for an existing entity. |
|
1451 |
This may be useful on accidental desync between the repository schema |
|
1452 |
and a sql database |
|
1453 |
""" |
|
1454 |
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
|
1455 |
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
|
1456 |
prefix=SQL_PREFIX) |
0 | 1457 |
for sql in tablesql.split(';'): |
1458 |
if sql.strip(): |
|
1459 |
self.sqlexec(sql) |
|
1460 |
if commit: |
|
1461 |
self.commit() |
|
1477 | 1462 |
|
0 | 1463 |
def cmd_add_relation_type_table(self, rtype, commit=True): |
1464 |
"""low level method to create the sql table for an existing relation. |
|
1465 |
This may be useful on accidental desync between the repository schema |
|
1466 |
and a sql database |
|
1467 |
""" |
|
1468 |
dbhelper = self.repo.system_source.dbhelper |
|
1469 |
tablesql = rschema2sql(dbhelper, self.repo.schema.rschema(rtype)) |
|
1470 |
for sql in tablesql.split(';'): |
|
1471 |
if sql.strip(): |
|
1472 |
self.sqlexec(sql) |
|
1473 |
if commit: |
|
1474 |
self.commit() |
|
1477 | 1475 |
|
4843
5f7363416765
fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4835
diff
changeset
|
1476 |
@deprecated("[3.7] use session.disable_hook_categories('integrity')") |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4763
diff
changeset
|
1477 |
def cmd_deactivate_verification_hooks(self): |
4843
5f7363416765
fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4835
diff
changeset
|
1478 |
self.session.disable_hook_categories('integrity') |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4763
diff
changeset
|
1479 |
|
4843
5f7363416765
fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4835
diff
changeset
|
1480 |
@deprecated("[3.7] use session.enable_hook_categories('integrity')") |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4763
diff
changeset
|
1481 |
def cmd_reactivate_verification_hooks(self): |
4843
5f7363416765
fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4835
diff
changeset
|
1482 |
self.session.enable_hook_categories('integrity') |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4763
diff
changeset
|
1483 |
|
0 | 1484 |
|
1485 |
class ForRqlIterator: |
|
1486 |
"""specific rql iterator to make the loop skipable""" |
|
1487 |
def __init__(self, helper, rql, kwargs, ask_confirm): |
|
1488 |
self._h = helper |
|
1489 |
self.rql = rql |
|
1490 |
self.kwargs = kwargs |
|
1491 |
self.ask_confirm = ask_confirm |
|
1492 |
self._rsetit = None |
|
1477 | 1493 |
|
0 | 1494 |
def __iter__(self): |
1495 |
return self |
|
1477 | 1496 |
|
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
|
1497 |
def _get_rset(self): |
0 | 1498 |
rql, kwargs = self.rql, self.kwargs |
1499 |
if kwargs: |
|
1500 |
msg = '%s (%s)' % (rql, kwargs) |
|
1501 |
else: |
|
1502 |
msg = rql |
|
1503 |
if self.ask_confirm: |
|
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1504 |
if not self._h.confirm('Execute rql: %s ?' % msg): |
0 | 1505 |
raise StopIteration |
1506 |
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
|
1507 |
return self._h._cw.execute(rql, kwargs) |
0 | 1508 |
except Exception, ex: |
4650
965395d821bc
typo: capitalize migration confirmation messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
4640
diff
changeset
|
1509 |
if self._h.confirm('Error: %s\nabort?' % ex): |
0 | 1510 |
raise |
1511 |
else: |
|
1512 |
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
|
1513 |
|
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1514 |
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
|
1515 |
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
|
1516 |
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
|
1517 |
rset = self._get_rset() |
0 | 1518 |
self._rsetit = iter(rset) |
1519 |
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
|
1520 |
|
46b9cbbc1e37
[migration] enhance RqlForIterator so we can do 'for e in rqliter(...).entities()'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6118
diff
changeset
|
1521 |
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
|
1522 |
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
|
1523 |
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
|
1524 |
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
|
1525 |
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
|
1526 |
return rset.entities() |