Code

Updated item listing
[gosa.git] / gosa-core / include / class_stats.inc
index 8d49c2f93e8ffb85b0eea798c86fea8de3a1cf22..7ec049843a3a752ce5f52d25d72aa1236cb09b10 100644 (file)
@@ -2,12 +2,11 @@
 
 class stats 
 {
-    
+
     static protected $lastCpuLoad = "";
     static protected $lastCpuLoadTimestamp = 0;
 
     static protected $tableName = "stats";
-    static protected $tableFile = "/var/spool/gosa/stats";
 
     static protected $lastHandle = NULL;
     static protected $statsEnabled = FALSE;
@@ -16,56 +15,100 @@ class stats
     /*! \brief     This method tries to connect the GOsa-stats database and 
      *              then returns a database handle on success else NULL.
      *
-     *             (The GOsa-stats database has to be enabled : statsDatabaseEnabled/statsDatabaseFile)
+     *             (The GOsa-stats database has to be enabled : statsDatabaseEnabled/statsDatabaseDirectory)
      *
      *             This database will then contain information about the use of GOsa,
      *              no customer data will be stored.
      *
      *  @return     handle      Returns a sqlite database handle.
      */
-    static function getDatabaseHandle()
+    static function getDatabaseHandle($filename = '')
     {
-        // Try to return last valid handle.
-        if(stats::$lastHandle != NULL && is_resource(stats::$lastHandle)){
-            return(stats::$lastHandle);
-        }
+        // We cannot log while the path to store logs in is empty.
+        global $config;
 
         // Check if Logging is enabled
-        global $config;
         if(!is_object($config) || ! $config instanceOf config){
             return(NULL);
         }
 
+        $path = $config->get_cfg_value('core', 'statsDatabaseDirectory');
+        if(empty($path)){
+            return(NULL);
+        }
+
+        // Check if path exists, if not try to create it
+        if(!is_dir($path) ){
+            $res = @mkdir($path);
+            if(!$res){
+                return(NULL);
+            }
+        }
+
+        // Append a date suffix to the database file, to prevent huge and unusable database files.
+        if($filename == ''){
+            $filename = date('Y-m-d');
+        }
+        $tableFile = $path.'/'.$filename;
+
+        // Try to return last valid handle.
+        if(file_exists($tableFile) && 
+                isset(stats::$lastHandle[$filename]) && 
+                stats::$lastHandle[$filename] != NULL &&
+                is_resource(stats::$lastHandle[$filename])){
+            return(stats::$lastHandle[$filename]);
+        }
+
         // Get statsFile property 
-        stats::$tableFile    = $config->get_cfg_value('core', 'statsDatabaseFile');
         stats::$statsEnabled = $config->boolValueIsTrue('core', 'statsDatabaseEnabled');
         if(!stats::$statsEnabled){
-            return;
+            return(NULL);
         }
 
-        // Append a date suffix to the database file, to prevent huge and unusable database files.
-        stats::$tableFile.= date('-Y_m_d');
-
         // Check for SQLite extension
         if(!stats::checkSQLiteExtension()){
             return(NULL);
         }
 
         // Check if we are able to read/write the given database file.
-        if(!is_writeable(stats::$tableFile) && !is_writeable(dirname(stats::$tableFile))){
+        if(!is_writeable($path) && !is_writeable(dirname($tableFile))){
             return(NULL);
         }
 
         // Try to create database, if it exists just open it.
-        $handle = sqlite_popen(stats::$tableFile, 0666, $error);
+        $handle = sqlite_open($tableFile, 0666, $error);
         if($handle){
             stats::createDatabaseOnDemand($handle);
         }
-        stats::$lastHandle = $handle;
+        stats::$lastHandle[$filename] = $handle;
         return($handle);
     }
 
 
+    /*! \brief      Returns a list of all created stat files
+     *  @return     Array   A list of all currently stored stat files.
+     */
+    static function getLocalStatFiles()
+    {
+        $res = array();
+
+        // Check if we're creating logs right now.
+        if(stats::getDatabaseHandle()){
+            global $config;
+
+            // Walk through all files found in the storage path
+            $path = $config->get_cfg_value('core', 'statsDatabaseDirectory');
+            $dir = opendir($path);
+            while($file = readdir($dir)){
+                if(is_file($path.'/'.$file) && !preg_match('/.old$/', $file)) {
+                    $res[] = $file;
+                }
+            }
+        } 
+        return($res);   
+    }
+
+
     /*! \brief      Check whether the qlite extension is available or not.
      *  @return     boolean     TRUE on success else FALSE
      */  
@@ -184,23 +227,20 @@ class stats
             $overallRenderTimer = microtime(TRUE);
         }
 
-        $duration   = stats::prepareFloatForWriting($duration);
-        $renderTime = stats::prepareFloatForWriting($renderTime);
-
         // Prepare values to be useable within a database
-        $uuid = $config->getGOsaUUID();
+        $uuid = $config->getInstanceUUID();
         $type           = sqlite_escape_string($type);
         $plugin         = sqlite_escape_string($plugin);
         $action         = sqlite_escape_string($action);
         $timestamp      = time();
-        $mtimestamp     = microtime(TRUE);
+        $mtimestamp     = number_format(microtime(TRUE), 4,'.','');
         $amount         = sqlite_escape_string($amount);
-        $duration       = sqlite_escape_string($duration);
-        $renderTime     = sqlite_escape_string($renderTime);
+        $duration       = sqlite_escape_string(number_format($duration, 4,'.',''));
+        $renderTime     = sqlite_escape_string(number_format($renderTime, 4,'.',''));
         $info           = sqlite_escape_string($info);
         $clicks         = sqlite_escape_string($clicks);
         $memory_usage   = sqlite_escape_string(stats::get_memory_usage());
-        $cpu_load       = sqlite_escape_string(sprintf("%0.6f",stats::get_cpu_load()));
+        $cpu_load       = sqlite_escape_string(number_format(stats::get_cpu_load(),4,'.',''));
 
         // Clean up category, which usally comes from acl_category and may still contain 
         //  some special chars like /
@@ -209,449 +249,179 @@ class stats
             $tmp[] = trim($cat, '\/,; ');
         }
         $category = sqlite_escape_string(implode($tmp, ', '));
-   
+
         // Create insert statement.
         $TABLE_NAME = stats::$tableName;
         $query = "
             INSERT INTO {$TABLE_NAME}
-                (ACTID, TYPE, PLUGIN, CATEGORY, ACTION, UUID, MTIMESTAMP, TIMESTAMP, 
-                 AMOUNT, DURATION, RENDER_TIME, MEMORY_USAGE, CPU_LOAD, INFO) 
+        (ACTID, TYPE, PLUGIN, CATEGORY, ACTION, UUID, MTIMESTAMP, TIMESTAMP, 
+         AMOUNT, DURATION, RENDER_TIME, MEMORY_USAGE, CPU_LOAD, INFO) 
             VALUES 
-                ('{$clicks}','{$type}','{$plugin}','{$category}','{$action}','{$uuid}',
-                    '{$mtimestamp}','{$timestamp}','{$amount}','{$duration}','{$renderTime}',
-                    '{$memory_usage}','{$cpu_load}','{$info}')";
+            ('{$clicks}','{$type}','{$plugin}','{$category}','{$action}','{$uuid}',
+             '{$mtimestamp}','{$timestamp}','{$amount}','{$duration}','{$renderTime}',
+             '{$memory_usage}','{$cpu_load}','{$info}')";
         sqlite_query($query, $res);
     }
-  
+
+
+    /*! \brief      Closes all sqlite handles opened by this class
+     */ 
+    static function closeHandles()
+    {
+        foreach(stats::lastHandle as $handle){
+            if($handle && is_resource($handle)){
+                sqlite_close($handle);
+            }
+        }
+    }
+
+
     /*! \brief      This method returns all entries of the GOsa-stats table.
      *              You can limit the result by setting the from/to parameter (timestamp).
      *  @param      int     from    The timestamp to start the result from. 
      *  @param      int     to      The timestamp to end the request.
      *  @return     array           An array containing the requested entries.
      */  
-    static function dumpTables($from = NULL, $to = NULL)
+    static function generateStatisticDump($filename)
     {
         // Get database connection
         $TABLE_NAME = stats::$tableName;
-        $handle = stats::getDatabaseHandle();
+        $handle = stats::getDatabaseHandle($filename);
         if(!$handle) return;        
 
-        // Build up filter to limit dumped entries to the given range.
-        $tim = "";
-        if($from != NULL){
-            $from = sqlite_escape_string($from);
-            $tim.= "AND TIMESTAMP >= '{$from}' ";
-        }
-        if($to != NULL){
-            $to = sqlite_escape_string($to);
-            $tim.= "AND TIMESTAMP <= '{$to}' ";
-        }
-        $tim = preg_replace("/^AND /"," WHERE ",$tim);
+        $query = 
+            "  SELECT ".
+            "      TYPE, PLUGIN, CATEGORY, ACTION, ".
+            "      UUID, DATE(TIMESTAMP, 'unixepoch') as date, ".
+            "      AVG(DURATION), AVG(RENDER_TIME), SUM(AMOUNT), ".
+            "      AVG(MEMORY_USAGE), AVG(CPU_LOAD), INFO ".
+            "  FROM ".
+            "      stats ".
+            "  GROUP BY ".
+            "      TYPE, PLUGIN, CATEGORY, ACTION, UUID, date, INFO ".
+            "  ORDER BY ".
+            "      ID ";
 
         // Create Filter and start query
-        $filter = "SELECT * FROM {$TABLE_NAME}{$tim} ORDER BY ID";
-        $ret = sqlite_array_query($filter, $handle, SQLITE_ASSOC);
+        $ret = sqlite_array_query($query, $handle, SQLITE_ASSOC);
         return($ret);
     }
 
-    /*! \brief      This is just a dummy output/debug method 
-     *              It directly prints some stats and table infos on the screen.
-     */  
-    static function show()
-    {
-        $res = stats::getDatabaseHandle();
-#       stats::dropTable($res);
-        if(!$res) return;        
-
-        $TABLE_NAME = stats::$tableName;
-        $query = "SELECT * FROM {$TABLE_NAME} ORDER BY MTIMESTAMP";
-        $query = "SELECT PLUGIN, ACTION, MAX(DURATION) as 'DURATION' FROM {$TABLE_NAME} WHERE ACTION='modify' GROUP BY PLUGIN,ACTION ";
-        $query = "SELECT * FROM {$TABLE_NAME} ORDER BY ID DESC LIMIT 30";
-        $query = "SELECT * FROM {$TABLE_NAME} WHERE plugin != 'LDAP' ORDER BY ID DESC LIMIT 30";
-        $ret = sqlite_query($query, $res);
-        echo "<pre>";
-
-        $colSize = 16;
-
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            if(!$title){
-                foreach($entry as $key => $str) {
-                    if(is_numeric($key)) continue;
-                    echo str_pad($key,$colSize,' ')."|";
-                }
-                echo "\n";
-                foreach($entry as $key => $str) {
-                    if(is_numeric($key)) continue;
-                    echo str_pad('',$colSize,'-')."-";
-                }
-                echo "\n";
-                $title = TRUE;
-            }
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                if($key == "DURATION" || $key == "MTIMESTAMP" || $key == "CPU_LOAD"){
-                    $str = sprintf("%0.4f", preg_replace("/,/",".",$str));
-                    echo str_pad($str,$colSize,' ', STR_PAD_LEFT)."|"; 
-                }else{
-                    echo str_pad($str,$colSize,' ')."|"; 
-                }
-            }
-            echo "\n";
-        }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Time spent per plugin-category \n";
-        echo "------ \n";
-
-        $query = "
-            SELECT SUM(DURATION) AS DUR, CATEGORY 
-            FROM {$TABLE_NAME}
-            WHERE plugin != 'LDAP' 
-            GROUP BY CATEGORY 
-            ORDER BY DUR DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
-        }
-
-
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Time spent per plugin \n";
-        echo "------ \n";
-
-        $query = "
-            SELECT SUM(DURATION) AS DUR, PLUGIN, UUID 
-            FROM {$TABLE_NAME}
-            WHERE plugin != 'LDAP' 
-            GROUP BY PLUGIN, UUID 
-            ORDER BY DUR DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
-        }
-        echo sqlite_error_string($ret);
-
- # * Anzahl von Objekttypen
- # * Anzahl der Löschungen pro Objekttyp
- # * Anzahl der Erzeugungen pro Objekttyp
- # * Anzahl der Bearbeitungen pro Objekttyp
- # * Anzahl der Verschiebungen pro Objekttyp
- # * Anzahl der Mehrfachbearbeitungen pro Objekttyp
- # * Antwortzeiten pro aktion
- # * Anzahl der Passwortänderungen
- # * Anzahl der unterschiedlichen Anmeldungen
-
-
-        echo "\n------ \n";
-        echo "Actions done per plugin \n";
-        echo "------ \n";
 
-        $query = "
-            SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
-            FROM {$TABLE_NAME}
-            WHERE   TYPE = 'plugin'
-             AND    PLUGIN != 'LDAP'
-            GROUP BY ACTION,PLUGIN 
-            ORDER BY CNT DESC LIMIT 30";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
-        }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "'create' actions done per plugin  (5 most)\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
-            FROM {$TABLE_NAME}
-            WHERE   TYPE = 'plugin'
-             AND    PLUGIN != 'LDAP'
-             AND    ACTION = 'create'
-            GROUP BY ACTION,PLUGIN 
-            ORDER BY CNT DESC LIMIT 5";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
-        }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "'move' actions done per plugin  (5 most)\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
-            FROM {$TABLE_NAME}
-            WHERE   TYPE = 'plugin'
-             AND    PLUGIN != 'LDAP'
-             AND    ACTION = 'move'
-            GROUP BY ACTION,PLUGIN 
-            ORDER BY CNT DESC LIMIT 5";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
+    static function removeStatsFile($filename)
+    {
+        // Get statsFile property 
+        global $config;
+        $path = $config->get_cfg_value('core', 'statsDatabaseDirectory');
+        stats::$statsEnabled = $config->boolValueIsTrue('core', 'statsDatabaseEnabled');
+        if(!stats::$statsEnabled){
+            return(NULL);
         }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "'view' actions done per plugin  (5 most)\n";
-        echo "------ \n";
 
-        $query = "
-            SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
-            FROM {$TABLE_NAME}
-            WHERE   TYPE = 'plugin'
-             AND    PLUGIN != 'LDAP'
-             AND    ACTION = 'view'
-            GROUP BY ACTION,PLUGIN 
-            ORDER BY CNT DESC LIMIT 5";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
+        // We cannot log while the path to store logs in is empty.
+        if(empty($path)){
+            return(NULL);
         }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "'open' actions done per plugin  (5 most)\n";
-        echo "------ \n";
 
-        $query = "
-            SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN, UUID 
-            FROM {$TABLE_NAME}
-            WHERE   TYPE = 'plugin'
-             AND    PLUGIN != 'LDAP'
-             AND    ACTION = 'open'
-            GROUP BY ACTION,PLUGIN, UUID
-            ORDER BY CNT DESC LIMIT 5";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
+        // Check if file exists and then remove it
+        if(isset(stats::$lastHandle[$filename]) && is_resource(stats::$lastHandle[$filename])){
+            sqlite_close(stats::$lastHandle[$filename]);
         }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Time per session\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT SUM(DURATION) as DUR, UUID
-            FROM {$TABLE_NAME}
-            GROUP BY UUID
-            ORDER BY DUR DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
+        if(file_exists($path.'/'.$filename)){
+            #unlink($path.'/'.$filename);
+            rename($path.'/'.$filename,  $path.'/'.$filename.".old");
         }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Most used password hashes\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT DISTINCT(INFO), COUNT(INFO) as CNT
-            FROM {$TABLE_NAME}
-            WHERE ACTION = 'change_password'
-            GROUP BY INFO
-            ORDER BY INFO DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
-        }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Actions at all\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT DISTINCT(ACTION), COUNT(ACTION)  AS CNT
-            FROM {$TABLE_NAME}
-            GROUP BY ACTION
-            ORDER BY CNT DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
-            }
-            echo "\n";
-        }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Time spent per action\n";
-        echo "------ \n";
+    }
 
-        $query = "
-            SELECT DISTINCT(ACTION), SUM(DURATION) AS DUR
-            FROM {$TABLE_NAME}
-            GROUP BY ACTION
-            ORDER BY DUR DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
+    
+    static function getLdapObjectCount($config, $statisticConformResult = FALSE, $date = "")    
+    {
+        $ldap = $config->get_ldap_link();
+        $ldap->cd($config->current['BASE']);
+        
+        // A list of objectClasses to search for, indexed by their 
+        //  object-category
+        $ocsToSearchFor = array(
+                "department" => array("gosaDepartment"),
+                "devices" => array("gotoDevice"),
+                "fai" => array("FAIobject"),
+                "gofaxlist" => array("goFaxRBlock","goFaxSBlock"),
+                "gofonconference" => array("goFonConference"),
+                "phone" => array("goFonHardware"),
+                "gofonmacro" => array("goFonMacro"),
+                "users" => array("gosaAccount"),
+                "acls" => array("gosaAcl","gosaRole"),
+                "application" => array("gosaApplication"),
+                "ogroups" => array("gosaGroupOfNames"),
+                "roles" => array("organizationalRole"),
+                "server" => array("goServer"),
+                "printer" => array("gotoPrinter"),
+                "terminal" => array("gotoTerminal"),
+                "workstation" => array("gotoWorkstation"),
+                "winworkstation" => array("sambaSamAccount"),
+                "incoming" => array("goHard"),
+                "component" => array("ieee802Device"),
+                "mimetypes" => array("gotoMimeType"),
+                "groups" => array("posixGroup"),
+                "sudo" => array("sudoRole"));
+
+        // Build up a filter which contains all objectClass combined by OR.
+        // We will later sum up the results using PHP.
+        $filter = "";
+        $categoryCounter = array();
+        foreach($ocsToSearchFor as $category => $ocs){
+            foreach($ocs as $oc){
+                $filter.= "(objectClass={$oc})";
             }
-            echo "\n";
+            $categoryCounter[$category] = 0;
         }
-        echo sqlite_error_string($ret);
-
-        echo "\n------ \n";
-        echo "Average time per action\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT DISTINCT(ACTION), AVG(DURATION) AS DUR
-            FROM {$TABLE_NAME}
-            GROUP BY ACTION
-            ORDER BY DUR DESC LIMIT 10";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
+        $filter = "(|{$filter})";
+
+        // Initiate the ldap query
+        $res = $ldap->search($filter, array('objectClass'));
+        if($ldap->success()) {
+
+            // Count number of results per category
+            while($entry = $ldap->fetch()){
+                foreach($ocsToSearchFor as $category => $ocs){
+                    if(count(array_intersect($ocs, $entry['objectClass']))){
+                        $categoryCounter[$category] ++;
+                        break; 
+                    }
+                }
             }
-            echo "\n";
         }
-        echo sqlite_error_string($ret);
-
-
-        echo "\n------ \n";
-        echo "Rendertime per plugin\n";
-        echo "------ \n";
-
-        $query = "
-            SELECT PLUGIN, RENDER_TIME AS RM
-            FROM {$TABLE_NAME}
-            GROUP BY PLUGIN
-            ORDER BY RM DESC
-            LIMIT 10
-            ";
-        $ret = sqlite_query($query, $res);
-
-        $colSize = 16;
-        $title = FALSE;
-        foreach(sqlite_fetch_all($ret) as $entry){
-            foreach($entry as $key => $str){
-                if(is_numeric($key)) continue;
-                echo str_pad($str,$colSize,' ')."|"; 
+        arsort($categoryCounter);
+
+        // Do we have to return the result as SQL INSERT statement?
+        if($statisticConformResult){ 
+            $uuid           = $config->getInstanceUUID();
+            $type           = 'objectCount';
+            $plugin         = '';
+            $action         = '';
+            $date           = (empty($date))?date('Y-m-d'):$date;
+            $memory_usage   = sqlite_escape_string(stats::get_memory_usage());
+            $cpu_load       = sqlite_escape_string(number_format(stats::get_cpu_load(),4,'.',''));
+            $sql = array();
+            foreach($categoryCounter as $category => $amount){
+                $sql[] = array(
+                        "type" => $type,
+                        "plugin" => $plugin,
+                        "category" => $category,
+                        "action" => $action,
+                        "uuid" => $uuid,
+                        "date" => $date,
+                        "duration" => 0,
+                        "render_time" => 0,
+                        "amount" => $amount,
+                        "mem_usage" => $memory_usage,
+                        "load" => $cpu_load,
+                        "info" => '');
             }
-            echo "\n";
+            return($sql);
+        }else{
+            return($categoryCounter); 
         }
-        echo sqlite_error_string($ret);
-
-        echo "</pre>";
-    }
-
-
-    /*! \brief     Somehow sqlite can not work with float values when it comes to AVG() SUM().
-     *             We use this methods to convert float values to int and vice versa.
-     *             The database will then contain 'int' intead of 'float'.
-     *                  prepareFloatForReading -> Used for reading 'float' values.
-     *                  prepareFloatForWriting -> Used for writing 'float' values.
-     *  @param     float    The 'float' value to convert.
-     *  @return    int      The converted float value. 
-     */
-    static function prepareFloatForWriting($float)
-    {
-        return(floor($float * 1000));
-    }
-
-
-
-    /*! \brief     Somehow sqlite can not work with float values when it comes to AVG() SUM().
-     *             We use this methods to convert float values to int and vice versa.
-     *             The database will then contain 'int' intead of 'float'.
-     *                  prepareFloatForWriting -> Used for writing 'float' values.
-     *  @param     float    The 'int' value read from the table.
-     *  @return    int      The converted int value. 
-     */
-    static function prepareFloatForReading($int)
-    {
-        return($int / 1000);
     }
 }