Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

HskSqlInterface.py

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       

Generated on Fri Jul 21 13:26:30 2006 for LATTE R04-12-00 by doxygen 1.4.3