Add CPU stats for Battery Dump
[platform/core/system/batterymonitor.git] / src / bm_server_db.c
index 32fe62e..933dc23 100644 (file)
@@ -496,6 +496,19 @@ static int bm_gl_bst_stat_convert_to_sql(bd_gl_bst_stat_s *gbst_st, bm_stmt hstm
        return count;
 }
 
+static int bm_gl_cpu_stat_convert_to_sql(bd_gl_cpu_stat_s *gcpu_st, bm_stmt hstmt, char *sql_value)
+{
+       ENTER;
+
+       int count = 1;
+       bm_query_bind_int(hstmt, count++, gcpu_st->time_s);
+       bm_query_bind_int(hstmt, count++, gcpu_st->usr_time);
+       bm_query_bind_int(hstmt, count++, gcpu_st->sys_time);
+
+       EXIT;
+       return count;
+}
+
 static void bm_convert_column_to_resourceid_usage(bm_stmt hstmt, resourceid_usage_s* bm_resource_type)
 {
        ENTER;
@@ -651,6 +664,17 @@ static void bm_convert_column_to_gl_bst_stat(bm_stmt hstmt, bd_gl_bst_stat_s *gb
        return;
 }
 
+static void bm_convert_column_to_gl_cpu_stat(bm_stmt hstmt, bd_gl_cpu_stat_s *gcpu_st)
+{
+       ENTER;
+       gcpu_st->time_s = -1;
+       gcpu_st->usr_time = bm_query_table_column_int(hstmt, BD_GCPUSTAT_USR);
+       gcpu_st->sys_time = bm_query_table_column_int(hstmt, BD_GCPUSTAT_SYS);
+
+       EXIT;
+       return;
+}
+
 static int bm_get_record_count(sqlite3 *bm_db_handle, const char *query)
 {
        ENTER;
@@ -710,12 +734,13 @@ static int bm_check_is_all_table_exists(sqlite3 *bm_db_handle)
        BM_MEMSET(query, 0, sizeof(query));
 
        BM_SNPRINTF(query, sizeof(query), "select count(*) from sqlite_master where name in \
-                       ('%s', '%s', '%s', '%s','%s', '%s', '%s', '%s','%s', '%s')",
+                       ('%s', '%s', '%s', '%s','%s', '%s', '%s', '%s','%s', '%s', '%s')",
                        BATTERY_MONITOR_APP_ID_MAP_TABLE, BATTERY_MONITOR_APP_ID_USAGE_TABLE,
                        BATTERY_MONITOR_RESOURCE_ID_USAGE_TABLE, BATTERY_MONITOR_GBL_BLE_STAT_TABLE,
                        BATTERY_MONITOR_GBL_WFL_STAT_TABLE, BATTERY_MONITOR_GBL_NT_STAT_TABLE,
                        BATTERY_MONITOR_GBL_BR_STAT_TABLE, BATTERY_MONITOR_GBL_SGT_STAT_TABLE,
-                       BATTERY_MONITOR_GBL_WST_STAT_TABLE, BATTERY_MONITOR_GBL_BST_STAT_TABLE);
+                       BATTERY_MONITOR_GBL_WST_STAT_TABLE, BATTERY_MONITOR_GBL_BST_STAT_TABLE,
+                       BATTERY_MONITOR_GBL_CPU_STAT_TABLE);
 
        rc = bm_get_record_count(bm_db_handle, query);
 
@@ -857,6 +882,18 @@ static int bm_create_all_tables(sqlite3 *bm_db_handle)
                                ("bm_execute_query(bm_db_handle, %s) failed(%d, %s).\n",
                                 GBL_BST_STAT_SCHEMA, rc, bm_db_err_msg(bm_db_handle)));
        }
+       /* Create the global cpu stats table */
+       BM_SNPRINTF(query, sizeof(query), "select count(*) from sqlite_master where name in ('%s')",
+                       BATTERY_MONITOR_GBL_CPU_STAT_TABLE);
+       rc = bm_get_record_count(bm_db_handle, query);
+       if (rc <= 0) {
+               rc = bm_execute_query(bm_db_handle, GBL_CPU_STAT_SCHEMA);
+               if (rc == SQLITE_BUSY)
+                       return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
+               BM_RETURN_VAL((SQLITE_OK == rc), {}, BATTERY_MONITOR_ERROR_DB_FAILED,
+                               ("bm_execute_query(bm_db_handle, %s) failed(%d, %s).\n",
+                                GBL_CPU_STAT_SCHEMA, rc, bm_db_err_msg(bm_db_handle)));
+       }
 
        EXIT;
        return error_code;
@@ -1237,6 +1274,23 @@ static int bm_battery_stat_insert_to_db(sqlite3 *bm_db_handle, void *str_data, i
                BM_RETURN_VAL((hstmt != NULL), {}, BATTERY_MONITOR_ERROR_DB_FAILED, ("bm_prepare_query() failed(%s).\n", bm_db_err_msg(bm_db_handle)));
                bm_gl_bst_stat_convert_to_sql(gbst_st, hstmt, query);
                break;
+       case 7:
+               _DBG("GCPU_DATA");
+               bd_gl_cpu_stat_s *gcpu_st = (bd_gl_cpu_stat_s *)str_data;
+               _DBG("time %ld usr %ld sys %ld", gcpu_st->time_s, gcpu_st->usr_time, gcpu_st->sys_time);
+               BM_SNPRINTF(query, sizeof(query), "INSERT INTO %s(time_s, usr_time, sys_time) values "\
+                               "(?, ?, ?)", BATTERY_MONITOR_GBL_CPU_STAT_TABLE);
+               hstmt = bm_prepare_query(bm_db_handle, query);
+               if (bm_db_err_code(bm_db_handle) == SQLITE_PERM) {
+                       _ERR("Access failed(%s)", bm_db_err_msg(bm_db_handle));
+                       return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
+               } else if (bm_db_err_code(bm_db_handle) == SQLITE_BUSY) {
+                       _ERR("Database Busy(%s)", bm_db_err_msg(bm_db_handle));
+                       return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
+               }
+               BM_RETURN_VAL((hstmt != NULL), {}, BATTERY_MONITOR_ERROR_DB_FAILED, ("bm_prepare_query() failed(%s).\n", bm_db_err_msg(bm_db_handle)));
+               bm_gl_cpu_stat_convert_to_sql(gcpu_st, hstmt, query);
+               break;
        default:
                break;
        }
@@ -1690,6 +1744,20 @@ static int bm_battery_stat_query_from_db(sqlite3 *bm_db_handle, void* str_data,
                BM_CATCH_ERROR(rc == SQLITE_ROW, {}, BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
                bm_convert_column_to_gl_bst_stat(hstmt, str_data);
                break;
+       case 7:
+               _DBG("GCPU_DATA");
+               BM_SNPRINTF(query, sizeof(query), "SELECT sum(usr_time), sum(sys_time) \
+               FROM %s WHERE time_s >= %ld", BATTERY_MONITOR_GBL_CPU_STAT_TABLE, duration);
+               hstmt = bm_prepare_query(bm_db_handle, query);
+               if (bm_db_err_code(bm_db_handle) == SQLITE_PERM) {
+                       _ERR("Access failed(%s)", bm_db_err_msg(bm_db_handle));
+                       error_code = BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
+                       return error_code;
+               }
+               rc = bm_query_step(hstmt);
+               BM_CATCH_ERROR(rc == SQLITE_ROW, {}, BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
+               bm_convert_column_to_gl_cpu_stat(hstmt, str_data);
+               break;
        default:
                break;
        }