'''
Generate reports from the database
'''
import time
import sys
import pandokia.text_table as text_table
import StringIO
# this will be reset by the cgi main program if we are in a real cgi
cginame = 'arf.cgi'
#
def info_callback_status( db, run, tablename, host, cmd ) :
c = db.cursor()
c.execute("SELECT status FROM status WHERE run = ? AND host = ? AND tablename = ? AND cmd = ?",(
run, host, tablename, cmd ) )
status, = c.fetchone()
return status
#
def info_callback_gui( db, run, tablename, host, cmd ) :
c = db.cursor()
c.execute("SELECT status, start_time, end_time FROM status WHERE run = ? AND host = ? AND tablename = ? AND cmd = ?",(
run, host, tablename, cmd ) )
x = c.fetchone()
if x is None :
return ''
status, start_time, end_time = x
if start_time is None :
start_time = ''
if end_time is None :
end_time = ''
# t_result = '%s %s %s'%(status, start_time, end_time )
t_result = status
if status != '0' and status != 'N' :
status = '%s'%status
if status != 'N' and status != 'P' :
link = "*"%(cginame, run, host, tablename, cmd )
else :
link = ''
# h_result = '%s %s %s %s'%(link, status, start_time, end_time)
h_result = '%s %s'%(link, status )
return ( t_result, h_result )
#
def info_callback_debug_table_cell( db, run, tablename, cmd, host ) :
return '%s %s %s %s' % ( run, host, tablename, cmd )
#
def get_table_list( db, run_name ) :
c = db.cursor()
c.execute("select max(depth) as d, tablename from status where run = ? group by tablename order by d asc",(run_name,))
table_list = [ x for x in c ]
# table_list contains ( depth, tablename )
return table_list
def get_table( db, run_name, tablename, info_callback, showdepth=0 ) :
t = text_table.text_table()
t.set_html_table_attributes('border=1')
t.define_column('-',html=' ',showname='-') # the command name in column 0
if showdepth :
t.define_column('depth')
c = db.cursor()
c.execute("select distinct host from status where tablename = ? and run = ? order by host asc",(tablename, run_name))
for host, in c :
t.define_column(host)
c.execute("""select cmd, host, depth, status, start_time, end_time, notes from status
where tablename = ? and run = ? order by depth, cmd asc
""", ( tablename, run_name ) )
row = -1
prev_cmd = None
for x in c :
cmd, host, depth, status, start_time, end_time, notes = x
if cmd != prev_cmd :
row = row + 1
t.set_value(row, 0, cmd)
if showdepth :
t.set_value(row, 'depth', depth)
prev_cmd = cmd
info = info_callback( db, run_name, tablename, host, cmd )
if isinstance(info, tuple) :
t.set_value( row, host, text=info[0], html=info[1] )
else :
t.set_value( row, host, info)
t.pad()
return t
#
def report_text( db, run_name, info_callback = info_callback_status ) :
s = StringIO.StringIO()
table_list = get_table_list(db, run_name)
for depth, tablename in table_list :
s.write("------\n")
s.write(tablename)
s.write('\n')
t = get_table( db, run_name, tablename, info_callback )
s.write( t.get_trac_wiki() )
return s.getvalue()
#
def report_html( db, run_name, info_callback = info_callback_status, hlevel=1 ) :
s = StringIO.StringIO()
s.write('%s\n'%(hlevel,run_name,hlevel))
hlevel = hlevel + 1
table_list = get_table_list(db, run_name)
for depth, tablename in table_list :
s.write('%s\n'%(hlevel,tablename,hlevel))
t = get_table( db, run_name, tablename, info_callback, showdepth=1 )
s.write(t.get_html())
return s.getvalue()
#
def main() :
import steuermann.config
db = steuermann.config.open_db()
print report_html( db, 'arf2011-08-30 16:52:23.928381' )
if __name__ == '__main__' :
main()