예제 #1
0
    def __init__(self):
        self.mBlackboard = TBlackBoard()
        self.mLocation   = os.path.join(self.mBlackboard.mRootPath, 'database', 'traces.db')
        self.mCookie     = uuid.uuid1()
        self.mLevel      = 3
        self.mCount      = 100000
        self.mCid        = 0
        xExists          = os.path.isfile(self.mLocation)
        
        if not xExists:
            os.makedirs(os.path.join(self.mBlackboard.mRootPath, 'database'), exist_ok=True)
            
        xTraceDB = sqlite3.connect(self.mLocation)
        xCursor  = xTraceDB.cursor()
        
        if not xExists:
            # To convert timestamp use: datetime.datetime.fromtimestamp(1481201285)
            # xCursor.execute('create table TSession (CID integer PRIMARY KEY autoincrement, CStarttime timestamp, CArgs text)')
            xCursor.execute("""
                create table TTrace (
                    CID         integer PRIMARY KEY autoincrement,
                    CTraceTime  timestamp, 
                    CLevel      integer, 
                    CReason     text, 
                    CFileName   text, 
                    CFunction   text, 
                    CLine       integer, 
                    CAppErrNo   integer, 
                    CAppText    text)""")
        
        # Insert the start of the session as severity entry -1
        xFileName    = '/'.join( sys.argv[0].split(os.sep)[-3:] )
        xCursor.execute("""
                insert into TTrace (
                    CTraceTime, CLevel, CReason, CFileName, CFunction, CLine, CAppErrNo, CAppText) 
                    values (?, ?, ?, ?, ?, ?, ?, ?)""", 
                (time.time(), -1, 'Start', xFileName, 'main', '0', '0', '.'.join(sys.argv[1:])))
        
        self.mCid = xCursor.lastrowid
        
        # Prevent from overflow
        xCursor.execute("""
            delete from TTrace 
               where CTraceTime < (select CTraceTime from TTrace where CLevel = -1 order by CTraceTime DESC limit 1 offset 3)""") 
        
        # Table of sessions
        self.mSessionTable = TDbTable(self.mLocation, 
            {'select' :['CTraceTime as Start', 
                        """(select IFNULL( MIN(xtr.CTraceTime)-1, cast(STRFTIME("%s","now") as FLOAT) ) 
                            from   TTrace xtr  
                            where  xtr.CTraceTime > xtl.CTraceTime 
                            and    xtr.CLevel = -1 )""" + ' as End'], 
            'from'    :['TTrace xtl'], 
            'where'   : 'xtl.CLevel = -1'})

        # Table of traces
        self.mTracesTable = TDbTable(self.mLocation,
            {'select' :['CTraceTime as Time', 
                        'CLevel     as Level', 
                        'CReason    as Reason', 
                        'CFileName  as File',
                        'CFunction  as Function',
                        'CLine      as Line',
                        'CAppErrNo  as ErrorNo',
                        'CAppText   as Message'],
             'from'   :['TTrace'],
             'where'  : 'CTraceTime between ? and ?'}
            ) 
         
        xTraceDB.commit()
        xTraceDB.close()
예제 #2
0
class TTracer:
    # ------------------------------------------------------------------------------------
    # Create database and insert the start event into the trace
    # ------------------------------------------------------------------------------------
    def __init__(self):
        self.mBlackboard = TBlackBoard()
        self.mLocation   = os.path.join(self.mBlackboard.mRootPath, 'database', 'traces.db')
        self.mCookie     = uuid.uuid1()
        self.mLevel      = 3
        self.mCount      = 100000
        self.mCid        = 0
        xExists          = os.path.isfile(self.mLocation)
        
        if not xExists:
            os.makedirs(os.path.join(self.mBlackboard.mRootPath, 'database'), exist_ok=True)
            
        xTraceDB = sqlite3.connect(self.mLocation)
        xCursor  = xTraceDB.cursor()
        
        if not xExists:
            # To convert timestamp use: datetime.datetime.fromtimestamp(1481201285)
            # xCursor.execute('create table TSession (CID integer PRIMARY KEY autoincrement, CStarttime timestamp, CArgs text)')
            xCursor.execute("""
                create table TTrace (
                    CID         integer PRIMARY KEY autoincrement,
                    CTraceTime  timestamp, 
                    CLevel      integer, 
                    CReason     text, 
                    CFileName   text, 
                    CFunction   text, 
                    CLine       integer, 
                    CAppErrNo   integer, 
                    CAppText    text)""")
        
        # Insert the start of the session as severity entry -1
        xFileName    = '/'.join( sys.argv[0].split(os.sep)[-3:] )
        xCursor.execute("""
                insert into TTrace (
                    CTraceTime, CLevel, CReason, CFileName, CFunction, CLine, CAppErrNo, CAppText) 
                    values (?, ?, ?, ?, ?, ?, ?, ?)""", 
                (time.time(), -1, 'Start', xFileName, 'main', '0', '0', '.'.join(sys.argv[1:])))
        
        self.mCid = xCursor.lastrowid
        
        # Prevent from overflow
        xCursor.execute("""
            delete from TTrace 
               where CTraceTime < (select CTraceTime from TTrace where CLevel = -1 order by CTraceTime DESC limit 1 offset 3)""") 
        
        # Table of sessions
        self.mSessionTable = TDbTable(self.mLocation, 
            {'select' :['CTraceTime as Start', 
                        """(select IFNULL( MIN(xtr.CTraceTime)-1, cast(STRFTIME("%s","now") as FLOAT) ) 
                            from   TTrace xtr  
                            where  xtr.CTraceTime > xtl.CTraceTime 
                            and    xtr.CLevel = -1 )""" + ' as End'], 
            'from'    :['TTrace xtl'], 
            'where'   : 'xtl.CLevel = -1'})

        # Table of traces
        self.mTracesTable = TDbTable(self.mLocation,
            {'select' :['CTraceTime as Time', 
                        'CLevel     as Level', 
                        'CReason    as Reason', 
                        'CFileName  as File',
                        'CFunction  as Function',
                        'CLine      as Line',
                        'CAppErrNo  as ErrorNo',
                        'CAppText   as Message'],
             'from'   :['TTrace'],
             'where'  : 'CTraceTime between ? and ?'}
            ) 
         
        xTraceDB.commit()
        xTraceDB.close()
        
    # ------------------------------------------------------------------------------------
    # Set the trace level. 
    # The higher the level the more output is generated
    # ------------------------------------------------------------------------------------
    def setTraceLevel(self, aLevel):
        self.mLevel = aLevel

    # ------------------------------------------------------------------------------------
    # Method to be used in case of exceptions
    # ------------------------------------------------------------------------------------
    def writeException(self, aLevel, aJsnReturn):
        if self.mLevel < aLevel or self.mCount <= 0:
            return

        self.mCount -= 1

        xType, xValue, xTraceback = sys.exc_info()
        xList        = traceback.extract_tb( xTraceback, linit=10 )
        xLine        = xList[0]
        xAppErr      = aJsnReturn['return']['code']
        xAppMsg      = aJsnReturn['return']['value']
        xFileName    = '/'.join( xLine[0].split(os.sep)[-3:] )
        xLineNo      = xLine[1]
        xFunction    = xLine[2]
        xStatement   = xLine[3]        
        xCombinedMsg = '{}:{}:{}'.format(xAppMsg, xStatement, xValue)

        xTraceDB     = sqlite3.connect(self.mLocation)
        xCursor      = xTraceDB.cursor()
        xCursor.execute("""
            insert into TTrace (CTraceTime, CLevel, CReason, CFileName, CFunction, CLine, CAppErrNo, CAppText) 
                values (?, ?, ?, ?, ?, ?, ?, ?)""", 
            (time.time(), aLevel, xType.__name__, xFileName, xFunction, xLineNo, xAppErr, xCombinedMsg))
        xTraceDB.commit()
        xTraceDB.close()
        
    # ------------------------------------------------------------------------------------
    # Method to be used for traces
    # ------------------------------------------------------------------------------------
    def write(self, aLevel, aReason, aJsnReturn = None, aMessage = ''):
        if self.mLevel < aLevel or self.mCount <= 0:
            return
        
        self.mCount -= 1
        xList        = traceback.extract_stack(limit=10) 
        xIndex       = len(xList) - 2
               
        xEntry       = xList[xIndex]
        xLineNo      = xEntry[1]
        xFunction    = xEntry[2]
        xFileName    = '/'.join( xEntry[0].split(os.sep)[-3:] )
        xAppErr      = 0
        xAppMsg      = ''

        if aJsnReturn and aJsnReturn.get('return'):
            xAppErr  = aJsnReturn['return']['code']
            xAppMsg  = aJsnReturn['return']['value']
        
        xCombinedMsg = ':'.join( [xAppMsg, aMessage] )
            
        xTraceDB     = sqlite3.connect(self.mLocation)
        xCursor      = xTraceDB.cursor()
        xCursor.execute("""
            insert into TTrace (CTraceTime, CLevel, CReason, CFileName, CFunction, CLine, CAppErrNo, CAppText) 
                values (?, ?, ?, ?, ?, ?, ?, ?)""", 
            (time.time(), aLevel, aReason, xFileName, xFunction, xLineNo, xAppErr, xCombinedMsg))
        xTraceDB.commit()
        xTraceDB.close()

    # ------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------
    def get_selected_sessions(self, index=-1, visible_items=None, visible_block=None, convert_time=False):
        self.mSessionTable.get_selected_obj(index, visible_items, visible_block)
        xTable = self.mSessionTable

        if convert_time:
            xCols   = xTable.get_columns()
            xOutput = TTable(aColNames = xCols[0][1:])
            for xRow in xTable:
                xOutput.append( [ str( datetime.datetime.fromtimestamp(xRow[1]) ), 
                                  str( datetime.datetime.fromtimestamp(xRow[2]) ) ] )
            return xOutput
        return xTable
    
    # ------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------
    def get_selected_traces(self, index=-1, visible_items=None, visible_block=None):
        xSessions = self.get_selected_sessions(index, visible_items, visible_block)
        xInx, xStart, xEnd = xSessions.get_selected_row(index)
        return self.mTracesTable.get_selected_obj(index, visible_items, visible_block, (xStart, xEnd))

    # ------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------
    def get_dictionary(self):
        return dict()