diff -r e9e93967b7b5 -r 740397c24ec3 server/schemaserial.py --- a/server/schemaserial.py Thu Jan 21 10:59:58 2010 +0100 +++ b/server/schemaserial.py Thu Jan 21 11:02:36 2010 +0100 @@ -28,7 +28,8 @@ from the user. """ res = {} - for eid, name in cursor.execute('Any G, N WHERE G is CWGroup, G name N'): + for eid, name in cursor.execute('Any G, N WHERE G is CWGroup, G name N', + build_descr=False): res[name] = eid if not interactive: return res @@ -112,23 +113,21 @@ print sql sqlcu.execute(sql) # other table renaming done once schema has been read - index = {} + sidx = {} permsdict = deserialize_ertype_permissions(session) schema.reading_from_database = True - for eid, etype, desc in session.execute('Any X, N, D WHERE ' - 'X is CWEType, X name N, ' - 'X description D', - build_descr=False): + for eid, etype, desc in session.execute( + 'Any X, N, D WHERE X is CWEType, X name N, X description D', + build_descr=False): # base types are already in the schema, skip them if etype in schemamod.BASE_TYPES: # just set the eid eschema = schema.eschema(etype) eschema.eid = eid - index[eid] = eschema + sidx[eid] = eschema continue if etype in ETYPE_NAME_MAP: netype = ETYPE_NAME_MAP[etype] - print 'fixing etype name from %s to %s' % (etype, netype) # can't use write rql queries at this point, use raw sql session.system_sql('UPDATE %(p)sCWEType SET %(p)sname=%%(n)s WHERE %(p)seid=%%(x)s' % {'p': sqlutils.SQL_PREFIX}, @@ -155,34 +154,21 @@ etype = netype etype = ybo.EntityType(name=etype, description=desc, eid=eid) eschema = schema.add_entity_type(etype) - index[eid] = eschema - set_perms(eschema, permsdict.get(eid, {})) - try: - rset = session.execute('Any XN, ETN WHERE X is CWEType, X name XN, ' - 'X specializes ET, ET name ETN') - except: # `specializes` relation not available for versions prior to 2.50 - session.rollback(False) - else: - for etype, stype in rset: - eschema = schema.eschema(etype) - seschema = schema.eschema(stype) - eschema._specialized_type = stype - seschema._specialized_by.append(etype) - for eid, rtype, desc, sym, il in session.execute( - 'Any X,N,D,S,I WHERE X is CWRType, X name N, X description D, ' - 'X symetric S, X inlined I', build_descr=False): - try: - # bw compat: fulltext_container added in 2.47 - ft_container = session.execute('Any FTC WHERE X eid %(x)s, X fulltext_container FTC', - {'x': eid}).rows[0][0] - except: - ft_container = None - session.rollback(False) + sidx[eid] = eschema + set_perms(eschema, permsdict) + for etype, stype in session.execute( + 'Any XN, ETN WHERE X is CWEType, X name XN, X specializes ET, ET name ETN', + build_descr=False): + schema.eschema(etype)._specialized_type = stype + schema.eschema(stype)._specialized_by.append(etype) + for eid, rtype, desc, sym, il, ftc in session.execute( + 'Any X,N,D,S,I,FTC WHERE X is CWRType, X name N, X description D, ' + 'X symetric S, X inlined I, X fulltext_container FTC', build_descr=False): rtype = ybo.RelationType(name=rtype, description=desc, symetric=bool(sym), inlined=bool(il), - fulltext_container=ft_container, eid=eid) + fulltext_container=ftc, eid=eid) rschema = schema.add_relation_type(rtype) - index[eid] = rschema + sidx[eid] = rschema cstrsdict = deserialize_rdef_constraints(session) for values in session.execute( 'Any X,SE,RT,OE,CARD,ORD,DESC,IDX,FTIDX,I18N,DFLT WHERE X is CWAttribute,' @@ -191,37 +177,30 @@ 'X fulltextindexed FTIDX, X from_entity SE, X to_entity OE', build_descr=False): rdefeid, seid, reid, teid, card, ord, desc, idx, ftidx, i18n, default = values - constraints = cstrsdict.get(rdefeid, ()) - frometype = index[seid].type - rtype = index[reid].type - toetype = index[teid].type - rdef = ybo.RelationDefinition(frometype, rtype, toetype, cardinality=card, - order=ord, description=desc, - constraints=constraints, - indexed=idx, fulltextindexed=ftidx, - internationalizable=i18n, - default=default, eid=rdefeid) + rdef = ybo.RelationDefinition(sidx[seid].type, sidx[reid].type, sidx[teid].type, + cardinality=card, + constraints=cstrsdict.get(rdefeid, ()), + order=ord, description=desc, + indexed=idx, fulltextindexed=ftidx, + internationalizable=i18n, + default=default, eid=rdefeid) rdefs = schema.add_relation_def(rdef) # rdefs can be None on duplicated relation definitions (e.g. symetrics) - if rdefs: - set_perms(rdefs, permsdict.get(rdefeid, {})) + if rdefs is not None: + set_perms(rdefs, permsdict) for values in session.execute( 'Any X,SE,RT,OE,CARD,ORD,DESC,C WHERE X is CWRelation, X relation_type RT,' 'X cardinality CARD, X ordernum ORD, X description DESC, ' 'X from_entity SE, X to_entity OE, X composite C', build_descr=False): rdefeid, seid, reid, teid, card, ord, desc, c = values - frometype = index[seid].type - rtype = index[reid].type - toetype = index[teid].type - constraints = cstrsdict.get(rdefeid, ()) - rdef = ybo.RelationDefinition(frometype, rtype, toetype, cardinality=card, - order=ord, description=desc, - composite=c, constraints=constraints, - eid=rdefeid) + rdef = ybo.RelationDefinition(sidx[seid].type, sidx[reid].type, sidx[teid].type, + constraints=cstrsdict.get(rdefeid, ()), + cardinality=card, order=ord, description=desc, + composite=c, eid=rdefeid) rdefs = schema.add_relation_def(rdef) # rdefs can be None on duplicated relation definitions (e.g. symetrics) - if rdefs: - set_perms(rdefs, permsdict.get(rdefeid, {})) + if rdefs is not None: + set_perms(rdefs, permsdict) schema.infer_specialization_rules() if _3_2_migration: _update_database(schema, sqlcu) @@ -255,14 +234,15 @@ definition dictionary as built by deserialize_ertype_permissions for a given erschema's eid """ - for action in erschema.ACTIONS: - actperms = [] - for something in permsdict.get(action, ()): - if isinstance(something, tuple): - actperms.append(erschema.rql_expression(*something)) - else: # group name - actperms.append(something) - erschema.set_action_permissions(action, actperms) + try: + thispermsdict = permsdict[erschema.eid] + except KeyError: + return + permissions = erschema.permissions + for action, somethings in thispermsdict.iteritems(): + permissions[action] = tuple( + isinstance(p, tuple) and erschema.rql_expression(*p) or p + for p in somethings) def deserialize_rdef_constraints(session): @@ -287,6 +267,7 @@ if not quiet: _title = '-> storing the schema in the database ' print _title, + execute = cursor.execute eschemas = schema.entities() aller = eschemas + schema.relations() if not verbose and not quiet: @@ -298,7 +279,7 @@ for cstrtype in CONSTRAINTS: if verbose: print rql - cursor.execute(rql, {'ct': unicode(cstrtype)}) + execute(rql, {'ct': unicode(cstrtype)}, build_descr=False) if pb is not None: pb.update() groupmap = group_mapping(cursor, interactive=False) @@ -311,13 +292,13 @@ for rql, kwargs in erschema2rql(schema[ertype], groupmap): if verbose: print rql % kwargs - cursor.execute(rql, kwargs) + execute(rql, kwargs, build_descr=False) if pb is not None: pb.update() for rql, kwargs in specialize2rql(schema): if verbose: print rql % kwargs - cursor.execute(rql, kwargs) + execute(rql, kwargs, build_descr=False) if pb is not None: pb.update() if not quiet: