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);
56 int __rua_stat_init(int flags)
58 char defname[FILENAME_MAX];
59 const char *rua_stat_db_path = tzplatform_getenv(TZ_USER_DB);
64 snprintf(defname, sizeof(defname), "%s/%s", rua_stat_db_path, RUA_STAT_DB_NAME);
65 _db = __db_init(defname, flags);
68 LOGW("__rua_stat_init error");
75 int __rua_stat_fini(void)
85 int __rua_stat_insert(char *caller, char *rua_stat_tag) {
88 char query[QUERY_MAXLEN];
89 sqlite3_stmt *stmt = NULL;
90 sqlite3_snprintf(QUERY_MAXLEN, query,
91 "INSERT INTO rua_panel_stat (caller_panel, rua_stat_tag, score) VALUES (?,?,?)");
93 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
95 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
99 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
101 LOGE("caller bind error(%d) \n", r);
105 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
107 LOGE("rua_stat_tag bind error(%d) \n", r);
111 r = sqlite3_bind_int(stmt, 3, WIN_SCORE);
113 LOGE("arg bind error(%d) \n", r);
117 r = sqlite3_step(stmt);
118 if (r != SQLITE_DONE) {
119 LOGE("step error(%d) \n", r);
126 sqlite3_finalize(stmt);
131 int __rua_stat_lose_score_update(char *caller, char *rua_stat_tag) {
134 char query[QUERY_MAXLEN];
135 sqlite3_stmt *stmt = NULL;
136 sqlite3_snprintf(QUERY_MAXLEN, query,
137 "UPDATE rua_panel_stat SET score = score * %f WHERE caller_panel = ? AND rua_stat_tag != ?",
140 LOGD("lose score update sql : %s", query);
142 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
143 if (r != SQLITE_OK) {
144 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
148 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
150 LOGE("caller bind error(%d) \n", r);
154 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
156 LOGE("rua_stat_tag bind error(%d) \n", r);
160 r = sqlite3_step(stmt);
161 if (r != SQLITE_DONE) {
162 LOGE("step error(%d) \n", r);
169 sqlite3_finalize(stmt);
175 int __rua_stat_win_score_update(char *caller, char *rua_stat_tag) {
178 char query[QUERY_MAXLEN];
179 sqlite3_stmt *stmt = NULL;
180 sqlite3_snprintf(QUERY_MAXLEN, query,
181 "UPDATE rua_panel_stat SET score = score + %d WHERE caller_panel = ? AND rua_stat_tag = ?",
184 LOGD("win score update sql : %s", query);
186 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
187 if (r != SQLITE_OK) {
188 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
192 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
194 LOGE("caller bind error(%d) \n", r);
198 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
200 LOGE("rua_stat_tag bind error(%d) \n", r);
204 r = sqlite3_step(stmt);
205 if (r != SQLITE_DONE) {
206 LOGE("step error(%d) \n", r);
213 sqlite3_finalize(stmt);
219 int rua_stat_update(char *caller, char *rua_stat_tag)
222 int affected_rows = 0;
223 sqlite3_stmt *stmt = NULL;
225 LOGD("rua_stat_update start");
227 r = __rua_stat_init(SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE);
229 LOGE("__rua_stat_init fail");
234 LOGE("rua_stat is not initialized");
238 if (caller == NULL) {
239 LOGE("caller is null");
243 if (rua_stat_tag == NULL) {
244 LOGE("rua_stat_tag is null");
249 r = __rua_stat_lose_score_update(caller, rua_stat_tag);
250 if (r != SQLITE_DONE) {
251 LOGE("__rua_stat_lose_score_insert fail.");
255 r = __rua_stat_win_score_update(caller, rua_stat_tag);
256 affected_rows = sqlite3_changes(_db);
257 if ((r != SQLITE_DONE) || (affected_rows == 0)) {
258 r = __rua_stat_insert(caller, rua_stat_tag);
260 if (r != SQLITE_DONE) {
261 LOGE("__rua_stat_insert fail.");
267 LOGD("rua_stat_update done");
274 int rua_stat_get_stat_tags(char *caller, int (*rua_stat_tag_iter_fn)(const char *rua_stat_tag, void *data),
279 char query[QUERY_MAXLEN];
280 const unsigned char *ct;
282 r = __rua_stat_init(SQLITE_OPEN_READONLY);
284 LOGE("__rua_stat_init fail");
288 sqlite3_snprintf(QUERY_MAXLEN, query,
289 "SELECT rua_stat_tag FROM rua_panel_stat WHERE caller_panel = ? ORDER BY score DESC");
294 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
295 if (r != SQLITE_OK) {
296 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
300 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
301 if (r != SQLITE_OK) {
302 LOGE("caller bind error(%d) \n", r);
306 while(sqlite3_step(stmt) == SQLITE_ROW) {
308 ct = sqlite3_column_text(stmt, 0);
309 if (ct == NULL || ct[0] == '\0') {
310 LOGW("sqlite3_column_text null");
312 rua_stat_tag_iter_fn(ct, data);
317 sqlite3_finalize(stmt);
324 static int __exec(sqlite3 *db, char *query)
332 r = sqlite3_exec(db, query, NULL, NULL, &errmsg);
333 if (r != SQLITE_OK) {
334 SECURE_LOGE("query(%s) exec error(%s)", query, errmsg);
335 sqlite3_free(errmsg);
342 static int __create_table(sqlite3 *db)
346 r = __exec(db, CREATE_RUA_STAT_TABLE);
348 LOGE("create table error");
355 static sqlite3 *__db_init(char *root, int flags)
360 r = db_util_open_with_options(root, &db, flags, NULL);
362 LOGE("db util open error(%d/%d/%d/%s)", r,
364 sqlite3_extended_errcode(db),
369 r = __create_table(db);