4ddcba6029ccf1687fd7cdb925456422a4771cb1
[plcapi.git] / PLC / Storage / AlchemyObject.py
1 from datetime import datetime
2
3 from sqlalchemy.ext.declarative import declarative_base
4 from sqlalchemy import Table, Column, MetaData, join, ForeignKey
5 from sqlalchemy import Column, Integer, String, TIMESTAMP
6 from sqlalchemy.orm import relationship, backref
7 from sqlalchemy.orm import column_property
8 from sqlalchemy.orm import mapper, object_mapper
9 from sqlalchemy.orm import validates
10 from sqlalchemy import ForeignKey    
11
12 from PLC.Storage.Alchemy import Base, engine, dbsession
13 from PLC.Storage.Record import Record
14 from PLC.Timestamp import Timestamp
15 from PLC.Logger import logger   
16  
17 class AlchemyObj(Record):
18
19     def __init__(self, api=None, fields = {}, object=None):
20         Record.__init__(self, dict=fields, object=object)
21         self.api=api
22
23     def __iter__(self):
24         self._i = iter(object_mapper(self).columns)
25         return self
26
27     def next(self):
28         n = self._i.next().name
29         return n, getattr(self, n)
30
31     def get_table(self):
32         metadata = MetaData(engine)
33         table = Table(self.tablename, metadata)
34         for field in self.fields:
35             param = self.fields[field]
36             args = {}
37             # skip params joined from other tables 
38             if param.joined:
39                 continue
40             type = String
41             if param.type == int:
42                 type = Integer
43             elif param.type == datetime:
44                 type = TIMESTAMP
45
46             column = Column(field, type, 
47                             nullable = param.nullok,
48                             index = param.indexed,
49                             primary_key=param.primary_key,
50                             default=param.default)
51             table.append_column(column)
52         if not table.exists():
53             table.create()
54         return table
55
56     def create(self):
57         self.get_table()
58
59     def insert(self, values):
60         table = self.get_table()
61         result = dbsession.execute(table.insert().values(values))
62         dbsession.commit()
63         return result
64     
65     def updatedb(self, filter, values):
66         class Cls(object): pass
67         table = self.get_table()
68         clsmapper = mapper(Cls, table)
69         result = dbsession.query(clsmapper).filter_by(**filter).update(values)
70         dbsession.commit()
71         return result
72
73     def delete(self, filter={}):
74         class Cls(object): pass
75         table = self.get_table()
76         clsmapper = mapper(Cls, table)
77         result = dbsession.query(clsmapper).filter_by(**filter).delete()
78         dbsession.commit()         
79         return result
80  
81     def select(self, filter={}):
82         class Cls(object): pass
83         table = self.get_table()
84         clsmapper = mapper(Cls, table) 
85         return dbsession.query(clsmapper).filter_by(**filter)