11 #define LOAD_APPS_SQL "SELECT * FROM applications;"
12 #define STORE_APP_SQL "INSERT INTO applications (name) VALUES (?);"
13 #define STORE_EVENT_SQL "INSERT INTO events\
14 (object, action, time_stamp, app_id, info) VALUES (?, ?, ?, ?, ?);"
15 #define LOAD_EVENTS_SQL "SELECT E.object, E.action, E.time_stamp, A.name, E.info\
16 FROM applications A, events E \
18 #define DEL_OLD_EVENTS_SQL "DELETE FROM events WHERE time_stamp < ?"
21 #define LOAD_EVENTS_ALL "SELECT E.object, E.action, E.time_stamp, A.name, E.info\
22 FROM applications A, events E\
26 #define TIMESTAMP_LT " (time_stamp < %lld)"
27 #define TIMESTAMP_GT " (time_stamp > %lld)"
28 #define BY_OBJECT " (object = %d)"
29 #define BY_ACTION " (action = %d)"
32 #define QUERY_BASE_STR_LEN sizeof(LOAD_EVENTS_ALL)
33 #define QUERY_ADD_STR_TIME_LEN sizeof(TIMESTAMP_LT) + sizeof(AND) \
34 + sizeof(TIMESTAMP_GT) + EXTRA
35 #define QUERY_ADD_STR_LEN_MAX sizeof(BY_OBJECT) + sizeof(AND) + EXTRA
39 static sqlite3_stmt *load_apps_stmt;
40 static sqlite3_stmt *store_app_stmt;
41 static sqlite3_stmt *store_event_stmt;
42 static sqlite3_stmt *load_events_stmt;
43 static sqlite3_stmt *del_old_events_stmt;
49 PREPARE_STMT(load_apps_stmt, LOAD_APPS_SQL);
50 PREPARE_STMT(store_app_stmt, STORE_APP_SQL);
51 PREPARE_STMT(store_event_stmt, STORE_EVENT_SQL);
52 PREPARE_STMT(load_events_stmt, LOAD_EVENTS_SQL);
53 PREPARE_STMT(del_old_events_stmt, DEL_OLD_EVENTS_SQL);
58 int events_finalize(void)
60 FINALIZE_STMT(load_apps_stmt);
61 FINALIZE_STMT(store_app_stmt);
62 FINALIZE_STMT(store_event_stmt);
63 FINALIZE_STMT(load_events_stmt);
64 FINALIZE_STMT(del_old_events_stmt);
69 API int logd_store_app(const char *app)
71 DB_CHECK(sqlite3_reset(store_app_stmt));
72 DB_CHECK(sqlite3_bind_text(store_app_stmt, 1, app, -1, SQLITE_STATIC));
73 if (sqlite3_step(store_app_stmt) != SQLITE_DONE) {
74 _E("Failed to record to applications table: %s",
82 API int logd_load_apps(enum logd_db_query (*cb) (int, const char *, void *),
85 const char *app = NULL;
88 while (sqlite3_step(load_apps_stmt) == SQLITE_ROW) {
89 app = (const char *)sqlite3_column_text(load_apps_stmt, 0);
90 id = sqlite3_column_int(load_apps_stmt, 1);
91 if (!cb(id, app, user_data))
98 API int logd_store_event(int event_type, uint64_t _time, int app_id,
101 DB_CHECK(sqlite3_reset(store_event_stmt));
102 DB_CHECK(sqlite3_bind_int(store_event_stmt, 1, event_type & 0xffff));
103 DB_CHECK(sqlite3_bind_int(store_event_stmt, 2, event_type >> 16));
104 DB_CHECK(sqlite3_bind_int64(store_event_stmt, 3, _time));
105 DB_CHECK(sqlite3_bind_int(store_event_stmt, 4, app_id));
106 DB_CHECK(sqlite3_bind_text(store_event_stmt, 5, message, -1,
109 if (sqlite3_step(store_event_stmt) != SQLITE_DONE) {
110 _E("Failed to record to events table: %s", sqlite3_errmsg(db));
117 API int logd_load_events(enum logd_db_query (*cb)(const struct logd_event_info *, void *),
118 sqlite3_stmt *stmt, void *user_data)
120 struct logd_event_info event;
123 stmt = stmt ? stmt : load_events_stmt;
125 while (sqlite3_step(stmt) == SQLITE_ROW) {
126 event.object = sqlite3_column_int(stmt, 0);
127 event.action = sqlite3_column_int(stmt, 1);
128 event.time = sqlite3_column_int64(stmt, 2);
131 strdup((char *)sqlite3_column_text(stmt, 3));
133 strdup((char *)sqlite3_column_text(stmt, 4));
135 ret = cb(&event, user_data);
137 free(event.application);
138 if (ret != LOGD_DB_QUERY_CONTINUE)
146 API int delete_old_events(uint64_t min_time)
148 DB_CHECK(sqlite3_reset(del_old_events_stmt));
149 DB_CHECK(sqlite3_bind_int64(del_old_events_stmt, 1, min_time));
151 if (sqlite3_step(del_old_events_stmt) != SQLITE_DONE) {
152 _E("Failed to remove old events: %s", sqlite3_errmsg(db));
159 API int logd_foreach_events(const struct logd_events_filter *filter,
160 enum logd_db_query (*cb)(const struct logd_event_info *, void *),
164 int idx, omidx, amidx, ret, len, firstskip;
167 if (filter == NULL) {
168 len = QUERY_BASE_STR_LEN;
170 buf = (char *)malloc(len);
175 len -= snprintf(buf, len, LOAD_EVENTS_ALL);
183 for (idx = 0; idx < LOGD_OBJECT_MAX; idx++) {
184 if (filter->objects_mask[idx] == 1)
188 for (idx = 0; idx < LOGD_ACTION_MAX; idx++) {
189 if (filter->actions_mask[idx] == 1)
193 len = QUERY_BASE_STR_LEN + sizeof(AND) +
194 QUERY_ADD_STR_TIME_LEN +
195 (omidx * QUERY_ADD_STR_LEN_MAX) +
196 (amidx * QUERY_ADD_STR_LEN_MAX);
198 buf = (char *)malloc(len);
203 len -= snprintf(buf, len, LOAD_EVENTS_ALL);
211 ret = asprintf(&qbuf, TIMESTAMP_GT, filter->from);
220 ret = asprintf(&qbuf, TIMESTAMP_LT, filter->to);
231 for (idx = 0; idx < LOGD_OBJECT_MAX; idx++) {
232 if (filter->objects_mask[idx] == 1) {
237 ret = asprintf(&qbuf, BY_OBJECT, idx);
240 strncat(buf, qbuf, ret);
250 for (idx = 0; idx < LOGD_ACTION_MAX; idx++) {
251 if (filter->actions_mask[idx] == 1) {
256 ret = asprintf(&qbuf, BY_ACTION, idx);
259 strncat(buf, qbuf, ret);
267 PREPARE_STMT(stmt, buf);
269 ret = logd_load_events(cb, stmt, user_data);