4 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 * @author Hyunho Kang (hhstark.kang@samsung.com)
32 /* For multi-user support */
33 #include <tzplatform_config.h>
36 #include "db-schema.h"
37 #include "perf-measure.h"
47 #define RUA_STAT_DB_NAME ".rua_stat.db"
48 #define QUERY_MAXLEN 4096
50 #define LOSE_SCORE_RATE 0.7f
52 static sqlite3 *_db = NULL;
53 static int __exec(sqlite3 *db, char *query);
54 static sqlite3 *__db_init(char *root, int flags);
57 int __rua_stat_insert(char *caller, char *rua_stat_tag) {
60 char query[QUERY_MAXLEN];
61 sqlite3_stmt *stmt = NULL;
62 sqlite3_snprintf(QUERY_MAXLEN, query,
63 "INSERT INTO rua_panel_stat (caller_panel, rua_stat_tag, score) VALUES (?,?,?)");
65 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
67 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
71 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
73 LOGE("caller bind error(%d) \n", r);
77 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
79 LOGE("rua_stat_tag bind error(%d) \n", r);
83 r = sqlite3_bind_int(stmt, 3, WIN_SCORE);
85 LOGE("arg bind error(%d) \n", r);
89 r = sqlite3_step(stmt);
90 if (r != SQLITE_DONE) {
91 LOGE("step error(%d) \n", r);
98 sqlite3_finalize(stmt);
103 int __rua_stat_lose_score_update(char *caller, char *rua_stat_tag) {
106 char query[QUERY_MAXLEN];
107 sqlite3_stmt *stmt = NULL;
108 sqlite3_snprintf(QUERY_MAXLEN, query,
109 "UPDATE rua_panel_stat SET score = score * %f WHERE caller_panel = ? AND rua_stat_tag != ?",
112 LOGD("lose score update sql : %s", query);
114 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
115 if (r != SQLITE_OK) {
116 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
120 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
122 LOGE("caller bind error(%d) \n", r);
126 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
128 LOGE("rua_stat_tag bind error(%d) \n", r);
132 r = sqlite3_step(stmt);
133 if (r != SQLITE_DONE) {
134 LOGE("step error(%d) \n", r);
141 sqlite3_finalize(stmt);
147 int __rua_stat_win_score_update(char *caller, char *rua_stat_tag) {
150 char query[QUERY_MAXLEN];
151 sqlite3_stmt *stmt = NULL;
152 sqlite3_snprintf(QUERY_MAXLEN, query,
153 "UPDATE rua_panel_stat SET score = score + %d WHERE caller_panel = ? AND rua_stat_tag = ?",
156 LOGD("win score update sql : %s", query);
158 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
159 if (r != SQLITE_OK) {
160 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
164 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
166 LOGE("caller bind error(%d) \n", r);
170 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
172 LOGE("rua_stat_tag bind error(%d) \n", r);
176 r = sqlite3_step(stmt);
177 if (r != SQLITE_DONE) {
178 LOGE("step error(%d) \n", r);
185 sqlite3_finalize(stmt);
191 int rua_stat_update(char *caller, char *rua_stat_tag)
194 int affected_rows = 0;
195 sqlite3_stmt *stmt = NULL;
197 LOGD("rua_stat_update start");
199 r = __rua_stat_init(SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE);
201 LOGE("__rua_stat_init fail");
206 LOGE("rua_stat is not initialized");
210 if (caller == NULL) {
211 LOGE("caller is null");
215 if (rua_stat_tag == NULL) {
216 LOGE("rua_stat_tag is null");
221 r = __rua_stat_lose_score_update(caller, rua_stat_tag);
222 if (r != SQLITE_DONE) {
223 LOGE("__rua_stat_lose_score_insert fail.");
227 r = __rua_stat_win_score_update(caller, rua_stat_tag);
228 affected_rows = sqlite3_changes(_db);
229 if ((r != SQLITE_DONE) || (affected_rows == 0)) {
230 r = __rua_stat_insert(caller, rua_stat_tag);
232 if (r != SQLITE_DONE) {
233 LOGE("__rua_stat_insert fail.");
239 LOGD("rua_stat_update done");
246 int rua_stat_get_stat_tags(char *caller, int (*rua_stat_tag_iter_fn)(const char *rua_stat_tag, void *data),
251 char query[QUERY_MAXLEN];
252 const unsigned char *ct;
254 r = __rua_stat_init(SQLITE_OPEN_READONLY);
256 LOGE("__rua_stat_init fail");
260 sqlite3_snprintf(QUERY_MAXLEN, query,
261 "SELECT rua_stat_tag FROM rua_panel_stat WHERE caller_panel = ? ORDER BY score DESC");
266 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
267 if (r != SQLITE_OK) {
268 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
272 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
273 if (r != SQLITE_OK) {
274 LOGE("caller bind error(%d) \n", r);
278 while(sqlite3_step(stmt) == SQLITE_ROW) {
280 ct = sqlite3_column_text(stmt, 0);
281 if (ct == NULL || ct[0] == '\0') {
282 LOGW("sqlite3_column_text null");
284 rua_stat_tag_iter_fn(ct, data);
289 sqlite3_finalize(stmt);
296 int __rua_stat_init(int flags)
303 char defname[FILENAME_MAX];
304 const char *rua_stat_db_path = tzplatform_getenv(TZ_USER_DB);
305 snprintf(defname, sizeof(defname), "%s/%s", rua_stat_db_path, RUA_STAT_DB_NAME);
306 _db = __db_init(defname, flags);
309 LOGW("__rua_stat_init error");
316 int __rua_stat_fini(void)
327 static int __exec(sqlite3 *db, char *query)
335 r = sqlite3_exec(db, query, NULL, NULL, &errmsg);
336 if (r != SQLITE_OK) {
337 SECURE_LOGE("query(%s) exec error(%s)", query, errmsg);
338 sqlite3_free(errmsg);
345 static int __create_table(sqlite3 *db)
349 r = __exec(db, CREATE_RUA_STAT_TABLE);
351 LOGE("create table error");
358 static sqlite3 *__db_init(char *root, int flags)
363 r = db_util_open_with_options(root, &db, flags, NULL);
365 LOGE("db util open error(%d/%d/%d/%s)", r,
367 sqlite3_extended_errcode(db),
372 r = __create_table(db);