1 from types import StringTypes
2 from datetime import datetime
4 from sqlalchemy import create_engine
5 from sqlalchemy import Column, Integer, String, DateTime
6 from sqlalchemy import Table, Column, MetaData, join, ForeignKey
7 from sqlalchemy.orm import relationship, backref
8 from sqlalchemy.orm import column_property
9 from sqlalchemy.ext.declarative import declarative_base
11 from sfa.util.sfalogging import logger
13 from sfa.trust.gid import GID
15 from sfa.storage.alchemy import Base, alchemy, dbsession, engine, AlchemyObj
17 ##############################
19 __table__ = Table ('types', Base.metadata,
20 Column ('type',String, primary_key=True)
22 def __init__ (self, type): self.type=type
23 def __repr__ (self): return "<Type %s>"%self.type
25 #BUILTIN_TYPES = [ 'authority', 'slice', 'node', 'user' ]
26 # xxx for compat but sounds useless
27 BUILTIN_TYPES = [ 'authority', 'slice', 'node', 'user',
28 'authority+sa', 'authority+am', 'authority+sm' ]
30 def insert_builtin_types(engine,dbsession):
31 Base.metadata.create_all(engine)
32 for type in BUILTIN_TYPES :
33 count = dbsession.query (Type).filter_by (type=type).count()
35 dbsession.add (Type (type))
38 ##############################
39 class RegRecord (Base,AlchemyObj):
40 # xxx tmp would be 'records'
41 __table__ = Table ('records', Base.metadata,
42 Column ('record_id', Integer, primary_key=True),
43 Column ('type', String, ForeignKey ("types.type")),
44 Column ('hrn',String),
45 Column ('gid',String),
46 Column ('authority',String),
47 Column ('peer_authority',String),
48 Column ('pointer',Integer,default=-1),
49 Column ('date_created',DateTime),
50 Column ('last_updated',DateTime),
52 def __init__ (self, type, hrn=None, gid=None, authority=None, peer_authority=None, pointer=-1):
56 if isinstance(gid, StringTypes): self.gid=gid
57 else: self.gid=gid.save_to_string(save_parents=True)
58 if authority: self.authority=authority
59 if peer_authority: self.peer_authority=peer_authority
63 result="[Record(record_id=%s, hrn=%s, type=%s, authority=%s, pointer=%s" % \
64 (self.record_id, self.hrn, self.type, self.authority, self.pointer)
65 if self.gid: result+=" %s..."%self.gid[:10]
66 else: result+=" no-gid"
70 def get_gid_object (self):
71 if not self.gid: return None
72 else: return GID(string=self.gid)
74 def just_created (self):
79 def just_updated (self):
83 ##############################
85 __table__ = Table ('users', Base.metadata,
86 Column ('user_id', Integer, primary_key=True),
87 Column ('record_id',Integer, ForeignKey('records.record_id')),
88 Column ('email', String),
90 def __init__ (self, email):
92 def __repr__ (self): return "<User(%d) %s, record_id=%d>"%(self.user_id,self.email,self.record_id,)
94 record_table = RegRecord.__table__
95 user_table = User.__table__
96 record_user_join = join (record_table, user_table)
98 class UserRecord (Base):
99 __table__ = record_user_join
100 record_id = column_property (record_table.c.record_id, user_table.c.record_id)
101 user_id = user_table.c.user_id
102 def __init__ (self, gid, email):
106 def __repr__ (self): return "<UserRecord %s %s>"%(self.email,self.gid)
108 ##############################
110 logger.info("Initializing db schema and builtin types")
111 Base.metadata.create_all(engine)
112 insert_builtin_types(engine,dbsession)
115 logger.info("Dropping tables")
116 Base.metadata.drop_all(engine)