2 * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 * @author Hyunho Kang (hhstark.kang@samsung.com)
29 /* For multi-user support */
30 #include <tzplatform_config.h>
33 #include "db-schema.h"
34 #include "perf-measure.h"
44 #define RUA_STAT_DB_NAME ".rua_stat.db"
45 #define QUERY_MAXLEN 4096
47 #define LOSE_SCORE_RATE 0.7f
49 static sqlite3 *_db = NULL;
50 static int __exec(sqlite3 *db, char *query);
51 static sqlite3 *__db_init(char *root, int flags);
53 int __rua_stat_init(int flags)
55 char defname[FILENAME_MAX];
56 const char *rua_stat_db_path = tzplatform_getenv(TZ_USER_DB);
61 snprintf(defname, sizeof(defname), "%s/%s", rua_stat_db_path, RUA_STAT_DB_NAME);
62 _db = __db_init(defname, flags);
65 LOGW("__rua_stat_init error");
72 int __rua_stat_fini(void)
82 int __rua_stat_insert(char *caller, char *rua_stat_tag)
85 char query[QUERY_MAXLEN];
86 sqlite3_stmt *stmt = NULL;
88 sqlite3_snprintf(QUERY_MAXLEN, query,
89 "INSERT INTO rua_panel_stat (caller_panel, rua_stat_tag, score) VALUES (?,?,?)");
91 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
93 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
97 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
99 LOGE("caller bind error(%d) \n", r);
103 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
104 if (r != SQLITE_OK) {
105 LOGE("rua_stat_tag bind error(%d) \n", r);
109 r = sqlite3_bind_int(stmt, 3, WIN_SCORE);
110 if (r != SQLITE_OK) {
111 LOGE("arg bind error(%d) \n", r);
115 r = sqlite3_step(stmt);
116 if (r != SQLITE_DONE) {
117 LOGE("step error(%d) \n", r);
123 sqlite3_finalize(stmt);
128 int __rua_stat_lose_score_update(char *caller, char *rua_stat_tag)
131 char query[QUERY_MAXLEN];
132 sqlite3_stmt *stmt = NULL;
134 sqlite3_snprintf(QUERY_MAXLEN, query,
135 "UPDATE rua_panel_stat SET score = score * %f WHERE caller_panel = ? AND rua_stat_tag != ?",
138 LOGD("lose score update sql : %s", query);
139 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
140 if (r != SQLITE_OK) {
141 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
145 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
146 if (r != SQLITE_OK) {
147 LOGE("caller bind error(%d) \n", r);
151 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
152 if (r != SQLITE_OK) {
153 LOGE("rua_stat_tag bind error(%d) \n", r);
157 r = sqlite3_step(stmt);
158 if (r != SQLITE_DONE) {
159 LOGE("step error(%d) \n", r);
165 sqlite3_finalize(stmt);
170 int __rua_stat_win_score_update(char *caller, char *rua_stat_tag)
173 char query[QUERY_MAXLEN];
174 sqlite3_stmt *stmt = NULL;
176 sqlite3_snprintf(QUERY_MAXLEN, query,
177 "UPDATE rua_panel_stat SET score = score + %d WHERE caller_panel = ? AND rua_stat_tag = ?",
180 LOGD("win score update sql : %s", query);
182 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
183 if (r != SQLITE_OK) {
184 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
188 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
189 if (r != SQLITE_OK) {
190 LOGE("caller bind error(%d) \n", r);
194 r = sqlite3_bind_text(stmt, 2, rua_stat_tag, strlen(rua_stat_tag), SQLITE_STATIC);
195 if (r != SQLITE_OK) {
196 LOGE("rua_stat_tag bind error(%d) \n", r);
200 r = sqlite3_step(stmt);
201 if (r != SQLITE_DONE) {
202 LOGE("step error(%d) \n", r);
208 sqlite3_finalize(stmt);
213 int rua_stat_update(char *caller, char *rua_stat_tag)
216 int affected_rows = 0;
218 LOGD("rua_stat_update start");
220 r = __rua_stat_init(SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE);
222 LOGE("__rua_stat_init fail");
227 LOGE("rua_stat is not initialized");
231 if (caller == NULL) {
232 LOGE("caller is null");
236 if (rua_stat_tag == NULL) {
237 LOGE("rua_stat_tag is null");
242 r = __rua_stat_lose_score_update(caller, rua_stat_tag);
243 if (r != SQLITE_DONE) {
244 LOGE("__rua_stat_lose_score_insert fail.");
248 r = __rua_stat_win_score_update(caller, rua_stat_tag);
249 affected_rows = sqlite3_changes(_db);
250 if ((r != SQLITE_DONE) || (affected_rows == 0)) {
251 r = __rua_stat_insert(caller, rua_stat_tag);
253 if (r != SQLITE_DONE) {
254 LOGE("__rua_stat_insert fail.");
260 LOGD("rua_stat_update done");
267 int rua_stat_get_stat_tags(char *caller,
268 int (*rua_stat_tag_iter_fn)(const char *rua_stat_tag, void *data),
273 char query[QUERY_MAXLEN];
274 const unsigned char *ct;
276 r = __rua_stat_init(SQLITE_OPEN_READONLY);
278 LOGE("__rua_stat_init fail");
282 sqlite3_snprintf(QUERY_MAXLEN, query,
283 "SELECT rua_stat_tag FROM rua_panel_stat WHERE caller_panel = ? ORDER BY score DESC");
288 r = sqlite3_prepare(_db, query, sizeof(query), &stmt, NULL);
289 if (r != SQLITE_OK) {
290 LOGE("sqlite3_prepare error(%d , %d, %s)", r, sqlite3_extended_errcode(_db), sqlite3_errmsg(_db));
294 r = sqlite3_bind_text(stmt, 1, caller, strlen(caller), SQLITE_STATIC);
295 if (r != SQLITE_OK) {
296 LOGE("caller bind error(%d) \n", r);
300 while (sqlite3_step(stmt) == SQLITE_ROW) {
301 ct = sqlite3_column_text(stmt, 0);
302 if (ct == NULL || ct[0] == '\0')
303 LOGW("sqlite3_column_text null");
305 rua_stat_tag_iter_fn((const char *)ct, data);
310 sqlite3_finalize(stmt);
317 static int __exec(sqlite3 *db, char *query)
325 r = sqlite3_exec(db, query, NULL, NULL, &errmsg);
326 if (r != SQLITE_OK) {
327 SECURE_LOGE("query(%s) exec error(%s)", query, errmsg);
328 sqlite3_free(errmsg);
335 static int __create_table(sqlite3 *db)
339 r = __exec(db, CREATE_RUA_STAT_TABLE);
341 LOGE("create table error");
348 static sqlite3 *__db_init(char *root, int flags)
353 r = db_util_open_with_options(root, &db, flags, NULL);
355 LOGE("db util open error(%d/%d/%d/%s)", r,
357 sqlite3_extended_errcode(db),
362 r = __create_table(db);