mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-05-16 10:34:42 -04:00
Merge branch 'master' into location
This commit is contained in:
@@ -21,10 +21,11 @@ $columns = array('TimeKey', 'Component', 'ServerId', 'Pid', 'Code', 'Message', '
|
||||
$col_alt = array('DateTime', 'Server');
|
||||
|
||||
// Search contains a user entered string to search on
|
||||
$search = '';
|
||||
if ( isset($_REQUEST['search']) ) {
|
||||
$search = $_REQUEST['search'];
|
||||
}
|
||||
$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : '';
|
||||
|
||||
// Advanced search contains an array of "column name" => "search text" pairs
|
||||
// Bootstrap table sends json_ecoded array, which we must decode
|
||||
$advsearch = isset($_REQUEST['filter']) ? json_decode($_REQUEST['filter'], JSON_OBJECT_AS_ARRAY) : array();
|
||||
|
||||
// Sort specifies the name of the column to sort on
|
||||
$sort = 'TimeKey';
|
||||
@@ -65,7 +66,26 @@ $data = array();
|
||||
$query = array();
|
||||
$query['values'] = array();
|
||||
$likes = array();
|
||||
if ( $search != '' ) {
|
||||
$where = '';
|
||||
// There are two search bars in the log view, normal and advanced
|
||||
// Making an exuctive decision to ignore the normal search, when advanced search is in use
|
||||
// Alternatively we could try to do both
|
||||
if ( count($advsearch) ) {
|
||||
|
||||
foreach ( $advsearch as $col=>$text ) {
|
||||
if ( !in_array($col, array_merge($columns, $col_alt)) ) {
|
||||
ZM\Error("'$col' is not a sortable column name");
|
||||
continue;
|
||||
}
|
||||
$text = '%' .$text. '%';
|
||||
array_push($likes, $col.' LIKE ?');
|
||||
array_push($query['values'], $text);
|
||||
}
|
||||
$wherevalues = $query['values'];
|
||||
$where = ' WHERE (' .implode(' OR ', $likes). ')';
|
||||
|
||||
} else if ( $search != '' ) {
|
||||
|
||||
$search = '%' .$search. '%';
|
||||
foreach ( $columns as $col ) {
|
||||
array_push($likes, $col.' LIKE ?');
|
||||
@@ -73,20 +93,18 @@ if ( $search != '' ) {
|
||||
}
|
||||
$wherevalues = $query['values'];
|
||||
$where = ' WHERE (' .implode(' OR ', $likes). ')';
|
||||
$query['sql'] = 'SELECT ' .$col_str. ' FROM `' .$table. '` ' .$where. ' ORDER BY ' .$sort. ' ' .$order. ' LIMIT ?, ?';
|
||||
array_push($query['values'], $offset, $limit);
|
||||
} else {
|
||||
$query['sql'] = 'SELECT ' .$col_str. ' FROM `' .$table. '` ORDER BY ' .$sort. ' ' .$order. ' LIMIT ?, ?';
|
||||
$query['values'] = array($offset, $limit);
|
||||
}
|
||||
}
|
||||
|
||||
$query['sql'] = 'SELECT ' .$col_str. ' FROM `' .$table. '` ' .$where. ' ORDER BY ' .$sort. ' ' .$order. ' LIMIT ?, ?';
|
||||
array_push($query['values'], $offset, $limit);
|
||||
|
||||
//ZM\Warning('Calling the following sql query: ' .$query['sql']);
|
||||
|
||||
$data['totalNotFiltered'] = dbFetchOne('SELECT count(*) AS Total FROM ' .$table, 'Total');
|
||||
if ( $search == '' ) {
|
||||
$data['total'] = $data['totalNotFiltered'];
|
||||
} else {
|
||||
if ( $search != '' || count($advsearch) ) {
|
||||
$data['total'] = dbFetchOne('SELECT count(*) AS Total FROM ' .$table.$where , 'Total', $wherevalues);
|
||||
} else {
|
||||
$data['total'] = $data['totalNotFiltered'];
|
||||
}
|
||||
|
||||
if ( !$Servers )
|
||||
|
||||
@@ -50,10 +50,10 @@ class Filter extends ZM_Object {
|
||||
return $this->_sql;
|
||||
}
|
||||
|
||||
public function querystring() {
|
||||
if ( ! isset($this->_querystring) ) {
|
||||
public function querystring($separator='&') {
|
||||
if ( (! isset($this->_querystring)) or ( $separator != '&' ) ) {
|
||||
foreach ( $this->FilterTerms() as $term ) {
|
||||
$this->_querystring .= $term->querystring();
|
||||
$this->_querystring .= $term->querystring($separator);
|
||||
} # end foreach term
|
||||
}
|
||||
return $this->_querystring;
|
||||
@@ -308,6 +308,312 @@ class Filter extends ZM_Object {
|
||||
return $failed;
|
||||
}
|
||||
|
||||
function tree() {
|
||||
$terms = $this->terms();
|
||||
|
||||
if ( count($terms) <= 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$StorageArea = NULL;
|
||||
|
||||
$postfixExpr = array();
|
||||
$postfixStack = array();
|
||||
|
||||
$priorities = array(
|
||||
'<' => 1,
|
||||
'<=' => 1,
|
||||
'>' => 1,
|
||||
'>=' => 1,
|
||||
'=' => 2,
|
||||
'!=' => 2,
|
||||
'=~' => 2,
|
||||
'!~' => 2,
|
||||
'=[]' => 2,
|
||||
'![]' => 2,
|
||||
'and' => 3,
|
||||
'or' => 4,
|
||||
);
|
||||
|
||||
for ( $i = 0; $i < count($terms); $i++ ) {
|
||||
$term = $terms[$i];
|
||||
if ( !empty($term['cnj']) ) {
|
||||
while( true ) {
|
||||
if ( !count($postfixStack) ) {
|
||||
$postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
|
||||
break;
|
||||
} elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
|
||||
$postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
|
||||
break;
|
||||
} elseif ( $priorities[$term['cnj']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
|
||||
$postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
|
||||
break;
|
||||
} else {
|
||||
$postfixExpr[] = array_pop($postfixStack);
|
||||
}
|
||||
}
|
||||
} # end if ! empty cnj
|
||||
|
||||
if ( !empty($term['obr']) ) {
|
||||
for ( $j = 0; $j < $term['obr']; $j++ ) {
|
||||
$postfixStack[] = array('type'=>'obr', 'value'=>$term['obr']);
|
||||
}
|
||||
}
|
||||
if ( !empty($term['attr']) ) {
|
||||
$dtAttr = false;
|
||||
switch ( $term['attr']) {
|
||||
case 'MonitorName':
|
||||
$sqlValue = 'M.'.preg_replace( '/^Monitor/', '', $term['attr']);
|
||||
break;
|
||||
case 'ServerId':
|
||||
$sqlValue .= 'M.ServerId';
|
||||
break;
|
||||
case 'StorageServerId':
|
||||
$sqlValue .= 'S.ServerId';
|
||||
break;
|
||||
case 'FilterServerId':
|
||||
$sqlValue .= ZM_SERVER_ID;
|
||||
break;
|
||||
case 'DateTime':
|
||||
case 'StartDateTime':
|
||||
$sqlValue = 'E.StartTime';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'Date':
|
||||
case 'StartDate':
|
||||
$sqlValue = 'to_days(E.StartTime)';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'Time':
|
||||
case 'StartTime':
|
||||
$sqlValue = 'extract(hour_second from E.StartTime)';
|
||||
break;
|
||||
case 'Weekday':
|
||||
case 'StartWeekday':
|
||||
$sqlValue = 'weekday(E.StartTime)';
|
||||
break;
|
||||
case 'EndDateTime':
|
||||
$sqlValue = 'E.EndTime';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'EndDate':
|
||||
$sqlValue = 'to_days(E.EndTime)';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'EndTime':
|
||||
$sqlValue = 'extract(hour_second from E.EndTime)';
|
||||
break;
|
||||
case 'EndWeekday':
|
||||
$sqlValue = 'weekday(E.EndTime)';
|
||||
break;
|
||||
case 'Id':
|
||||
case 'Name':
|
||||
case 'MonitorId':
|
||||
case 'StorageId':
|
||||
case 'SecondaryStorageId':
|
||||
case 'Length':
|
||||
case 'Frames':
|
||||
case 'AlarmFrames':
|
||||
case 'TotScore':
|
||||
case 'AvgScore':
|
||||
case 'MaxScore':
|
||||
case 'Cause':
|
||||
case 'Notes':
|
||||
case 'StateId':
|
||||
case 'Archived':
|
||||
$sqlValue = 'E.'.$term['attr'];
|
||||
break;
|
||||
case 'DiskPercent':
|
||||
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
||||
if ( ! $StorageArea ) {
|
||||
for ( $j = 0; $j < count($terms); $j++ ) {
|
||||
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
||||
$StorageArea = new Storage($terms[$j]['val']);
|
||||
break;
|
||||
}
|
||||
} // end foreach remaining term
|
||||
if ( ! $StorageArea ) $StorageArea = new Storage();
|
||||
} // end no StorageArea found yet
|
||||
$sqlValue = getDiskPercent($StorageArea);
|
||||
break;
|
||||
case 'DiskBlocks':
|
||||
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
||||
if ( ! $StorageArea ) {
|
||||
for ( $j = 0; $j < count($terms); $j++ ) {
|
||||
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
||||
$StorageArea = new Storage($terms[$j]['val']);
|
||||
break;
|
||||
}
|
||||
} // end foreach remaining term
|
||||
if ( ! $StorageArea ) $StorageArea = new Storage();
|
||||
} // end no StorageArea found yet
|
||||
$sqlValue = getDiskBlocks($StorageArea);
|
||||
break;
|
||||
default :
|
||||
$sqlValue = $term['attr'];
|
||||
break;
|
||||
}
|
||||
if ( $dtAttr ) {
|
||||
$postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue, 'dtAttr'=>true);
|
||||
} else {
|
||||
$postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue);
|
||||
}
|
||||
} # end if attr
|
||||
|
||||
if ( isset($term['op']) ) {
|
||||
if ( empty($term['op']) ) {
|
||||
$term['op'] = '=';
|
||||
}
|
||||
switch ( $term['op']) {
|
||||
case '=' :
|
||||
case '!=' :
|
||||
case '>=' :
|
||||
case '>' :
|
||||
case '<' :
|
||||
case '<=' :
|
||||
case 'LIKE' :
|
||||
case 'NOT LIKE':
|
||||
$sqlValue = $term['op'];
|
||||
break;
|
||||
case '=~' :
|
||||
$sqlValue = 'regexp';
|
||||
break;
|
||||
case '!~' :
|
||||
$sqlValue = 'not regexp';
|
||||
break;
|
||||
case '=[]' :
|
||||
case 'IN' :
|
||||
$sqlValue = 'in (';
|
||||
break;
|
||||
case '![]' :
|
||||
$sqlValue = 'not in (';
|
||||
break;
|
||||
case 'IS' :
|
||||
case 'IS NOT' :
|
||||
if ( $term['val'] == 'Odd' ) {
|
||||
$sqlValue .= ' % 2 = 1';
|
||||
} else if ( $term['val'] == 'Even' ) {
|
||||
$sqlValue .= ' % 2 = 0';
|
||||
} else {
|
||||
$sqlValue .= ' '.$term['op'];
|
||||
}
|
||||
break;
|
||||
default :
|
||||
ZM\Error('Unknown operator in filter '.$term['op']);
|
||||
}
|
||||
|
||||
while( true ) {
|
||||
if ( !count($postfixStack) ) {
|
||||
$postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
|
||||
break;
|
||||
} elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
|
||||
$postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
|
||||
break;
|
||||
} elseif ( $priorities[$term['op']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
|
||||
$postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue );
|
||||
break;
|
||||
} else {
|
||||
$postfixExpr[] = array_pop($postfixStack);
|
||||
}
|
||||
} // end while
|
||||
} // end if operator
|
||||
|
||||
if ( isset($term['val']) ) {
|
||||
$valueList = array();
|
||||
foreach ( preg_split('/["\'\s]*?,["\'\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $term['val'])) as $value ) {
|
||||
switch ( $term['attr'] ) {
|
||||
case 'MonitorName':
|
||||
case 'Name':
|
||||
case 'Cause':
|
||||
case 'Notes':
|
||||
if ( $term['op'] == 'LIKE' || $term['op'] == 'NOT LIKE' ) {
|
||||
$value = '%'.$value.'%';
|
||||
}
|
||||
$value = dbEscape($value);
|
||||
break;
|
||||
case 'MonitorServerId':
|
||||
case 'FilterServerId':
|
||||
case 'StorageServerId':
|
||||
case 'ServerId':
|
||||
if ( $value == 'ZM_SERVER_ID' ) {
|
||||
$value = ZM_SERVER_ID;
|
||||
} else if ( $value == 'NULL' ) {
|
||||
|
||||
} else {
|
||||
$value = dbEscape($value);
|
||||
}
|
||||
break;
|
||||
case 'StorageId':
|
||||
$StorageArea = new Storage($value);
|
||||
if ( $value != 'NULL' )
|
||||
$value = dbEscape($value);
|
||||
break;
|
||||
case 'DateTime':
|
||||
case 'EndDateTime':
|
||||
case 'StartDateTime':
|
||||
$value = "'".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."'";
|
||||
break;
|
||||
case 'Date':
|
||||
case 'EndDate':
|
||||
case 'StartDate':
|
||||
$value = 'to_days(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
|
||||
break;
|
||||
case 'Time':
|
||||
case 'EndTime':
|
||||
case 'StartTime':
|
||||
$value = 'extract(hour_second from \''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
|
||||
break;
|
||||
case 'Weekday':
|
||||
case 'EndWeekday':
|
||||
case 'StartWeekday':
|
||||
$value = 'weekday(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
|
||||
break;
|
||||
default :
|
||||
if ( $value != 'NULL' )
|
||||
$value = dbEscape($value);
|
||||
} // end switch attribute
|
||||
$valueList[] = $value;
|
||||
} // end foreach value
|
||||
$postfixExpr[] = array('type'=>'val', 'value'=>$term['val'], 'sqlValue'=>join(',', $valueList));
|
||||
} // end if has val
|
||||
|
||||
if ( !empty($term['cbr']) ) {
|
||||
for ( $j = 0; $j < $term['cbr']; $j++ ) {
|
||||
while ( count($postfixStack) ) {
|
||||
$element = array_pop($postfixStack);
|
||||
if ( $element['type'] == 'obr' ) {
|
||||
$postfixExpr[count($postfixExpr)-1]['bracket'] = true;
|
||||
break;
|
||||
}
|
||||
$postfixExpr[] = $element;
|
||||
}
|
||||
}
|
||||
} #end if cbr
|
||||
} # end foreach term
|
||||
|
||||
while ( count($postfixStack) ) {
|
||||
$postfixExpr[] = array_pop($postfixStack);
|
||||
}
|
||||
|
||||
$exprStack = array();
|
||||
foreach ( $postfixExpr as $element ) {
|
||||
if ( $element['type'] == 'attr' || $element['type'] == 'val' ) {
|
||||
$node = array('data'=>$element, 'count'=>0);
|
||||
$exprStack[] = $node;
|
||||
} elseif ( $element['type'] == 'op' || $element['type'] == 'cnj' ) {
|
||||
$right = array_pop($exprStack);
|
||||
$left = array_pop($exprStack);
|
||||
$node = array('data'=>$element, 'count'=>2+$left['count']+$right['count'], 'right'=>$right, 'left'=>$left);
|
||||
$exprStack[] = $node;
|
||||
} else {
|
||||
ZM\Fatal('Unexpected element type \''.$element['type'].'\', value \''.$element['value'].'\'');
|
||||
}
|
||||
}
|
||||
if ( count($exprStack) != 1 ) {
|
||||
ZM\Fatal('Expression stack has '.count($exprStack).' elements');
|
||||
}
|
||||
return array_pop($exprStack);
|
||||
} # end function tree
|
||||
|
||||
} # end class Filter
|
||||
|
||||
|
||||
@@ -1109,7 +1109,7 @@ function parseFilter(&$filter, $saveToSession=false, $querySep='&') {
|
||||
$Filter = ZM\Filter::parse($filter, $querySep);
|
||||
|
||||
$filter['sql'] = $Filter->sql();
|
||||
$filter['querystring'] = $Filter->querystring();
|
||||
$filter['querystring'] = $Filter->querystring($querySep);
|
||||
$filter['hidden_fields'] = $Filter->hidden_fields();
|
||||
$filter['pre_sql_conditions'] = $Filter->pre_sql_conditions();
|
||||
$filter['post_sql_conditions'] = $Filter->post_sql_conditions();
|
||||
|
||||
52
web/skins/classic/css/base/views/newlog.css
Normal file
52
web/skins/classic/css/base/views/newlog.css
Normal file
@@ -0,0 +1,52 @@
|
||||
#logSummary {
|
||||
font-size:10px;
|
||||
}
|
||||
|
||||
#logSummary tr {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#logSummary td {
|
||||
border: 1px solid #7f7fb2;
|
||||
padding: 0 6px;
|
||||
font-size: 10px;
|
||||
line-height: 15px;
|
||||
}
|
||||
|
||||
tr.log-fat td {
|
||||
background-color:#ffcccc;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
tr.bg-danger,
|
||||
tr.log-err td {
|
||||
background-color:#ffcccc !important;
|
||||
}
|
||||
|
||||
tr.log-war td {
|
||||
background-color: #ffe4b5;
|
||||
}
|
||||
|
||||
tr.log-dbg td {
|
||||
color: #666666;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
#exportLog label {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#exportLog input[type=radio] {
|
||||
margin-right: 4px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#exportError {
|
||||
display: none;
|
||||
color: #dc143c;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
#exportErrorText {
|
||||
}
|
||||
@@ -43,316 +43,6 @@ function getSlotFrame($slot) {
|
||||
return $slotFrame;
|
||||
}
|
||||
|
||||
function parseFilterToTree($filter) {
|
||||
if ( count($filter['terms']) <= 0 ) {
|
||||
return false;
|
||||
}
|
||||
$terms = $filter['terms'];
|
||||
|
||||
$StorageArea = NULL;
|
||||
|
||||
$postfixExpr = array();
|
||||
$postfixStack = array();
|
||||
|
||||
$priorities = array(
|
||||
'<' => 1,
|
||||
'<=' => 1,
|
||||
'>' => 1,
|
||||
'>=' => 1,
|
||||
'=' => 2,
|
||||
'!=' => 2,
|
||||
'=~' => 2,
|
||||
'!~' => 2,
|
||||
'=[]' => 2,
|
||||
'![]' => 2,
|
||||
'and' => 3,
|
||||
'or' => 4,
|
||||
);
|
||||
|
||||
for ( $i = 0; $i < count($terms); $i++ ) {
|
||||
$term = $terms[$i];
|
||||
if ( !empty($term['cnj']) ) {
|
||||
while( true ) {
|
||||
if ( !count($postfixStack) ) {
|
||||
$postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
|
||||
break;
|
||||
} elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
|
||||
$postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
|
||||
break;
|
||||
} elseif ( $priorities[$term['cnj']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
|
||||
$postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
|
||||
break;
|
||||
} else {
|
||||
$postfixExpr[] = array_pop($postfixStack);
|
||||
}
|
||||
}
|
||||
} # end if ! empty cnj
|
||||
|
||||
if ( !empty($term['obr']) ) {
|
||||
for ( $j = 0; $j < $term['obr']; $j++ ) {
|
||||
$postfixStack[] = array('type'=>'obr', 'value'=>$term['obr']);
|
||||
}
|
||||
}
|
||||
if ( !empty($term['attr']) ) {
|
||||
$dtAttr = false;
|
||||
switch ( $term['attr']) {
|
||||
case 'MonitorName':
|
||||
$sqlValue = 'M.'.preg_replace( '/^Monitor/', '', $term['attr']);
|
||||
break;
|
||||
case 'ServerId':
|
||||
$sqlValue .= 'M.ServerId';
|
||||
break;
|
||||
case 'StorageServerId':
|
||||
$sqlValue .= 'S.ServerId';
|
||||
break;
|
||||
case 'FilterServerId':
|
||||
$sqlValue .= ZM_SERVER_ID;
|
||||
break;
|
||||
case 'DateTime':
|
||||
case 'StartDateTime':
|
||||
$sqlValue = 'E.StartTime';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'Date':
|
||||
case 'StartDate':
|
||||
$sqlValue = 'to_days(E.StartTime)';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'Time':
|
||||
case 'StartTime':
|
||||
$sqlValue = 'extract(hour_second from E.StartTime)';
|
||||
break;
|
||||
case 'Weekday':
|
||||
case 'StartWeekday':
|
||||
$sqlValue = 'weekday(E.StartTime)';
|
||||
break;
|
||||
case 'EndDateTime':
|
||||
$sqlValue = 'E.EndTime';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'EndDate':
|
||||
$sqlValue = 'to_days(E.EndTime)';
|
||||
$dtAttr = true;
|
||||
break;
|
||||
case 'EndTime':
|
||||
$sqlValue = 'extract(hour_second from E.EndTime)';
|
||||
break;
|
||||
case 'EndWeekday':
|
||||
$sqlValue = 'weekday(E.EndTime)';
|
||||
break;
|
||||
case 'Id':
|
||||
case 'Name':
|
||||
case 'MonitorId':
|
||||
case 'StorageId':
|
||||
case 'SecondaryStorageId':
|
||||
case 'Length':
|
||||
case 'Frames':
|
||||
case 'AlarmFrames':
|
||||
case 'TotScore':
|
||||
case 'AvgScore':
|
||||
case 'MaxScore':
|
||||
case 'Cause':
|
||||
case 'Notes':
|
||||
case 'StateId':
|
||||
case 'Archived':
|
||||
$sqlValue = 'E.'.$term['attr'];
|
||||
break;
|
||||
case 'DiskPercent':
|
||||
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
||||
if ( ! $StorageArea ) {
|
||||
for ( $j = 0; $j < count($terms); $j++ ) {
|
||||
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
||||
$StorageArea = new Storage($terms[$j]['val']);
|
||||
break;
|
||||
}
|
||||
} // end foreach remaining term
|
||||
if ( ! $StorageArea ) $StorageArea = new Storage();
|
||||
} // end no StorageArea found yet
|
||||
$sqlValue = getDiskPercent($StorageArea);
|
||||
break;
|
||||
case 'DiskBlocks':
|
||||
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
||||
if ( ! $StorageArea ) {
|
||||
for ( $j = 0; $j < count($terms); $j++ ) {
|
||||
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
||||
$StorageArea = new Storage($terms[$j]['val']);
|
||||
break;
|
||||
}
|
||||
} // end foreach remaining term
|
||||
if ( ! $StorageArea ) $StorageArea = new Storage();
|
||||
} // end no StorageArea found yet
|
||||
$sqlValue = getDiskBlocks($StorageArea);
|
||||
break;
|
||||
default :
|
||||
$sqlValue = $term['attr'];
|
||||
break;
|
||||
}
|
||||
if ( $dtAttr ) {
|
||||
$postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue, 'dtAttr'=>true);
|
||||
} else {
|
||||
$postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue);
|
||||
}
|
||||
} # end if attr
|
||||
|
||||
if ( isset($term['op']) ) {
|
||||
if ( empty($term['op']) ) {
|
||||
$term['op'] = '=';
|
||||
}
|
||||
switch ( $term['op']) {
|
||||
case '=' :
|
||||
case '!=' :
|
||||
case '>=' :
|
||||
case '>' :
|
||||
case '<' :
|
||||
case '<=' :
|
||||
case 'LIKE' :
|
||||
case 'NOT LIKE':
|
||||
$sqlValue = $term['op'];
|
||||
break;
|
||||
case '=~' :
|
||||
$sqlValue = 'regexp';
|
||||
break;
|
||||
case '!~' :
|
||||
$sqlValue = 'not regexp';
|
||||
break;
|
||||
case '=[]' :
|
||||
case 'IN' :
|
||||
$sqlValue = 'in (';
|
||||
break;
|
||||
case '![]' :
|
||||
$sqlValue = 'not in (';
|
||||
break;
|
||||
case 'IS' :
|
||||
case 'IS NOT' :
|
||||
if ( $term['val'] == 'Odd' ) {
|
||||
$sqlValue .= ' % 2 = 1';
|
||||
} else if ( $term['val'] == 'Even' ) {
|
||||
$sqlValue .= ' % 2 = 0';
|
||||
} else {
|
||||
$sqlValue .= ' '.$term['op'];
|
||||
}
|
||||
break;
|
||||
default :
|
||||
ZM\Error('Unknown operator in filter '.$term['op']);
|
||||
}
|
||||
while( true ) {
|
||||
if ( !count($postfixStack) ) {
|
||||
$postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
|
||||
break;
|
||||
} elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
|
||||
$postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
|
||||
break;
|
||||
} elseif ( $priorities[$term['op']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
|
||||
$postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue );
|
||||
break;
|
||||
} else {
|
||||
$postfixExpr[] = array_pop($postfixStack);
|
||||
}
|
||||
} // end while
|
||||
} // end if operator
|
||||
|
||||
if ( isset($term['val']) ) {
|
||||
$valueList = array();
|
||||
foreach ( preg_split('/["\'\s]*?,["\'\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $term['val'])) as $value ) {
|
||||
switch ( $term['attr'] ) {
|
||||
case 'MonitorName':
|
||||
case 'Name':
|
||||
case 'Cause':
|
||||
case 'Notes':
|
||||
if ( $term['op'] == 'LIKE' || $term['op'] == 'NOT LIKE' ) {
|
||||
$value = '%'.$value.'%';
|
||||
}
|
||||
$value = dbEscape($value);
|
||||
break;
|
||||
case 'MonitorServerId':
|
||||
case 'FilterServerId':
|
||||
case 'StorageServerId':
|
||||
case 'ServerId':
|
||||
if ( $value == 'ZM_SERVER_ID' ) {
|
||||
$value = ZM_SERVER_ID;
|
||||
} else if ( $value == 'NULL' ) {
|
||||
|
||||
} else {
|
||||
$value = dbEscape($value);
|
||||
}
|
||||
break;
|
||||
case 'StorageId':
|
||||
$StorageArea = new Storage($value);
|
||||
if ( $value != 'NULL' )
|
||||
$value = dbEscape($value);
|
||||
break;
|
||||
case 'DateTime':
|
||||
case 'EndDateTime':
|
||||
case 'StartDateTime':
|
||||
$value = "'".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."'";
|
||||
break;
|
||||
case 'Date':
|
||||
case 'EndDate':
|
||||
case 'StartDate':
|
||||
$value = 'to_days(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
|
||||
break;
|
||||
case 'Time':
|
||||
case 'EndTime':
|
||||
case 'StartTime':
|
||||
$value = 'extract(hour_second from \''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
|
||||
break;
|
||||
case 'Weekday':
|
||||
case 'EndWeekday':
|
||||
case 'StartWeekday':
|
||||
$value = 'weekday(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
|
||||
break;
|
||||
default :
|
||||
if ( $value != 'NULL' )
|
||||
$value = dbEscape($value);
|
||||
} // end switch attribute
|
||||
$valueList[] = $value;
|
||||
} // end foreach value
|
||||
$postfixExpr[] = array('type'=>'val', 'value'=>$term['val'], 'sqlValue'=>join(',', $valueList));
|
||||
} // end if has val
|
||||
|
||||
if ( !empty($term['cbr']) ) {
|
||||
for ( $j = 0; $j < $term['cbr']; $j++ ) {
|
||||
while ( count($postfixStack) ) {
|
||||
$element = array_pop($postfixStack);
|
||||
if ( $element['type'] == 'obr' ) {
|
||||
$postfixExpr[count($postfixExpr)-1]['bracket'] = true;
|
||||
break;
|
||||
}
|
||||
$postfixExpr[] = $element;
|
||||
}
|
||||
}
|
||||
} #end if cbr
|
||||
} # end foreach term
|
||||
|
||||
while ( count($postfixStack) ) {
|
||||
$postfixExpr[] = array_pop($postfixStack);
|
||||
}
|
||||
|
||||
$exprStack = array();
|
||||
//foreach ( $postfixExpr as $element )
|
||||
//{
|
||||
//echo $element['value'].' ';
|
||||
//}
|
||||
//echo "<br>";
|
||||
foreach ( $postfixExpr as $element ) {
|
||||
if ( $element['type'] == 'attr' || $element['type'] == 'val' ) {
|
||||
$node = array('data'=>$element, 'count'=>0);
|
||||
$exprStack[] = $node;
|
||||
} elseif ( $element['type'] == 'op' || $element['type'] == 'cnj' ) {
|
||||
$right = array_pop($exprStack);
|
||||
$left = array_pop($exprStack);
|
||||
$node = array('data'=>$element, 'count'=>2+$left['count']+$right['count'], 'right'=>$right, 'left'=>$left);
|
||||
$exprStack[] = $node;
|
||||
} else {
|
||||
ZM\Fatal('Unexpected element type \''.$element['type'].'\', value \''.$element['value'].'\'');
|
||||
}
|
||||
}
|
||||
if ( count($exprStack) != 1 ) {
|
||||
ZM\Fatal('Expression stack has '.count($exprStack).' elements');
|
||||
}
|
||||
return array_pop($exprStack);
|
||||
}
|
||||
|
||||
function _parseTreeToInfix($node) {
|
||||
$expression = '';
|
||||
if ( isset($node) ) {
|
||||
@@ -443,7 +133,7 @@ function parseTreeToFilter($tree) {
|
||||
function parseTreeToQuery($tree) {
|
||||
$filter = parseTreeToFilter($tree);
|
||||
parseFilter($filter, false, '&');
|
||||
return $filter['query'];
|
||||
return $filter['querystring'];
|
||||
}
|
||||
|
||||
function _drawTree($node, $level) {
|
||||
|
||||
@@ -23,6 +23,22 @@
|
||||
//
|
||||
var popupOptions = "resizable,scrollbars,status=no,toolbar=yes";
|
||||
|
||||
// Globally define the icons used in the bootstrap-table top-right toolbar
|
||||
var icons = {
|
||||
paginationSwitchDown: 'fa-caret-square-o-down',
|
||||
paginationSwitchUp: 'fa-caret-square-o-up',
|
||||
export: 'fa-download',
|
||||
refresh: 'fa-retweet',
|
||||
autoRefresh: 'fa-clock-o',
|
||||
advancedSearchIcon: 'fa-chevron-down',
|
||||
toggleOff: 'fa-toggle-off',
|
||||
toggleOn: 'fa-toggle-on',
|
||||
columns: 'fa-th-list',
|
||||
fullscreen: 'fa-arrows-alt',
|
||||
detailOpen: 'fa-plus',
|
||||
detailClose: 'fa-minus'
|
||||
};
|
||||
|
||||
function checkSize() {
|
||||
if ( 0 ) {
|
||||
if (window.outerHeight) {
|
||||
|
||||
@@ -106,20 +106,6 @@ function initPage() {
|
||||
// Load the delete confirmation modal into the DOM
|
||||
getDelConfirmModal();
|
||||
|
||||
// Define the icons used in the bootstrap-table top-right toolbar
|
||||
var icons = {
|
||||
paginationSwitchDown: 'fa-caret-square-o-down',
|
||||
paginationSwitchUp: 'fa-caret-square-o-up',
|
||||
export: 'fa-download',
|
||||
refresh: 'fa-sync',
|
||||
toggleOff: 'fa-toggle-off',
|
||||
toggleOn: 'fa-toggle-on',
|
||||
columns: 'fa-th-list',
|
||||
fullscreen: 'fa-arrows-alt',
|
||||
detailOpen: 'fa-plus',
|
||||
detailClose: 'fa-minus'
|
||||
};
|
||||
|
||||
// Init the bootstrap-table
|
||||
table.bootstrapTable({icons: icons});
|
||||
|
||||
|
||||
@@ -38,20 +38,6 @@ function initPage() {
|
||||
var backBtn = $j('#backBtn');
|
||||
var table = $j('#framesTable');
|
||||
|
||||
// Define the icons used in the bootstrap-table top-right toolbar
|
||||
var icons = {
|
||||
paginationSwitchDown: 'fa-caret-square-o-down',
|
||||
paginationSwitchUp: 'fa-caret-square-o-up',
|
||||
export: 'fa-download',
|
||||
refresh: 'fa-sync',
|
||||
toggleOff: 'fa-toggle-off',
|
||||
toggleOn: 'fa-toggle-on',
|
||||
columns: 'fa-th-list',
|
||||
fullscreen: 'fa-arrows-alt',
|
||||
detailOpen: 'fa-plus',
|
||||
detailClose: 'fa-minus'
|
||||
};
|
||||
|
||||
// Init the bootstrap-table
|
||||
table.bootstrapTable({icons: icons});
|
||||
|
||||
|
||||
@@ -13,6 +13,11 @@ var params =
|
||||
"order":"asc",
|
||||
"offset":0,
|
||||
"limit":25
|
||||
"filter":
|
||||
{
|
||||
"message":"some advanced search text"
|
||||
"level":"some more advanced search text"
|
||||
}
|
||||
},
|
||||
"cache":true,
|
||||
"contentType":"application/json",
|
||||
@@ -23,14 +28,11 @@ var params =
|
||||
// Called by bootstrap-table to retrieve zm log data
|
||||
function ajaxRequest(params) {
|
||||
$j.getJSON(thisUrl + '?view=request&request=newlog&task=query', params.data)
|
||||
.done(function(res) {
|
||||
//console.log('total: ' + res.total);
|
||||
//console.log('totalNotFiltered: ' + res.totalNotFiltered);
|
||||
console.log(JSON.stringify(params));
|
||||
.done(function(data) {
|
||||
//console.log('Ajax parameters: ' + JSON.stringify(params));
|
||||
// rearrange the result into what bootstrap-table expects
|
||||
var data = {total: res.total, totalNotFiltered: res.totalNotFiltered, rows: res.rows};
|
||||
params.success(data);
|
||||
updateHeaderStats(res);
|
||||
params.success({total: data.total, totalNotFiltered: data.totalNotFiltered, rows: data.rows});
|
||||
updateHeaderStats(data);
|
||||
})
|
||||
.fail(logAjaxFail);
|
||||
}
|
||||
@@ -57,22 +59,6 @@ function updateHeaderStats(data) {
|
||||
function initPage() {
|
||||
var backBtn = $j('#backBtn');
|
||||
|
||||
// Define the icons used in the bootstrap-table top-right toolbar
|
||||
var icons = {
|
||||
paginationSwitchDown: 'fa-caret-square-o-down',
|
||||
paginationSwitchUp: 'fa-caret-square-o-up',
|
||||
export: 'fa-download',
|
||||
refresh: 'fa-refresh',
|
||||
autoRefresh: 'fa-clock-o',
|
||||
advancedSearchIcon: 'fa-chevron-down',
|
||||
toggleOff: 'fa-toggle-off',
|
||||
toggleOn: 'fa-toggle-on',
|
||||
columns: 'fa-th-list',
|
||||
fullscreen: 'fa-arrows-alt',
|
||||
detailOpen: 'fa-plus',
|
||||
detailClose: 'fa-minus'
|
||||
};
|
||||
|
||||
// Init the bootstrap-table with custom icons
|
||||
table.bootstrapTable({icons: icons});
|
||||
|
||||
@@ -91,6 +77,7 @@ function initPage() {
|
||||
row.addClass('bg-warning');
|
||||
} else if ( level == 'DBG' ) {
|
||||
row.addClass('bg-info');
|
||||
row.addClass('font-italic');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -29,10 +29,6 @@ xhtmlHeaders(__FILE__, translate('SystemLog'));
|
||||
<?php echo getNavBarHTML() ?>
|
||||
<div id="page" class="px-3">
|
||||
|
||||
<div> <!-- DELETE ME -->
|
||||
<h3>UNDER CONSTRUTION - This view is not yet fully functional</h3>
|
||||
</div>
|
||||
|
||||
<div id="logSummary" class="text-center">
|
||||
<?php echo translate('State') ?>: <span id="logState"></span> -
|
||||
<?php echo translate('Total') ?>: <span id="totalLogs"></span> -
|
||||
@@ -71,7 +67,7 @@ xhtmlHeaders(__FILE__, translate('SystemLog'));
|
||||
data-auto-refresh="true"
|
||||
data-auto-refresh-silent="true"
|
||||
data-show-refresh="true"
|
||||
data-auto-refresh-interval="2"
|
||||
data-auto-refresh-interval="5"
|
||||
>
|
||||
<thead class="thead-highlight">
|
||||
<tr>
|
||||
|
||||
@@ -142,8 +142,11 @@ if ( !empty($user['MonitorIds']) ) {
|
||||
}
|
||||
|
||||
$tree = false;
|
||||
if ( isset($_REQUEST['filter']) )
|
||||
$tree = parseFilterToTree($_REQUEST['filter']['Query']);
|
||||
if ( isset($_REQUEST['filter']) ) {
|
||||
$filter = ZM\Filter::parse($_REQUEST['filter']);
|
||||
$tree = $filter->tree();
|
||||
ZM\Warning("Parse tree: " . print_r($tree,true));
|
||||
}
|
||||
|
||||
if ( isset($_REQUEST['range']) )
|
||||
$range = validHtmlStr($_REQUEST['range']);
|
||||
|
||||
Reference in New Issue
Block a user