00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 import wx
00018 from sqlite3Impl import sqlite3Impl
00019 from objects.logic.network.packetDecoder import packetDecoder
00020 from threading import RLock, Thread, Event
00021 from objects.logic.common.exception import exception
00022 from objects.logic.common.logger import logger
00023 from objects.logic.common.globalStrings import globalStrings
00024 import time
00025
00026 from objects.logic.common.threads.appThreadBase import appThreadBase
00027 from objects.logic.common.observerInterface import observerInterface
00028
00029
00030
00031
00032 class storageWriterThread(appThreadBase):
00033
00034 def run ( self ):
00035 try:
00036 self.parent.storageImpl.open()
00037 self.anythingElseProcessed = False
00038 logger.log(__name__ + ": Starting Storage Write Thread")
00039 while(self.killSwitch == False):
00040 self.threadEvent.clear()
00041
00042 try:
00043
00044 try:
00045 (header, data) = self.parent.packetList.pop(0)
00046 except Exception:
00047 time.sleep(1)
00048
00049 else:
00050 decodedPacketDict = self.parent.decoder.decodePacket(header, data)
00051 self.parent.storageImpl.store(decodedPacketDict)
00052
00053 self.anythingElseProcessed = True
00054
00055
00056 if self.parent.timeToCommit == True and self.anythingElseProcessed == True:
00057 self.parent.timeToCommit = False
00058 self.parent.anythingElseProcessed = False
00059
00060 self.parent.storageImpl.commit()
00061
00062 except Exception, ex:
00063 logger.log(__name__ + ": There was an unknown error writing packet to database")
00064 logger.log(ex)
00065 finally:
00066 pass
00067
00068
00069 finally:
00070 self.parent.storageImpl.commit()
00071 self.parent.storageImpl.close()
00072 self.threadEvent.set()
00073 self.threadEvent.clear()
00074 logger.log(__name__ + ": Storage Write Thread is Done")
00075
00076
00077
00078
00079
00080
00081
00082
00083 class storageMonitorThread(appThreadBase):
00084
00085 def __init__(self, _parent, storageWriterThread):
00086 Thread.__init__(self)
00087 appThreadBase.__init__(self, _parent)
00088
00089 self.storageWriterThread = storageWriterThread
00090 self.sleepSoFar = 0
00091
00092 def run ( self ):
00093 logger.log(__name__ + ": Starting Storage Monitor Timer")
00094 self.firstTimeSizeCheck = True
00095
00096 try:
00097
00098 while(self.killSwitch == False):
00099
00100 self.threadEvent.clear()
00101 try:
00102 time.sleep(3)
00103 if self.parent.maxSize != -1:
00104 self.sleepSoFar += 3
00105 self.parent.timeToCommit = True
00106
00107 except Exception, ex:
00108 logger.log(__name__ + ": There was an error setting storage commit flag. Data will now be commited on this cycle")
00109 logger.log(ex)
00110
00111
00112 if self.firstTimeSizeCheck == True or self.sleepSoFar >= 30:
00113 self.sleepSoFar = 0
00114 self.firstTimeSizeCheck = False
00115
00116
00117 fileSze = self.parent.storageImpl.getStorageSizeBytes()
00118 if self.parent.maxSize != -1 and fileSze > (self.parent.maxSize * 1000000):
00119
00120 self.storageWriterThread.killSignal()
00121 self.killSwitch = True
00122
00123
00124 dlg = wx.MessageDialog(None, "The Trace Storage File has exceeded its maximum allowed size and no more data will be saved.\nTo increase capacity, set a new limit in the application options and restart the monitor", 'Error', wx.ICON_ERROR)
00125 result = dlg.ShowModal()
00126 dlg.Destroy()
00127 else:
00128 strMsg = "Storage File has not exceeded its max size yet -- Current size is [%d] Bytes" % fileSze
00129 logger.log(__name__ + ": " + strMsg)
00130
00131 finally:
00132 self.threadEvent.set()
00133 self.threadEvent.clear()
00134 logger.log(__name__ + ": Storage Monitor is Done")
00135
00136
00137
00138
00139
00140
00141
00142
00143 class storageManager(observerInterface):
00144
00145 def __init__(self, saveStorage, maxSize):
00146 self.storageImpl = sqlite3Impl(globalStrings.traceStoragePath)
00147
00148 self.decoder = packetDecoder()
00149 self.decoder.setDefaultReader()
00150
00151 self.saveStorage = saveStorage
00152 self.maxSize = maxSize
00153 self.lck = RLock()
00154
00155
00156 self.writer = storageWriterThread(self)
00157 self.monitor = storageMonitorThread(self, self.writer)
00158
00159 self.packetList = []
00160
00161 self.timeToCommit = False
00162
00163 self.cnt = 0
00164
00165
00166
00167
00168
00169
00170 def update(self, header, data):
00171
00172
00173
00174
00175 try:
00176 self.processPacket(header, data)
00177 except exception, ex:
00178 logger.log(__name__ + ": Could add packet onto storage queue")
00179 logger.log(ex)
00180
00181
00182
00183
00184 def initializeStorage(self):
00185 self.storageImpl.createStorage()
00186 self.storageImpl.clear()
00187
00188
00189
00190 def deleteStorage(self):
00191 self.storageImpl.deleteStorage()
00192
00193
00194
00195
00196 def startupStorage(self):
00197 if self.storageImpl.successful == True and self.saveStorage == True:
00198 self.__startThreads()
00199
00200
00201
00202
00203 def shutdownStorage(self):
00204 if self.storageImpl.successful == True and self.saveStorage == True:
00205 self.__stopThreads()
00206
00207
00208
00209
00210
00211
00212
00213 def processPacket(self, header, data):
00214
00215 if self.writer.getKillSignal() or self.monitor.getKillSignal():
00216 return
00217
00218 try:
00219 self.packetList.append((header, data))
00220 finally:
00221 pass
00222
00223
00224
00225
00226 def __startThreads(self):
00227 if self.__threadIsRunning() == True:
00228 return
00229
00230 self.writer = storageWriterThread(self)
00231 self.monitor = storageMonitorThread(self, self.writer)
00232
00233 self.writer.reset()
00234 self.monitor.reset()
00235
00236 self.writer.start()
00237 self.monitor.start()
00238
00239
00240
00241
00242 def __stopThreads(self):
00243
00244 if self.__threadIsRunning() == True:
00245
00246 self.writer.killSignal()
00247 self.monitor.killSignal()
00248
00249 self.writer.wait(10)
00250 self.monitor.wait(10)
00251
00252 if self.maxSize > 0:
00253 pass
00254
00255
00256
00257 def __threadIsRunning(self):
00258 if self.writer != None and self.writer.isAlive() == True:
00259 return True
00260 else:
00261 return False
00262
00263
00264
00265