author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 07 Dec 2010 12:18:20 +0100 | |
branch | stable |
changeset 7065 | 6a6ea9966931 |
parent 7021 | fc7ac3409b0c |
child 7181 | e54ad6984e01 |
permissions | -rw-r--r-- |
6954
f9a84d54ebf3
[doc] update some copyrights
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6889
diff
changeset
|
1 |
# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
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:
4951
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
"""schema hooks: |
19 |
||
20 |
- synchronize the living schema object with the persistent schema |
|
21 |
- perform physical update on the source when necessary |
|
22 |
||
23 |
checking for schema consistency is done in hooks.py |
|
5803
589e2e3fb997
[schema migration] don't try to drop column if backend doesn't support column alteration (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5801
diff
changeset
|
24 |
""" |
0 | 25 |
|
26 |
__docformat__ = "restructuredtext en" |
|
27 |
||
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:
4722
diff
changeset
|
28 |
from copy import copy |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
29 |
from yams.schema import BASE_TYPES, RelationSchema, RelationDefinitionSchema |
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:
4722
diff
changeset
|
30 |
from yams import buildobjs as ybo, schema2sql as y2sql |
0 | 31 |
|
3774
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
32 |
from logilab.common.decorators import clear_cache |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
33 |
|
4719
aaed3f813ef8
kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4667
diff
changeset
|
34 |
from cubicweb import ValidationError |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
35 |
from cubicweb.selectors import is_instance |
6261
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
36 |
from cubicweb.schema import (SCHEMA_TYPES, META_RTYPES, VIRTUAL_RTYPES, |
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
37 |
CONSTRAINTS, ETYPE_NAME_MAP, display_name) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
38 |
from cubicweb.server import hook, schemaserial as ss |
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:
0
diff
changeset
|
39 |
from cubicweb.server.sqlutils import SQL_PREFIX |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
40 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
41 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
42 |
TYPE_CONVERTER = { # XXX |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
43 |
'Boolean': bool, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
44 |
'Int': int, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
45 |
'Float': float, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
46 |
'Password': str, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
47 |
'String': unicode, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
48 |
'Date' : unicode, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
49 |
'Datetime' : unicode, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
50 |
'Time' : unicode, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
51 |
} |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
52 |
|
0 | 53 |
# core entity and relation types which can't be removed |
6261
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
54 |
CORE_TYPES = BASE_TYPES | SCHEMA_TYPES | META_RTYPES | set( |
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
55 |
('CWUser', 'CWGroup','login', 'upassword', 'name', 'in_group')) |
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
56 |
|
0 | 57 |
|
58 |
def get_constraints(session, entity): |
|
59 |
constraints = [] |
|
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
60 |
for cstreid in session.transaction_data.get(entity.eid, ()): |
2195
58bef4f707ce
update calls to a deprecated method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2101
diff
changeset
|
61 |
cstrent = session.entity_from_eid(cstreid) |
0 | 62 |
cstr = CONSTRAINTS[cstrent.type].deserialize(cstrent.value) |
63 |
cstr.eid = cstreid |
|
64 |
constraints.append(cstr) |
|
65 |
return constraints |
|
66 |
||
4043
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
67 |
def group_mapping(cw): |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
68 |
try: |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
69 |
return cw.transaction_data['groupmap'] |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
70 |
except KeyError: |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
71 |
cw.transaction_data['groupmap'] = gmap = ss.group_mapping(cw) |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
72 |
return gmap |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
73 |
|
0 | 74 |
def add_inline_relation_column(session, etype, rtype): |
75 |
"""add necessary column and index for an inlined relation""" |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
76 |
attrkey = '%s.%s' % (etype, rtype) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
77 |
createdattrs = session.transaction_data.setdefault('createdattrs', set()) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
78 |
if attrkey in createdattrs: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
79 |
return |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
80 |
createdattrs.add(attrkey) |
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:
0
diff
changeset
|
81 |
table = SQL_PREFIX + 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:
0
diff
changeset
|
82 |
column = SQL_PREFIX + rtype |
0 | 83 |
try: |
5801
355d3945c1f3
Use SQL standard ALTER TABLE command (with ADD instead of ADD COLUMN)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5772
diff
changeset
|
84 |
session.system_sql(str('ALTER TABLE %s ADD %s integer' |
2618
ff9b0d5bd884
[F repo sqlite schema changes] don't rollback on potentially expected schema changes failure
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2617
diff
changeset
|
85 |
% (table, column)), rollback_on_failure=False) |
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:
0
diff
changeset
|
86 |
session.info('added column %s to table %s', column, table) |
0 | 87 |
except: |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
88 |
# silent exception here, if this error has not been raised because the |
0 | 89 |
# column already exists, index creation will fail anyway |
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:
0
diff
changeset
|
90 |
session.exception('error while adding column %s to table %s', |
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:
0
diff
changeset
|
91 |
table, column) |
0 | 92 |
# create index before alter table which may expectingly fail during test |
93 |
# (sqlite) while index creation should never fail (test for index existence |
|
94 |
# is done by the 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:
0
diff
changeset
|
95 |
session.pool.source('system').create_index(session, table, column) |
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:
0
diff
changeset
|
96 |
session.info('added index on %s(%s)', table, column) |
0 | 97 |
|
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
98 |
|
6076
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
99 |
def insert_rdef_on_subclasses(session, eschema, rschema, rdefdef, props): |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
100 |
# XXX 'infered': True/False, not clear actually |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
101 |
props.update({'constraints': rdefdef.constraints, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
102 |
'description': rdefdef.description, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
103 |
'cardinality': rdefdef.cardinality, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
104 |
'permissions': rdefdef.get_permissions(), |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
105 |
'order': rdefdef.order, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
106 |
'infered': False, 'eid': None |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
107 |
}) |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
108 |
cstrtypemap = ss.cstrtype_mapping(session) |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
109 |
groupmap = group_mapping(session) |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
110 |
object = rschema.schema.eschema(rdefdef.object) |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
111 |
for specialization in eschema.specialized_by(False): |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
112 |
if (specialization, rdefdef.object) in rschema.rdefs: |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
113 |
continue |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
114 |
sperdef = RelationDefinitionSchema(specialization, rschema, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
115 |
object, props) |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
116 |
ss.execschemarql(session.execute, sperdef, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
117 |
ss.rdef2rql(sperdef, cstrtypemap, groupmap)) |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
118 |
|
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
119 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
120 |
def check_valid_changes(session, entity, ro_attrs=('name', 'final')): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
121 |
errors = {} |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
122 |
# don't use getattr(entity, attr), we would get the modified value if any |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
123 |
for attr in entity.cw_edited: |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
124 |
if attr in ro_attrs: |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
125 |
origval, newval = entity.cw_edited.oldnewvalue(attr) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
126 |
if newval != origval: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
127 |
errors[attr] = session._("can't change the %s attribute") % \ |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
128 |
display_name(session, attr) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
129 |
if errors: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
130 |
raise ValidationError(entity.eid, errors) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
131 |
|
0 | 132 |
|
6789
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
133 |
class _MockEntity(object): # XXX use a named tuple with python 2.6 |
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
134 |
def __init__(self, eid): |
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
135 |
self.eid = eid |
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
136 |
|
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
137 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
138 |
class SyncSchemaHook(hook.Hook): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
139 |
"""abstract class for schema synchronization hooks (in the `syncschema` |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
140 |
category) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
141 |
""" |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
142 |
__abstract__ = True |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
143 |
category = 'syncschema' |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
144 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
145 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
146 |
# operations for low-level database alteration ################################ |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
147 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
148 |
class DropTable(hook.Operation): |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2462
diff
changeset
|
149 |
"""actually remove a database from the instance's schema""" |
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
150 |
table = None # make pylint happy |
0 | 151 |
def precommit_event(self): |
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
152 |
dropped = self.session.transaction_data.setdefault('droppedtables', |
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
153 |
set()) |
0 | 154 |
if self.table in dropped: |
155 |
return # already processed |
|
156 |
dropped.add(self.table) |
|
157 |
self.session.system_sql('DROP TABLE %s' % self.table) |
|
158 |
self.info('dropped table %s', self.table) |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
159 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
160 |
# XXX revertprecommit_event |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
161 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
162 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
163 |
class DropRelationTable(DropTable): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
164 |
def __init__(self, session, rtype): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
165 |
super(DropRelationTable, self).__init__( |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
166 |
session, table='%s_relation' % rtype) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
167 |
session.transaction_data.setdefault('pendingrtypes', set()).add(rtype) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
168 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
169 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
170 |
class DropColumn(hook.Operation): |
0 | 171 |
"""actually remove the attribut's column from entity table in the system |
172 |
database |
|
173 |
""" |
|
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
174 |
table = column = None # make pylint happy |
0 | 175 |
def precommit_event(self): |
176 |
session, table, column = self.session, self.table, self.column |
|
5805
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
177 |
source = session.repo.system_source |
0 | 178 |
# drop index if any |
5805
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
179 |
source.drop_index(session, table, column) |
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
180 |
if source.dbhelper.alter_column_support: |
0 | 181 |
session.system_sql('ALTER TABLE %s DROP COLUMN %s' |
2618
ff9b0d5bd884
[F repo sqlite schema changes] don't rollback on potentially expected schema changes failure
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2617
diff
changeset
|
182 |
% (table, column), rollback_on_failure=False) |
0 | 183 |
self.info('dropped column %s from table %s', column, table) |
5805
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
184 |
else: |
0 | 185 |
# not supported by sqlite for instance |
5805
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
186 |
self.error('dropping column not supported by the backend, handle ' |
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
187 |
'it yourself (%s.%s)', table, column) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
188 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
189 |
# XXX revertprecommit_event |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
190 |
|
0 | 191 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
192 |
# base operations for in-memory schema synchronization ######################## |
0 | 193 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
194 |
class MemSchemaNotifyChanges(hook.SingleLastOperation): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
195 |
"""the update schema operation: |
0 | 196 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
197 |
special operation which should be called once and after all other schema |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
198 |
operations. It will trigger internal structures rebuilding to consider |
2902
dd9f2dd02f85
remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2899
diff
changeset
|
199 |
schema changes. |
0 | 200 |
""" |
201 |
||
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
202 |
def __init__(self, session): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
203 |
hook.SingleLastOperation.__init__(self, session) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
204 |
|
3774
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
205 |
def precommit_event(self): |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
206 |
for eschema in self.session.repo.schema.entities(): |
3774
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
207 |
if not eschema.final: |
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
208 |
clear_cache(eschema, 'ordered_relations') |
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
209 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
210 |
def postcommit_event(self): |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
211 |
rebuildinfered = self.session.data.get('rebuild-infered', True) |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
212 |
repo = self.session.repo |
4591
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
213 |
# commit event should not raise error, while set_schema has chances to |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
214 |
# do so because it triggers full vreg reloading |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
215 |
try: |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
216 |
repo.set_schema(repo.schema, rebuildinfered=rebuildinfered) |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
217 |
# CWUser class might have changed, update current session users |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
218 |
cwuser_cls = self.session.vreg['etypes'].etype_class('CWUser') |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
219 |
for session in repo._sessions.values(): |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
220 |
session.user.__class__ = cwuser_cls |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
221 |
except: |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
222 |
self.critical('error while setting schmea', exc_info=True) |
0 | 223 |
|
3774
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
224 |
def rollback_event(self): |
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
225 |
self.precommit_event() |
1eca47d59fd9
on precommit / rollback of schema update op, clear order_relations cache of entity schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3689
diff
changeset
|
226 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
227 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
228 |
class MemSchemaOperation(hook.Operation): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
229 |
"""base class for schema operations""" |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
230 |
def __init__(self, session, **kwargs): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
231 |
hook.Operation.__init__(self, session, **kwargs) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
232 |
# every schema operation is triggering a schema update |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
233 |
MemSchemaNotifyChanges(session) |
0 | 234 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
235 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
236 |
# operations for high-level source database alteration ######################## |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
237 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
238 |
class CWETypeAddOp(MemSchemaOperation): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
239 |
"""after adding a CWEType entity: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
240 |
* add it to the instance's schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
241 |
* create the necessary table |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
242 |
* set creation_date and modification_date by creating the necessary |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
243 |
CWAttribute entities |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
244 |
* add owned_by relation by creating the necessary CWRelation entity |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
245 |
""" |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
246 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
247 |
def precommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
248 |
session = self.session |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
249 |
entity = self.entity |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
250 |
schema = session.vreg.schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
251 |
etype = ybo.EntityType(eid=entity.eid, name=entity.name, |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
252 |
description=entity.description) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
253 |
eschema = schema.add_entity_type(etype) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
254 |
# create the necessary table |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
255 |
tablesql = y2sql.eschema2sql(session.pool.source('system').dbhelper, |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
256 |
eschema, prefix=SQL_PREFIX) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
257 |
for sql in tablesql.split(';'): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
258 |
if sql.strip(): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
259 |
session.system_sql(sql) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
260 |
# add meta relations |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
261 |
gmap = group_mapping(session) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
262 |
cmap = ss.cstrtype_mapping(session) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
263 |
for rtype in (META_RTYPES - VIRTUAL_RTYPES): |
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
264 |
try: |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
265 |
rschema = schema[rtype] |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
266 |
except: |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
267 |
if rtype == 'cw_source': |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
268 |
continue # XXX 3.10 migration |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6426
diff
changeset
|
269 |
raise |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
270 |
sampletype = rschema.subjects()[0] |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
271 |
desttype = rschema.objects()[0] |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
272 |
rdef = copy(rschema.rdef(sampletype, desttype)) |
6789
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
273 |
rdef.subject = _MockEntity(eid=entity.eid) |
f38963f7c91d
[schema hook] don't depends on lgc.testlib, hence unittest2 for a dumb mock
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6750
diff
changeset
|
274 |
mock = _MockEntity(eid=None) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
275 |
ss.execschemarql(session.execute, mock, ss.rdef2rql(rdef, cmap, gmap)) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
276 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
277 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
278 |
# revert changes on in memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
279 |
self.session.vreg.schema.del_entity_type(self.entity.name) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
280 |
# revert changes on database |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
281 |
self.session.system_sql('DROP TABLE %s%s' % (SQL_PREFIX, self.entity.name)) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
282 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
283 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
284 |
class CWETypeRenameOp(MemSchemaOperation): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
285 |
"""this operation updates physical storage accordingly""" |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
286 |
oldname = newname = None # make pylint happy |
0 | 287 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
288 |
def rename(self, oldname, newname): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
289 |
self.session.vreg.schema.rename_entity_type(oldname, newname) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
290 |
# we need sql to operate physical changes on the system database |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
291 |
sqlexec = self.session.system_sql |
6734
ec9a5efdc451
make rename_table work with MS SQL (needs updated logilab.database)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6294
diff
changeset
|
292 |
dbhelper= self.session.pool.source('system').dbhelper |
ec9a5efdc451
make rename_table work with MS SQL (needs updated logilab.database)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6294
diff
changeset
|
293 |
sql = dbhelper.sql_rename_table(SQL_PREFIX+oldname, |
ec9a5efdc451
make rename_table work with MS SQL (needs updated logilab.database)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6294
diff
changeset
|
294 |
SQL_PREFIX+newname) |
ec9a5efdc451
make rename_table work with MS SQL (needs updated logilab.database)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6294
diff
changeset
|
295 |
sqlexec(sql) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
296 |
self.info('renamed table %s to %s', oldname, newname) |
6734
ec9a5efdc451
make rename_table work with MS SQL (needs updated logilab.database)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6294
diff
changeset
|
297 |
sqlexec('UPDATE entities SET type=%(newname)s WHERE type=%(oldname)s', |
6735
7d37ba09f4e3
brown paperbag fix
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6734
diff
changeset
|
298 |
{'newname': newname, 'oldname': oldname}) |
6734
ec9a5efdc451
make rename_table work with MS SQL (needs updated logilab.database)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6294
diff
changeset
|
299 |
sqlexec('UPDATE deleted_entities SET type=%(newname)s WHERE type=%(oldname)s', |
6735
7d37ba09f4e3
brown paperbag fix
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6734
diff
changeset
|
300 |
{'newname': newname, 'oldname': oldname}) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
301 |
# XXX transaction records |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
302 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
303 |
def precommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
304 |
self.rename(self.oldname, self.newname) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
305 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
306 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
307 |
self.rename(self.newname, self.oldname) |
0 | 308 |
|
309 |
||
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
310 |
class CWRTypeUpdateOp(MemSchemaOperation): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
311 |
"""actually update some properties of a relation definition""" |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
312 |
rschema = entity = values = None # make pylint happy |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
313 |
oldvalus = None |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
314 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
315 |
def precommit_event(self): |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
316 |
rschema = self.rschema |
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
317 |
if rschema.final: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
318 |
return # watched changes to final relation type are unexpected |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
319 |
session = self.session |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
320 |
if 'fulltext_container' in self.values: |
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
321 |
op = UpdateFTIndexOp.get_instance(session) |
4826
7eba168407c3
[schema hook] fulltext_container is a relation *type* property. Test and fix (+ more fti properties change testing)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4807
diff
changeset
|
322 |
for subjtype, objtype in rschema.rdefs: |
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
323 |
op.add_data(subjtype) |
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
324 |
op.add_data(objtype) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
325 |
# update the in-memory schema first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
326 |
self.oldvalues = dict( (attr, getattr(rschema, attr)) for attr in self.values) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
327 |
self.rschema.__dict__.update(self.values) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
328 |
# then make necessary changes to the system source database |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
329 |
if not 'inlined' in self.values: |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
330 |
return # nothing to do |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
331 |
inlined = self.values['inlined'] |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
332 |
# check in-lining is possible when inlined |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
333 |
if inlined: |
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
334 |
self.entity.check_inlined_allowed() |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
335 |
# inlined changed, make necessary physical changes! |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
336 |
sqlexec = self.session.system_sql |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
337 |
rtype = rschema.type |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
338 |
eidcolumn = SQL_PREFIX + 'eid' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
339 |
if not inlined: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
340 |
# need to create the relation if it has not been already done by |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
341 |
# another event of the same transaction |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
342 |
if not rschema.type in session.transaction_data.get('createdtables', ()): |
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:
4722
diff
changeset
|
343 |
tablesql = y2sql.rschema2sql(rschema) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
344 |
# create the necessary table |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
345 |
for sql in tablesql.split(';'): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
346 |
if sql.strip(): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
347 |
sqlexec(sql) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
348 |
session.transaction_data.setdefault('createdtables', []).append( |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
349 |
rschema.type) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
350 |
# copy existant data |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
351 |
column = SQL_PREFIX + rtype |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
352 |
for etype in rschema.subjects(): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
353 |
table = SQL_PREFIX + str(etype) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
354 |
sqlexec('INSERT INTO %s_relation SELECT %s, %s FROM %s WHERE NOT %s IS NULL' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
355 |
% (rtype, eidcolumn, column, table, column)) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
356 |
# drop existant columns |
5805
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
357 |
#if session.repo.system_source.dbhelper.alter_column_support: |
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
358 |
for etype in rschema.subjects(): |
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
359 |
DropColumn(session, table=SQL_PREFIX + str(etype), |
560cde8a4f9f
[schema migration] fix fix introduced in 5803:589e2e3fb997, test for backend alter column support should be done in the operation, else the associated index is not dropped while this is supported
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5804
diff
changeset
|
360 |
column=SQL_PREFIX + rtype) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
361 |
else: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
362 |
for etype in rschema.subjects(): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
363 |
try: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
364 |
add_inline_relation_column(session, str(etype), rtype) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
365 |
except Exception, ex: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
366 |
# the column probably already exists. this occurs when the |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
367 |
# entity's type has just been added or if the column has not |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
368 |
# been previously dropped (eg sqlite) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
369 |
self.error('error while altering table %s: %s', etype, ex) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
370 |
# copy existant data. |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
371 |
# XXX don't use, it's not supported by sqlite (at least at when i tried it) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
372 |
#sqlexec('UPDATE %(etype)s SET %(rtype)s=eid_to ' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
373 |
# 'FROM %(rtype)s_relation ' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
374 |
# 'WHERE %(etype)s.eid=%(rtype)s_relation.eid_from' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
375 |
# % locals()) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
376 |
table = SQL_PREFIX + str(etype) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
377 |
cursor = sqlexec('SELECT eid_from, eid_to FROM %(table)s, ' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
378 |
'%(rtype)s_relation WHERE %(table)s.%(eidcolumn)s=' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
379 |
'%(rtype)s_relation.eid_from' % locals()) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
380 |
args = [{'val': eid_to, 'x': eid} for eid, eid_to in cursor.fetchall()] |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
381 |
if args: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
382 |
column = SQL_PREFIX + rtype |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
383 |
cursor.executemany('UPDATE %s SET %s=%%(val)s WHERE %s=%%(x)s' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
384 |
% (table, column, eidcolumn), args) |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
385 |
# drop existant table |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
386 |
DropRelationTable(session, rtype) |
0 | 387 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
388 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
389 |
# revert changes on in memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
390 |
self.rschema.__dict__.update(self.oldvalues) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
391 |
# XXX revert changes on database |
0 | 392 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
393 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
394 |
class CWAttributeAddOp(MemSchemaOperation): |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
395 |
"""an attribute relation (CWAttribute) has been added: |
0 | 396 |
* add the necessary column |
397 |
* set default on this column if any and possible |
|
398 |
* register an operation to add the relation definition to the |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2462
diff
changeset
|
399 |
instance's schema on commit |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
400 |
|
0 | 401 |
constraints are handled by specific hooks |
402 |
""" |
|
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
403 |
entity = None # make pylint happy |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
404 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
405 |
def init_rdef(self, **kwargs): |
0 | 406 |
entity = self.entity |
2599
79bd12769c55
[R schema hooks] use new accessors on CWRelation and CWAttribute entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
407 |
fromentity = entity.stype |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
408 |
rdefdef = self.rdefdef = ybo.RelationDefinition( |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
409 |
str(fromentity.name), entity.rtype.name, str(entity.otype.name), |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
410 |
description=entity.description, cardinality=entity.cardinality, |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
411 |
constraints=get_constraints(self.session, entity), |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
412 |
order=entity.ordernum, eid=entity.eid, **kwargs) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
413 |
self.session.vreg.schema.add_relation_def(rdefdef) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
414 |
self.session.execute('SET X ordernum Y+1 ' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
415 |
'WHERE X from_entity SE, SE eid %(se)s, X ordernum Y, ' |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
416 |
'X ordernum >= %(order)s, NOT X eid %(x)s', |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
417 |
{'x': entity.eid, 'se': fromentity.eid, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
418 |
'order': entity.ordernum or 0}) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
419 |
return rdefdef |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
420 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
421 |
def precommit_event(self): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
422 |
session = self.session |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
423 |
entity = self.entity |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
424 |
# entity.defaultval is a string or None, but we need a correctly typed |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
425 |
# value |
0 | 426 |
default = entity.defaultval |
427 |
if default is not None: |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
428 |
default = TYPE_CONVERTER[entity.otype.name](default) |
3526
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
429 |
props = {'default': default, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
430 |
'indexed': entity.indexed, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
431 |
'fulltextindexed': entity.fulltextindexed, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
432 |
'internationalizable': entity.internationalizable} |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
433 |
# update the in-memory schema first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
434 |
rdefdef = self.init_rdef(**props) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
435 |
# then make necessary changes to the system source database |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
436 |
syssource = session.pool.source('system') |
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:
4722
diff
changeset
|
437 |
attrtype = y2sql.type_from_constraints( |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
438 |
syssource.dbhelper, rdefdef.object, rdefdef.constraints) |
5847
51636c991fb4
[migration] refactor schema migration fix introduced by 5833:d7256ae7c1d1
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5846
diff
changeset
|
439 |
# XXX should be moved somehow into lgdb: sqlite doesn't support to |
0 | 440 |
# add a new column with UNIQUE, it should be added after the ALTER TABLE |
441 |
# using ADD INDEX |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
442 |
if syssource.dbdriver == 'sqlite' and 'UNIQUE' in attrtype: |
0 | 443 |
extra_unique_index = True |
444 |
attrtype = attrtype.replace(' UNIQUE', '') |
|
445 |
else: |
|
446 |
extra_unique_index = False |
|
447 |
# added some str() wrapping query since some backend (eg psycopg) don't |
|
448 |
# allow unicode queries |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
449 |
table = SQL_PREFIX + rdefdef.subject |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
450 |
column = SQL_PREFIX + rdefdef.name |
0 | 451 |
try: |
5801
355d3945c1f3
Use SQL standard ALTER TABLE command (with ADD instead of ADD COLUMN)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5772
diff
changeset
|
452 |
session.system_sql(str('ALTER TABLE %s ADD %s %s' |
2618
ff9b0d5bd884
[F repo sqlite schema changes] don't rollback on potentially expected schema changes failure
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2617
diff
changeset
|
453 |
% (table, column, attrtype)), |
ff9b0d5bd884
[F repo sqlite schema changes] don't rollback on potentially expected schema changes failure
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2617
diff
changeset
|
454 |
rollback_on_failure=False) |
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:
0
diff
changeset
|
455 |
self.info('added column %s to table %s', table, column) |
0 | 456 |
except Exception, ex: |
457 |
# the column probably already exists. this occurs when |
|
458 |
# the entity's type has just been added or if the column |
|
459 |
# has not been previously dropped |
|
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:
0
diff
changeset
|
460 |
self.error('error while altering table %s: %s', table, ex) |
0 | 461 |
if extra_unique_index or entity.indexed: |
462 |
try: |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
463 |
syssource.create_index(session, table, column, |
0 | 464 |
unique=extra_unique_index) |
465 |
except Exception, ex: |
|
466 |
self.error('error while creating index for %s.%s: %s', |
|
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:
0
diff
changeset
|
467 |
table, column, ex) |
3526
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
468 |
# final relations are not infered, propagate |
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:
4722
diff
changeset
|
469 |
schema = session.vreg.schema |
3531
c095f5f54873
[migration] take care to entity being added
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3526
diff
changeset
|
470 |
try: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
471 |
eschema = schema.eschema(rdefdef.subject) |
3531
c095f5f54873
[migration] take care to entity being added
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3526
diff
changeset
|
472 |
except KeyError: |
c095f5f54873
[migration] take care to entity being added
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3526
diff
changeset
|
473 |
return # entity type currently being added |
3543
ed152fe5aa8b
[migration] when adding a new attribute with a default value, set this value on existing entities (test and fix)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3531
diff
changeset
|
474 |
# propagate attribute to children classes |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
475 |
rschema = schema.rschema(rdefdef.name) |
3550
f9bdcfeb12ee
[migration] fix bug when propagating newly inserted relation type to children classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3546
diff
changeset
|
476 |
# if relation type has been inserted in the same transaction, its final |
f9bdcfeb12ee
[migration] fix bug when propagating newly inserted relation type to children classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3546
diff
changeset
|
477 |
# attribute is still set to False, so we've to ensure it's False |
f9bdcfeb12ee
[migration] fix bug when propagating newly inserted relation type to children classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3546
diff
changeset
|
478 |
rschema.final = True |
6076
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
479 |
insert_rdef_on_subclasses(session, eschema, rschema, rdefdef, props) |
3543
ed152fe5aa8b
[migration] when adding a new attribute with a default value, set this value on existing entities (test and fix)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3531
diff
changeset
|
480 |
# set default value, using sql for performance and to avoid |
ed152fe5aa8b
[migration] when adding a new attribute with a default value, set this value on existing entities (test and fix)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3531
diff
changeset
|
481 |
# modification_date update |
ed152fe5aa8b
[migration] when adding a new attribute with a default value, set this value on existing entities (test and fix)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3531
diff
changeset
|
482 |
if default: |
ed152fe5aa8b
[migration] when adding a new attribute with a default value, set this value on existing entities (test and fix)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3531
diff
changeset
|
483 |
session.system_sql('UPDATE %s SET %s=%%(default)s' % (table, column), |
ed152fe5aa8b
[migration] when adding a new attribute with a default value, set this value on existing entities (test and fix)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3531
diff
changeset
|
484 |
{'default': default}) |
0 | 485 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
486 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
487 |
# revert changes on in memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
488 |
self.session.vreg.schema.del_relation_def( |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
489 |
self.rdefdef.subject, self.rdefdef.name, self.rdefdef.object) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
490 |
# XXX revert changes on database |
0 | 491 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
492 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
493 |
class CWRelationAddOp(CWAttributeAddOp): |
0 | 494 |
"""an actual relation has been added: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
495 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
496 |
* add the relation definition to the instance's schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
497 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
498 |
* if this is an inlined relation, add the necessary column else if it's the |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
499 |
first instance of this relation type, add the necessary table and set |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
500 |
default permissions |
0 | 501 |
|
502 |
constraints are handled by specific hooks |
|
503 |
""" |
|
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
504 |
entity = None # make pylint happy |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
505 |
|
0 | 506 |
def precommit_event(self): |
507 |
session = self.session |
|
508 |
entity = self.entity |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
509 |
# update the in-memory schema first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
510 |
rdefdef = self.init_rdef(composite=entity.composite) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
511 |
# then make necessary changes to the system source database |
2902
dd9f2dd02f85
remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2899
diff
changeset
|
512 |
schema = session.vreg.schema |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
513 |
rtype = rdefdef.name |
4722
9c13d5db03d9
pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
514 |
rschema = schema.rschema(rtype) |
0 | 515 |
# this have to be done before permissions setting |
516 |
if rschema.inlined: |
|
517 |
# need to add a column if the relation is inlined and if this is the |
|
518 |
# first occurence of "Subject relation Something" whatever Something |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
519 |
if len(rschema.objects(rdefdef.subject)) == 1: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
520 |
add_inline_relation_column(session, rdefdef.subject, rtype) |
6076
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
521 |
eschema = schema[rdefdef.subject] |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
522 |
insert_rdef_on_subclasses(session, eschema, rschema, rdefdef, |
aa7402e998a1
[migration] when some inlined relation definition is added to an entity type which has some specialized types, it should be propagated to those types else they may miss the necessary table column to store the relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6002
diff
changeset
|
523 |
{'composite': entity.composite}) |
0 | 524 |
else: |
6163
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
525 |
if rschema.symmetric: |
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
526 |
# for symmetric relations, rdefs will store relation definitions |
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
527 |
# in both ways (i.e. (subj -> obj) and (obj -> subj)) |
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
528 |
relation_already_defined = len(rschema.rdefs) > 2 |
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
529 |
else: |
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
530 |
relation_already_defined = len(rschema.rdefs) > 1 |
0 | 531 |
# need to create the relation if no relation definition in the |
532 |
# schema and if it has not been added during other event of the same |
|
533 |
# transaction |
|
6163
407f54345687
[migration] fix add_relation_type() for symmetric relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6097
diff
changeset
|
534 |
if not (relation_already_defined or |
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
535 |
rtype in session.transaction_data.get('createdtables', ())): |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
536 |
rschema = schema.rschema(rtype) |
0 | 537 |
# create the necessary table |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
538 |
for sql in y2sql.rschema2sql(rschema).split(';'): |
0 | 539 |
if sql.strip(): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
540 |
session.system_sql(sql) |
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
541 |
session.transaction_data.setdefault('createdtables', []).append( |
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
542 |
rtype) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
543 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
544 |
# XXX revertprecommit_event |
0 | 545 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
546 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
547 |
class RDefDelOp(MemSchemaOperation): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
548 |
"""an actual relation has been removed""" |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
549 |
rdef = None # make pylint happy |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
550 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
551 |
def precommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
552 |
session = self.session |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
553 |
rdef = self.rdef |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
554 |
rschema = rdef.rtype |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
555 |
# make necessary changes to the system source database first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
556 |
rdeftype = rschema.final and 'CWAttribute' or 'CWRelation' |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
557 |
execute = session.execute |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
558 |
rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R,' |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
559 |
'R eid %%(x)s' % rdeftype, {'x': rschema.eid}) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
560 |
lastrel = rset[0][0] == 0 |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
561 |
# we have to update physical schema systematically for final and inlined |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
562 |
# relations, but only if it's the last instance for this relation type |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
563 |
# for other relations |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
564 |
if (rschema.final or rschema.inlined): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
565 |
rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R, ' |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
566 |
'R eid %%(r)s, X from_entity E, E eid %%(e)s' |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
567 |
% rdeftype, |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
568 |
{'r': rschema.eid, 'e': rdef.subject.eid}) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
569 |
if rset[0][0] == 0 and not session.deleted_in_transaction(rdef.subject.eid): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
570 |
ptypes = session.transaction_data.setdefault('pendingrtypes', set()) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
571 |
ptypes.add(rschema.type) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
572 |
DropColumn(session, table=SQL_PREFIX + str(rdef.subject), |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
573 |
column=SQL_PREFIX + str(rschema)) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
574 |
elif lastrel: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
575 |
DropRelationTable(session, str(rschema)) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
576 |
# then update the in-memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
577 |
rschema.del_relation_def(rdef.subject, rdef.object) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
578 |
# if this is the last relation definition of this type, drop associated |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
579 |
# relation type |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
580 |
if lastrel and not session.deleted_in_transaction(rschema.eid): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
581 |
execute('DELETE CWRType X WHERE X eid %(x)s', {'x': rschema.eid}) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
582 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
583 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
584 |
# revert changes on in memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
585 |
# |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
586 |
# Note: add_relation_def takes a RelationDefinition, not a |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
587 |
# RelationDefinitionSchema, needs to fake it |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
588 |
self.rdef.name = str(self.rdef.rtype) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
589 |
self.session.vreg.schema.add_relation_def(self.rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
590 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
591 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
592 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
593 |
class RDefUpdateOp(MemSchemaOperation): |
0 | 594 |
"""actually update some properties of a relation definition""" |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
595 |
rschema = rdefkey = values = None # make pylint happy |
6002
0ce7052ce30b
[schema sync] if something went wrong while getting rdef in precommit event, rdef adttribute won't be set in revertprecommit. We don't want to fail in such case
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5891
diff
changeset
|
596 |
rdef = oldvalues = None |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
597 |
indexed_changed = null_allowed_changed = False |
0 | 598 |
|
599 |
def precommit_event(self): |
|
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
600 |
session = self.session |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
601 |
rdef = self.rdef = self.rschema.rdefs[self.rdefkey] |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
602 |
# update the in-memory schema first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
603 |
self.oldvalues = dict( (attr, getattr(rdef, attr)) for attr in self.values) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
604 |
rdef.update(self.values) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
605 |
# then make necessary changes to the system source database |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
606 |
syssource = session.pool.source('system') |
0 | 607 |
if 'indexed' in self.values: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
608 |
syssource.update_rdef_indexed(session, rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
609 |
self.indexed_changed = True |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
610 |
if 'cardinality' in self.values and (rdef.rtype.final or |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
611 |
rdef.rtype.inlined) \ |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
612 |
and self.values['cardinality'][0] != self.oldvalues['cardinality'][0]: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
613 |
syssource.update_rdef_null_allowed(self.session, rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
614 |
self.null_allowed_changed = True |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
615 |
if 'fulltextindexed' in self.values: |
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
616 |
UpdateFTIndexOp.get_instance(session).add_data(rdef.subject) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
617 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
618 |
def revertprecommit_event(self): |
6002
0ce7052ce30b
[schema sync] if something went wrong while getting rdef in precommit event, rdef adttribute won't be set in revertprecommit. We don't want to fail in such case
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5891
diff
changeset
|
619 |
if self.rdef is None: |
0ce7052ce30b
[schema sync] if something went wrong while getting rdef in precommit event, rdef adttribute won't be set in revertprecommit. We don't want to fail in such case
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5891
diff
changeset
|
620 |
return |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
621 |
# revert changes on in memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
622 |
self.rdef.update(self.oldvalues) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
623 |
# revert changes on database |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
624 |
syssource = self.session.pool.source('system') |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
625 |
if self.indexed_changed: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
626 |
syssource.update_rdef_indexed(self.session, self.rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
627 |
if self.null_allowed_changed: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
628 |
syssource.update_rdef_null_allowed(self.session, self.rdef) |
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:
0
diff
changeset
|
629 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
630 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
631 |
def _set_modifiable_constraints(rdef): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
632 |
# for proper in-place modification of in-memory schema: if rdef.constraints |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
633 |
# is already a list, reuse it (we're updating multiple constraints of the |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
634 |
# same rdef in the same transactions) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
635 |
if not isinstance(rdef.constraints, list): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
636 |
rdef.constraints = list(rdef.constraints) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
637 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
638 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
639 |
class CWConstraintDelOp(MemSchemaOperation): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
640 |
"""actually remove a constraint of a relation definition""" |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
641 |
rdef = oldcstr = newcstr = None # make pylint happy |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
642 |
size_cstr_changed = unique_changed = False |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
643 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
644 |
def precommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
645 |
session = self.session |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
646 |
rdef = self.rdef |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
647 |
# in-place modification of in-memory schema first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
648 |
_set_modifiable_constraints(rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
649 |
rdef.constraints.remove(self.oldcstr) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
650 |
# then update database: alter the physical schema on size/unique |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
651 |
# constraint changes |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
652 |
syssource = session.pool.source('system') |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
653 |
cstrtype = self.oldcstr.type() |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
654 |
if cstrtype == 'SizeConstraint': |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
655 |
syssource.update_rdef_column(session, rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
656 |
self.size_cstr_changed = True |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
657 |
elif cstrtype == 'UniqueConstraint': |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
658 |
syssource.update_rdef_unique(session, rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
659 |
self.unique_changed = True |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
660 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
661 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
662 |
# revert changes on in memory schema |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
663 |
if self.newcstr is not None: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
664 |
self.rdef.constraints.remove(self.newcstr) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
665 |
if self.oldcstr is not None: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
666 |
self.rdef.constraints.append(self.oldcstr) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
667 |
# revert changes on database |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
668 |
syssource = self.session.pool.source('system') |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
669 |
if self.size_cstr_changed: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
670 |
syssource.update_rdef_column(self.session, self.rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
671 |
if self.unique_changed: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
672 |
syssource.update_rdef_unique(self.session, self.rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
673 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
674 |
|
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
675 |
class CWConstraintAddOp(CWConstraintDelOp): |
0 | 676 |
"""actually update constraint of a relation definition""" |
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
677 |
entity = None # make pylint happy |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
678 |
|
0 | 679 |
def precommit_event(self): |
680 |
session = self.session |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
681 |
rdefentity = self.entity.reverse_constrained_by[0] |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
682 |
# when the relation is added in the same transaction, the constraint |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
683 |
# object is created by the operation adding the attribute or relation, |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
684 |
# so there is nothing to do here |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
685 |
if session.added_in_transaction(rdefentity.eid): |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
686 |
return |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
687 |
rdef = self.rdef = session.vreg.schema.schema_by_eid(rdefentity.eid) |
0 | 688 |
cstrtype = self.entity.type |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
689 |
oldcstr = self.oldcstr = rdef.constraint_by_type(cstrtype) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
690 |
newcstr = self.newcstr = CONSTRAINTS[cstrtype].deserialize(self.entity.value) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
691 |
# in-place modification of in-memory schema first |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
692 |
_set_modifiable_constraints(rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
693 |
newcstr.eid = self.entity.eid |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
694 |
if oldcstr is not None: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
695 |
rdef.constraints.remove(oldcstr) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
696 |
rdef.constraints.append(newcstr) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
697 |
# then update database: alter the physical schema on size/unique |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
698 |
# constraint changes |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
699 |
syssource = session.pool.source('system') |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
700 |
if cstrtype == 'SizeConstraint' and (oldcstr is None or |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
701 |
oldcstr.max != newcstr.max): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
702 |
syssource.update_rdef_column(session, rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
703 |
self.size_cstr_changed = True |
2697
a0c4bc933a1b
[schema hooks] rename variable, check unique constraint actually changed before creating the index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2680
diff
changeset
|
704 |
elif cstrtype == 'UniqueConstraint' and oldcstr is None: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
705 |
syssource.update_rdef_unique(session, rdef) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
706 |
self.unique_changed = True |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
707 |
|
6815
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
708 |
|
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
709 |
class CWUniqueTogetherConstraintAddOp(MemSchemaOperation): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
710 |
entity = None # make pylint happy |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
711 |
def precommit_event(self): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
712 |
session = self.session |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
713 |
prefix = SQL_PREFIX |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
714 |
table = '%s%s' % (prefix, self.entity.constraint_of[0].name) |
6815
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
715 |
cols = ['%s%s' % (prefix, r.name) for r in self.entity.relations] |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
716 |
dbhelper= session.pool.source('system').dbhelper |
6294
a1535abe6ab2
use new logilab.database interface for multicol indexes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6261
diff
changeset
|
717 |
sqls = dbhelper.sqls_create_multicol_unique_index(table, cols) |
a1535abe6ab2
use new logilab.database interface for multicol indexes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6261
diff
changeset
|
718 |
for sql in sqls: |
a1535abe6ab2
use new logilab.database interface for multicol indexes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6261
diff
changeset
|
719 |
session.system_sql(sql) |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
720 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
721 |
# XXX revertprecommit_event |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
722 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
723 |
def postcommit_event(self): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
724 |
eschema = self.session.vreg.schema.schema_by_eid(self.entity.constraint_of[0].eid) |
6815
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
725 |
attrs = [r.name for r in self.entity.relations] |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
726 |
eschema._unique_together.append(attrs) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
727 |
|
6815
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
728 |
|
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
729 |
class CWUniqueTogetherConstraintDelOp(MemSchemaOperation): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
730 |
entity = oldcstr = None # for pylint |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
731 |
cols = [] # for pylint |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
732 |
def precommit_event(self): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
733 |
session = self.session |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
734 |
prefix = SQL_PREFIX |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
735 |
table = '%s%s' % (prefix, self.entity.type) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
736 |
dbhelper= session.pool.source('system').dbhelper |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
737 |
cols = ['%s%s' % (prefix, c) for c in self.cols] |
6294
a1535abe6ab2
use new logilab.database interface for multicol indexes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6261
diff
changeset
|
738 |
sqls = dbhelper.sqls_drop_multicol_unique_index(table, cols) |
a1535abe6ab2
use new logilab.database interface for multicol indexes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6261
diff
changeset
|
739 |
for sql in sqls: |
a1535abe6ab2
use new logilab.database interface for multicol indexes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6261
diff
changeset
|
740 |
session.system_sql(sql) |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
741 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
742 |
# XXX revertprecommit_event |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
743 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
744 |
def postcommit_event(self): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
745 |
eschema = self.session.vreg.schema.schema_by_eid(self.entity.eid) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
746 |
cols = set(self.cols) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
747 |
unique_together = [ut for ut in eschema._unique_together |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
748 |
if set(ut) != cols] |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
749 |
eschema._unique_together = unique_together |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
750 |
|
6815
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
751 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
752 |
# operations for in-memory schema synchronization ############################# |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
753 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
754 |
class MemSchemaCWETypeDel(MemSchemaOperation): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
755 |
"""actually remove the entity type from the instance's schema""" |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
756 |
def postcommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
757 |
# del_entity_type also removes entity's relations |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
758 |
self.session.vreg.schema.del_entity_type(self.etype) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
759 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
760 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
761 |
class MemSchemaCWRTypeAdd(MemSchemaOperation): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
762 |
"""actually add the relation type to the instance's schema""" |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
763 |
def precommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
764 |
self.session.vreg.schema.add_relation_type(self.rtypedef) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
765 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
766 |
def revertprecommit_event(self): |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
767 |
self.session.vreg.schema.del_relation_type(self.rtypedef.name) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
768 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
769 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
770 |
class MemSchemaCWRTypeDel(MemSchemaOperation): |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
771 |
"""actually remove the relation type from the instance's schema""" |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
772 |
def postcommit_event(self): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
773 |
try: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
774 |
self.session.vreg.schema.del_relation_type(self.rtype) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
775 |
except KeyError: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
776 |
# s/o entity type have already been deleted |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
777 |
pass |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
778 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
779 |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
780 |
class MemSchemaPermissionAdd(MemSchemaOperation): |
0 | 781 |
"""synchronize schema when a *_permission relation has been added on a group |
782 |
""" |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
783 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
784 |
def precommit_event(self): |
0 | 785 |
"""the observed connections pool has been commited""" |
786 |
try: |
|
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
787 |
erschema = self.session.vreg.schema.schema_by_eid(self.eid) |
0 | 788 |
except KeyError: |
789 |
# duh, schema not found, log error and skip operation |
|
4624
1b46d5ece0d5
turn default logging threshold to warning (we usually want them), and log 'no schema for eid' pb using warning instead of error, so we see them in logs but not during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4591
diff
changeset
|
790 |
self.warning('no schema for %s', self.eid) |
0 | 791 |
return |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
792 |
perms = list(erschema.action_permissions(self.action)) |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
793 |
if hasattr(self, 'group_eid'): |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
794 |
perm = self.session.entity_from_eid(self.group_eid).name |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
795 |
else: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
796 |
perm = erschema.rql_expression(self.expr) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
797 |
try: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
798 |
perms.index(perm) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
799 |
self.warning('%s already in permissions for %s on %s', |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
800 |
perm, self.action, erschema) |
0 | 801 |
except ValueError: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
802 |
perms.append(perm) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
803 |
erschema.set_action_permissions(self.action, perms) |
0 | 804 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
805 |
# XXX revertprecommit_event |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
806 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
807 |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
808 |
class MemSchemaPermissionDel(MemSchemaPermissionAdd): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
809 |
"""synchronize schema when a *_permission relation has been deleted from a |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
810 |
group |
0 | 811 |
""" |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
812 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
813 |
def precommit_event(self): |
0 | 814 |
"""the observed connections pool has been commited""" |
815 |
try: |
|
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
816 |
erschema = self.session.vreg.schema.schema_by_eid(self.eid) |
0 | 817 |
except KeyError: |
818 |
# duh, schema not found, log error and skip operation |
|
4624
1b46d5ece0d5
turn default logging threshold to warning (we usually want them), and log 'no schema for eid' pb using warning instead of error, so we see them in logs but not during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4591
diff
changeset
|
819 |
self.warning('no schema for %s', self.eid) |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
820 |
return |
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
821 |
if isinstance(erschema, RelationSchema): # XXX 3.6 migration |
0 | 822 |
return |
4570
ede247bbbf62
follow yams api change: attributes permissions are now defined for
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4467
diff
changeset
|
823 |
if isinstance(erschema, RelationDefinitionSchema) and \ |
ede247bbbf62
follow yams api change: attributes permissions are now defined for
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4467
diff
changeset
|
824 |
self.action in ('delete', 'add'): # XXX 3.6.1 migration |
ede247bbbf62
follow yams api change: attributes permissions are now defined for
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4467
diff
changeset
|
825 |
return |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
826 |
perms = list(erschema.action_permissions(self.action)) |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
827 |
if hasattr(self, 'group_eid'): |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
828 |
perm = self.session.entity_from_eid(self.group_eid).name |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
829 |
else: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
830 |
perm = erschema.rql_expression(self.expr) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
831 |
try: |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
832 |
perms.remove(perm) |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
833 |
erschema.set_action_permissions(self.action, perms) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
834 |
except ValueError: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
835 |
self.error('can\'t remove permission %s for %s on %s', |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
836 |
perm, self.action, erschema) |
0 | 837 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
838 |
# XXX revertprecommit_event |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
839 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
840 |
|
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
841 |
class MemSchemaSpecializesAdd(MemSchemaOperation): |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
842 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
843 |
def precommit_event(self): |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
844 |
eschema = self.session.vreg.schema.schema_by_eid(self.etypeeid) |
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
845 |
parenteschema = self.session.vreg.schema.schema_by_eid(self.parentetypeeid) |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
846 |
eschema._specialized_type = parenteschema.type |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
847 |
parenteschema._specialized_by.append(eschema.type) |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
848 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
849 |
# XXX revertprecommit_event |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
850 |
|
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
851 |
|
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
852 |
class MemSchemaSpecializesDel(MemSchemaOperation): |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
853 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
854 |
def precommit_event(self): |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
855 |
try: |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
856 |
eschema = self.session.vreg.schema.schema_by_eid(self.etypeeid) |
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
857 |
parenteschema = self.session.vreg.schema.schema_by_eid(self.parentetypeeid) |
2963
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
858 |
except KeyError: |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
859 |
# etype removed, nothing to do |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
860 |
return |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
861 |
eschema._specialized_type = None |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
862 |
parenteschema._specialized_by.remove(eschema.type) |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
863 |
|
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
864 |
# XXX revertprecommit_event |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
865 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
866 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
867 |
# CWEType hooks ################################################################ |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
868 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
869 |
class DelCWETypeHook(SyncSchemaHook): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
870 |
"""before deleting a CWEType entity: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
871 |
* check that we don't remove a core entity type |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
872 |
* cascade to delete related CWAttribute and CWRelation entities |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
873 |
* instantiate an operation to delete the entity type on commit |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
874 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
875 |
__regid__ = 'syncdelcwetype' |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
876 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWEType') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
877 |
events = ('before_delete_entity',) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
878 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
879 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
880 |
# final entities can't be deleted, don't care about that |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
881 |
name = self.entity.name |
6261
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
882 |
if name in CORE_TYPES: |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
883 |
raise ValidationError(self.entity.eid, {None: self._cw._('can\'t be deleted')}) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
884 |
# delete every entities of this type |
5558
afd1face1faf
[schema migration] make some stuff to ease file 1.9 migration : we want to kill the Image entity so that existing image are turned into (existing entity type) File entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
885 |
if not name in ETYPE_NAME_MAP: |
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
|
886 |
self._cw.execute('DELETE %s X' % name) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
887 |
MemSchemaCWETypeDel(self._cw, etype=name) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
888 |
DropTable(self._cw, table=SQL_PREFIX + name) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
889 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
890 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
891 |
class AfterDelCWETypeHook(DelCWETypeHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
892 |
__regid__ = 'wfcleanup' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
893 |
events = ('after_delete_entity',) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
894 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
895 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
896 |
# workflow cleanup |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
897 |
self._cw.execute('DELETE Workflow X WHERE NOT X workflow_of Y') |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
898 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
899 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
900 |
class AfterAddCWETypeHook(DelCWETypeHook): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
901 |
"""after adding a CWEType entity: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
902 |
* create the necessary table |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
903 |
* set creation_date and modification_date by creating the necessary |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
904 |
CWAttribute entities |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
905 |
* add owned_by relation by creating the necessary CWRelation entity |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
906 |
* register an operation to add the entity type to the instance's |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
907 |
schema on commit |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
908 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
909 |
__regid__ = 'syncaddcwetype' |
3402
434946bb5356
should be a after_add hook
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3400
diff
changeset
|
910 |
events = ('after_add_entity',) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
911 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
912 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
913 |
entity = self.entity |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
914 |
if entity.cw_edited.get('final'): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
915 |
return |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
916 |
CWETypeAddOp(self._cw, entity=entity) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
917 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
918 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
919 |
class BeforeUpdateCWETypeHook(DelCWETypeHook): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
920 |
"""check name change, handle final""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
921 |
__regid__ = 'syncupdatecwetype' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
922 |
events = ('before_update_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
923 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
924 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
925 |
entity = self.entity |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
926 |
check_valid_changes(self._cw, entity, ro_attrs=('final',)) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
927 |
# don't use getattr(entity, attr), we would get the modified value if any |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
928 |
if 'name' in entity.cw_edited: |
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
929 |
oldname, newname = entity.cw_edited.oldnewvalue('name') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
930 |
if newname.lower() != oldname.lower(): |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
931 |
CWETypeRenameOp(self._cw, oldname=oldname, newname=newname) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
932 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
933 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
934 |
# CWRType hooks ################################################################ |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
935 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
936 |
class DelCWRTypeHook(SyncSchemaHook): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
937 |
"""before deleting a CWRType entity: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
938 |
* check that we don't remove a core relation type |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
939 |
* cascade to delete related CWAttribute and CWRelation entities |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
940 |
* instantiate an operation to delete the relation type on commit |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
941 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
942 |
__regid__ = 'syncdelcwrtype' |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
943 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWRType') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
944 |
events = ('before_delete_entity',) |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
945 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
946 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
947 |
name = self.entity.name |
6261
82d3ac90e47c
[syncschema hooks] simplify core types definition be reusing schema sets (remove typos on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6208
diff
changeset
|
948 |
if name in CORE_TYPES: |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
949 |
raise ValidationError(self.entity.eid, {None: self._cw._('can\'t be deleted')}) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
950 |
# delete relation definitions using this relation type |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
951 |
self._cw.execute('DELETE CWAttribute X WHERE X relation_type Y, Y eid %(x)s', |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
952 |
{'x': self.entity.eid}) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
953 |
self._cw.execute('DELETE CWRelation X WHERE X relation_type Y, Y eid %(x)s', |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
954 |
{'x': self.entity.eid}) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
955 |
MemSchemaCWRTypeDel(self._cw, rtype=name) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
956 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
957 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
958 |
class AfterAddCWRTypeHook(DelCWRTypeHook): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
959 |
"""after a CWRType entity has been added: |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
960 |
* register an operation to add the relation type to the instance's |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
961 |
schema on commit |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
962 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
963 |
We don't know yet this point if a table is necessary |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
964 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
965 |
__regid__ = 'syncaddcwrtype' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
966 |
events = ('after_add_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
967 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
968 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
969 |
entity = self.entity |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
970 |
rtypedef = ybo.RelationType(name=entity.name, |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
971 |
description=entity.description, |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
972 |
inlined=entity.cw_edited.get('inlined', False), |
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
973 |
symmetric=entity.cw_edited.get('symmetric', False), |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
974 |
eid=entity.eid) |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
975 |
MemSchemaCWRTypeAdd(self._cw, rtypedef=rtypedef) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
976 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
977 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
978 |
class BeforeUpdateCWRTypeHook(DelCWRTypeHook): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
979 |
"""check name change, handle final""" |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
980 |
__regid__ = 'syncupdatecwrtype' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
981 |
events = ('before_update_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
982 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
983 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
984 |
entity = self.entity |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
985 |
check_valid_changes(self._cw, entity) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
986 |
newvalues = {} |
4827
8a505bf12193
[hook] use entity instead of values dict, check for edited_attributes on rtype change
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4826
diff
changeset
|
987 |
for prop in ('symmetric', 'inlined', 'fulltext_container'): |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
988 |
if prop in entity.cw_edited: |
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
989 |
old, new = entity.cw_edited.oldnewvalue(prop) |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
990 |
if old != new: |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
991 |
newvalues[prop] = new |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
992 |
if newvalues: |
4827
8a505bf12193
[hook] use entity instead of values dict, check for edited_attributes on rtype change
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4826
diff
changeset
|
993 |
rschema = self._cw.vreg.schema.rschema(entity.name) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
994 |
CWRTypeUpdateOp(self._cw, rschema=rschema, entity=entity, |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
995 |
values=newvalues) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
996 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
997 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
998 |
class AfterDelRelationTypeHook(SyncSchemaHook): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
999 |
"""before deleting a CWAttribute or CWRelation entity: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1000 |
* if this is a final or inlined relation definition, instantiate an |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1001 |
operation to drop necessary column, else if this is the last instance |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1002 |
of a non final relation, instantiate an operation to drop necessary |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1003 |
table |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1004 |
* instantiate an operation to delete the relation definition on commit |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1005 |
* delete the associated relation type when necessary |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1006 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1007 |
__regid__ = 'syncdelrelationtype' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1008 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('relation_type') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1009 |
events = ('after_delete_relation',) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1010 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1011 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1012 |
session = self._cw |
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
|
1013 |
try: |
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
|
1014 |
rdef = session.vreg.schema.schema_by_eid(self.eidfrom) |
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
|
1015 |
except KeyError: |
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
|
1016 |
self.critical('cant get schema rdef associated to %s', self.eidfrom) |
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
|
1017 |
return |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
1018 |
subjschema, rschema, objschema = rdef.as_triple() |
3589 | 1019 |
pendingrdefs = session.transaction_data.setdefault('pendingrdefs', set()) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1020 |
# first delete existing relation if necessary |
3720 | 1021 |
if rschema.final: |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1022 |
rdeftype = 'CWAttribute' |
3589 | 1023 |
pendingrdefs.add((subjschema, rschema)) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1024 |
else: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1025 |
rdeftype = 'CWRelation' |
3589 | 1026 |
pendingrdefs.add((subjschema, rschema, objschema)) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1027 |
if not (session.deleted_in_transaction(subjschema.eid) or |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1028 |
session.deleted_in_transaction(objschema.eid)): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1029 |
session.execute('DELETE X %s Y WHERE X is %s, Y is %s' |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1030 |
% (rschema, subjschema, objschema)) |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1031 |
RDefDelOp(session, rdef=rdef) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1032 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1033 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1034 |
# CWAttribute / CWRelation hooks ############################################### |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1035 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1036 |
class AfterAddCWAttributeHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1037 |
__regid__ = 'syncaddcwattribute' |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
1038 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWAttribute') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1039 |
events = ('after_add_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1040 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1041 |
def __call__(self): |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1042 |
CWAttributeAddOp(self._cw, entity=self.entity) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1043 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1044 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1045 |
class AfterAddCWRelationHook(AfterAddCWAttributeHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1046 |
__regid__ = 'syncaddcwrelation' |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
1047 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWRelation') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1048 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1049 |
def __call__(self): |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1050 |
CWRelationAddOp(self._cw, entity=self.entity) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1051 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1052 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1053 |
class AfterUpdateCWRDefHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1054 |
__regid__ = 'syncaddcwattribute' |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
1055 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWAttribute', |
5881
57387070f612
[selectors] use before-registry-reset event to init is_instance cache: cleaner code and avoid reloading bug (making hooks test fail for instance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
1056 |
'CWRelation') |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
1057 |
events = ('before_update_entity',) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1058 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1059 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1060 |
entity = self.entity |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1061 |
if self._cw.deleted_in_transaction(entity.eid): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1062 |
return |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1063 |
subjtype = entity.stype.name |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1064 |
objtype = entity.otype.name |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
1065 |
rschema = self._cw.vreg.schema[entity.rtype.name] |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1066 |
# note: do not access schema rdef here, it may be added later by an |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1067 |
# operation |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1068 |
newvalues = {} |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1069 |
for prop in RelationDefinitionSchema.rproperty_defs(objtype): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1070 |
if prop == 'constraints': |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1071 |
continue |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1072 |
if prop == 'order': |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1073 |
attr = 'ordernum' |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1074 |
else: |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1075 |
attr = prop |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
1076 |
if attr in entity.cw_edited: |
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6097
diff
changeset
|
1077 |
old, new = entity.cw_edited.oldnewvalue(attr) |
4839
f482dbdf2f8c
[schema hooks] properly check for changes of schema properties avoid useless costly operation (such as full-text reindexing all entities of a type). Refactor inlined handling and fix a bug trying to reindex a final entity type on the way.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4828
diff
changeset
|
1078 |
if old != new: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1079 |
newvalues[prop] = new |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1080 |
if newvalues: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1081 |
RDefUpdateOp(self._cw, rschema=rschema, rdefkey=(subjtype, objtype), |
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1082 |
values=newvalues) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1083 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1084 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1085 |
# constraints synchronization hooks ############################################ |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1086 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1087 |
class AfterAddCWConstraintHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1088 |
__regid__ = 'syncaddcwconstraint' |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
1089 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWConstraint') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1090 |
events = ('after_add_entity', 'after_update_entity') |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1091 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1092 |
def __call__(self): |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1093 |
CWConstraintAddOp(self._cw, entity=self.entity) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1094 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1095 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1096 |
class AfterAddConstrainedByHook(SyncSchemaHook): |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1097 |
__regid__ = 'syncaddconstrainedby' |
3403 | 1098 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('constrained_by') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1099 |
events = ('after_add_relation',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1100 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1101 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1102 |
if self._cw.added_in_transaction(self.eidfrom): |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1103 |
# used by get_constraints() which is called in CWAttributeAddOp |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1104 |
self._cw.transaction_data.setdefault(self.eidfrom, []).append(self.eidto) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1105 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1106 |
|
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1107 |
class BeforeDeleteConstrainedByHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1108 |
__regid__ = 'syncdelconstrainedby' |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1109 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('constrained_by') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1110 |
events = ('before_delete_relation',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1111 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1112 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1113 |
if self._cw.deleted_in_transaction(self.eidfrom): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1114 |
return |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
1115 |
schema = self._cw.vreg.schema |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1116 |
entity = self._cw.entity_from_eid(self.eidto) |
4052
0c39ffd789ed
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
1117 |
rdef = schema.schema_by_eid(self.eidfrom) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1118 |
try: |
4052
0c39ffd789ed
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
1119 |
cstr = rdef.constraint_by_type(entity.type) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1120 |
except IndexError: |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1121 |
self._cw.critical('constraint type no more accessible') |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1122 |
else: |
5891
99024ad59223
[schema migration] import refactoring to fix #1109558 and enhances things on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5881
diff
changeset
|
1123 |
CWConstraintDelOp(self._cw, rdef=rdef, oldcstr=cstr) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1124 |
|
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1125 |
# unique_together constraints |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1126 |
# XXX: use setoperations and before_add_relation here (on constraint_of and relations) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1127 |
class AfterAddCWUniqueTogetherConstraintHook(SyncSchemaHook): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1128 |
__regid__ = 'syncadd_cwuniquetogether_constraint' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1129 |
__select__ = SyncSchemaHook.__select__ & is_instance('CWUniqueTogetherConstraint') |
7021
fc7ac3409b0c
[schema sync] we don't want to react on after_update_entity, it may only causes bug. CWUniqueConstraint should be deleted then a fresh one readded on change (as we do in sync_schema_props_perms)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6954
diff
changeset
|
1130 |
events = ('after_add_entity',) |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1131 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1132 |
def __call__(self): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1133 |
CWUniqueTogetherConstraintAddOp(self._cw, entity=self.entity) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1134 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1135 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1136 |
class BeforeDeleteConstraintOfHook(SyncSchemaHook): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1137 |
__regid__ = 'syncdelconstraintof' |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1138 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('constraint_of') |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1139 |
events = ('before_delete_relation',) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1140 |
|
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1141 |
def __call__(self): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1142 |
if self._cw.deleted_in_transaction(self.eidto): |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1143 |
return |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1144 |
schema = self._cw.vreg.schema |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1145 |
cstr = self._cw.entity_from_eid(self.eidfrom) |
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1146 |
entity = schema.schema_by_eid(self.eidto) |
6815
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
1147 |
cols = [r.name for r in cstr.relations] |
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
1148 |
CWUniqueTogetherConstraintDelOp(self._cw, entity=entity, |
a84190d4e78c
[schema] fix pb with ambiguous relation used within UniqueTogetherConstraint by having CWUniqueTogetherConstraint.relation targeting CWRType instead of CWAttribute/CWRelation. This fixes 3.10.7 migration.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6789
diff
changeset
|
1149 |
oldcstr=cstr, cols=cols) |
6208
07b176640a8c
unique_together integration in CW (alf+syt)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6163
diff
changeset
|
1150 |
|
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1151 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1152 |
# permissions synchronization hooks ############################################ |
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1153 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1154 |
class AfterAddPermissionHook(SyncSchemaHook): |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1155 |
"""added entity/relation *_permission, need to update schema""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1156 |
__regid__ = 'syncaddperm' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1157 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype( |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1158 |
'read_permission', 'add_permission', 'delete_permission', |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1159 |
'update_permission') |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1160 |
events = ('after_add_relation',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1161 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1162 |
def __call__(self): |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1163 |
action = self.rtype.split('_', 1)[0] |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1164 |
if self._cw.describe(self.eidto)[0] == 'CWGroup': |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1165 |
MemSchemaPermissionAdd(self._cw, action=action, eid=self.eidfrom, |
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1166 |
group_eid=self.eidto) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1167 |
else: # RQLExpression |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1168 |
expr = self._cw.entity_from_eid(self.eidto).expression |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
1169 |
MemSchemaPermissionAdd(self._cw, action=action, eid=self.eidfrom, |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1170 |
expr=expr) |
2641
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1171 |
|
9c33d98a074e
R [schema hooks] big refactoring / reorganization for clearer code, a few fixes on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2624
diff
changeset
|
1172 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1173 |
class BeforeDelPermissionHook(AfterAddPermissionHook): |
0 | 1174 |
"""delete entity/relation *_permission, need to update schema |
1175 |
||
1176 |
skip the operation if the related type is being deleted |
|
1177 |
""" |
|
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1178 |
__regid__ = 'syncdelperm' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1179 |
events = ('before_delete_relation',) |
0 | 1180 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1181 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1182 |
if self._cw.deleted_in_transaction(self.eidfrom): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1183 |
return |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1184 |
action = self.rtype.split('_', 1)[0] |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1185 |
if self._cw.describe(self.eidto)[0] == 'CWGroup': |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1186 |
MemSchemaPermissionDel(self._cw, action=action, eid=self.eidfrom, |
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1187 |
group_eid=self.eidto) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1188 |
else: # RQLExpression |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1189 |
expr = self._cw.entity_from_eid(self.eidto).expression |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1190 |
MemSchemaPermissionDel(self._cw, action=action, eid=self.eidfrom, |
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1191 |
expr=expr) |
0 | 1192 |
|
1193 |
||
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1194 |
|
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1195 |
class UpdateFTIndexOp(hook.DataOperationMixIn, hook.SingleLastOperation): |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1196 |
"""operation to update full text indexation of entity whose schema change |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1197 |
|
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1198 |
We wait after the commit to as the schema in memory is only updated after |
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1199 |
the commit. |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1200 |
""" |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1201 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1202 |
def postcommit_event(self): |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1203 |
session = self.session |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1204 |
source = session.repo.system_source |
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1205 |
schema = session.repo.vreg.schema |
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1206 |
to_reindex = self.get_data() |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1207 |
self.info('%i etypes need full text indexed reindexation', |
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1208 |
len(to_reindex)) |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1209 |
for etype in to_reindex: |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1210 |
rset = session.execute('Any X WHERE X is %s' % etype) |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1211 |
self.info('Reindexing full text index for %i entity of type %s', |
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1212 |
len(rset), etype) |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1213 |
still_fti = list(schema[etype].indexable_attributes()) |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1214 |
for entity in rset.entities(): |
6889
37668bf302f5
improve massive deletion performance
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6815
diff
changeset
|
1215 |
source.fti_unindex_entities(session, [entity]) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
1216 |
for container in entity.cw_adapt_to('IFTIndexable').fti_containers(): |
4828
3e173d598cad
[cleanup] fti_* method already try/except exception, no need for additional catch here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4827
diff
changeset
|
1217 |
if still_fti or container is not entity: |
6889
37668bf302f5
improve massive deletion performance
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6815
diff
changeset
|
1218 |
source.fti_unindex_entities(session, [container]) |
37668bf302f5
improve massive deletion performance
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6815
diff
changeset
|
1219 |
source.fti_index_entities(session, [container]) |
6426
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1220 |
if to_reindex: |
541659c39f6a
[hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
1221 |
# Transaction has already been committed |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1222 |
session.pool.commit() |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1223 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1224 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1225 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1226 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1227 |
# specializes synchronization hooks ############################################ |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1228 |
|
0 | 1229 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1230 |
class AfterAddSpecializesHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1231 |
__regid__ = 'syncaddspecializes' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1232 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('specializes') |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1233 |
events = ('after_add_relation',) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1234 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1235 |
def __call__(self): |
3404
9cb6b0cc2a7c
fix some name errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3403
diff
changeset
|
1236 |
MemSchemaSpecializesAdd(self._cw, etypeeid=self.eidfrom, |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1237 |
parentetypeeid=self.eidto) |
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1238 |
|
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1239 |
|
3410
47832374cf14
fix class name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3404
diff
changeset
|
1240 |
class AfterDelSpecializesHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1241 |
__regid__ = 'syncdelspecializes' |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1242 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('specializes') |
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1243 |
events = ('after_delete_relation',) |
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1244 |
|
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1245 |
def __call__(self): |
3404
9cb6b0cc2a7c
fix some name errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3403
diff
changeset
|
1246 |
MemSchemaSpecializesDel(self._cw, etypeeid=self.eidfrom, |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1247 |
parentetypeeid=self.eidto) |