Fixed oarjob creation and update.
[sfa.git] / sfa / senslab / slabpostgres.py
1 import sys
2
3 from sqlalchemy import create_engine, and_
4 from sqlalchemy.orm import sessionmaker
5
6 from sfa.util.config import Config
7 from sfa.util.sfalogging import logger
8
9 from sqlalchemy import Column, Integer, String, DateTime
10 from sqlalchemy import Table, Column, MetaData, join, ForeignKey
11 import sfa.storage.model as model
12
13 from sqlalchemy.ext.declarative import declarative_base
14 from sqlalchemy.orm import relationship, backref
15
16
17 from sqlalchemy import MetaData, Table
18 from sqlalchemy.exc import NoSuchTableError
19
20 #Dict holding the columns names of the table as keys
21 #and their type, used for creation of the table
22 slice_table = {'record_id_user':'integer PRIMARY KEY references X ON DELETE CASCADE ON UPDATE CASCADE','oar_job_id':'integer DEFAULT -1',  'record_id_slice':'integer', 'slice_hrn':'text NOT NULL'}
23
24 #Dict with all the specific senslab tables
25 tablenames_dict = {'slice_senslab': slice_table}
26
27 ##############################
28
29
30
31 SlabBase = declarative_base()
32
33
34
35
36 class SliceSenslab (SlabBase):
37     __tablename__ = 'slice_senslab' 
38     record_id_user = Column(Integer, primary_key=True)
39     oar_job_id = Column( Integer,default = -1)
40     record_id_slice = Column(Integer)
41     slice_hrn = Column(String,nullable = False)
42     
43     def __init__ (self, slice_hrn =None, oar_job_id=None, record_id_slice=None, record_id_user= None):
44         if record_id_slice: 
45             self.record_id_slice = record_id_slice
46         if slice_hrn:
47             self.slice_hrn = slice_hrn
48         if oar_job_id:
49             self.oar_job_id = oar_job_id
50         if slice_hrn:
51             self.slice_hrn = slice_hrn 
52         if record_id_user: 
53             self.record_id_user= record_id_user
54             
55     def __repr__(self):
56         result="<Record id user =%s, slice hrn=%s, oar_job id=%s,Record id slice =%s" % \
57                 (self.record_id_user, self.slice_hrn, self.oar_job_id, self.record_id_slice)
58         result += ">"
59         return result
60           
61             
62 #class PeerSenslab(SlabBase):
63     #__tablename__ = 'peer_senslab' 
64     #peername = Column(String, nullable = False)
65     #peerid = Column( Integer,primary_key=True)
66     
67     #def __init__ (self,peername = None ):
68         #if peername:
69             #self.peername = peername
70             
71             
72       #def __repr__(self):
73         #result="<Peer id  =%s, Peer name =%s" % (self.peerid, self.peername)
74         #result += ">"
75         #return result
76           
77 class SlabDB:
78     def __init__(self,config):
79         self.sl_base = SlabBase
80
81         dbname="slab_sfa"
82         # will be created lazily on-demand
83         self.slab_session = None
84         # the former PostgreSQL.py used the psycopg2 directly and was doing
85         #self.connection.set_client_encoding("UNICODE")
86         # it's unclear how to achieve this in sqlalchemy, nor if it's needed at all
87         # http://www.sqlalchemy.org/docs/dialects/postgresql.html#unicode
88         # we indeed have /var/lib/pgsql/data/postgresql.conf where
89         # this setting is unset, it might be an angle to tweak that if need be
90         # try a unix socket first - omitting the hostname does the trick
91         unix_url = "postgresql+psycopg2://%s:%s@:%s/%s"%\
92             (config.SFA_DB_USER,config.SFA_DB_PASSWORD,config.SFA_DB_PORT,dbname)
93         print >>sys.stderr, " \r\n \r\n SLAPOSTGRES INIT unix_url %s" %(unix_url)
94         # the TCP fallback method
95         tcp_url = "postgresql+psycopg2://%s:%s@%s:%s/%s"%\
96             (config.SFA_DB_USER,config.SFA_DB_PASSWORD,config.SFA_DB_HOST,config.SFA_DB_PORT,dbname)
97         for url in [ unix_url, tcp_url ] :
98             try:
99                 self.slab_engine = create_engine (url,echo_pool=True,echo=True)
100                 self.check()
101                 self.url=url
102                 return
103             except:
104                 pass
105         self.slab_engine=None
106         raise Exception,"Could not connect to database"
107
108     def check (self):
109         self.slab_engine.execute ("select 1").scalar()
110
111
112     def session (self):
113         if self.slab_session is None:
114             Session=sessionmaker ()
115             self.slab_session=Session(bind=self.slab_engine)
116         return self.slab_session
117         
118         
119    
120         
121     #Close connection to database
122     def close(self):
123         if self.connection is not None:
124             self.connection.close()
125             self.connection = None
126             
127    
128         
129         
130     def exists(self, tablename):
131         """
132         Checks if the table specified as tablename exists.
133     
134         """
135        
136         try:
137             metadata = MetaData (bind=self.slab_engine)
138             table=Table (tablename, metadata, autoload=True)
139            
140             return True
141         except NoSuchTableError:
142             print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES EXISTS NOPE! tablename %s " %(tablename)
143             return False
144        
145     
146     def createtable(self, tablename ):
147         """
148         Creates the specifed table. Uses the global dictionnary holding the tablenames and
149         the table schema.
150     
151         """
152
153         print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES createtable SlabBase.metadata.sorted_tables %s \r\n engine %s" %(SlabBase.metadata.sorted_tables , slab_engine)
154         SlabBase.metadata.create_all(slab_engine)
155         return
156     
157     
158     def update_job(self, job_id, hrn):
159         slice_rec = slab_dbsession.query(SliceSenslab).filter_by(slice_hrn = hrn).first()
160         print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES  update_job slice_rec %s"%(slice_rec)
161         slice_rec.oar_job_id = job_id
162         slab_dbsession.commit()
163
164     def find (self, name = None, filter_dict = None):
165         print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES find  filter_dict %s"%(filter_dict)
166
167         #Filter_by can not handle more than one argument, hence these functions
168         def filter_id_user(query, user_id):
169             print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES find  filter_id_user"
170             return query.filter_by(record_id_user = user_id)
171         
172         def filter_job(query, job):
173             print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES find filter_job "
174             return query.filter_by(oar_job_id = job)
175         
176         def filer_id_slice (query, id_slice):
177             print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES find  filer_id_slice"
178             return query.filter_by(record_id_slice = id_slice)
179         
180         def filter_slice_hrn(query, hrn):
181             print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES find  filter_slice_hrn"
182             return query.filter_by(slice_hrn = hrn)
183         
184         
185         extended_filter = {'record_id_user': filter_id_user,
186          'oar_job_id':filter_job,
187          'record_id_slice': filer_id_slice,
188          'slice_hrn': filter_slice_hrn}
189          
190         Q = slab_dbsession.query(SliceSenslab) 
191         
192         if filter_dict is not None:
193             for k in filter_dict:
194                 try:
195                   newQ= extended_filter[k](Q, filter_dict[k])
196                   Q = newQ
197                 except KeyError:
198                     print>>sys.stderr, "\r\n \t\t FFFFFFFFFFFFFFFFUUUUUUUUFUFUFU!!!!!!!!"
199         print>>sys.stderr, " HEEEEEEEEEEEEY %s " %(Q.all())
200         reclist = []
201         for rec in Q.all():
202             reclist.append(dict(zip(['record_id_user','oar_job_id', 'record_id_slice','slice_hrn'],[rec.record_id_user,rec.oar_job_id,rec.record_id_slice, rec.slice_hrn])))
203         print>>sys.stderr, " \r\n \r\n \t SLABPOSTGRES find  reclist %s" %(reclist)
204         return reclist
205         
206        
207
208
209 from sfa.util.config import Config
210
211 slab_alchemy= SlabDB(Config())
212 slab_engine=slab_alchemy.slab_engine
213 slab_dbsession=slab_alchemy.session()