mirror of
https://github.com/rsyslog/loganalyzer.git
synced 2025-09-26 03:09:21 +02:00
Added support for paging in MongoDB Logstream source.
Also minor changes in uID handling were/are needed to support MongoDB ID's
This commit is contained in:
parent
2250e27e3f
commit
020d27cd15
@ -66,6 +66,8 @@ class LogStreamMongoDB extends LogStream {
|
|||||||
private $_myMongoCon = null;
|
private $_myMongoCon = null;
|
||||||
private $_myMongoDB = null;
|
private $_myMongoDB = null;
|
||||||
private $_myMongoCollection = null;
|
private $_myMongoCollection = null;
|
||||||
|
private $_myMongoFields = null;
|
||||||
|
private $_myMongoQuery = null;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public function LogStreamMongoDB($streamConfigObj) {
|
public function LogStreamMongoDB($streamConfigObj) {
|
||||||
@ -101,8 +103,13 @@ class LogStreamMongoDB extends LogStream {
|
|||||||
if ( !isset($dbmapping[ $this->_logStreamConfigObj->DBTableType ]) )
|
if ( !isset($dbmapping[ $this->_logStreamConfigObj->DBTableType ]) )
|
||||||
return ERROR_DB_INVALIDDBMAPPING;
|
return ERROR_DB_INVALIDDBMAPPING;
|
||||||
|
|
||||||
// Create SQL Where Clause first!
|
// Create Needed Fields Array first!
|
||||||
$res = $this->CreateSQLWhereClause();
|
$res = $this->CreateFieldsArray();
|
||||||
|
if ( $res != SUCCESS )
|
||||||
|
return $res;
|
||||||
|
|
||||||
|
// Create Filters for first time!
|
||||||
|
$res = $this->CreateQueryArray(UID_UNKNOWN);
|
||||||
if ( $res != SUCCESS )
|
if ( $res != SUCCESS )
|
||||||
return $res;
|
return $res;
|
||||||
|
|
||||||
@ -621,7 +628,17 @@ TODO
|
|||||||
if ( isset($this->bufferedRecords[$this->_currentRecordNum][$dbfieldname]) )
|
if ( isset($this->bufferedRecords[$this->_currentRecordNum][$dbfieldname]) )
|
||||||
{
|
{
|
||||||
if ( isset($fields[$property]['FieldType']) && $fields[$property]['FieldType'] == FILTER_TYPE_DATE ) // Handle as date!
|
if ( isset($fields[$property]['FieldType']) && $fields[$property]['FieldType'] == FILTER_TYPE_DATE ) // Handle as date!
|
||||||
$arrProperitesOut[$property] = GetEventTime( $this->bufferedRecords[$this->_currentRecordNum][$dbfieldname] );
|
{
|
||||||
|
$myDateField = $this->bufferedRecords[$this->_currentRecordNum][$dbfieldname];
|
||||||
|
if ( gettype($myDateField) == "object" && get_class($myDateField) == "MongoDate" )
|
||||||
|
{
|
||||||
|
$arrProperitesOut[$property][EVTIME_TIMESTAMP] = $myDateField->sec;
|
||||||
|
$arrProperitesOut[$property][EVTIME_TIMEZONE] = date('O'); // Get default Offset
|
||||||
|
$arrProperitesOut[$property][EVTIME_MICROSECONDS] = $myDateField->usec;
|
||||||
|
}
|
||||||
|
else // Try to parse Date!
|
||||||
|
$arrProperitesOut[$property] = GetEventTime( $myDateField );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
$arrProperitesOut[$property] = $this->bufferedRecords[$this->_currentRecordNum][$dbfieldname];
|
$arrProperitesOut[$property] = $this->bufferedRecords[$this->_currentRecordNum][$dbfieldname];
|
||||||
}
|
}
|
||||||
@ -1407,6 +1424,66 @@ TODO!!!
|
|||||||
* ============= Beginn of private functions =============
|
* ============= Beginn of private functions =============
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper function to create the Field Array
|
||||||
|
*/
|
||||||
|
private function CreateFieldsArray()
|
||||||
|
{
|
||||||
|
global $dbmapping;
|
||||||
|
$szTableType = $this->_logStreamConfigObj->DBTableType;
|
||||||
|
|
||||||
|
// Init Array
|
||||||
|
$this->_myMongoFields = array();
|
||||||
|
|
||||||
|
// Init Fields Array
|
||||||
|
foreach ( $this->_arrProperties as $property )
|
||||||
|
{
|
||||||
|
// Check if mapping exists
|
||||||
|
if ( isset($dbmapping[$szTableType]['DBMAPPINGS'][$property]) )
|
||||||
|
{
|
||||||
|
$this->_myMongoFields[ $dbmapping[$szTableType]['DBMAPPINGS'][$property] ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper function to create the Query Array
|
||||||
|
*/
|
||||||
|
private function CreateQueryArray($uID)
|
||||||
|
{
|
||||||
|
global $dbmapping;
|
||||||
|
$szTableType = $this->_logStreamConfigObj->DBTableType;
|
||||||
|
|
||||||
|
// Init Array
|
||||||
|
$this->_myMongoQuery = array();
|
||||||
|
|
||||||
|
if ( $this->_filters != null )
|
||||||
|
{
|
||||||
|
// Init Fields Array
|
||||||
|
foreach ( $this->_arrProperties as $property )
|
||||||
|
{
|
||||||
|
// Check if mapping exists
|
||||||
|
if ( isset($dbmapping[$szTableType]['DBMAPPINGS'][$property]) )
|
||||||
|
{
|
||||||
|
$this->_myMongoQuery[ $dbmapping[$szTableType]['DBMAPPINGS'][$property] ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $uID != UID_UNKNOWN )
|
||||||
|
{
|
||||||
|
// Add uID Filter as well!
|
||||||
|
$myMongoID = new MongoId( base_convert($uID, 10, 16) );
|
||||||
|
$this->_myMongoQuery[ $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_UID] ] = array( '$lt' => $myMongoID );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function expects the filters to already being set earlier.
|
* This function expects the filters to already being set earlier.
|
||||||
* Otherwise no usual WHERE Clause can be created!
|
* Otherwise no usual WHERE Clause can be created!
|
||||||
@ -1656,15 +1733,16 @@ TODO!!!
|
|||||||
$szTableType = $this->_logStreamConfigObj->DBTableType;
|
$szTableType = $this->_logStreamConfigObj->DBTableType;
|
||||||
|
|
||||||
// return error if there was one!
|
// return error if there was one!
|
||||||
if ( ($res = $this->CreateMainSQLQuery($uID)) != SUCCESS )
|
if ( ($res = $this->CreateQueryArray($uID)) != SUCCESS )
|
||||||
return $res;
|
return $res;
|
||||||
|
|
||||||
// Append LIMIT clause
|
// Append LIMIT clause
|
||||||
// $szSql .= " LIMIT " . $this->_currentRecordStart . ", " . $this->_logStreamConfigObj->RecordsPerQuery;
|
// $szSql .= " LIMIT " . $this->_currentRecordStart . ", " . $this->_logStreamConfigObj->RecordsPerQuery;
|
||||||
|
$myCursor = $this->_myMongoCollection->find($this->_myMongoQuery, $this->_myMongoFields); // ->limit(10); // $collection->find();
|
||||||
|
|
||||||
|
OutputDebugMessage("Cursor verbose: " . var_export($myCursor->explain(), true), DEBUG_DEBUG);
|
||||||
|
|
||||||
$myCursor = $this->_myMongoCollection->find(); // ->limit(10); // $collection->find();
|
|
||||||
$myCursor = $myCursor->sort(array("_id" => -1));
|
$myCursor = $myCursor->sort(array("_id" => -1));
|
||||||
|
|
||||||
// Copy rows into the buffer!
|
// Copy rows into the buffer!
|
||||||
$iBegin = $this->_currentRecordNum;
|
$iBegin = $this->_currentRecordNum;
|
||||||
|
|
||||||
@ -1674,8 +1752,8 @@ TODO!!!
|
|||||||
if ( $myRow === FALSE || !$myRow )
|
if ( $myRow === FALSE || !$myRow )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
$myRow[ "_id" ] = $myRow["_id"]->{'$id'};
|
$myRow[ "_id" ] = base_convert($myRow[ "_id" ], 16, 10); // ($myRow["_id"]->{'$id'});
|
||||||
|
// $myRow[ "_id" ] = $myRow["_id"]->getInc(); // Use Inc value for now, easier to read!
|
||||||
// Keys will be converted into lowercase!
|
// Keys will be converted into lowercase!
|
||||||
$this->bufferedRecords[$iBegin] = array_change_key_case( $myRow, CASE_LOWER);
|
$this->bufferedRecords[$iBegin] = array_change_key_case( $myRow, CASE_LOWER);
|
||||||
$iBegin++;
|
$iBegin++;
|
||||||
@ -1702,70 +1780,6 @@ TODO!!!
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the SQL QUery!
|
|
||||||
*/
|
|
||||||
private function CreateMainSQLQuery($uID)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
global $querycount;
|
|
||||||
|
|
||||||
// Get SQL Statement
|
|
||||||
$szSql = $this->CreateSQLStatement($uID);
|
|
||||||
|
|
||||||
// --- Append LIMIT
|
|
||||||
$szSql .= " LIMIT " . $this->_logStreamConfigObj->RecordsPerQuery;
|
|
||||||
// ---
|
|
||||||
|
|
||||||
// Perform Database Query
|
|
||||||
$this->_myDBQuery = mysql_query($szSql, $this->_dbhandle);
|
|
||||||
if ( !$this->_myDBQuery )
|
|
||||||
{
|
|
||||||
// Check if a field is missing!
|
|
||||||
if ( mysql_errno() == 1054 )
|
|
||||||
{
|
|
||||||
// Handle missing field and try again!
|
|
||||||
if ( $this->HandleMissingField() == SUCCESS )
|
|
||||||
{
|
|
||||||
$this->_myDBQuery = mysql_query($szSql, $this->_dbhandle);
|
|
||||||
if ( !$this->_myDBQuery )
|
|
||||||
{
|
|
||||||
$this->PrintDebugError("Invalid SQL: ".$szSql);
|
|
||||||
return ERROR_DB_QUERYFAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // Failed to add field dynamically
|
|
||||||
return ERROR_DB_QUERYFAILED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->PrintDebugError("Invalid SQL: ".$szSql);
|
|
||||||
return ERROR_DB_QUERYFAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Skip one entry in this case
|
|
||||||
if ( $this->_currentRecordStart > 0 )
|
|
||||||
{
|
|
||||||
// Throw away
|
|
||||||
$myRow = mysql_fetch_array($this->_myDBQuery, MYSQL_ASSOC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increment for the Footer Stats
|
|
||||||
$querycount++;
|
|
||||||
|
|
||||||
// Output Debug Informations
|
|
||||||
OutputDebugMessage("LogStreamDB|CreateMainSQLQuery: Created SQL Query:<br>" . $szSql, DEBUG_DEBUG);
|
|
||||||
|
|
||||||
// return success state if reached this point!
|
|
||||||
return SUCCESS;
|
|
||||||
*/
|
|
||||||
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creates the SQL Statement we are going to use!
|
* Creates the SQL Statement we are going to use!
|
||||||
*/
|
*/
|
||||||
|
@ -59,7 +59,13 @@ $content['EXTRA_STYLESHEET'] = '<link rel="stylesheet" href="css/highlight.css"
|
|||||||
|
|
||||||
// --- CONTENT Vars
|
// --- CONTENT Vars
|
||||||
if ( isset($_GET['uid']) )
|
if ( isset($_GET['uid']) )
|
||||||
$content['uid_current'] = intval($_GET['uid']);
|
{
|
||||||
|
// Now check by numeric as uid can be larger than INT values
|
||||||
|
if ( is_numeric($_GET['uid']) )
|
||||||
|
$content['uid_current'] = $_GET['uid'];
|
||||||
|
else
|
||||||
|
$content['uid_current'] = UID_UNKNOWN;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
$content['uid_current'] = UID_UNKNOWN;
|
$content['uid_current'] = UID_UNKNOWN;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user