From 8c4338bdb173a74cf1bd5936439b5dace25a8daf Mon Sep 17 00:00:00 2001 From: Zydox Date: Mon, 31 May 2010 00:15:45 +0200 Subject: [PATCH] DB: added the same format for stacktraces as for settings, PHP: modified the pages to work with the new stacktrace format --- backend.py | 97 +++++++++++++++++++++++++++++++++--------- php/logical/common.php | 25 +++++------ php/pages/Crashes.php | 15 ++++--- php/pages/Details.php | 2 +- php/pages/List.php | 7 +++ 5 files changed, 107 insertions(+), 39 deletions(-) diff --git a/backend.py b/backend.py index 3b31e4a..76277c0 100644 --- a/backend.py +++ b/backend.py @@ -36,7 +36,7 @@ class Crash(Base): contains_demo = Column( Boolean, default=False ) # settings = relation( 'Settings', order_by='Settings.setting.desc' ) - stacktrace = relation( 'Stacktrace', order_by='Stacktrace.frame' ) +# stacktrace = relation( 'Stacktrace', order_by='Stacktrace.frame' ) def __init__(self): self.date = datetime.datetime.now() @@ -70,16 +70,21 @@ class SettingsData(Base): class Stacktrace(Base): __tablename__ = 'stacktrace' - id = Column( Integer, ForeignKey( Crash.id ), primary_key=True ) - stacktrace_id = Column( Integer, primary_key=True ) - frame = Column( Integer ) + reportid = Column( Integer, ForeignKey( Crash.id ), primary_key=True ) + orderid = Column( Integer, primary_key=True ) + stacktraceid = Column( Integer ) type = Column( String(10)) line = Column( Integer ) + raw = Column( String(255) ) + + +class StacktraceData(Base): + __tablename__ = 'stacktracedata' + id = Column( Integer, primary_key=True ) file = Column( String(128) ) functionname = Column( String(128) ) - functionat = Column( String(16) ) + functionaddress = Column( String(16) ) address = Column( String(10) ) - raw = Column( String(255) ) class DbConfig(Base): @@ -128,7 +133,8 @@ def __init__(self,alchemy_uri,verbose=False): self.UpdateDBScheme( oldrev, current_db_rev ) self.SetDBRevision( current_db_rev ) self.getSettingIDCache = {} - + self.getStacktraceIDCache = {} + def UpdateDBScheme( self, oldrev, current_db_rev ): pass @@ -261,7 +267,7 @@ def parseZipMembers(self, fn, data, date_time = '' ): elif (is_stacktrace and re.search ('^\[[ 0-9]*\] \([0-9]*\) ', line)): stacktrace_id = stacktrace_id + 1 stacktrace_key = int (self.parseInfologSub ('^\[[ 0-9]*\]', line, 0)[1:-1]) - temp = {} + temp = {'function':None, 'functionat':None} value = self.parseInfologSub ('^\[[ 0-9]*\] ', line) value = value.split (' ') temp['line'] = value[0][1:-1] @@ -275,19 +281,42 @@ def parseZipMembers(self, fn, data, date_time = '' ): temp['file'] = temp['file'][max (temp['file'].rfind ('\\'), temp['file'].rfind ('/')) + 1:] stacktrace = Stacktrace() - stacktrace.id = crash.id - stacktrace.stacktrace_id = stacktrace_id - stacktrace.frame = stacktrace_key + stacktrace.reportid = crash.id + stacktrace.orderid = stacktrace_id + stacktrace.stacktraceid = self.getStacktraceID (session, temp['file'], temp['address'], temp['function'], temp['functionat']) stacktrace.type = stacktrace_type - stacktrace.raw = self.dbEncode (line) stacktrace.line = int (temp['line']) - stacktrace.file = temp['file'] - if (temp.has_key ('function')): - stacktrace.functionname = temp['function'] - if (temp.has_key ('functionat')): - stacktrace.functionat = temp['functionat'] - stacktrace.address = temp['address'] + stacktrace.raw = line stacktracelist.append ( stacktrace ) + +# stacktrace_id = stacktrace_id + 1 +# stacktrace_key = int (self.parseInfologSub ('^\[[ 0-9]*\]', line, 0)[1:-1]) +# temp = {} +# value = self.parseInfologSub ('^\[[ 0-9]*\] ', line) +# value = value.split (' ') +# temp['line'] = value[0][1:-1] +# temp['address'] = value[len (value) - 1][1:-1] +# if (value[len (value) - 2][-1] == ')'): +# temp['file'] = value[len (value) - 2][:value[len (value) - 2].rfind ('(')] +# temp['function'] = value[len (value) - 2][value[len (value) - 2].rfind ('(') + 1:value[len (value) - 2].rfind ('+')] +# temp['functionat'] = value[len (value) - 2][value[len (value) - 2].rfind ('+') + 1:-1] +# else: +# temp['file'] = value[len (value) - 2] +# temp['file'] = temp['file'][max (temp['file'].rfind ('\\'), temp['file'].rfind ('/')) + 1:] +# +# stacktrace = Stacktrace() +# stacktrace.id = crash.id +# stacktrace.stacktrace_id = stacktrace_id +# stacktrace.frame = stacktrace_key +# stacktrace.type = stacktrace_type +# stacktrace.raw = self.dbEncode (line) +# stacktrace.line = int (temp['line']) +# stacktrace.file = temp['file'] +# if (temp.has_key ('function')): +# stacktrace.functionname = temp['function'] +# if (temp.has_key ('functionat')): +# stacktrace.functionat = temp['functionat'] +# stacktrace.address = temp['address'] if (al_available_devices): crash.al_available_devices = self.dbEncode ("\n".join (al_available_devices)) @@ -358,4 +387,34 @@ def getSettingID (self, session, setting, value): settingsdata.value = value session.add( settingsdata ) session.commit() - return (settingsdata.id) \ No newline at end of file + return (settingsdata.id) + + + def getStacktraceID (self, session, file, address, functionname, functionaddress): + if self.getStacktraceIDCache.has_key (file): + if self.getStacktraceIDCache[file].has_key (address): + if self.getStacktraceIDCache[file][address].has_key (functionname): + if self.getStacktraceIDCache[file][address][functionname].has_key (functionaddress): + return (self.getStacktraceIDCache[file][address][functionname][functionaddress]) + + + id = session.query( StacktraceData.id ).filter( StacktraceData.file == file ).filter( StacktraceData.address == address ).filter ( StacktraceData.functionname == functionname ).filter ( StacktraceData.functionaddress == functionaddress ).first() + try: + if session.query( StacktraceData.id ).filter( and_ (StacktraceData.file == file, StacktraceData.address == address, StacktraceData.functionname == functionname, StacktraceData.functionaddress == functionaddress ) ).one(): + if not self.getStacktraceIDCache.has_key (file): + self.getStacktraceIDCache[file] = {} + if not self.getStacktraceIDCache[file].has_key (address): + self.getStacktraceIDCache[file][address] = {} + if not self.getStacktraceIDCache[file][address].has_key (functionname): + self.getStacktraceIDCache[file][address][functionname] = {} + self.getStacktraceIDCache[file][address][functionname][functionaddress] = id.id + return (id.id) + except: + stacktracedata = StacktraceData() + stacktracedata.file = file + stacktracedata.address = address + stacktracedata.functionname = functionname + stacktracedata.functionaddress = functionaddress + session.add( stacktracedata ) + session.commit() + return (stacktracedata.id) diff --git a/php/logical/common.php b/php/logical/common.php index f60686e..2c5e758 100644 --- a/php/logical/common.php +++ b/php/logical/common.php @@ -37,9 +37,9 @@ function GetSettings ($ID) { function GetStacktrace ($ID) { - $MySQL_Result = DB_Query ("SELECT * FROM stacktrace WHERE id='" . mysql_escape_string ($ID) . "'"); + $MySQL_Result = DB_Query ("SELECT stacktrace.orderid, stacktrace.raw, stacktracedata.* FROM stacktrace LEFT JOIN stacktracedata ON stacktrace.stacktraceid=stacktracedata.id WHERE reportid='" . mysql_escape_string ($ID) . "'"); while ($Data = mysql_fetch_assoc ($MySQL_Result)) - $Return[$Data['line']] = $Data; + $Return[$Data['orderid']] = $Data; return ($Return); } @@ -49,10 +49,10 @@ function GetCrashes () { $Crashed = join ("", mysql_fetch_assoc ($MySQL_Result)); $MySQL_Result = DB_Query ("SELECT settingsdata.id, settingsdata.setting, settingsdata.value, COUNT(records.id) AS Crashes FROM records LEFT JOIN settings ON records.id=settings.reportid LEFT JOIN settingsdata on settings.settingid=settingsdata.id WHERE crashed='1' GROUP BY settings.settingid"); while ($Data = mysql_fetch_assoc ($MySQL_Result)) - $Return['Settings'][$Data['setting']][$Data['value']] = array ("ID" => $Data['id'], "Reports" => $Data['Crashes'], "Percentage" => number_format ($Data['Crashes'] / $Crashed * 100, 1, ".", "")); - ksort ($Return['Settings']); - foreach (array_keys ($Return['Settings']) as $Setting) - ksort ($Return['Settings'][$Setting]); + $Return['Data'][$Data['setting']][$Data['value']] = array ("ID" => $Data['id'], "Reports" => $Data['Crashes'], "Percentage" => number_format ($Data['Crashes'] / $Crashed * 100, 1, ".", "")); + ksort ($Return['Data']); + foreach (array_keys ($Return['Data']) as $Setting) + ksort ($Return['Data'][$Setting]); return ($Return); } @@ -60,14 +60,15 @@ function GetCrashes () { function GetCrashes2 () { $MySQL_Result = DB_Query ("SELECT COUNT(id) FROM records WHERE crashed='1'"); $Crashed = join ("", mysql_fetch_assoc ($MySQL_Result)); - $MySQL_Result = DB_Query ("SELECT stacktrace.file, stacktrace.functionname, stacktrace.functionat, stacktrace.address, COUNT(records.id) AS Crashes FROM records LEFT JOIN stacktrace ON records.id=stacktrace.id WHERE crashed='1' GROUP BY stacktrace.file, stacktrace.functionname, stacktrace.functionat, stacktrace.address"); + $MySQL_Result = DB_Query ("SELECT stacktracedata.*, COUNT(records.id) AS Crashes FROM records LEFT JOIN stacktrace ON records.id=stacktrace.reportid AND stacktrace.orderid='1' LEFT JOIN stacktracedata ON stacktrace.stacktraceid=stacktracedata.id WHERE crashed='1' GROUP BY stacktrace.stacktraceid"); while ($Data = mysql_fetch_assoc ($MySQL_Result)) { - $Return['Settings'][$Data['file']][$Data['address']]['Reports'] += $Data['Crashes']; - $Return['Settings'][$Data['file']][$Data['address']]['Percentage'] = number_format ($Return['Settings'][$Data['file']][$Data['address']]['Reports'] / $Crashed * 100, 1, ".", ""); + $Return['Data'][$Data['file']][$Data['address']]['Reports'] += $Data['Crashes']; + $Return['Data'][$Data['file']][$Data['address']]['Percentage'] = number_format ($Return['Settings'][$Data['file']][$Data['address']]['Reports'] / $Crashed * 100, 1, ".", ""); + $Return['Data'][$Data['file']][$Data['address']]['ID'] = $Data['id']; } - ksort ($Return['Settings']); - foreach (array_keys ($Return['Settings']) as $Setting) - ksort ($Return['Settings'][$Setting]); + ksort ($Return['Data']); + foreach (array_keys ($Return['Data']) as $Setting) + ksort ($Return['Data'][$Setting]); return ($Return); } diff --git a/php/pages/Crashes.php b/php/pages/Crashes.php index 313b489..11c9149 100644 --- a/php/pages/Crashes.php +++ b/php/pages/Crashes.php @@ -1,5 +1,6 @@ "; @@ -10,23 +11,23 @@ SettingValueCrash reportsPercentage -"> +"> - - -% + + +% - + diff --git a/php/pages/List.php b/php/pages/List.php index a519e9b..c7ef666 100644 --- a/php/pages/List.php +++ b/php/pages/List.php @@ -14,6 +14,13 @@ $Join['LEFT JOIN settings ON records.id=settings.reportid'] = "LEFT JOIN settings ON records.id=settings.reportid"; $Where[] = "(" . join (" OR ", $NewWhere) . ")"; } + if (is_array ($Filter['stacktraceid'])) { + unset ($NewWhere); + foreach ($Filter['stacktraceid'] as $ID) + $NewWhere[] = "stacktrace.stacktraceid='" . mysql_escape_string ($ID) . "'"; + $Join['LEFT JOIN stacktrace ON records.id=stacktrace.reportid'] = "LEFT JOIN stacktrace ON records.id=stacktrace.reportid"; + $Where[] = "(" . join (" OR ", $NewWhere) . ")"; + } if (is_array ($Filter['crashed'])) { unset ($NewWhere); $NewWhere[] = "records.crashed='" . mysql_escape_string (key ($Filter['crashed'])) . "'";