# -*- coding: ISO-8859-1 -*- ################################## # @program smon # @description simulation monitor # @copyright Copyright “(c)2009 Centre National de la Recherche Scientifique CNRS. # All Rights Reserved” # @svn_file $Id: repo_io.py 2599 2013-03-24 19:01:23Z jripsl $ # @version $Rev: 2599 $ # @lastrevision $Date: 2013-03-24 20:01:23 +0100 (Sun, 24 Mar 2013) $ # @license CeCILL (http://dods.ipsl.jussieu.fr/jripsl/smon/LICENSE) ################################## import sys import sqlite3 import types _conn=None timeout=1 def connect(): global _conn if _conn is not None: raise Exception() db_file="/opt/supervisor/local_db/supervisor.db" #db_file=":memory:" _conn=sqlite3.connect(db_file,timeout) create_tables() def free(): global _conn if _conn is None: raise Exception() _conn.close() _conn=None def commit(): """ public method not used for now """ _conn.commit() def rollback(): _conn.rollback() def create_tables(): _conn.execute("create table if not exists simulation (id INTEGER PRIMARY KEY, name TEXT, status TEXT)") _conn.execute("create unique index if not exists idx_simulation_1 on simulation (name)") _conn.execute("create table if not exists message (id INTEGER PRIMARY KEY, simulation_id TEXT, body TEXT, timestamp TEXT, crea_date TEXT)") # TODO: check how to use INT datatype for simulation_id column def cleanup(): _conn.execute("delete from simulation") _conn.execute("delete from message") _conn.commit() def populate_tables_with_sample(): rows = [('SIMU-001','running'), ('SIMU-002','running'), ('SIMU-003','running'),] _conn.executemany('INSERT INTO simulation (name,status) VALUES (?,?)', rows) _conn.commit() def retrieve_simulations(): li=[] c=_conn.cursor() c.execute("select name,id,status from simulation") rs=c.fetchone() while rs is not None: s=types.Simulation(name=rs[0],id=rs[1],status=rs[2]) li.append(s) rs=c.fetchone() return li def retrieve_simulation(name): c=_conn.cursor() c.execute("select name,id,status from simulation where name = ?",(name,)) rs=c.fetchone() if rs is None: raise Exception("name=%s"%name) return types.Simulation(name=rs[0],id=rs[1],status=rs[2]) def delete_simulation(simulation): _conn.execute("delete from simulation where name = ?",(simulation.name,)) _conn.commit() def create_simulation(simulation): _conn.execute("insert into simulation (name,status) values (?,?)",(simulation.name,simulation.status)) _conn.commit() def update_simulation_status(simulation): _conn.execute("update simulation set status=? where name = ?",(simulation.status,simulation.name)) _conn.commit() def retrieve_messages(simulation): li=[] c=_conn.cursor() c.execute("select id from message where simulation_id = ?",(simulation.id,)) rs=c.fetchone() while rs is not None: li.append(types.Message(id=rs[0])) rs=c.fetchone() return li def delete_messages(simulation): _conn.execute("delete from message where simulation_id = ?",(simulation.id,)) _conn.commit() def create_message(message,simulation): _conn.execute("insert into message (simulation_id,timestamp,crea_date) values (?,?,datetime('now', 'localtime'))",(simulation.id, message.timestamp)) _conn.commit() def retrieve_last_message(simulation): c=_conn.cursor() # debug #print "simulation_id=%d"%simulation.id c.execute("select id, simulation_id, body, timestamp, crea_date from message where simulation_id=? order by crea_date desc limit 1",(simulation.id,)) rs=c.fetchone() if rs is None: # debug #print "simulation not found (%d)"%simulation.id raise types.MessageNotFoundException() # HACK (we want the Message constructor to support BOTH **kw AND kw) di={} di["id"]=rs[0] di["simulation_id"]=rs[1] di["body"]=rs[2] di["timestamp"]=id=rs[3] di["crea_date"]=rs[4] m=types.Message(di) return m