fix creation and update times
[sfa.git] / sfa / storage / persistentobjs.py
1 from types import StringTypes
2 from datetime import datetime
3
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
10
11 from sfa.util.sfalogging import logger
12
13 from sfa.trust.gid import GID
14
15 from sfa.storage.alchemy import Base, alchemy, dbsession, engine, AlchemyObj
16
17 ##############################
18 class Type (Base):
19     __table__ = Table ('types', Base.metadata,
20                        Column ('type',String, primary_key=True)
21                        )
22     def __init__ (self, type): self.type=type
23     def __repr__ (self): return "<Type %s>"%self.type
24     
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' ]
29
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()
34         if count==0:
35             dbsession.add (Type (type))
36     dbsession.commit()
37
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),
51                        )
52     def __init__ (self, type, hrn=None, gid=None, authority=None, peer_authority=None, pointer=-1):
53         self.type=type
54         if hrn: self.hrn=hrn
55         if gid: 
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
60         self.pointer=pointer
61
62     def __repr__(self):
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"
67         result += "]"
68         return result
69
70     def get_gid_object (self):
71         if not self.gid: return None
72         else: return GID(string=self.gid)
73
74     def just_created (self):
75         now=datetime.now()
76         self.date_created=now
77         self.last_updated=now
78
79     def just_updated (self):
80         now=datetime.now()
81         self.last_updated=now
82
83 ##############################
84 class User (Base):
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),
89                        )
90     def __init__ (self, email):
91         self.email=email
92     def __repr__ (self): return "<User(%d) %s, record_id=%d>"%(self.user_id,self.email,self.record_id,)
93                            
94 record_table = RegRecord.__table__
95 user_table = User.__table__
96 record_user_join = join (record_table, user_table)
97
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):
103         self.type='user'
104         self.gid=gid
105         self.email=email
106     def __repr__ (self): return "<UserRecord %s %s>"%(self.email,self.gid)
107
108 ##############################    
109 def init_tables():
110     logger.info("Initializing db schema and builtin types")
111     Base.metadata.create_all(engine)
112     insert_builtin_types(engine,dbsession)
113
114 def drop_tables():
115     logger.info("Dropping tables")
116     Base.metadata.drop_all(engine)