author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 13 Apr 2010 19:43:30 +0200 | |
changeset 5237 | 10dd0dd78778 |
parent 5174 | 78438ad513ca |
child 5423 | e15abfdcce38 |
permissions | -rw-r--r-- |
0 | 1 |
"""schema hooks: |
2 |
||
3 |
- synchronize the living schema object with the persistent schema |
|
4 |
- perform physical update on the source when necessary |
|
5 |
||
6 |
checking for schema consistency is done in hooks.py |
|
7 |
||
8 |
:organization: Logilab |
|
4212
ab6573088b4a
update copyright: welcome 2010
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4129
diff
changeset
|
9 |
:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
0 | 10 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
1981
e6eed4324357
fix #327301: synchronize_schema doesn't update not-null constraint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1802
diff
changeset
|
11 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
0 | 12 |
""" |
13 |
__docformat__ = "restructuredtext en" |
|
14 |
||
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
|
15 |
from copy import copy |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
16 |
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
|
17 |
from yams import buildobjs as ybo, schema2sql as y2sql |
0 | 18 |
|
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
|
19 |
from logilab.common.decorators import clear_cache |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
20 |
from logilab.common.testlib import mock_object |
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
|
21 |
|
4719
aaed3f813ef8
kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4667
diff
changeset
|
22 |
from cubicweb import ValidationError |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
23 |
from cubicweb.selectors import implements |
4394
b98fbca17e9e
missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
24 |
from cubicweb.schema import META_RTYPES, VIRTUAL_RTYPES, CONSTRAINTS, display_name |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
25 |
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
|
26 |
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
|
27 |
|
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
|
28 |
|
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
|
29 |
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
|
30 |
'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
|
31 |
'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
|
32 |
'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
|
33 |
'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
|
34 |
'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
|
35 |
'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
|
36 |
'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
|
37 |
'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
|
38 |
} |
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
|
39 |
|
0 | 40 |
# core entity and relation types which can't be removed |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
41 |
CORE_ETYPES = list(BASE_TYPES) + ['CWEType', 'CWRType', 'CWUser', 'CWGroup', |
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
42 |
'CWConstraint', 'CWAttribute', 'CWRelation'] |
2456
aa25d6b244c8
new cwuri metadata + a few tests fixes on the way
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2455
diff
changeset
|
43 |
CORE_RTYPES = ['eid', 'creation_date', 'modification_date', 'cwuri', |
0 | 44 |
'login', 'upassword', 'name', |
45 |
'is', 'instanceof', 'owned_by', 'created_by', 'in_group', |
|
46 |
'relation_type', 'from_entity', 'to_entity', |
|
47 |
'constrainted_by', |
|
48 |
'read_permission', 'add_permission', |
|
49 |
'delete_permission', 'updated_permission', |
|
50 |
] |
|
51 |
||
52 |
def get_constraints(session, entity): |
|
53 |
constraints = [] |
|
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
54 |
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
|
55 |
cstrent = session.entity_from_eid(cstreid) |
0 | 56 |
cstr = CONSTRAINTS[cstrent.type].deserialize(cstrent.value) |
57 |
cstr.eid = cstreid |
|
58 |
constraints.append(cstr) |
|
59 |
return constraints |
|
60 |
||
4043
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
61 |
def group_mapping(cw): |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
62 |
try: |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
63 |
return cw.transaction_data['groupmap'] |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
64 |
except KeyError: |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
65 |
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
|
66 |
return gmap |
39ae94e0c8b8
give group mapping where needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4042
diff
changeset
|
67 |
|
0 | 68 |
def add_inline_relation_column(session, etype, rtype): |
69 |
"""add necessary column and index for an inlined relation""" |
|
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
|
70 |
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
|
71 |
column = SQL_PREFIX + rtype |
0 | 72 |
try: |
73 |
session.system_sql(str('ALTER TABLE %s ADD COLUMN %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
|
74 |
% (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
|
75 |
session.info('added column %s to table %s', column, table) |
0 | 76 |
except: |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
77 |
# silent exception here, if this error has not been raised because the |
0 | 78 |
# 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
|
79 |
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
|
80 |
table, column) |
0 | 81 |
# create index before alter table which may expectingly fail during test |
82 |
# (sqlite) while index creation should never fail (test for index existence |
|
83 |
# 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
|
84 |
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
|
85 |
session.info('added index on %s(%s)', table, column) |
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
86 |
session.transaction_data.setdefault('createdattrs', []).append( |
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
87 |
'%s.%s' % (etype, rtype)) |
0 | 88 |
|
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
89 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
90 |
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
|
91 |
errors = {} |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
92 |
# don't use getattr(entity, attr), we would get the modified value if any |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
93 |
for attr in entity.edited_attributes: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
94 |
if attr in ro_attrs: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
95 |
newval = entity.pop(attr) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
96 |
origval = getattr(entity, attr) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
97 |
if newval != origval: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
98 |
errors[attr] = session._("can't change the %s attribute") % \ |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
99 |
display_name(session, attr) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
100 |
entity[attr] = newval |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
101 |
if errors: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
102 |
raise ValidationError(entity.eid, errors) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
103 |
|
0 | 104 |
|
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
|
105 |
# 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
|
106 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
107 |
class DropTable(hook.Operation): |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2462
diff
changeset
|
108 |
"""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
|
109 |
table = None # make pylint happy |
0 | 110 |
def precommit_event(self): |
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
111 |
dropped = self.session.transaction_data.setdefault('droppedtables', |
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
112 |
set()) |
0 | 113 |
if self.table in dropped: |
114 |
return # already processed |
|
115 |
dropped.add(self.table) |
|
116 |
self.session.system_sql('DROP TABLE %s' % self.table) |
|
117 |
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
|
118 |
|
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
|
119 |
|
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
|
120 |
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
|
121 |
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
|
122 |
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
|
123 |
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
|
124 |
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
|
125 |
|
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
|
126 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
127 |
class DropColumn(hook.Operation): |
0 | 128 |
"""actually remove the attribut's column from entity table in the system |
129 |
database |
|
130 |
""" |
|
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
131 |
table = column = None # make pylint happy |
0 | 132 |
def precommit_event(self): |
133 |
session, table, column = self.session, self.table, self.column |
|
134 |
# drop index if any |
|
135 |
session.pool.source('system').drop_index(session, table, column) |
|
136 |
try: |
|
137 |
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
|
138 |
% (table, column), rollback_on_failure=False) |
0 | 139 |
self.info('dropped column %s from table %s', column, table) |
140 |
except Exception, ex: |
|
141 |
# not supported by sqlite for instance |
|
142 |
self.error('error while altering table %s: %s', table, ex) |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
143 |
|
0 | 144 |
|
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
|
145 |
# base operations for in-memory schema synchronization ######################## |
0 | 146 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
147 |
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
|
148 |
"""the update schema operation: |
0 | 149 |
|
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
|
150 |
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
|
151 |
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
|
152 |
schema changes. |
0 | 153 |
""" |
154 |
||
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
|
155 |
def __init__(self, session): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
156 |
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
|
157 |
|
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
|
158 |
def precommit_event(self): |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
159 |
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
|
160 |
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
|
161 |
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
|
162 |
|
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
|
163 |
def commit_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
|
164 |
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
|
165 |
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
|
166 |
# 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
|
167 |
# 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
|
168 |
try: |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
169 |
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
|
170 |
# 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
|
171 |
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
|
172 |
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
|
173 |
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
|
174 |
except: |
47acae3cb778
don't let set_schema making commit_event fail
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
175 |
self.critical('error while setting schmea', exc_info=True) |
0 | 176 |
|
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
|
177 |
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
|
178 |
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
|
179 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
180 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
181 |
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
|
182 |
"""base class for schema operations""" |
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
|
183 |
def __init__(self, session, kobj=None, **kwargs): |
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
|
184 |
self.kobj = kobj |
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
|
185 |
# once Operation.__init__ has been called, event may be triggered, so |
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
|
186 |
# do this last ! |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
187 |
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
|
188 |
# 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
|
189 |
MemSchemaNotifyChanges(session) |
0 | 190 |
|
4927
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
191 |
def prepare_constraints(self, rdef): |
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
192 |
# if constraints is already a list, reuse it (we're updating multiple |
4948 | 193 |
# constraints of the same rdef in the same transactions) |
4927
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
194 |
if not isinstance(rdef.constraints, list): |
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
195 |
rdef.constraints = list(rdef.constraints) |
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
196 |
self.constraints = rdef.constraints |
0 | 197 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
198 |
|
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
|
199 |
class MemSchemaEarlyOperation(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
|
200 |
def insert_index(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
|
201 |
"""schema operation which are inserted at the begining of the queue |
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 |
(typically to add/remove entity or relation types) |
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
|
203 |
""" |
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 |
i = -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
|
205 |
for i, op in enumerate(self.session.pending_operations): |
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
|
206 |
if not isinstance(op, MemSchemaEarlyOperation): |
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
|
207 |
return i |
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
|
208 |
return i + 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
|
209 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
210 |
|
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
|
211 |
# 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
|
212 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
213 |
class SourceDbCWETypeRename(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
|
214 |
"""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
|
215 |
oldname = newname = None # make pylint happy |
0 | 216 |
|
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
|
217 |
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
|
218 |
# 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
|
219 |
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
|
220 |
sqlexec('ALTER TABLE %s%s RENAME TO %s%s' % (SQL_PREFIX, self.oldname, |
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
|
221 |
SQL_PREFIX, self.newname)) |
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
|
222 |
self.info('renamed table %s to %s', self.oldname, self.newname) |
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
|
223 |
sqlexec('UPDATE entities SET type=%s WHERE type=%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
|
224 |
(self.newname, self.oldname)) |
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
|
225 |
sqlexec('UPDATE deleted_entities SET type=%s WHERE type=%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
|
226 |
(self.newname, self.oldname)) |
0 | 227 |
|
228 |
||
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
229 |
class SourceDbCWRTypeUpdate(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
|
230 |
"""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
|
231 |
rschema = entity = values = None # make pylint happy |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
232 |
|
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
|
233 |
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
|
234 |
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
|
235 |
if rschema.final: |
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
|
236 |
return |
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
|
237 |
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
|
238 |
if 'fulltext_container' in self.values: |
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
|
239 |
ftiupdates = session.transaction_data.setdefault( |
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
|
240 |
'fti_update_etypes', set()) |
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
|
241 |
for subjtype, objtype in rschema.rdefs: |
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
|
242 |
ftiupdates.add(subjtype) |
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
|
243 |
ftiupdates.add(objtype) |
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
|
244 |
UpdateFTIndexOp(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
|
245 |
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
|
246 |
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
|
247 |
inlined = self.values['inlined'] |
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
|
248 |
# check in-lining is necessary / possible |
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
|
249 |
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
|
250 |
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
|
251 |
# 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
|
252 |
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
|
253 |
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
|
254 |
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
|
255 |
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
|
256 |
# 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
|
257 |
# 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
|
258 |
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
|
259 |
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
|
260 |
# 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
|
261 |
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
|
262 |
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
|
263 |
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
|
264 |
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
|
265 |
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
|
266 |
# 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
|
267 |
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
|
268 |
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
|
269 |
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
|
270 |
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
|
271 |
% (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
|
272 |
# drop existant columns |
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
|
273 |
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
|
274 |
DropColumn(session, 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
|
275 |
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
|
276 |
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
|
277 |
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
|
278 |
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
|
279 |
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
|
280 |
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
|
281 |
# 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
|
282 |
# entity's type has just been added or if the column has not |
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
|
283 |
# been previously dropped |
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
|
284 |
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
|
285 |
# 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
|
286 |
# 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
|
287 |
#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
|
288 |
# '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
|
289 |
# '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
|
290 |
# % 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
|
291 |
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
|
292 |
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
|
293 |
'%(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
|
294 |
'%(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
|
295 |
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
|
296 |
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
|
297 |
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
|
298 |
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
|
299 |
% (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
|
300 |
# 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
|
301 |
DropRelationTable(session, rtype) |
0 | 302 |
|
303 |
||
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
304 |
class SourceDbCWAttributeAdd(hook.Operation): |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
305 |
"""an attribute relation (CWAttribute) has been added: |
0 | 306 |
* add the necessary column |
307 |
* set default on this column if any and possible |
|
308 |
* 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
|
309 |
instance's schema on commit |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
310 |
|
0 | 311 |
constraints are handled by specific hooks |
312 |
""" |
|
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
313 |
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
|
314 |
|
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 init_rdef(self, **kwargs): |
0 | 316 |
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
|
317 |
fromentity = entity.stype |
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
|
318 |
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
|
319 |
'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
|
320 |
'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
|
321 |
{'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
|
322 |
'order': entity.ordernum or 0}) |
2624 | 323 |
subj = str(fromentity.name) |
324 |
rtype = entity.rtype.name |
|
2599
79bd12769c55
[R schema hooks] use new accessors on CWRelation and CWAttribute entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
325 |
obj = str(entity.otype.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
|
326 |
constraints = get_constraints(self.session, entity) |
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
|
327 |
rdef = ybo.RelationDefinition(subj, rtype, obj, |
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
|
328 |
description=entity.description, |
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
|
329 |
cardinality=entity.cardinality, |
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
|
330 |
constraints=constraints, |
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
|
331 |
order=entity.ordernum, |
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
|
332 |
eid=entity.eid, |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
333 |
**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
|
334 |
MemSchemaRDefAdd(self.session, rdef) |
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 |
return rdef |
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 |
|
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 |
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
|
338 |
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
|
339 |
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
|
340 |
# 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
|
341 |
# value |
0 | 342 |
default = entity.defaultval |
343 |
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
|
344 |
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
|
345 |
props = {'default': default, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
346 |
'indexed': entity.indexed, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
347 |
'fulltextindexed': entity.fulltextindexed, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
348 |
'internationalizable': entity.internationalizable} |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
349 |
rdef = self.init_rdef(**props) |
0 | 350 |
sysource = 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
|
351 |
attrtype = y2sql.type_from_constraints( |
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
|
352 |
sysource.dbhelper, rdef.object, rdef.constraints) |
0 | 353 |
# XXX should be moved somehow into lgc.adbh: sqlite doesn't support to |
354 |
# add a new column with UNIQUE, it should be added after the ALTER TABLE |
|
355 |
# using ADD INDEX |
|
356 |
if sysource.dbdriver == 'sqlite' and 'UNIQUE' in attrtype: |
|
357 |
extra_unique_index = True |
|
358 |
attrtype = attrtype.replace(' UNIQUE', '') |
|
359 |
else: |
|
360 |
extra_unique_index = False |
|
361 |
# added some str() wrapping query since some backend (eg psycopg) don't |
|
362 |
# allow unicode queries |
|
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
|
363 |
table = SQL_PREFIX + rdef.subject |
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 |
column = SQL_PREFIX + rdef.name |
0 | 365 |
try: |
366 |
session.system_sql(str('ALTER TABLE %s ADD COLUMN %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
|
367 |
% (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
|
368 |
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
|
369 |
self.info('added column %s to table %s', table, column) |
0 | 370 |
except Exception, ex: |
371 |
# the column probably already exists. this occurs when |
|
372 |
# the entity's type has just been added or if the column |
|
373 |
# 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
|
374 |
self.error('error while altering table %s: %s', table, ex) |
0 | 375 |
if extra_unique_index or entity.indexed: |
376 |
try: |
|
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
|
377 |
sysource.create_index(session, table, column, |
0 | 378 |
unique=extra_unique_index) |
379 |
except Exception, ex: |
|
380 |
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
|
381 |
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
|
382 |
# 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
|
383 |
schema = session.vreg.schema |
3531
c095f5f54873
[migration] take care to entity being added
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3526
diff
changeset
|
384 |
try: |
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
|
385 |
eschema = schema.eschema(rdef.subject) |
3531
c095f5f54873
[migration] take care to entity being added
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3526
diff
changeset
|
386 |
except KeyError: |
c095f5f54873
[migration] take care to entity being added
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3526
diff
changeset
|
387 |
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
|
388 |
# propagate attribute to children classes |
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
|
389 |
rschema = schema.rschema(rdef.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
|
390 |
# 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
|
391 |
# 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
|
392 |
rschema.final = True |
f9bdcfeb12ee
[migration] fix bug when propagating newly inserted relation type to children classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3546
diff
changeset
|
393 |
# XXX 'infered': True/False, not clear actually |
3526
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
394 |
props.update({'constraints': rdef.constraints, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
395 |
'description': rdef.description, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
396 |
'cardinality': rdef.cardinality, |
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
397 |
'constraints': rdef.constraints, |
4054
03c9a539d282
fix infered rdef propagation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4052
diff
changeset
|
398 |
'permissions': rdef.get_permissions(), |
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
|
399 |
'order': rdef.order, |
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
|
400 |
'infered': False, 'eid': None |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
401 |
}) |
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
|
402 |
cstrtypemap = ss.cstrtype_mapping(session) |
4054
03c9a539d282
fix infered rdef propagation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4052
diff
changeset
|
403 |
groupmap = group_mapping(session) |
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
|
404 |
object = schema.eschema(rdef.object) |
3526
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
405 |
for specialization in eschema.specialized_by(False): |
4054
03c9a539d282
fix infered rdef propagation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4052
diff
changeset
|
406 |
if (specialization, rdef.object) in rschema.rdefs: |
3526
dfb2ebb765e2
[migration]Â fix addition of attribute to a parent class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2967
diff
changeset
|
407 |
continue |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
408 |
sperdef = RelationDefinitionSchema(specialization, rschema, |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
409 |
object, props) |
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
|
410 |
ss.execschemarql(session.execute, sperdef, |
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
|
411 |
ss.rdef2rql(sperdef, cstrtypemap, groupmap)) |
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
|
412 |
# 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
|
413 |
# 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
|
414 |
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
|
415 |
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
|
416 |
{'default': default}) |
0 | 417 |
|
418 |
||
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
|
419 |
class SourceDbCWRelationAdd(SourceDbCWAttributeAdd): |
0 | 420 |
"""an actual relation has been added: |
421 |
* if this is an inlined relation, add the necessary column |
|
422 |
else if it's the first instance of this relation type, add the |
|
423 |
necessary table and set default permissions |
|
424 |
* 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
|
425 |
instance's schema on commit |
0 | 426 |
|
427 |
constraints are handled by specific hooks |
|
428 |
""" |
|
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
429 |
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
|
430 |
|
0 | 431 |
def precommit_event(self): |
432 |
session = self.session |
|
433 |
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
|
434 |
rdef = self.init_rdef(composite=entity.composite) |
2902
dd9f2dd02f85
remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2899
diff
changeset
|
435 |
schema = session.vreg.schema |
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
|
436 |
rtype = rdef.name |
4722
9c13d5db03d9
pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
437 |
rschema = schema.rschema(rtype) |
0 | 438 |
# this have to be done before permissions setting |
439 |
if rschema.inlined: |
|
440 |
# need to add a column if the relation is inlined and if this is the |
|
441 |
# first occurence of "Subject relation Something" whatever Something |
|
442 |
# and if it has not been added during other event of the same |
|
443 |
# transaction |
|
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
|
444 |
key = '%s.%s' % (rdef.subject, rtype) |
0 | 445 |
try: |
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
|
446 |
alreadythere = bool(rschema.objects(rdef.subject)) |
0 | 447 |
except KeyError: |
448 |
alreadythere = False |
|
449 |
if not (alreadythere or |
|
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
450 |
key in session.transaction_data.get('createdattrs', ())): |
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
|
451 |
add_inline_relation_column(session, rdef.subject, rtype) |
0 | 452 |
else: |
453 |
# need to create the relation if no relation definition in the |
|
454 |
# schema and if it has not been added during other event of the same |
|
455 |
# transaction |
|
456 |
if not (rschema.subjects() or |
|
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
457 |
rtype in session.transaction_data.get('createdtables', ())): |
0 | 458 |
try: |
4722
9c13d5db03d9
pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
459 |
rschema = schema.rschema(rtype) |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
460 |
tablesql = y2sql.rschema2sql(rschema) |
0 | 461 |
except KeyError: |
462 |
# fake we add it to the schema now to get a correctly |
|
463 |
# initialized schema but remove it before doing anything |
|
464 |
# more dangerous... |
|
4722
9c13d5db03d9
pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
465 |
rschema = schema.add_relation_type(rdef) |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
466 |
tablesql = y2sql.rschema2sql(rschema) |
4722
9c13d5db03d9
pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
467 |
schema.del_relation_type(rtype) |
0 | 468 |
# create the necessary table |
469 |
for sql in tablesql.split(';'): |
|
470 |
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
|
471 |
session.system_sql(sql) |
2101
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
472 |
session.transaction_data.setdefault('createdtables', []).append( |
08003e0354a7
update transaction data api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2056
diff
changeset
|
473 |
rtype) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
474 |
|
0 | 475 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
476 |
class SourceDbRDefUpdate(hook.Operation): |
0 | 477 |
"""actually update some properties of a relation definition""" |
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
478 |
rschema = values = None # make pylint happy |
0 | 479 |
|
480 |
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
|
481 |
session = self.session |
2019
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
482 |
etype = self.kobj[0] |
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
483 |
table = SQL_PREFIX + etype |
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
484 |
column = SQL_PREFIX + self.rschema.type |
0 | 485 |
if 'indexed' in self.values: |
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
486 |
sysource = session.pool.source('system') |
0 | 487 |
if self.values['indexed']: |
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
488 |
sysource.create_index(session, table, column) |
0 | 489 |
else: |
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
490 |
sysource.drop_index(session, table, column) |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3550
diff
changeset
|
491 |
if 'cardinality' in self.values and self.rschema.final: |
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
492 |
adbh = session.pool.source('system').dbhelper |
2019
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
493 |
if not adbh.alter_column_support: |
1981
e6eed4324357
fix #327301: synchronize_schema doesn't update not-null constraint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1802
diff
changeset
|
494 |
# not supported (and NOT NULL not set by yams in that case, so |
e6eed4324357
fix #327301: synchronize_schema doesn't update not-null constraint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1802
diff
changeset
|
495 |
# no worry) |
e6eed4324357
fix #327301: synchronize_schema doesn't update not-null constraint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1802
diff
changeset
|
496 |
return |
2019
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
497 |
atype = self.rschema.objects(etype)[0] |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
498 |
constraints = self.rschema.rdef(etype, atype).constraints |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
499 |
coltype = y2sql.type_from_constraints(adbh, atype, constraints, |
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
|
500 |
creating=False) |
2056 | 501 |
# XXX check self.values['cardinality'][0] actually changed? |
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
|
502 |
notnull = self.values['cardinality'][0] != '1' |
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
|
503 |
sql = adbh.sql_set_null_allowed(table, column, coltype, notnull) |
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
504 |
session.system_sql(sql) |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
505 |
if 'fulltextindexed' in self.values: |
4807
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
506 |
UpdateFTIndexOp(session) |
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
507 |
session.transaction_data.setdefault( |
5642bfa43236
[cleanup] add index_entity to abstract source, add docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4806
diff
changeset
|
508 |
'fti_update_etypes', set()).add(etype) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
509 |
|
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
|
510 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
511 |
class SourceDbCWConstraintAdd(hook.Operation): |
0 | 512 |
"""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
|
513 |
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
|
514 |
cancelled = False |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
515 |
|
0 | 516 |
def precommit_event(self): |
517 |
rdef = self.entity.reverse_constrained_by[0] |
|
518 |
session = 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
|
519 |
# 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
|
520 |
# 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
|
521 |
# so there is nothing to do here |
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
|
522 |
if session.added_in_transaction(rdef.eid): |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
523 |
return |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
524 |
rdefschema = session.vreg.schema.schema_by_eid(rdef.eid) |
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
525 |
subjtype, rtype, objtype = rdefschema.as_triple() |
0 | 526 |
cstrtype = self.entity.type |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
527 |
oldcstr = rtype.rdef(subjtype, objtype).constraint_by_type(cstrtype) |
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
|
528 |
newcstr = CONSTRAINTS[cstrtype].deserialize(self.entity.value) |
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
|
529 |
table = SQL_PREFIX + str(subjtype) |
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
|
530 |
column = SQL_PREFIX + str(rtype) |
0 | 531 |
# alter the physical schema on size constraint changes |
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
|
532 |
if newcstr.type() == 'SizeConstraint' and ( |
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
|
533 |
oldcstr is None or oldcstr.max != newcstr.max): |
2019
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
534 |
adbh = self.session.pool.source('system').dbhelper |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
535 |
card = rtype.rdef(subjtype, objtype).cardinality |
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
|
536 |
coltype = y2sql.type_from_constraints(adbh, objtype, [newcstr], |
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
|
537 |
creating=False) |
2019
399a930e10ef
#343488: SQL error in migration script (depends on a new release of yams and lgc)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2011
diff
changeset
|
538 |
sql = adbh.sql_change_col_type(table, column, coltype, card != '1') |
0 | 539 |
try: |
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
|
540 |
session.system_sql(sql, rollback_on_failure=False) |
0 | 541 |
self.info('altered column %s of table %s: now VARCHAR(%s)', |
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
|
542 |
column, table, newcstr.max) |
0 | 543 |
except Exception, ex: |
544 |
# not supported by sqlite for instance |
|
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
|
545 |
self.error('error while altering table %s: %s', table, ex) |
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
|
546 |
elif cstrtype == 'UniqueConstraint' and oldcstr is None: |
0 | 547 |
session.pool.source('system').create_index( |
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
|
548 |
self.session, table, column, unique=True) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
549 |
|
0 | 550 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
551 |
class SourceDbCWConstraintDel(hook.Operation): |
0 | 552 |
"""actually remove a constraint of a relation definition""" |
4928
cbca73dc9753
[cleanup] objtype not used
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4927
diff
changeset
|
553 |
rtype = subjtype = None # make pylint happy |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
554 |
|
0 | 555 |
def precommit_event(self): |
556 |
cstrtype = self.cstr.type() |
|
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
|
557 |
table = SQL_PREFIX + str(self.subjtype) |
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
|
558 |
column = SQL_PREFIX + str(self.rtype) |
0 | 559 |
# alter the physical schema on size/unique constraint changes |
560 |
if cstrtype == 'SizeConstraint': |
|
561 |
try: |
|
562 |
self.session.system_sql('ALTER TABLE %s ALTER COLUMN %s TYPE TEXT' |
|
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
|
563 |
% (table, column), |
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
|
564 |
rollback_on_failure=False) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
565 |
self.info('altered column %s of table %s: now TEXT', |
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
|
566 |
column, table) |
0 | 567 |
except Exception, ex: |
568 |
# not supported by sqlite for instance |
|
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
|
569 |
self.error('error while altering table %s: %s', table, ex) |
0 | 570 |
elif cstrtype == 'UniqueConstraint': |
571 |
self.session.pool.source('system').drop_index( |
|
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
|
572 |
self.session, table, column, unique=True) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
573 |
|
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
|
574 |
|
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
|
575 |
# 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
|
576 |
|
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
|
577 |
class MemSchemaCWETypeAdd(MemSchemaEarlyOperation): |
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
|
578 |
"""actually add the entity type to the instance's 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
|
579 |
eid = None # make pylint happy |
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
|
580 |
def commit_event(self): |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
581 |
self.session.vreg.schema.add_entity_type(self.kobj) |
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
|
582 |
|
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
|
583 |
|
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
|
584 |
class MemSchemaCWETypeRename(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
|
585 |
"""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
|
586 |
oldname = newname = None # make pylint happy |
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
|
587 |
|
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
|
588 |
def commit_event(self): |
2902
dd9f2dd02f85
remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2899
diff
changeset
|
589 |
self.session.vreg.schema.rename_entity_type(self.oldname, self.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
|
590 |
|
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
|
591 |
|
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
|
592 |
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
|
593 |
"""actually remove the entity type from the instance's 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
|
594 |
def commit_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
|
595 |
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
|
596 |
# del_entity_type also removes entity's relations |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
597 |
self.session.vreg.schema.del_entity_type(self.kobj) |
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
|
598 |
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
|
599 |
# 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
|
600 |
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
|
601 |
|
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
|
602 |
|
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
|
603 |
class MemSchemaCWRTypeAdd(MemSchemaEarlyOperation): |
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
|
604 |
"""actually add the relation type to the instance's 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
|
605 |
eid = None # make pylint happy |
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
|
606 |
def commit_event(self): |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
607 |
self.session.vreg.schema.add_relation_type(self.kobj) |
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
|
608 |
|
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
|
609 |
|
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
|
610 |
class MemSchemaCWRTypeUpdate(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
|
611 |
"""actually update some properties of a relation definition""" |
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
|
612 |
rschema = values = None # make pylint happy |
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
|
613 |
|
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
|
614 |
def commit_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
|
615 |
# structure should be clean, not need to remove entity's relations |
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
|
616 |
# at this point |
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
|
617 |
self.rschema.__dict__.update(self.values) |
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
|
618 |
|
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
|
619 |
|
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
|
620 |
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
|
621 |
"""actually remove the relation type from the instance's 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
|
622 |
def commit_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
|
623 |
try: |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
624 |
self.session.vreg.schema.del_relation_type(self.kobj) |
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
|
625 |
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
|
626 |
# 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
|
627 |
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
|
628 |
|
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
|
629 |
|
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
|
630 |
class MemSchemaRDefAdd(MemSchemaEarlyOperation): |
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
|
631 |
"""actually add the attribute relation definition 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
|
632 |
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
|
633 |
""" |
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
|
634 |
def commit_event(self): |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
635 |
self.session.vreg.schema.add_relation_def(self.kobj) |
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
|
636 |
|
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
|
637 |
|
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
|
638 |
class MemSchemaRDefUpdate(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
|
639 |
"""actually update some properties of a relation definition""" |
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
|
640 |
rschema = values = None # make pylint happy |
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
|
641 |
|
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
|
642 |
def commit_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
|
643 |
# structure should be clean, not need to remove entity's relations |
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
|
644 |
# at this point |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
645 |
self.rschema.rdefs[self.kobj].update(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
|
646 |
|
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
|
647 |
|
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
|
648 |
class MemSchemaRDefDel(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
|
649 |
"""actually remove the relation definition from the instance's 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
|
650 |
def commit_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
|
651 |
subjtype, rtype, objtype = self.kobj |
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
|
652 |
try: |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
653 |
self.session.vreg.schema.del_relation_def(subjtype, rtype, objtype) |
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
|
654 |
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
|
655 |
# relation type may have been already 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
|
656 |
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
|
657 |
|
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
|
658 |
|
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
|
659 |
class MemSchemaCWConstraintAdd(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
|
660 |
"""actually update constraint of a relation definition |
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
|
661 |
|
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
|
662 |
has to be called before SourceDbCWConstraintAdd |
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
|
663 |
""" |
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
|
664 |
cancelled = False |
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
|
665 |
|
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
|
666 |
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
|
667 |
rdef = self.entity.reverse_constrained_by[0] |
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
|
668 |
# 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
|
669 |
# 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
|
670 |
# so there is nothing to do here |
2883
57ff19806026
fix name error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2882
diff
changeset
|
671 |
if self.session.added_in_transaction(rdef.eid): |
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
|
672 |
self.cancelled = True |
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
|
673 |
return |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
674 |
rdef = self.session.vreg.schema.schema_by_eid(rdef.eid) |
4927
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
675 |
self.prepare_constraints(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
|
676 |
cstrtype = self.entity.type |
4948 | 677 |
self.cstr = rdef.constraint_by_type(cstrtype) |
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
|
678 |
self.newcstr = CONSTRAINTS[cstrtype].deserialize(self.entity.value) |
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
|
679 |
self.newcstr.eid = self.entity.eid |
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
|
680 |
|
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
|
681 |
def commit_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
|
682 |
if self.cancelled: |
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 |
return |
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 |
# in-place modification |
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
|
685 |
if not self.cstr is None: |
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
|
686 |
self.constraints.remove(self.cstr) |
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
|
687 |
self.constraints.append(self.newcstr) |
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
|
688 |
|
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
|
689 |
|
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
|
690 |
class MemSchemaCWConstraintDel(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
|
691 |
"""actually remove a constraint of a relation definition |
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
|
692 |
|
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
|
693 |
has to be called before SourceDbCWConstraintDel |
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
|
694 |
""" |
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
|
695 |
rtype = subjtype = objtype = None # make pylint happy |
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
|
696 |
def precommit_event(self): |
4927
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
697 |
self.prepare_constraints(self.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
|
698 |
|
0 | 699 |
def commit_event(self): |
700 |
self.constraints.remove(self.cstr) |
|
701 |
||
702 |
||
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
703 |
class MemSchemaPermissionAdd(MemSchemaOperation): |
0 | 704 |
"""synchronize schema when a *_permission relation has been added on a group |
705 |
""" |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
706 |
|
0 | 707 |
def commit_event(self): |
708 |
"""the observed connections pool has been commited""" |
|
709 |
try: |
|
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
710 |
erschema = self.session.vreg.schema.schema_by_eid(self.eid) |
0 | 711 |
except KeyError: |
712 |
# 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
|
713 |
self.warning('no schema for %s', self.eid) |
0 | 714 |
return |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
715 |
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
|
716 |
if hasattr(self, 'group_eid'): |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
717 |
perm = self.session.entity_from_eid(self.group_eid).name |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
718 |
else: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
719 |
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
|
720 |
try: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
721 |
perms.index(perm) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
722 |
self.warning('%s already in permissions for %s on %s', |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
723 |
perm, self.action, erschema) |
0 | 724 |
except ValueError: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
725 |
perms.append(perm) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
726 |
erschema.set_action_permissions(self.action, perms) |
0 | 727 |
|
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
|
728 |
|
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
729 |
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
|
730 |
"""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
|
731 |
group |
0 | 732 |
""" |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
733 |
|
0 | 734 |
def commit_event(self): |
735 |
"""the observed connections pool has been commited""" |
|
736 |
try: |
|
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
737 |
erschema = self.session.vreg.schema.schema_by_eid(self.eid) |
0 | 738 |
except KeyError: |
739 |
# 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
|
740 |
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
|
741 |
return |
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
742 |
if isinstance(erschema, RelationSchema): # XXX 3.6 migration |
0 | 743 |
return |
4570
ede247bbbf62
follow yams api change: attributes permissions are now defined for
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4467
diff
changeset
|
744 |
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
|
745 |
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
|
746 |
return |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
747 |
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
|
748 |
if hasattr(self, 'group_eid'): |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
749 |
perm = self.session.entity_from_eid(self.group_eid).name |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
750 |
else: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
751 |
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
|
752 |
try: |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
753 |
perms.remove(perm) |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
754 |
erschema.set_action_permissions(self.action, perms) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
755 |
except ValueError: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3870
diff
changeset
|
756 |
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
|
757 |
perm, self.action, erschema) |
0 | 758 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1398
diff
changeset
|
759 |
|
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
|
760 |
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
|
761 |
|
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
762 |
def commit_event(self): |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
763 |
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
|
764 |
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
|
765 |
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
|
766 |
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
|
767 |
|
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
768 |
|
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
769 |
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
|
770 |
|
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
771 |
def commit_event(self): |
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
772 |
try: |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
773 |
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
|
774 |
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
|
775 |
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
|
776 |
# 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
|
777 |
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
|
778 |
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
|
779 |
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
|
780 |
|
12ad88615a12
test and fix migration introducing base classes (w/ regard to yams inheritance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
781 |
|
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
|
782 |
class SyncSchemaHook(hook.Hook): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
783 |
__abstract__ = True |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
784 |
category = 'syncschema' |
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
|
785 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
786 |
|
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
|
787 |
# 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
|
788 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
789 |
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
|
790 |
"""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
|
791 |
* 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
|
792 |
* 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
|
793 |
* 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
|
794 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
795 |
__regid__ = 'syncdelcwetype' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
796 |
__select__ = SyncSchemaHook.__select__ & implements('CWEType') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
797 |
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
|
798 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
799 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
800 |
# 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
|
801 |
name = self.entity.name |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
802 |
if name in CORE_ETYPES: |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
803 |
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
|
804 |
# delete every entities of this type |
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4829
diff
changeset
|
805 |
self._cw.execute('DELETE %s X' % name) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
806 |
DropTable(self._cw, table=SQL_PREFIX + name) |
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
807 |
MemSchemaCWETypeDel(self._cw, 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
|
808 |
|
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 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
810 |
class AfterDelCWETypeHook(DelCWETypeHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
811 |
__regid__ = 'wfcleanup' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
812 |
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
|
813 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
814 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
815 |
# workflow cleanup |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
816 |
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
|
817 |
|
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
|
818 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
819 |
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
|
820 |
"""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
|
821 |
* 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
|
822 |
* 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
|
823 |
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
|
824 |
* 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
|
825 |
* 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
|
826 |
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
|
827 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
828 |
__regid__ = 'syncaddcwetype' |
3402
434946bb5356
should be a after_add hook
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3400
diff
changeset
|
829 |
events = ('after_add_entity',) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
830 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
831 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
832 |
entity = self.entity |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
833 |
if entity.get('final'): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
834 |
return |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
835 |
schema = self._cw.vreg.schema |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
836 |
name = entity['name'] |
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
|
837 |
etype = ybo.EntityType(name=name, description=entity.get('description'), |
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
|
838 |
meta=entity.get('meta')) # don't care about final |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
839 |
# fake we add it to the schema now to get a correctly initialized schema |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
840 |
# but remove it before doing anything more dangerous... |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
841 |
schema = self._cw.vreg.schema |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
842 |
eschema = schema.add_entity_type(etype) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
843 |
# generate table sql and rql to add metadata |
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
|
844 |
tablesql = y2sql.eschema2sql(self._cw.pool.source('system').dbhelper, |
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
|
845 |
eschema, prefix=SQL_PREFIX) |
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
|
846 |
rdefrqls = [] |
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
|
847 |
gmap = group_mapping(self._cw) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
848 |
cmap = ss.cstrtype_mapping(self._cw) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
849 |
for rtype in (META_RTYPES - VIRTUAL_RTYPES): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
850 |
rschema = schema[rtype] |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
851 |
sampletype = rschema.subjects()[0] |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
852 |
desttype = rschema.objects()[0] |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
853 |
rdef = copy(rschema.rdef(sampletype, desttype)) |
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
|
854 |
rdef.subject = mock_object(eid=entity.eid) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
855 |
mock = mock_object(eid=None) |
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
856 |
rdefrqls.append( (mock, tuple(ss.rdef2rql(rdef, cmap, gmap))) ) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
857 |
# now remove it ! |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
858 |
schema.del_entity_type(name) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
859 |
# create the necessary table |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
860 |
for sql in tablesql.split(';'): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
861 |
if sql.strip(): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
862 |
self._cw.system_sql(sql) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
863 |
# register operation to modify the schema on commit |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
864 |
# this have to be done before adding other relations definitions |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
865 |
# or permission settings |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
866 |
etype.eid = entity.eid |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
867 |
MemSchemaCWETypeAdd(self._cw, etype) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
868 |
# add meta relations |
4763
81b0df087375
schema serialization optimization by using eids instead of type names. Heavy refactoring/cleanup on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4722
diff
changeset
|
869 |
for rdef, relrqls in rdefrqls: |
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
|
870 |
ss.execschemarql(self._cw.execute, rdef, relrqls) |
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
|
871 |
|
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 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
873 |
class BeforeUpdateCWETypeHook(DelCWETypeHook): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
874 |
"""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
|
875 |
__regid__ = 'syncupdatecwetype' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
876 |
events = ('before_update_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
877 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
878 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
879 |
entity = self.entity |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
880 |
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
|
881 |
# don't use getattr(entity, attr), we would get the modified value if any |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
882 |
if 'name' in entity.edited_attributes: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
883 |
newname = entity.pop('name') |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
884 |
oldname = entity.name |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
885 |
if newname.lower() != oldname.lower(): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
886 |
SourceDbCWETypeRename(self._cw, oldname=oldname, newname=newname) |
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
887 |
MemSchemaCWETypeRename(self._cw, oldname=oldname, newname=newname) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
888 |
entity['name'] = 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
|
889 |
|
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
|
890 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
891 |
# 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
|
892 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
893 |
class DelCWRTypeHook(SyncSchemaHook): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
894 |
"""before deleting a CWRType entity: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
895 |
* 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
|
896 |
* cascade to delete related CWAttribute and CWRelation entities |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
897 |
* 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
|
898 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
899 |
__regid__ = 'syncdelcwrtype' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
900 |
__select__ = SyncSchemaHook.__select__ & implements('CWRType') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
901 |
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
|
902 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
903 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
904 |
name = self.entity.name |
3431
6944a92c16f2
move hooks test to the hooks package, update them to work with a minimal schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3410
diff
changeset
|
905 |
if name in CORE_RTYPES: |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
906 |
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
|
907 |
# 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
|
908 |
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
|
909 |
{'x': self.entity.eid}) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
910 |
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
|
911 |
{'x': self.entity.eid}) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
912 |
MemSchemaCWRTypeDel(self._cw, 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
|
913 |
|
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
|
914 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
915 |
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
|
916 |
"""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
|
917 |
* 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
|
918 |
schema on commit |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
919 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
920 |
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
|
921 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
922 |
__regid__ = 'syncaddcwrtype' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
923 |
events = ('after_add_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
924 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
925 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
926 |
entity = self.entity |
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
|
927 |
rtype = ybo.RelationType(name=entity.name, |
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
|
928 |
description=entity.get('description'), |
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
|
929 |
meta=entity.get('meta', False), |
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
|
930 |
inlined=entity.get('inlined', False), |
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
|
931 |
symmetric=entity.get('symmetric', False), |
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
|
932 |
eid=entity.eid) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
933 |
MemSchemaCWRTypeAdd(self._cw, 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
|
934 |
|
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
|
935 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
936 |
class BeforeUpdateCWRTypeHook(DelCWRTypeHook): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
937 |
"""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
|
938 |
__regid__ = 'syncupdatecwrtype' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
939 |
events = ('before_update_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
940 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
941 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
942 |
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
|
943 |
check_valid_changes(self._cw, entity) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
944 |
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
|
945 |
for prop in ('symmetric', 'inlined', 'fulltext_container'): |
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
|
946 |
if prop in entity.edited_attributes: |
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
|
947 |
old, new = hook.entity_oldnewvalue(entity, prop) |
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
|
948 |
if old != new: |
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
|
949 |
newvalues[prop] = entity[prop] |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
950 |
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
|
951 |
rschema = self._cw.vreg.schema.rschema(entity.name) |
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
|
952 |
SourceDbCWRTypeUpdate(self._cw, rschema=rschema, entity=entity, |
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
|
953 |
values=newvalues) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
954 |
MemSchemaCWRTypeUpdate(self._cw, rschema=rschema, values=newvalues) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
955 |
|
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 |
|
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
|
957 |
class AfterDelRelationTypeHook(SyncSchemaHook): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
958 |
"""before deleting a CWAttribute or CWRelation entity: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
959 |
* 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
|
960 |
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
|
961 |
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
|
962 |
table |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
963 |
* 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
|
964 |
* delete the associated relation type when necessary |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
965 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
966 |
__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
|
967 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('relation_type') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
968 |
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
|
969 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
970 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
971 |
session = self._cw |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
972 |
rdef = session.vreg.schema.schema_by_eid(self.eidfrom) |
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
973 |
subjschema, rschema, objschema = rdef.as_triple() |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
974 |
pendings = session.transaction_data.get('pendingeids', ()) |
3589 | 975 |
pendingrdefs = session.transaction_data.setdefault('pendingrdefs', set()) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
976 |
# first delete existing relation if necessary |
3720 | 977 |
if rschema.final: |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
978 |
rdeftype = 'CWAttribute' |
3589 | 979 |
pendingrdefs.add((subjschema, rschema)) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
980 |
else: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
981 |
rdeftype = 'CWRelation' |
3589 | 982 |
pendingrdefs.add((subjschema, rschema, objschema)) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
983 |
if not (subjschema.eid in pendings or objschema.eid in pendings): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
984 |
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
|
985 |
% (rschema, subjschema, objschema)) |
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4829
diff
changeset
|
986 |
execute = session.execute |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
987 |
rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R,' |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
988 |
'R eid %%(x)s' % rdeftype, {'x': self.eidto}) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
989 |
lastrel = rset[0][0] == 0 |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
990 |
# we have to update physical schema systematically for final and inlined |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
991 |
# relations, but only if it's the last instance for this relation type |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
992 |
# for other relations |
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
|
993 |
|
3720 | 994 |
if (rschema.final or rschema.inlined): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
995 |
rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R, ' |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
996 |
'R eid %%(x)s, X from_entity E, E name %%(name)s' |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
997 |
% rdeftype, {'x': self.eidto, 'name': str(subjschema)}) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
998 |
if rset[0][0] == 0 and not subjschema.eid in pendings: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
999 |
ptypes = session.transaction_data.setdefault('pendingrtypes', set()) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1000 |
ptypes.add(rschema.type) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1001 |
DropColumn(session, table=SQL_PREFIX + subjschema.type, |
4011
394f853bb653
[migration] write migration instructions for permissions handling on relation definition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4003
diff
changeset
|
1002 |
column=SQL_PREFIX + rschema.type) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1003 |
elif lastrel: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1004 |
DropRelationTable(session, rschema.type) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1005 |
# if this is the last instance, drop associated relation type |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
1006 |
if lastrel and not self.eidto in pendings: |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4951
diff
changeset
|
1007 |
execute('DELETE CWRType X WHERE X eid %(x)s', {'x': self.eidto}) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1008 |
MemSchemaRDefDel(session, (subjschema, rschema, objschema)) |
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
|
1009 |
|
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 |
|
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
|
1011 |
# 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
|
1012 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2835
diff
changeset
|
1013 |
class AfterAddCWAttributeHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1014 |
__regid__ = 'syncaddcwattribute' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
1015 |
__select__ = SyncSchemaHook.__select__ & implements('CWAttribute') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1016 |
events = ('after_add_entity',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1017 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1018 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1019 |
SourceDbCWAttributeAdd(self._cw, entity=self.entity) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1020 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1021 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1022 |
class AfterAddCWRelationHook(AfterAddCWAttributeHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1023 |
__regid__ = 'syncaddcwrelation' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
1024 |
__select__ = SyncSchemaHook.__select__ & implements('CWRelation') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1025 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1026 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1027 |
SourceDbCWRelationAdd(self._cw, entity=self.entity) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1028 |
|
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
|
1029 |
|
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
|
1030 |
class AfterUpdateCWRDefHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1031 |
__regid__ = 'syncaddcwattribute' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
1032 |
__select__ = SyncSchemaHook.__select__ & implements('CWAttribute', |
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
|
1033 |
'CWRelation') |
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
|
1034 |
events = ('before_update_entity',) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1035 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1036 |
def __call__(self): |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1037 |
entity = self.entity |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1038 |
if self._cw.deleted_in_transaction(entity.eid): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1039 |
return |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1040 |
desttype = entity.otype.name |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
1041 |
rschema = self._cw.vreg.schema[entity.rtype.name] |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1042 |
newvalues = {} |
4042
f85a4c846aad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4011
diff
changeset
|
1043 |
for prop in RelationDefinitionSchema.rproperty_defs(desttype): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1044 |
if prop == 'constraints': |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1045 |
continue |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1046 |
if prop == 'order': |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1047 |
prop = 'ordernum' |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1048 |
if prop in entity.edited_attributes: |
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
|
1049 |
old, new = hook.entity_oldnewvalue(entity, prop) |
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
|
1050 |
if old != new: |
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
|
1051 |
newvalues[prop] = entity[prop] |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1052 |
if newvalues: |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1053 |
subjtype = entity.stype.name |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1054 |
MemSchemaRDefUpdate(self._cw, kobj=(subjtype, desttype), |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1055 |
rschema=rschema, values=newvalues) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1056 |
SourceDbRDefUpdate(self._cw, kobj=(subjtype, desttype), |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1057 |
rschema=rschema, values=newvalues) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1058 |
|
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
|
1059 |
|
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
|
1060 |
# 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
|
1061 |
|
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
|
1062 |
class AfterAddCWConstraintHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1063 |
__regid__ = 'syncaddcwconstraint' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4054
diff
changeset
|
1064 |
__select__ = SyncSchemaHook.__select__ & implements('CWConstraint') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1065 |
events = ('after_add_entity', 'after_update_entity') |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1066 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1067 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1068 |
MemSchemaCWConstraintAdd(self._cw, entity=self.entity) |
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1069 |
SourceDbCWConstraintAdd(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
|
1070 |
|
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
|
1071 |
|
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
|
1072 |
class AfterAddConstrainedByHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1073 |
__regid__ = 'syncdelconstrainedby' |
3403 | 1074 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype('constrained_by') |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1075 |
events = ('after_add_relation',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1076 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1077 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1078 |
if self._cw.added_in_transaction(self.eidfrom): |
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1079 |
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
|
1080 |
|
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
|
1081 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1082 |
class BeforeDeleteConstrainedByHook(AfterAddConstrainedByHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1083 |
__regid__ = 'syncdelconstrainedby' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1084 |
events = ('before_delete_relation',) |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1085 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1086 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1087 |
if self._cw.deleted_in_transaction(self.eidfrom): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1088 |
return |
3400
93fc0070673a
access to schema through vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
1089 |
schema = self._cw.vreg.schema |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1090 |
entity = self._cw.entity_from_eid(self.eidto) |
4052
0c39ffd789ed
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
1091 |
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
|
1092 |
try: |
4052
0c39ffd789ed
yams api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4043
diff
changeset
|
1093 |
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
|
1094 |
except IndexError: |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1095 |
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
|
1096 |
else: |
4927
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
1097 |
SourceDbCWConstraintDel(self._cw, cstr=cstr, |
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
1098 |
subjtype=rdef.subject, rtype=rdef.rtype) |
19fd1952ad63
[schema sync] test and fix bug when updating multiple constraint for the same rdef in the same transaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4839
diff
changeset
|
1099 |
MemSchemaCWConstraintDel(self._cw, rdef=rdef, cstr=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
|
1100 |
|
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
|
1101 |
|
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
|
1102 |
# 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
|
1103 |
|
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
|
1104 |
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
|
1105 |
"""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
|
1106 |
__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
|
1107 |
__select__ = SyncSchemaHook.__select__ & hook.match_rtype( |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1108 |
'read_permission', 'add_permission', 'delete_permission', |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1109 |
'update_permission') |
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1110 |
events = ('after_add_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): |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1113 |
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
|
1114 |
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
|
1115 |
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
|
1116 |
group_eid=self.eidto) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1117 |
else: # RQLExpression |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1118 |
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
|
1119 |
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
|
1120 |
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
|
1121 |
|
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 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1123 |
class BeforeDelPermissionHook(AfterAddPermissionHook): |
0 | 1124 |
"""delete entity/relation *_permission, need to update schema |
1125 |
||
1126 |
skip the operation if the related type is being deleted |
|
1127 |
""" |
|
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1128 |
__regid__ = 'syncdelperm' |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1129 |
events = ('before_delete_relation',) |
0 | 1130 |
|
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1131 |
def __call__(self): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1132 |
if self._cw.deleted_in_transaction(self.eidfrom): |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1133 |
return |
3890
d7a270f50f54
backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1134 |
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
|
1135 |
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
|
1136 |
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
|
1137 |
group_eid=self.eidto) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1138 |
else: # RQLExpression |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
1139 |
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
|
1140 |
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
|
1141 |
expr=expr) |
0 | 1142 |
|
1143 |
||
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1144 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1145 |
class UpdateFTIndexOp(hook.SingleLastOperation): |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1146 |
"""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
|
1147 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1148 |
We wait after the commit to as the schema in memory is only updated after the commit. |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1149 |
""" |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1150 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1151 |
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
|
1152 |
session = self.session |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1153 |
source = session.repo.system_source |
4721
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1154 |
to_reindex = session.transaction_data.get('fti_update_etypes', ()) |
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1155 |
self.info('%i etypes need full text indexed reindexation', |
8f63691ccb7f
pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
1156 |
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
|
1157 |
schema = self.session.repo.vreg.schema |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1158 |
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
|
1159 |
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
|
1160 |
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
|
1161 |
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
|
1162 |
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
|
1163 |
for entity in rset.entities(): |
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
|
1164 |
source.fti_unindex_entity(session, entity.eid) |
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
|
1165 |
for container in entity.fti_containers(): |
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
|
1166 |
if still_fti or container is not entity: |
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
|
1167 |
source.fti_unindex_entity(session, entity.eid) |
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
|
1168 |
source.fti_index_entity(session, container) |
4667
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1169 |
if len(to_reindex): |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1170 |
# Transaction have already been committed |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1171 |
session.pool.commit() |
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1172 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1173 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1174 |
|
6c8eccb1b695
[fix] Apply fulltextindexed change in the actual index
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4624
diff
changeset
|
1175 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1176 |
# specializes synchronization hooks ############################################ |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1177 |
|
0 | 1178 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1179 |
class AfterAddSpecializesHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1180 |
__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
|
1181 |
__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
|
1182 |
events = ('after_add_relation',) |
2835
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1183 |
|
04034421b072
[hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2745
diff
changeset
|
1184 |
def __call__(self): |
3404
9cb6b0cc2a7c
fix some name errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3403
diff
changeset
|
1185 |
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
|
1186 |
parentetypeeid=self.eidto) |
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1187 |
|
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1188 |
|
3410
47832374cf14
fix class name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3404
diff
changeset
|
1189 |
class AfterDelSpecializesHook(SyncSchemaHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
1190 |
__regid__ = 'syncdelspecializes' |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1191 |
__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
|
1192 |
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
|
1193 |
|
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1194 |
def __call__(self): |
3404
9cb6b0cc2a7c
fix some name errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3403
diff
changeset
|
1195 |
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
|
1196 |
parentetypeeid=self.eidto) |