00001 #!/usr/local/bin/python 00002 # 00003 # Copyright 2004 00004 # by 00005 # The Board of Trustees of the 00006 # Leland Stanford Junior University. 00007 # All rights reserved. 00008 # 00009 00010 __facility__ = "Online" 00011 __abstract__ = "GLAST LAT Housekeeping server infrastructure" 00012 __author__ = "Jim Panetta <panetta@slac.stanford.edu> SLAC - GLAST I&T" 00013 __date__ = "10/07/04" 00014 __version__ = "$Revision: 1.7 $" 00015 __release__ = "$Name: R04-12-00 $" 00016 __credits__ = "SLAC" 00017 00018 import LATTE.copyright_SLAC 00019 import MySQLdb 00020 import logging 00021 import time 00022 00023 from LATTE.monitoring.Recorder import Recorder 00024 from LATTE.monitoring.Receiver import Receiver 00025 from LATTE.database.gHSK import GHSK 00026 from LATTE.monitoring.TrendMaps import GHSKTrendMap, makeSimpleMap 00027 00028 class HskSqlRecorder(Recorder): 00029 def __init__(self, ghsk, sqlCursor, source): 00030 Recorder.__init__(self) 00031 self.__ghsk = ghsk 00032 self.__trendMap = GHSKTrendMap(ghsk) 00033 self.__database = sqlCursor 00034 self.__pad = ' ' 00035 self.log = logging.getLogger('HskSqlRecorder') 00036 self.__mnemMap = {} 00037 self.__makeMmap() 00038 self.__source = source 00039 00040 def processTrends(self, trendables): 00041 if trendables is None: return 00042 00043 trendMap = makeSimpleMap(trendables, self.__trendMap) 00044 00045 sqlCmd = '' 00046 sqlBase = 'insert ignore into VALfields (MNEMID,USECS,SOURCE,VALUE) VALUES ' 00047 sqlCmd += sqlBase 00048 dTime = trendMap['TimeStamp'] 00049 for mnem in trendMap.keys(): 00050 if mnem == 'TimeStamp': continue 00051 mnemid = self.__mnemMap[mnem] 00052 value = trendMap[mnem] 00053 if value == None: # No value, insert Null into database 00054 sqlCmd += '(%d, %f, %d, NULL),' % (mnemid, dTime, self.__source) 00055 else: 00056 sqlCmd += '(%d, %f, %d, %f),' % (mnemid, dTime, self.__source, value) 00057 if len(sqlCmd) > 4000: 00058 sqlCmd = sqlCmd.strip(',') 00059 sqlCmd += ';' 00060 self.__database.execute(sqlCmd) 00061 sqlCmd = '' + sqlBase 00062 00063 sqlCmd = sqlCmd.strip(',') 00064 if len(sqlCmd) != len(sqlBase): # prevent call of empty set 00065 sqlCmd += ';' 00066 self.__database.execute(sqlCmd) 00067 00068 # gotta commit the transaction 00069 self.__database.connection.commit() 00070 00071 def __makeMmap(self): 00072 sqlCmd = 'select t.mnemid, t.mnem from tlmfields t;' 00073 self.__database.execute(sqlCmd) 00074 m = self.__database.fetchall() 00075 for mnemid, mnem in m: 00076 self.__mnemMap[mnem] = int(mnemid) 00077 # for k in self.__mnemMap.keys(): 00078 # print k, self.__mnemMap[k] 00079 00080 class HskSqlReceiver(Receiver): 00081 def __init__(self, sqlCursor, timeDepth, trendList): 00082 Receiver.__init__(self) 00083 self.log = logging.getLogger('HskSqlReceiver') 00084 self.__trendList = trendList 00085 self.__database = sqlCursor 00086 self.__lastTime = time.time() - timeDepth 00087 # self.__lastTime = 1794 - timeDepth 00088 # self.__lastTime = 0 00089 self.__mnemMap = {} 00090 self.__makeMmap() 00091 self.__source = 000 00092 00093 def setSource(self, source): 00094 self.__source = source 00095 00096 def __makeMmap(self): 00097 sqlCmd = 'select t.mnemid, t.mnem from tlmfields t;' 00098 self.__database.execute(sqlCmd) 00099 m = self.__database.fetchall() 00100 for mnemid, mnem in m: 00101 self.__mnemMap[mnem] = int(mnemid) 00102 # for k in self.__mnemMap.keys(): 00103 # print k, self.__mnemMap[k] 00104 00105 def receive(self): 00106 while True: 00107 alist = {} 00108 # loop once, getting the full set from the DB 00109 for mnem in self.__trendList: 00110 msg = "select v.usecs, v.value from valfields v where v.mnemid='%s' and v.usecs>%f and v.source=%d;" % (self.__mnemMap[mnem], self.__lastTime, self.__source) 00111 self.__database.execute(msg) 00112 alist[mnem] = self.__database.fetchall() 00113 # print len(alist[mnem]), alist[mnem], self.__lastTime 00114 # loop over the set and dispatch 00115 lt = 1E12 00116 timestamp = lt 00117 for mnem in self.__trendList: 00118 for i in range(len(alist[mnem])): 00119 # create a two item dict: timestamp, mnemonic 00120 timestamp, value = alist[mnem][i] 00121 # print timeValPair 00122 dispatchMap = {'TimeStamp':timestamp, mnem:value} 00123 # print "dispatching: ", i, mnem, dispatchMap 00124 self.dispatch(dispatchMap) 00125 if lt > timestamp: lt = timestamp 00126 if lt != 1E12: self.__lastTime = lt 00127 break 00128 # print "waiting for godot", self.__lastTime 00129 time.sleep(10) 00130 00131 def receiveRegion(self, start, end): 00132 # print "trendList: ", self.__trendList 00133 for mnem in self.__trendList: 00134 msg = "select v.usecs, v.value from valfields v " 00135 msg += "where v.mnemid='%s' and v.usecs>%f and v.usecs<%f and v.source=%d;" % \ 00136 (self.__mnemMap[mnem], start, end, self.__source) 00137 self.__database.execute(msg) 00138 alist = self.__database.fetchall() 00139 for i in range(len(alist)): 00140 timestamp, value = alist[i] 00141 # print timeValPair 00142 dispatchMap = {'TimeStamp':timestamp, mnem:value} 00143 # print "dispatching: ", i, mnem, dispatchMap 00144 self.dispatch(dispatchMap) 00145 00146 00147 def dispatch(self, trendMap): 00148 self.process(trendMap) 00149 00150 def process(self, dispatchMap): 00151 line = '' 00152 for item in dispatchMap: 00153 line += item + ":" + str(dispatchMap[item]) + " " 00154 print line 00155 00156 def trendItem(self, item): 00157 if item in self.__trendList: 00158 return True 00159 else: 00160 return False 00161