8 #include "socket-helper.h"
10 #define UPDATE_PROC_STAT_SQL "REPLACE INTO proc_power_cons \
11 (appid, power_cons, duration, day) VALUES(?, ?, ?, ?)"
12 #define LOAD_PROC_STAT_SQL "SELECT * FROM proc_power_cons WHERE day=?"
13 #define DELETE_OLD_POWER_CONS "DELETE FROM proc_power_cons WHERE day=?"
16 static sqlite3_stmt *update_proc_stat_stmt;
17 static sqlite3_stmt *load_proc_stat_stmt;
18 static sqlite3_stmt *delete_old_power_cons_stmt;
20 API int proc_stat_init(void)
24 PREPARE_STMT(update_proc_stat_stmt, UPDATE_PROC_STAT_SQL);
25 PREPARE_STMT(load_proc_stat_stmt, LOAD_PROC_STAT_SQL);
26 PREPARE_STMT(delete_old_power_cons_stmt, DELETE_OLD_POWER_CONS);
31 API int proc_stat_finalize(void)
33 FINALIZE_STMT(load_proc_stat_stmt);
34 FINALIZE_STMT(update_proc_stat_stmt);
35 FINALIZE_STMT(delete_old_power_cons_stmt);
40 API int foreach_proc_power_cons(enum logd_db_query (*cb)
41 (const struct proc_power_cons *pc, void *user_data), int day, void *user_data)
43 enum logd_db_query res;
45 DB_CHECK(sqlite3_reset(load_proc_stat_stmt));
46 DB_CHECK(sqlite3_bind_int(load_proc_stat_stmt, 1, day));
47 while (sqlite3_step(load_proc_stat_stmt) == SQLITE_ROW) {
48 struct proc_power_cons pc;
50 pc.appid = strdup((const char*)
51 sqlite3_column_text(load_proc_stat_stmt, 0));
56 pc.power_cons = sqlite3_column_int64(load_proc_stat_stmt, 1);
57 pc.duration = sqlite3_column_int(load_proc_stat_stmt, 2);
58 res = cb(&pc, user_data);
59 free((void*)pc.appid);
60 if (res == LOGD_DB_QUERY_STOP)
68 API int logd_foreach_apps_energy_efficiency(enum logd_db_query (*cb)
69 (const char *application, float efficiency, void *user_data), void *user_data)
71 enum logd_db_query res;
73 DB_CHECK(sqlite3_reset(load_proc_stat_stmt));
74 while (sqlite3_step(load_proc_stat_stmt) == SQLITE_ROW) {
75 struct proc_power_cons pc;
76 float efficiency = -1;
78 pc.appid = strdup((const char*)
79 sqlite3_column_text(load_proc_stat_stmt, 0));
84 pc.power_cons = sqlite3_column_int64(load_proc_stat_stmt, 1);
85 pc.duration = sqlite3_column_int(load_proc_stat_stmt, 2);
86 if (pc.duration >= 2 * 60 * 60) /* 2 hours */
87 efficiency = ((float)pc.power_cons) / pc.duration;
88 res = cb(pc.appid, efficiency * 60 * 60, user_data);
89 free((void*)pc.appid);
90 if (res == LOGD_DB_QUERY_STOP)
98 API int update_proc_power_cons(struct proc_power_cons *pc, int day)
100 DB_CHECK(sqlite3_reset(update_proc_stat_stmt));
101 DB_CHECK(sqlite3_bind_text(update_proc_stat_stmt, 1, pc->appid, -1,
103 DB_CHECK(sqlite3_bind_int64(update_proc_stat_stmt, 2, pc->power_cons));
104 DB_CHECK(sqlite3_bind_int(update_proc_stat_stmt, 3, pc->duration));
105 DB_CHECK(sqlite3_bind_int(update_proc_stat_stmt, 4, day));
107 if (sqlite3_step(update_proc_stat_stmt) != SQLITE_DONE) {
108 _E("Failed to record to proc_stat table");
115 API int logd_foreach_proc_stat(enum logd_db_query (*cb)
116 (const struct logd_proc_stat *, void *), void *user_data)
121 struct logd_proc_stat proc_stat;
122 enum logd_socket_req_type req_type = LOGD_PROC_STAT_REQ;
124 if ((sock = connect_to_logd_socket()) < 0) {
128 if (write(sock, &req_type, sizeof(req_type)) != sizeof(req_type)) {
130 _E("Can'r write req_type");
134 if (read_from_socket(sock, &count, sizeof(count)) != sizeof(count)) {
136 _E("Can't read count");
140 for (int i = 0; i < count; ++i) {
142 char buf[FILENAME_MAX] = { 0, };
143 if (read_from_socket(sock, &length, sizeof(length)) != sizeof(length)) {
145 _E("Can't read len");
149 if (read_from_socket(sock, buf, length) != length) {
154 proc_stat.application = strdup(buf);
155 if (read_from_socket(sock, &proc_stat.utime, sizeof(proc_stat.utime)) !=
156 sizeof(proc_stat.utime)) {
162 if (read_from_socket(sock, &proc_stat.stime, sizeof(proc_stat.stime)) !=
163 sizeof(proc_stat.stime)) {
168 if (read_from_socket(sock, &proc_stat.utime_power_cons, sizeof(proc_stat.utime_power_cons)) !=
169 sizeof(proc_stat.utime_power_cons)) {
175 if (read_from_socket(sock, &proc_stat.stime_power_cons, sizeof(proc_stat.stime_power_cons)) !=
176 sizeof(proc_stat.stime_power_cons)) {
182 if (read_from_socket(sock, &proc_stat.is_active, sizeof(proc_stat.is_active)) !=
183 sizeof(proc_stat.is_active)) {
189 ret = cb(&proc_stat, user_data);
190 free(proc_stat.application);
191 if (ret == LOGD_DB_QUERY_STOP) {
201 API int delete_old_power_cons(int day)
203 DB_CHECK(sqlite3_reset(delete_old_power_cons_stmt));
204 DB_CHECK(sqlite3_bind_int(delete_old_power_cons_stmt, 1, day));
206 if (sqlite3_step(delete_old_power_cons_stmt) != SQLITE_DONE) {
207 _E("Failed to record to proc_stat table");