diff -r 31412adee482 -r dc6d44e69a70 server/schemahooks.py --- a/server/schemahooks.py Wed Jun 03 09:09:33 2009 +0200 +++ b/server/schemahooks.py Thu Apr 04 13:49:34 2019 +0200 @@ -21,7 +21,7 @@ from cubicweb.server.pool import Operation, SingleLastOperation, PreCommitOperation from cubicweb.server.hookhelper import (entity_attr, entity_name, check_internal_entity) - + # core entity and relation types which can't be removed CORE_ETYPES = list(BASE_TYPES) + ['CWEType', 'CWRType', 'CWUser', 'CWGroup', 'CWConstraint', 'CWAttribute', 'CWRelation'] @@ -52,7 +52,7 @@ % (table, column))) session.info('added column %s to table %s', column, table) except: - # silent exception here, if this error has not been raised because the + # silent exception here, if this error has not been raised because the # column already exists, index creation will fail anyway session.exception('error while adding column %s to table %s', table, column) @@ -74,7 +74,7 @@ Operation.__init__(self, session, **kwargs) # every schema operation is triggering a schema update UpdateSchemaOp(session) - + class EarlySchemaOperation(SchemaOperation): def insert_index(self): """schema operation which are inserted at the begining of the queue @@ -85,7 +85,7 @@ if not isinstance(op, EarlySchemaOperation): return i return i + 1 - + class UpdateSchemaOp(SingleLastOperation): """the update schema operation: @@ -93,15 +93,15 @@ operations. It will trigger internal structures rebuilding to consider schema changes """ - + def __init__(self, session): self.repo = session.repo SingleLastOperation.__init__(self, session) - + def commit_event(self): self.repo.set_schema(self.repo.schema) - + class DropTableOp(PreCommitOperation): """actually remove a database from the application's schema""" table = None # make pylint happy @@ -113,7 +113,7 @@ dropped.add(self.table) self.session.system_sql('DROP TABLE %s' % self.table) self.info('dropped table %s', self.table) - + class DropColumnOp(PreCommitOperation): """actually remove the attribut's column from entity table in the system database @@ -130,12 +130,12 @@ except Exception, ex: # not supported by sqlite for instance self.error('error while altering table %s: %s', table, ex) - + # deletion #################################################################### class DeleteCWETypeOp(SchemaOperation): - """actually remove the entity type from the application's schema""" + """actually remove the entity type from the application's schema""" def commit_event(self): try: # del_entity_type also removes entity's relations @@ -162,9 +162,9 @@ session.execute('DELETE State X WHERE NOT X state_of Y') session.execute('DELETE Transition X WHERE NOT X transition_of Y') - + class DeleteCWRTypeOp(SchemaOperation): - """actually remove the relation type from the application's schema""" + """actually remove the relation type from the application's schema""" def commit_event(self): try: self.schema.del_relation_type(self.kobj) @@ -186,7 +186,7 @@ {'x': eid}) DeleteCWRTypeOp(session, name) - + class DelErdefOp(SchemaOperation): """actually remove the relation definition from the application's schema""" def commit_event(self): @@ -196,7 +196,7 @@ except KeyError: # relation type may have been already deleted pass - + def after_del_relation_type(session, rdefeid, rtype, rteid): """before deleting a CWAttribute or CWRelation entity: * if this is a final or inlined relation definition, instantiate an @@ -223,7 +223,7 @@ # we have to update physical schema systematically for final and inlined # relations, but only if it's the last instance for this relation type # for other relations - + if (rschema.is_final() or rschema.inlined): rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R, ' 'R eid %%(x)s, X from_entity E, E name %%(name)s' @@ -238,16 +238,16 @@ execute('DELETE CWRType X WHERE X eid %(x)s', {'x': rteid}, 'x') DelErdefOp(session, (subjschema, rschema, objschema)) - + # addition #################################################################### class AddCWETypeOp(EarlySchemaOperation): - """actually add the entity type to the application's schema""" + """actually add the entity type to the application's schema""" eid = None # make pylint happy def commit_event(self): eschema = self.schema.add_entity_type(self.kobj) eschema.eid = self.eid - + def before_add_eetype(session, entity): """before adding a CWEType entity: * check that we are not using an existing entity type, @@ -304,25 +304,25 @@ class AddCWRTypeOp(EarlySchemaOperation): - """actually add the relation type to the application's schema""" + """actually add the relation type to the application's schema""" eid = None # make pylint happy def commit_event(self): rschema = self.schema.add_relation_type(self.kobj) rschema.set_default_groups() rschema.eid = self.eid - + def before_add_ertype(session, entity): """before adding a CWRType entity: * check that we are not using an existing relation type, * register an operation to add the relation type to the application's schema on commit - + We don't know yeat this point if a table is necessary """ name = entity['name'] if name in session.repo.schema.relations(): raise RepositoryError('a relation type %s already exists' % name) - + def after_add_ertype(session, entity): """after a CWRType entity has been added: * register an operation to add the relation type to the application's @@ -340,7 +340,7 @@ class AddErdefOp(EarlySchemaOperation): """actually add the attribute relation definition to the application's schema - """ + """ def commit_event(self): self.schema.add_relation_def(self.kobj) @@ -350,7 +350,7 @@ 'Float': float, 'Password': str, 'String': unicode, - 'Date' : unicode, + 'Date' : unicode, 'Datetime' : unicode, 'Time' : unicode, } @@ -362,7 +362,7 @@ * set default on this column if any and possible * register an operation to add the relation definition to the application's schema on commit - + constraints are handled by specific hooks """ entity = None # make pylint happy @@ -457,7 +457,7 @@ session = self.session entity = self.entity fromentity = entity.from_entity[0] - relationtype = entity.relation_type[0] + relationtype = entity.relation_type[0] session.execute('SET X ordernum Y+1 WHERE X from_entity SE, SE eid %(se)s, X ordernum Y, X ordernum >= %(order)s, NOT X eid %(x)s', {'x': entity.eid, 'se': fromentity.eid, 'order': entity.ordernum or 0}) subj, rtype = str(fromentity.name), str(relationtype.name) @@ -508,7 +508,7 @@ if sql.strip(): self.session.system_sql(sql) session.add_query_data('createdtables', rtype) - + def after_add_enfrdef(session, entity): AddCWRelationPreCommitOp(session, entity=entity) @@ -556,7 +556,7 @@ (self.newname, self.oldname)) sqlexec('UPDATE deleted_entities SET type=%s WHERE type=%s', (self.newname, self.oldname)) - + def commit_event(self): self.session.repo.schema.rename_entity_type(self.oldname, self.newname) @@ -575,13 +575,13 @@ sysource.create_index(self.session, table, column) else: sysource.drop_index(self.session, table, column) - + def commit_event(self): # structure should be clean, not need to remove entity's relations # at this point self.rschema._rproperties[self.kobj].update(self.values) - + def after_update_erdef(session, entity): desttype = entity.to_entity[0].name rschema = session.repo.schema[entity.relation_type[0].name] @@ -600,7 +600,7 @@ class UpdateRtypeOp(SchemaOperation): - """actually update some properties of a relation definition""" + """actually update some properties of a relation definition""" rschema = values = entity = None # make pylint happy def precommit_event(self): @@ -639,13 +639,13 @@ else: for etype in rschema.subjects(): try: - add_inline_relation_column(session, str(etype), rtype) + add_inline_relation_column(session, str(etype), rtype) except Exception, ex: # the column probably already exists. this occurs when # the entity's type has just been added or if the column # has not been previously dropped self.error('error while altering table %s: %s', etype, ex) - # copy existant data. + # copy existant data. # XXX don't use, it's not supported by sqlite (at least at when i tried it) #sqlexec('UPDATE %(etype)s SET %(rtype)s=eid_to ' # 'FROM %(rtype)s_relation ' @@ -667,7 +667,7 @@ # structure should be clean, not need to remove entity's relations # at this point self.rschema.__dict__.update(self.values) - + def after_update_ertype(session, entity): rschema = session.repo.schema.rschema(entity.name) newvalues = {} @@ -684,13 +684,13 @@ class ConstraintOp(SchemaOperation): """actually update constraint of a relation definition""" entity = None # make pylint happy - + def prepare_constraints(self, rtype, subjtype, objtype): constraints = rtype.rproperty(subjtype, objtype, 'constraints') self.constraints = list(constraints) rtype.set_rproperty(subjtype, objtype, 'constraints', self.constraints) return self.constraints - + def precommit_event(self): rdef = self.entity.reverse_constrained_by[0] session = self.session @@ -698,7 +698,7 @@ # is created by AddEN?FRDefPreCommitOp, there is nothing to do here if rdef.eid in session.query_data('neweids', ()): self.cancelled = True - return + return self.cancelled = False schema = session.repo.schema subjtype, rtype, objtype = schema.schema_by_eid(rdef.eid) @@ -723,7 +723,7 @@ elif cstrtype == 'UniqueConstraint': session.pool.source('system').create_index( self.session, table, column, unique=True) - + def commit_event(self): if self.cancelled: return @@ -743,7 +743,7 @@ class DelConstraintOp(ConstraintOp): """actually remove a constraint of a relation definition""" rtype = subjtype = objtype = None # make pylint happy - + def precommit_event(self): self.prepare_constraints(self.rtype, self.subjtype, self.objtype) cstrtype = self.cstr.type() @@ -754,7 +754,7 @@ try: self.session.system_sql('ALTER TABLE %s ALTER COLUMN %s TYPE TEXT' % (table, column)) - self.info('altered column %s of table %s: now TEXT', + self.info('altered column %s of table %s: now TEXT', column, table) except Exception, ex: # not supported by sqlite for instance @@ -762,7 +762,7 @@ elif cstrtype == 'UniqueConstraint': self.session.pool.source('system').drop_index( self.session, table, column, unique=True) - + def commit_event(self): self.constraints.remove(self.cstr) @@ -784,7 +784,7 @@ if fromeid in session.query_data('neweids', ()): session.add_query_data(fromeid, toeid) - + # schema permissions synchronization ########################################## class PermissionOp(Operation): @@ -805,7 +805,7 @@ def __init__(self, session, perm, etype_eid, group_eid): self.group = entity_name(session, group_eid) PermissionOp.__init__(self, session, perm, etype_eid) - + def commit_event(self): """the observed connections pool has been commited""" try: @@ -815,7 +815,7 @@ self.error('no schema for %s', self.name) return groups = list(erschema.get_groups(self.perm)) - try: + try: groups.index(self.group) self.warning('group %s already have permission %s on %s', self.group, self.perm, erschema.type) @@ -830,7 +830,7 @@ def __init__(self, session, perm, etype_eid, expression): self.expr = expression PermissionOp.__init__(self, session, perm, etype_eid) - + def commit_event(self): """the observed connections pool has been commited""" try: @@ -852,12 +852,12 @@ expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR', {'x': object}, 'x')[0][0] AddRQLExpressionPermissionOp(session, perm, subject, expr) - + - + class DelGroupPermissionOp(AddGroupPermissionOp): """synchronize schema when a *_permission relation has been deleted from a group""" - + def commit_event(self): """the observed connections pool has been commited""" try: @@ -867,17 +867,17 @@ self.error('no schema for %s', self.name) return groups = list(erschema.get_groups(self.perm)) - try: + try: groups.remove(self.group) erschema.set_groups(self.perm, groups) except ValueError: self.error('can\'t remove permission %s on %s to group %s', self.perm, erschema.type, self.group) - + class DelRQLExpressionPermissionOp(AddRQLExpressionPermissionOp): """synchronize schema when a *_permission relation has been deleted from an rql expression""" - + def commit_event(self): """the observed connections pool has been commited""" try: @@ -897,7 +897,7 @@ return erschema.set_rqlexprs(self.perm, rqlexprs) - + def before_del_permission(session, subject, rtype, object): """delete entity/relation *_permission, need to update schema @@ -943,7 +943,7 @@ hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType') hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type') hm.register_hook(rebuild_infered_relations, 'after_add_relation', 'specializes') - hm.register_hook(rebuild_infered_relations, 'after_delete_relation', 'specializes') + hm.register_hook(rebuild_infered_relations, 'after_delete_relation', 'specializes') # constraints synchronization hooks hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint') hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint')