cpu : enhance SQLite query 91/229991/2
authorKichan Kwon <k_c.kwon@samsung.com>
Tue, 7 Apr 2020 04:50:07 +0000 (13:50 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Tue, 7 Apr 2020 05:06:06 +0000 (14:06 +0900)
- Get the only latest row of each (appid,pid)

Change-Id: Iebfc38816d494198e70c6aa24aedd539eb7e392d
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
plugin/cpu/src/bm_cpu_plugin.c

index 60bf00bfe4c34f23bc2704e816726c717081c234..9b63c6e0e7945b8e442bd0f101b71f952c8a9a2c 100644 (file)
 #define JIFFY_TO_MS_FACTOR 10  // 1000 / 100
 #define JIFFY_TO_MS(x) ((x) >= UINT_MAX / JIFFY_TO_MS_FACTOR ? UINT_MAX : (x) * JIFFY_TO_MS_FACTOR)
 
+#define DATA_FROM_2ND_TOKEN "SUBSTR(data, INSTR(data, ' ') + 1)"
+#define SQLITE_QUERY   \
+"SELECT"       \
+"      appid, data,"   \
+"      SUBSTR(data, len_utime + len_stime + 1, len_pid - 1) AS pid"    \
+"      FROM (SELECT *,"        \
+"              INSTR(data, ' ') AS len_utime," \
+"              INSTR(" DATA_FROM_2ND_TOKEN ", ' ') AS len_stime,"      \
+"              INSTR(SUBSTR(" DATA_FROM_2ND_TOKEN ", INSTR(" DATA_FROM_2ND_TOKEN ", ' ') + 1), ' ') AS len_pid"        \
+"              FROM cpu"       \
+"      )"      \
+"      WHERE time BETWEEN %ld AND %ld" \
+"      GROUP BY appid, pid"    \
+"      HAVING MAX(time)"
+
 struct app_status {
        pid_t pid;
        time_t used_time;       // utime + stime
@@ -181,7 +196,7 @@ int get_feature_data(bm_data_h *handle, bm_plugin_data_type_e type)
        /* Sqlite */
        sqlite3 *db;
        sqlite3_stmt *stmt;
-       char query[128];
+       char query[512];
 
        /* DB row */
        const char *appid;
@@ -302,7 +317,7 @@ int get_feature_data(bm_data_h *handle, bm_plugin_data_type_e type)
 
        /* Read data from HEART-CPU DB */
        _I("Gather CPU usage : %ld ~ %ld", last_requested_time, current_time);
-       snprintf(query, 128, "SELECT appid,data FROM cpu WHERE (time >= %ld AND time < %ld)", last_requested_time, current_time);
+       snprintf(query, 512, SQLITE_QUERY, last_requested_time, current_time);
        ret = sqlite3_prepare_v2(db, query, -1, &stmt, 0);
        while (sqlite3_step(stmt) == SQLITE_ROW) {
                appid = (const char *)sqlite3_column_text(stmt, 0);