2 * Copyright (c) 2011-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.
17 #include <app_manager.h>
21 #include <tzplatform_config.h>
23 #include "vc_cmd_db.h"
25 #include "vc_command.h"
26 #include "voice_control_command_expand.h"
29 const char* vc_db_tag()
39 * +-----+------+------+--------+--------+---------+-----------+-------+-----------------+-------+
40 * | id | pid | type | format | domain | command | parameter | appid | invocation_name | fixed |
41 * +-----+------+------+--------+--------+---------+-----------+-------+-----------------+-------+
43 * CREATE TABLE vc_info (id INTEGER PRIMARY KEY AUTOINCREMENT, pid INTEGER, type INTEGER, format INTEGER, domain INTEGER, command TEXT, appid TEXT);
46 * +-----+--------+-------+-----+-----------+-----+------+--------+--------+---------+-----------+-------+-----------------+-------+
47 * | id | result | event | msg | exclusive | pid | type | format | domain | command | parameter | appid | invocation_name | fixed |
48 * +-----+--------+-------+-----+-----------+-----+------+--------+--------+---------+-----------+-------+-----------------+-------+
50 * CREATE TABLE vc_result (id INTEGER PRIMARY KEY AUTOINCREMENT, result TEXT, event INTEGER, msg TEXT, exclusive INTEGER,
51 * pid INTEGER, type INTEGER, format INTEGER, domain INTEGER, command TEXT, parameter TEXT, appid TEXT,\
55 #define FREE_MEM(X) {if (NULL != X) {free(X); X = NULL; } }
58 //#define DB_PATH tzplatform_mkpath(TZ_USER_DB, ".vc_info.db")
59 static sqlite3* g_db_handle = NULL;
60 static sqlite3* g_db_backup_handle = NULL;
61 static char* g_path = NULL;
62 static char* g_backup_path = NULL;
63 static int g_ref_cnt = 0;
67 int g_backup_db_cnt = 0;
69 static int __vc_db_check_table(sqlite3* db_handle, const char* table, bool *is_exist);
70 static int __vc_db_begin_transaction(sqlite3* db_handle);
71 static int __vc_db_create_table(sqlite3* db_handle, const char* table);
72 static int __vc_db_rollback_transaction(sqlite3* db_handle);
73 static int __vc_db_commit_transaction(sqlite3* db_handle);
76 int __vc_db_reset_handle(void)
78 if (!g_db_handle || !g_db_backup_handle) {
82 return VC_DB_ERROR_NONE;
85 static int __vc_db_transaction(sqlite3* db_handle, const char* transaction)
87 sqlite3_stmt* pStmt = NULL;
91 ret = sqlite3_prepare_v2(db_handle, transaction, -1, &pStmt, NULL);
92 if (ret != SQLITE_OK) {
93 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_prepare_v2: transaction(%s), ret(%d), err(%s)", transaction, ret, sqlite3_errmsg(db_handle));
94 return VC_DB_ERROR_OPERATION_FAILED;
97 if (sqlite3_step(pStmt) != SQLITE_DONE) {
98 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: transaction(%s), ret(%d), err(%s)", transaction, ret, sqlite3_errmsg(db_handle));
99 sqlite3_finalize(pStmt);
100 return VC_DB_ERROR_OPERATION_FAILED;
103 sqlite3_finalize(pStmt);
104 return VC_DB_ERROR_NONE;
107 static int __vc_db_begin_transaction(sqlite3* db_handle)
109 int ret = __vc_db_transaction(db_handle, "BEGIN IMMEDIATE TRANSACTION");
113 static int __vc_db_rollback_transaction(sqlite3* db_handle)
115 int ret = __vc_db_transaction(db_handle, "ROLLBACK TRANSACTION");
119 static int __vc_db_commit_transaction(sqlite3* db_handle)
121 int ret = __vc_db_transaction(db_handle, "COMMIT TRANSACTION");
125 static int __vc_db_exec_query(sqlite3* db_handle, const char* sql)
127 char* err_msg = NULL;
129 int ret = sqlite3_exec(db_handle, sql, NULL, NULL, &err_msg);
130 if (ret != SQLITE_OK) {
131 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_exec return fail, ret(%d), err(%s)", ret, err_msg);
132 sqlite3_free(err_msg);
134 return VC_DB_ERROR_OPERATION_FAILED;
136 return VC_DB_ERROR_NONE;
139 static int __vc_db_check_table(sqlite3* db_handle, const char* table, bool *is_exist)
143 if (0 == strncmp(table, VC_RESULT_TABLE, strlen(table))) {
144 sql = strdup("SELECT COUNT(*) FROM sqlite_master WHERE name='vc_result';");
145 } else if (0 == strncmp(table, VC_INFO_TABLE, strlen(table))) {
146 sql = strdup("SELECT COUNT(*) FROM sqlite_master WHERE name='vc_info';");
148 return VC_DB_ERROR_INVALID_PARAMETER;
152 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
153 return VC_DB_ERROR_OUT_OF_MEMORY;
156 SLOG(LOG_WARN, vc_db_tag(), "[SQL] %s", sql);
158 char* err_msg = NULL;
159 char** results = NULL;
160 int ret = sqlite3_get_table(db_handle, sql, &results, NULL, NULL, &err_msg);
161 if (ret != SQLITE_OK) {
162 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_get_table return fail, ret(%d), err(%s)", ret, err_msg);
163 sqlite3_free(err_msg);
165 return VC_DB_ERROR_OPERATION_FAILED;
168 if (0 != atoi(results[1])) {
170 SLOG(LOG_INFO, vc_db_tag(), "[INFO] table exists (%d)", atoi(results[1]));
172 SLOG(LOG_INFO, vc_db_tag(), "[INFO] table doesn't exist (%d)", atoi(results[1]));
175 sqlite3_free_table(results);
178 return VC_DB_ERROR_NONE;
181 static int __vc_db_delete_commands(sqlite3* db_handle, int pid, vc_cmd_type_e type, const char* appid)
183 sqlite3_stmt* stmt = NULL;
186 if (VC_COMMAND_TYPE_BACKGROUND != type && -1 == pid)
187 sql = strdup("DELETE FROM vc_info WHERE type = ?;");
188 else if (NULL != appid)
189 sql = strdup("DELETE FROM vc_info WHERE type = ? AND appid = ?;");
191 sql = strdup("DELETE FROM vc_info WHERE type = ? AND pid = ?;");
194 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
195 return VC_DB_ERROR_OUT_OF_MEMORY;
199 /* check whether there is a table or not */
200 bool is_exist = false;
201 ret = __vc_db_check_table(db_handle, VC_INFO_TABLE, &is_exist);
202 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
203 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_INFO_TABLE, ret);
204 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_INFO_TABLE)) {
205 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_INFO_TABLE, ret);
208 return VC_DB_ERROR_OPERATION_FAILED;
211 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_INFO_TABLE);
214 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
215 if (ret != SQLITE_OK) {
216 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
219 return VC_DB_ERROR_OPERATION_FAILED;
221 ret = sqlite3_bind_int(stmt, 1, (int)type);
222 if (ret != SQLITE_OK) {
223 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
224 sqlite3_finalize(stmt);
227 return VC_DB_ERROR_OPERATION_FAILED;
230 if (VC_COMMAND_TYPE_BACKGROUND != type && -1 == pid) {
231 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] DELETE FROM vc_info WHERE type = %d;", type);
232 } else if (NULL != appid) {
233 ret = sqlite3_bind_text(stmt, 2, appid, -1, SQLITE_TRANSIENT);
234 if (ret != SQLITE_OK) {
235 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
236 sqlite3_clear_bindings(stmt);
237 sqlite3_finalize(stmt);
240 return VC_DB_ERROR_OPERATION_FAILED;
242 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] DELETE FROM vc_info WHERE type = %d AND appid = %s", type, appid);
244 ret = sqlite3_bind_int(stmt, 2, pid);
245 if (ret != SQLITE_OK) {
246 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
247 sqlite3_clear_bindings(stmt);
248 sqlite3_finalize(stmt);
251 return VC_DB_ERROR_OPERATION_FAILED;
253 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] DELETE FROM vc_info WHERE type = %d AND pid = %d", type, pid);
256 ret = sqlite3_step(stmt);
257 if (ret != SQLITE_DONE) {
258 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned, sql(%s), ret(%d), err(%s)", sql, ret, sqlite3_errmsg(db_handle));
259 sqlite3_clear_bindings(stmt);
260 sqlite3_finalize(stmt);
263 return VC_DB_ERROR_OPERATION_FAILED;
267 sqlite3_clear_bindings(stmt);
268 sqlite3_finalize(stmt);
272 return VC_DB_ERROR_NONE;
275 static int __vc_db_insert_commands(sqlite3* db_handle, int pid, vc_cmd_type_e type, vc_cmd_s* cmd)
277 SLOG(LOG_DEBUG, vc_db_tag(), "pid(%d), type(%d)", pid, type);
279 sqlite3_stmt* stmt = NULL;
280 const char* sql = "INSERT INTO vc_info (id, pid, type, format, domain, command, parameter, appid, invocation_name, fixed) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
282 /* check whether there is a table or not */
283 bool is_exist = false;
284 ret = __vc_db_check_table(db_handle, VC_INFO_TABLE, &is_exist);
285 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
286 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_INFO_TABLE, ret);
287 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_INFO_TABLE)) {
288 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_INFO_TABLE, ret);
289 return VC_DB_ERROR_OPERATION_FAILED;
292 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_INFO_TABLE);
296 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
297 if (ret != SQLITE_OK) {
298 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: err(%s)", sqlite3_errmsg(db_handle));
299 return VC_DB_ERROR_OPERATION_FAILED;
301 ret = sqlite3_bind_int(stmt, 2, pid);
302 if (ret != SQLITE_OK) {
303 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
304 sqlite3_finalize(stmt);
305 return VC_DB_ERROR_OPERATION_FAILED;
307 ret = sqlite3_bind_int(stmt, 3, cmd->type);
308 if (ret != SQLITE_OK) {
309 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
310 sqlite3_clear_bindings(stmt);
311 sqlite3_finalize(stmt);
312 return VC_DB_ERROR_OPERATION_FAILED;
314 ret = sqlite3_bind_int(stmt, 4, cmd->format);
315 if (ret != SQLITE_OK) {
316 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
317 sqlite3_clear_bindings(stmt);
318 sqlite3_finalize(stmt);
319 return VC_DB_ERROR_OPERATION_FAILED;
321 ret = sqlite3_bind_int(stmt, 5, cmd->domain);
322 if (ret != SQLITE_OK) {
323 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
324 sqlite3_clear_bindings(stmt);
325 sqlite3_finalize(stmt);
326 return VC_DB_ERROR_OPERATION_FAILED;
328 ret = sqlite3_bind_text(stmt, 6, cmd->command, -1, SQLITE_TRANSIENT);
329 if (ret != SQLITE_OK) {
330 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
331 sqlite3_clear_bindings(stmt);
332 sqlite3_finalize(stmt);
333 return VC_DB_ERROR_OPERATION_FAILED;
337 if (NULL == cmd->appid) {
338 // Get appid by pid using app control
339 ret = app_manager_get_app_id(pid, &appid);
340 if (APP_MANAGER_ERROR_NONE != ret) {
341 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] fail to get app id, ret(%d), pid(%d)", ret, pid);
344 cmd->appid = strdup(appid);
348 ret = sqlite3_bind_text(stmt, 8, cmd->appid, -1, SQLITE_TRANSIENT);
349 if (ret != SQLITE_OK) {
350 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
351 sqlite3_clear_bindings(stmt);
352 sqlite3_finalize(stmt);
353 return VC_DB_ERROR_OPERATION_FAILED;
355 if (VC_COMMAND_TYPE_BACKGROUND == type && NULL != cmd->invocation_name) {
356 ret = sqlite3_bind_text(stmt, 9, cmd->invocation_name, -1, SQLITE_TRANSIENT);
357 if (ret != SQLITE_OK) {
358 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
359 sqlite3_clear_bindings(stmt);
360 sqlite3_finalize(stmt);
361 return VC_DB_ERROR_OPERATION_FAILED;
364 ret = sqlite3_bind_text(stmt, 10, cmd->fixed, -1, SQLITE_TRANSIENT);
365 if (ret != SQLITE_OK) {
366 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
367 sqlite3_clear_bindings(stmt);
368 sqlite3_finalize(stmt);
369 return VC_DB_ERROR_OPERATION_FAILED;
371 ret = sqlite3_step(stmt);
372 if (ret != SQLITE_DONE) {
373 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned %d, %s", ret, sqlite3_errmsg(db_handle));
374 sqlite3_clear_bindings(stmt);
375 sqlite3_finalize(stmt);
376 return VC_DB_ERROR_OPERATION_FAILED;
379 SLOG(LOG_INFO, vc_db_tag(), "[SQL] INSERT INTO vc_info (id, pid(%d), type(%d), format(%d), domain(%d), command(%s)", pid, cmd->type, cmd->format, cmd->domain, cmd->command);
380 SLOG(LOG_INFO, vc_db_tag(), "[SQL] @@ appid(%s), invocation(%s), fixed(%s)", cmd->appid, cmd->invocation_name, cmd->fixed);
383 sqlite3_clear_bindings(stmt);
384 sqlite3_finalize(stmt);
385 return VC_DB_ERROR_NONE;
388 static int __vc_db_get_commands(sqlite3* db_handle, int pid, vc_cmd_type_e type, GSList** cmd_list)
390 SLOG(LOG_DEBUG, vc_db_tag(), "pid(%d), type(%d)", pid, type);
393 sqlite3_stmt* stmt = NULL;
397 if (VC_COMMAND_TYPE_BACKGROUND == type) {
398 /* For background command */
399 sql = strdup("SELECT * FROM vc_info WHERE type = ?;");
401 sql = strdup("SELECT * FROM vc_info WHERE type = ? AND pid = ?;");
405 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
406 return VC_DB_ERROR_OUT_OF_MEMORY;
409 /* check whether there is a table or not */
410 bool is_exist = false;
411 ret = __vc_db_check_table(db_handle, VC_INFO_TABLE, &is_exist);
412 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
413 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_INFO_TABLE, ret);
414 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_INFO_TABLE)) {
415 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_INFO_TABLE, ret);
418 return VC_DB_ERROR_OPERATION_FAILED;
421 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_INFO_TABLE);
425 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
426 if (ret != SQLITE_OK) {
427 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
430 return VC_DB_ERROR_OPERATION_FAILED;
433 ret = sqlite3_bind_int(stmt, 1, (int)type);
434 if (ret != SQLITE_OK) {
435 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
436 sqlite3_finalize(stmt);
439 return VC_DB_ERROR_OPERATION_FAILED;
441 if (VC_COMMAND_TYPE_BACKGROUND != type) {
442 ret = sqlite3_bind_int(stmt, 2, pid);
443 if (ret != SQLITE_OK) {
444 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
445 sqlite3_clear_bindings(stmt);
446 sqlite3_finalize(stmt);
449 return VC_DB_ERROR_OPERATION_FAILED;
453 if (VC_COMMAND_TYPE_BACKGROUND == type)
454 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_info WHERE type = %d", type);
456 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_info WHERE type = %d and pid = %d", type, pid);
458 ret = sqlite3_step(stmt);
459 if (ret == SQLITE_DONE) {
460 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
461 sqlite3_clear_bindings(stmt);
462 sqlite3_finalize(stmt);
465 return VC_DB_ERROR_NONE;
468 if (VC_COMMAND_TYPE_BACKGROUND == type && -1 != pid) {
469 if (APP_MANAGER_ERROR_NONE != app_manager_get_app_id(pid, &appid)) {
470 SLOG(LOG_WARN, vc_db_tag(), "[WARN] fail to get app id, pid(%d)", pid);
474 while (SQLITE_ROW == ret) {
477 char* temp_text = NULL;
479 ret = vc_cmd_create(&temp_cmd);
482 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
488 sqlite3_clear_bindings(stmt);
489 sqlite3_finalize(stmt);
492 return VC_DB_ERROR_OUT_OF_MEMORY;
495 temp_text = (char*)sqlite3_column_text(stmt, 7);
496 if (NULL != temp_text)
497 vc_cmd_set_appid(temp_cmd, temp_text);
499 ret = vc_cmd_get_appid(temp_cmd, &temp_text);
500 if (NULL != appid && 0 == ret) {
501 if (VC_COMMAND_TYPE_BACKGROUND == type && 0 == strncmp(appid, temp_text, strlen(appid))) {
502 SLOG(LOG_DEBUG, vc_db_tag(), "Skip get background commands when app is foreground, appid(%s)", appid);
507 vc_cmd_destroy(temp_cmd);
510 ret = sqlite3_step(stmt);
511 if (SQLITE_DONE == ret)
518 if (NULL != temp_text) {
523 temp = sqlite3_column_int(stmt, 0);
524 vc_cmd_set_id(temp_cmd, temp);
526 temp = sqlite3_column_int(stmt, 1);
527 vc_cmd_set_pid(temp_cmd, temp);
529 temp = sqlite3_column_int(stmt, 2);
530 vc_cmd_set_type(temp_cmd, temp);
532 temp = sqlite3_column_int(stmt, 3);
533 vc_cmd_set_format(temp_cmd, temp);
535 temp = sqlite3_column_int(stmt, 4);
536 vc_cmd_set_domain(temp_cmd, temp);
538 temp_text = (char*)sqlite3_column_text(stmt, 5);
539 if (NULL != temp_text)
540 vc_cmd_set_command(temp_cmd, temp_text);
542 temp_text = (char*)sqlite3_column_text(stmt, 6);
543 if (NULL != temp_text)
544 vc_cmd_set_unfixed_command(temp_cmd, temp_text);
546 temp_text = (char*)sqlite3_column_text(stmt, 8);
547 if (NULL != temp_text)
548 vc_cmd_set_invocation_name(temp_cmd, temp_text);
550 temp_text = (char*)sqlite3_column_text(stmt, 9);
551 if (NULL != temp_text)
552 vc_cmd_set_fixed_command(temp_cmd, temp_text);
554 ret = vc_cmd_get_type(temp_cmd, &temp);
555 if (0 == ret && type == temp) {
556 *cmd_list = g_slist_append(*cmd_list, temp_cmd);
558 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Command type(%d) is NOT valid : request type(%d)", temp, type);
560 vc_cmd_destroy(temp_cmd);
563 ret = sqlite3_step(stmt);
564 if (SQLITE_DONE == ret)
574 sqlite3_clear_bindings(stmt);
575 sqlite3_finalize(stmt);
579 return VC_DB_ERROR_NONE;
582 static int __vc_db_get_pid(const char* appid, int* pid)
584 bool running = false;
585 int ret = app_manager_is_running(appid, &running);
586 if (APP_MANAGER_ERROR_NONE != ret) {
587 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to check running with appid(%s)", appid);
588 return VC_DB_ERROR_OPERATION_FAILED;
590 if (true == running) {
591 app_context_h app_context = NULL;
592 ret = app_manager_get_app_context(appid, &app_context);
593 if (APP_MANAGER_ERROR_NONE != ret) {
594 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get app_context, ret(%d), appid(%s)", ret, appid);
595 return VC_DB_ERROR_OPERATION_FAILED;
598 ret = app_context_get_pid(app_context, pid);
599 int destroy_ret = app_context_destroy(app_context);
600 if (APP_MANAGER_ERROR_NONE != destroy_ret) {
601 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to destroy app context, ret(%d), appid(%s)", destroy_ret, appid);
604 if (APP_MANAGER_ERROR_NONE != ret) {
605 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get pid, ret(%d), appid(%s)", ret, appid);
606 return VC_DB_ERROR_OPERATION_FAILED;
609 SLOG(LOG_ERROR, vc_db_tag(), "app is not running, appid(%s)", appid);
611 return VC_DB_ERROR_NONE;
614 static int __vc_db_insert_result(sqlite3* db_handle, const char* result_text, int event, const char* msg, bool exclusive, vc_cmd_s* cmd)
616 SLOG(LOG_DEBUG, vc_db_tag(), "result_text(%s), event(%d), msg(%s), exclusive(%d), cmd(%p)", result_text, event, msg, exclusive, cmd);
618 sqlite3_stmt* stmt = NULL;
619 const char* sql = "INSERT INTO vc_result (id, result, event, msg, exclusive, pid, type, format, domain, command, parameter, appid, invocation_name, fixed) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
622 /* check whether there is a table or not */
623 bool is_exist = false;
624 ret = __vc_db_check_table(db_handle, VC_RESULT_TABLE, &is_exist);
625 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
626 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_RESULT_TABLE, ret);
627 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_RESULT_TABLE)) {
628 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_RESULT_TABLE, ret);
629 return VC_DB_ERROR_OPERATION_FAILED;
632 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_RESULT_TABLE);
636 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
637 if (ret != SQLITE_OK) {
638 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
639 return VC_DB_ERROR_OPERATION_FAILED;
641 ret = sqlite3_bind_text(stmt, 2, result_text, -1, SQLITE_TRANSIENT);
642 if (ret != SQLITE_OK) {
643 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
644 sqlite3_finalize(stmt);
645 return VC_DB_ERROR_OPERATION_FAILED;
647 ret = sqlite3_bind_int(stmt, 3, event);
648 if (ret != SQLITE_OK) {
649 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
650 sqlite3_clear_bindings(stmt);
651 sqlite3_finalize(stmt);
652 return VC_DB_ERROR_OPERATION_FAILED;
654 ret = sqlite3_bind_text(stmt, 4, msg, -1, SQLITE_TRANSIENT);
655 if (ret != SQLITE_OK) {
656 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
657 sqlite3_clear_bindings(stmt);
658 sqlite3_finalize(stmt);
659 return VC_DB_ERROR_OPERATION_FAILED;
661 ret = sqlite3_bind_int(stmt, 5, exclusive);
662 if (ret != SQLITE_OK) {
663 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
664 sqlite3_clear_bindings(stmt);
665 sqlite3_finalize(stmt);
666 return VC_DB_ERROR_OPERATION_FAILED;
670 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] INSERT INTO vc_result result(%s), event(%d), msg(%s), exclusive(%d))", result_text, event, msg, exclusive);
672 ret = sqlite3_step(stmt);
673 if (ret != SQLITE_DONE) {
674 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned %d, %s", ret, sqlite3_errmsg(db_handle));
675 sqlite3_clear_bindings(stmt);
676 sqlite3_finalize(stmt);
677 return VC_DB_ERROR_OPERATION_FAILED;
680 sqlite3_clear_bindings(stmt);
681 sqlite3_finalize(stmt);
682 return VC_DB_ERROR_NONE;
685 if (VC_COMMAND_TYPE_BACKGROUND == cmd->type) {
687 ret = __vc_db_get_pid(cmd->appid, &pid);
689 SLOG(LOG_WARN, vc_db_tag(), "Fail to get pid, appid(%s) ret(%d)", cmd->appid, ret);
691 SLOG(LOG_ERROR, vc_db_tag(), "pid(%d)", pid);
696 ret = sqlite3_bind_int(stmt, 6, cmd->pid);
697 if (ret != SQLITE_OK) {
698 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
699 sqlite3_clear_bindings(stmt);
700 sqlite3_finalize(stmt);
701 return VC_DB_ERROR_OPERATION_FAILED;
703 ret = sqlite3_bind_int(stmt, 7, cmd->type);
704 if (ret != SQLITE_OK) {
705 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
706 sqlite3_clear_bindings(stmt);
707 sqlite3_finalize(stmt);
708 return VC_DB_ERROR_OPERATION_FAILED;
710 ret = sqlite3_bind_int(stmt, 8, cmd->format);
711 if (ret != SQLITE_OK) {
712 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
713 sqlite3_clear_bindings(stmt);
714 sqlite3_finalize(stmt);
715 return VC_DB_ERROR_OPERATION_FAILED;
717 ret = sqlite3_bind_int(stmt, 9, cmd->domain);
718 if (ret != SQLITE_OK) {
719 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
720 sqlite3_clear_bindings(stmt);
721 sqlite3_finalize(stmt);
722 return VC_DB_ERROR_OPERATION_FAILED;
724 ret = sqlite3_bind_text(stmt, 10, cmd->command, -1, SQLITE_TRANSIENT);
725 if (ret != SQLITE_OK) {
726 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
727 sqlite3_clear_bindings(stmt);
728 sqlite3_finalize(stmt);
729 return VC_DB_ERROR_OPERATION_FAILED;
731 ret = sqlite3_bind_text(stmt, 11, cmd->parameter, -1, SQLITE_TRANSIENT);
732 if (ret != SQLITE_OK) {
733 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
734 sqlite3_clear_bindings(stmt);
735 sqlite3_finalize(stmt);
736 return VC_DB_ERROR_OPERATION_FAILED;
738 ret = sqlite3_bind_text(stmt, 12, cmd->appid, -1, SQLITE_TRANSIENT);
739 if (ret != SQLITE_OK) {
740 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
741 sqlite3_clear_bindings(stmt);
742 sqlite3_finalize(stmt);
743 return VC_DB_ERROR_OPERATION_FAILED;
745 ret = sqlite3_bind_text(stmt, 13, cmd->invocation_name, -1, SQLITE_TRANSIENT);
746 if (ret != SQLITE_OK) {
747 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
748 sqlite3_clear_bindings(stmt);
749 sqlite3_finalize(stmt);
750 return VC_DB_ERROR_OPERATION_FAILED;
752 ret = sqlite3_bind_text(stmt, 14, cmd->fixed, -1, SQLITE_TRANSIENT);
753 if (ret != SQLITE_OK) {
754 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
755 sqlite3_clear_bindings(stmt);
756 sqlite3_finalize(stmt);
757 return VC_DB_ERROR_OPERATION_FAILED;
759 ret = sqlite3_step(stmt);
760 if (ret != SQLITE_DONE) {
761 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned %d, %s", ret, sqlite3_errmsg(db_handle));
762 sqlite3_clear_bindings(stmt);
763 sqlite3_finalize(stmt);
764 return VC_DB_ERROR_OPERATION_FAILED;
767 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] INSERT INTO vc_result result(%s), event(%d), msg(%s), exclusive(%d), pid(%d), type(%d), format(%d), domain(%d), command(%s), parameter(%s), appid(%s), invocation(%s), fixed(%s)",
768 result_text, event, msg, exclusive, cmd->pid, cmd->type, cmd->format, cmd->domain, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
771 sqlite3_clear_bindings(stmt);
772 sqlite3_finalize(stmt);
774 return VC_DB_ERROR_NONE;
777 static int __vc_db_remove_invocation_name(char* org_cmd, const char* invocation_name, char** new_cmd)
779 if (NULL == org_cmd || NULL == new_cmd) {
780 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter");
781 return VC_DB_ERROR_INVALID_PARAMETER;
784 if (NULL == invocation_name) {
785 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Invalid parameter, invocation name is NULL, org_cmd(%s)", org_cmd);
786 return VC_DB_ERROR_INVALID_PARAMETER;
789 if (strlen(org_cmd) <= strlen(invocation_name)) {
790 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] No need to remove invocation name, org_cmd(%s) invocation(%s)", org_cmd, invocation_name);
791 return VC_DB_ERROR_INVALID_PARAMETER;
793 if (0 == strncasecmp(org_cmd, invocation_name, strlen(invocation_name))) {
794 *new_cmd = strdup(org_cmd + strlen(invocation_name) + 1);
796 SLOG(LOG_INFO, vc_db_tag(), "Original cmd[%s], New cmd[%s], Invocation name[%s]", org_cmd, (*new_cmd) ? *new_cmd : "NULL", invocation_name);
797 return VC_DB_ERROR_NONE;
800 static int __vc_db_extract_unfixed_command(char* command, char* fixed, char** temp_unfixed)
802 if (NULL == command || NULL == temp_unfixed) {
803 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter");
804 return VC_DB_ERROR_INVALID_PARAMETER;
808 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Invalid parameter, fixed cmd is NULL, org_cmd(%s)", command);
809 return VC_DB_ERROR_INVALID_PARAMETER;
812 if (strlen(command) <= strlen(fixed)) {
813 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] No need to extract unfixed command, cmd(%s) fixed(%s)", command, fixed);
814 return VC_DB_ERROR_INVALID_PARAMETER;
817 char* temp = (char*)calloc(256, sizeof(char));
819 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
820 return VC_DB_ERROR_OUT_OF_MEMORY;
822 if (0 == strncasecmp(command, fixed, strlen(fixed))) {
823 strncpy(temp, command + strlen(fixed) + 1, strlen(command) - strlen(fixed) - 1);
824 SLOG(LOG_WARN, vc_db_tag(), "@@@");
825 } else if (0 == strncasecmp(command + strlen(command) - strlen(fixed), fixed, strlen(fixed))) {
826 command[strlen(command) - strlen(fixed) - 1] = '\0';
827 snprintf(temp, 256, "%s", command);
828 SLOG(LOG_WARN, vc_db_tag(), "@@@");
831 SLOG(LOG_WARN, vc_db_tag(), "Command(%s) Fixed(%s) Unfixed(%s)", command, fixed, temp);
833 *temp_unfixed = strdup(temp);
837 return VC_DB_ERROR_NONE;
840 static int __vc_db_get_result(sqlite3* db_handle, char** result_text, int* event, char** msg, int pid, char* appid, vc_cmd_list_h vc_cmd_list, bool exclusive)
843 sqlite3_stmt* stmt = NULL;
846 sql = strdup("SELECT * FROM vc_result;");
847 else if (NULL != appid)
848 sql = strdup("SELECT * FROM vc_result WHERE appid = ?;");
850 sql = strdup("SELECT * FROM vc_result WHERE pid = ?;");
853 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
854 return VC_DB_ERROR_OUT_OF_MEMORY;
857 /* check whether there is a table or not */
858 bool is_exist = false;
859 ret = __vc_db_check_table(db_handle, VC_RESULT_TABLE, &is_exist);
860 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
861 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_RESULT_TABLE, ret);
862 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_RESULT_TABLE)) {
863 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_RESULT_TABLE, ret);
866 return VC_DB_ERROR_OPERATION_FAILED;
869 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_RESULT_TABLE);
873 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
874 if (ret != SQLITE_OK) {
875 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
878 return VC_DB_ERROR_OPERATION_FAILED;
881 ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
882 if (ret != SQLITE_OK) {
883 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
884 sqlite3_finalize(stmt);
887 return VC_DB_ERROR_OPERATION_FAILED;
889 } else if (-1 != pid) {
890 ret = sqlite3_bind_int(stmt, 1, pid);
891 if (ret != SQLITE_OK) {
892 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
893 sqlite3_finalize(stmt);
896 return VC_DB_ERROR_OPERATION_FAILED;
899 ret = sqlite3_step(stmt);
900 if (ret == SQLITE_DONE) {
901 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
902 sqlite3_clear_bindings(stmt);
903 sqlite3_finalize(stmt);
906 return VC_DB_ERROR_NONE;
910 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] %s", sql);
911 else if (NULL != appid)
912 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE appid = %s;", appid);
915 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE pid = %d;", pid);
917 vc_cmd_h temp_cmd = NULL;
918 while (SQLITE_ROW == ret) {
920 char* temp_text = NULL;
921 const char* invocation_name = NULL;
923 temp_text = (char*)sqlite3_column_text(stmt, 1);
924 if (NULL != temp_text)
925 *result_text = strdup(temp_text);
927 temp = sqlite3_column_int(stmt, 2);
931 temp_text = (char*)sqlite3_column_text(stmt, 3);
932 if (NULL != temp_text)
933 *msg = strdup(temp_text);
936 if (0 != vc_cmd_create(&temp_cmd)) {
937 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create command!!");
938 if (NULL != *result_text) {
943 if (NULL != msg && NULL != *msg) {
949 sqlite3_clear_bindings(stmt);
950 sqlite3_finalize(stmt);
956 temp = sqlite3_column_int(stmt, 0);
957 vc_cmd_set_id(temp_cmd, temp);
959 temp = sqlite3_column_int(stmt, 5);
960 vc_cmd_set_pid(temp_cmd, temp);
962 temp = sqlite3_column_int(stmt, 6);
963 vc_cmd_set_type(temp_cmd, temp);
965 temp = sqlite3_column_int(stmt, 7);
966 vc_cmd_set_format(temp_cmd, temp);
968 temp = sqlite3_column_int(stmt, 8);
969 vc_cmd_set_domain(temp_cmd, temp);
972 invocation_name = (char*)sqlite3_column_text(stmt, 12);
974 temp_text = (char*)sqlite3_column_text(stmt, 9);
975 SLOG(LOG_DEBUG, vc_db_tag(), "org command (%s)", temp_text);
977 if (NULL != temp_text) {
978 char* temp_command = NULL;
979 char* temp_unfixed = NULL;
980 char* temp_fixed = NULL;
982 if (NULL != invocation_name)
983 __vc_db_remove_invocation_name(*result_text, invocation_name, &temp_command);
985 if (NULL == temp_command) {
986 temp_command = strdup(temp_text);
988 // remove invocation name from result_text
990 *result_text = strdup(temp_command);
994 temp_fixed = (char*)sqlite3_column_text(stmt, 13);
995 if (NULL != temp_fixed)
996 vc_cmd_set_fixed_command(temp_cmd, temp_fixed);
999 temp_unfixed = (char*)sqlite3_column_text(stmt, 10);
1001 if (NULL != temp_unfixed) {
1002 char merge_result[256] = {0, };
1003 vc_cmd_set_command(temp_cmd, temp_command);
1004 vc_cmd_set_unfixed_command(temp_cmd, temp_unfixed);
1005 snprintf(merge_result, 256, "%s %s", temp_command, temp_unfixed);
1006 if (NULL != *result_text)
1008 *result_text = strdup(merge_result);
1009 } else if (NULL != temp_fixed) {
1010 __vc_db_extract_unfixed_command(*result_text, temp_fixed, &temp_unfixed);
1011 vc_cmd_set_command(temp_cmd, temp_fixed);
1012 vc_cmd_set_unfixed_command(temp_cmd, temp_unfixed);
1013 if (NULL != temp_unfixed) {
1015 temp_unfixed = NULL;
1018 vc_cmd_set_command(temp_cmd, temp_command);
1021 temp_command = NULL;
1024 temp_text = (char*)sqlite3_column_text(stmt, 11);
1025 if (NULL != temp_text)
1026 vc_cmd_set_appid(temp_cmd, temp_text);
1028 if (0 != vc_cmd_list_add(vc_cmd_list, temp_cmd)) {
1029 SLOG(LOG_DEBUG, vc_db_tag(), "Fail to add command to list");
1030 vc_cmd_destroy(temp_cmd);
1031 vc_cmd_list_destroy(vc_cmd_list, true);
1033 if (NULL != *result_text) {
1035 *result_text = NULL;
1038 if (NULL != msg && NULL != *msg) {
1043 sqlite3_reset(stmt);
1044 sqlite3_clear_bindings(stmt);
1045 sqlite3_finalize(stmt);
1048 return VC_DB_ERROR_OPERATION_FAILED;
1051 ret = sqlite3_step(stmt);
1052 if (SQLITE_DONE == ret)
1056 sqlite3_reset(stmt);
1057 sqlite3_clear_bindings(stmt);
1058 sqlite3_finalize(stmt);
1062 return VC_DB_ERROR_NONE;
1065 void __vc_db_demandable_client_free(void* data)
1067 vc_deactivated_app_s* d_app = (vc_deactivated_app_s*)data;
1069 if (NULL != d_app) {
1070 if (NULL != d_app->appid) {
1072 d_app->appid = NULL;
1079 static int __vc_db_get_appid(sqlite3* db_handle, const char* result, GSList** app_list)
1081 GSList* temp_app_list = NULL;
1084 sqlite3_stmt* stmt = NULL;
1085 const char* sql = "SELECT * FROM vc_result WHERE type = ? AND result = ? COLLATE NOCASE;";
1087 /* check whether there is a table or not */
1088 bool is_exist = false;
1089 ret = __vc_db_check_table(db_handle, VC_RESULT_TABLE, &is_exist);
1090 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
1091 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_RESULT_TABLE, ret);
1092 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_RESULT_TABLE)) {
1093 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_RESULT_TABLE, ret);
1094 return VC_DB_ERROR_OPERATION_FAILED;
1097 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_RESULT_TABLE);
1101 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
1102 if (ret != SQLITE_OK) {
1103 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
1104 return VC_DB_ERROR_OPERATION_FAILED;
1106 ret = sqlite3_bind_int(stmt, 1, VC_COMMAND_TYPE_BACKGROUND);
1107 if (ret != SQLITE_OK) {
1108 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1109 sqlite3_finalize(stmt);
1110 return VC_DB_ERROR_OPERATION_FAILED;
1112 ret = sqlite3_bind_text(stmt, 2, result, -1, SQLITE_TRANSIENT);
1113 if (ret != SQLITE_OK) {
1114 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1115 sqlite3_clear_bindings(stmt);
1116 sqlite3_finalize(stmt);
1117 return VC_DB_ERROR_OPERATION_FAILED;
1119 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE type = 2 and result = %s", result);
1120 ret = sqlite3_step(stmt);
1121 if (ret == SQLITE_DONE) {
1122 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
1123 sqlite3_clear_bindings(stmt);
1124 sqlite3_finalize(stmt);
1125 return VC_DB_ERROR_NONE;
1128 while (SQLITE_ROW == ret) {
1129 char* temp_text = NULL;
1130 vc_deactivated_app_s* temp_app = NULL;
1131 temp_app = (vc_deactivated_app_s*)calloc(1, sizeof(vc_deactivated_app_s));
1132 if (NULL == temp_app) {
1133 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] memory allocation fail");
1135 if (NULL != temp_app_list) {
1136 g_slist_free_full(temp_app_list, __vc_db_demandable_client_free);
1137 temp_app_list = NULL;
1140 sqlite3_reset(stmt);
1141 sqlite3_clear_bindings(stmt);
1142 sqlite3_finalize(stmt);
1143 return VC_DB_ERROR_OUT_OF_MEMORY;
1146 temp_text = (char*)sqlite3_column_text(stmt, 11);
1147 if (NULL != temp_text)
1148 temp_app->appid = strdup(temp_text);
1150 temp_app_list = g_slist_append(temp_app_list, temp_app);
1152 ret = sqlite3_step(stmt);
1153 if (SQLITE_DONE == ret)
1157 *app_list = temp_app_list;
1159 sqlite3_reset(stmt);
1160 sqlite3_clear_bindings(stmt);
1161 sqlite3_finalize(stmt);
1162 return VC_DB_ERROR_NONE;
1165 int __vc_db_get_result_pid_list(sqlite3* db_handle, const char* result, GSList** pid_list)
1167 GSList* temp_pid_list = NULL;
1170 sqlite3_stmt* stmt = NULL;
1171 const char* sql = "SELECT DISTINCT pid, type FROM vc_result WHERE result = ? COLLATE NOCASE ORDER BY pid ASC;";
1174 /* check whether there is a table or not */
1175 bool is_exist = false;
1176 ret = __vc_db_check_table(db_handle, VC_RESULT_TABLE, &is_exist);
1177 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
1178 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_RESULT_TABLE, ret);
1179 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_RESULT_TABLE)) {
1180 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_RESULT_TABLE, ret);
1181 return VC_DB_ERROR_OPERATION_FAILED;
1184 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_RESULT_TABLE);
1188 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
1189 if (ret != SQLITE_OK) {
1190 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
1191 return VC_DB_ERROR_OPERATION_FAILED;
1193 ret = sqlite3_bind_text(stmt, 1, result, -1, SQLITE_TRANSIENT);
1194 if (ret != SQLITE_OK) {
1195 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1196 sqlite3_finalize(stmt);
1197 return VC_DB_ERROR_OPERATION_FAILED;
1199 ret = sqlite3_step(stmt);
1200 if (ret == SQLITE_DONE) {
1201 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
1202 sqlite3_clear_bindings(stmt);
1203 sqlite3_finalize(stmt);
1204 return VC_DB_ERROR_NONE;
1207 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result result = %s", result);
1209 while (SQLITE_ROW == ret) {
1211 vc_cmd_s* temp_cmd = NULL;
1212 temp_cmd = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
1213 if (NULL == temp_cmd) {
1214 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] memory allocation fail");
1216 if (NULL != temp_pid_list) {
1217 g_slist_free_full(temp_pid_list, free);
1218 temp_pid_list = NULL;
1221 sqlite3_reset(stmt);
1222 sqlite3_clear_bindings(stmt);
1223 sqlite3_finalize(stmt);
1224 return VC_DB_ERROR_OUT_OF_MEMORY;
1227 temp = sqlite3_column_int(stmt, 0);
1228 temp_cmd->pid = temp;
1230 temp = sqlite3_column_int(stmt, 1);
1231 temp_cmd->type = temp;
1233 temp_pid_list = g_slist_append(temp_pid_list, temp_cmd);
1235 ret = sqlite3_step(stmt);
1236 if (SQLITE_DONE == ret)
1240 *pid_list = temp_pid_list;
1242 sqlite3_reset(stmt);
1243 sqlite3_clear_bindings(stmt);
1244 sqlite3_finalize(stmt);
1245 return VC_DB_ERROR_NONE;
1248 static int __vc_db_append_commands(sqlite3* db_handle, int pid, int type, vc_cmd_list_h vc_cmd_list)
1250 SLOG(LOG_ERROR, vc_db_tag(), "pid(%d), type(%d)", pid, type);
1253 sqlite3_stmt* stmt = NULL;
1254 const char* sql = "SELECT * FROM vc_info WHERE pid = ? AND type = ?;";
1256 /* check whether there is a table or not */
1257 bool is_exist = false;
1258 ret = __vc_db_check_table(db_handle, VC_INFO_TABLE, &is_exist);
1259 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
1260 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", VC_INFO_TABLE, ret);
1261 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, VC_INFO_TABLE)) {
1262 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_INFO_TABLE, ret);
1263 return VC_DB_ERROR_OPERATION_FAILED;
1266 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", VC_INFO_TABLE);
1270 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
1271 if (ret != SQLITE_OK) {
1272 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
1273 return VC_DB_ERROR_OPERATION_FAILED;
1275 ret = sqlite3_bind_int(stmt, 1, pid);
1276 if (ret != SQLITE_OK) {
1277 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1278 sqlite3_finalize(stmt);
1279 return VC_DB_ERROR_OPERATION_FAILED;
1281 ret = sqlite3_bind_int(stmt, 2, type);
1282 if (ret != SQLITE_OK) {
1283 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1284 sqlite3_clear_bindings(stmt);
1285 sqlite3_finalize(stmt);
1286 return VC_DB_ERROR_OPERATION_FAILED;
1288 ret = sqlite3_step(stmt);
1289 if (ret == SQLITE_DONE) {
1290 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
1291 sqlite3_clear_bindings(stmt);
1292 sqlite3_finalize(stmt);
1293 return VC_DB_ERROR_NONE;
1296 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_info WHERE pid = %d and type = %d", pid, type);
1298 vc_cmd_h temp_cmd = NULL;
1300 while (SQLITE_ROW == ret) {
1302 char* temp_text = NULL;
1304 if (0 != vc_cmd_create(&temp_cmd)) {
1305 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create command!!");
1306 sqlite3_reset(stmt);
1307 sqlite3_clear_bindings(stmt);
1308 sqlite3_finalize(stmt);
1311 temp = sqlite3_column_int(stmt, 0);
1312 vc_cmd_set_id(temp_cmd, temp);
1314 temp = sqlite3_column_int(stmt, 1);
1315 vc_cmd_set_pid(temp_cmd, temp);
1317 temp = sqlite3_column_int(stmt, 2);
1318 vc_cmd_set_type(temp_cmd, temp);
1320 temp = sqlite3_column_int(stmt, 3);
1321 vc_cmd_set_format(temp_cmd, temp);
1323 temp = sqlite3_column_int(stmt, 4);
1324 vc_cmd_set_domain(temp_cmd, temp);
1326 temp_text = (char*)sqlite3_column_text(stmt, 5);
1327 if (NULL != temp_text)
1328 vc_cmd_set_command(temp_cmd, temp_text);
1330 temp_text = (char*)sqlite3_column_text(stmt, 6);
1331 if (NULL != temp_text)
1332 vc_cmd_set_unfixed_command(temp_cmd, temp_text);
1334 temp_text = (char*)sqlite3_column_text(stmt, 7);
1335 if (NULL != temp_text)
1336 vc_cmd_set_appid(temp_cmd, temp_text);
1338 temp_text = (char*)sqlite3_column_text(stmt, 8);
1339 if (NULL != temp_text)
1340 vc_cmd_set_invocation_name(temp_cmd, temp_text);
1342 temp_text = (char*)sqlite3_column_text(stmt, 9);
1343 if (NULL != temp_text)
1344 vc_cmd_set_fixed_command(temp_cmd, temp_text);
1346 if (0 != vc_cmd_list_add(vc_cmd_list, temp_cmd)) {
1347 SLOG(LOG_DEBUG, vc_db_tag(), "Fail to add command to list");
1348 vc_cmd_destroy(temp_cmd);
1349 vc_cmd_list_destroy(vc_cmd_list, true);
1351 sqlite3_reset(stmt);
1352 sqlite3_clear_bindings(stmt);
1353 sqlite3_finalize(stmt);
1354 return VC_DB_ERROR_OPERATION_FAILED;
1357 ret = sqlite3_step(stmt);
1358 if (SQLITE_DONE == ret)
1362 sqlite3_reset(stmt);
1363 sqlite3_clear_bindings(stmt);
1364 sqlite3_finalize(stmt);
1365 return VC_DB_ERROR_NONE;
1368 static vc_cmd_s* __vc_db_command_copy(vc_cmd_s* src_cmd)
1370 if (NULL == src_cmd) {
1371 SLOG(LOG_WARN, vc_db_tag(), "[Client Data] Input command is NULL");
1375 vc_cmd_s* temp_cmd = NULL;
1376 temp_cmd = (vc_cmd_s*)calloc(sizeof(vc_cmd_s), 1);
1377 if (NULL == temp_cmd) {
1378 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1382 temp_cmd->id = src_cmd->id;
1383 temp_cmd->pid = src_cmd->pid;
1384 temp_cmd->index = src_cmd->index;
1385 temp_cmd->type = src_cmd->type;
1386 temp_cmd->format = src_cmd->format;
1387 temp_cmd->domain = src_cmd->domain;
1389 if (VC_COMMAND_TYPE_SYSTEM == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM;
1390 else if (VC_COMMAND_TYPE_EXCLUSIVE == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_EXCLUSIVE;
1391 else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_WIDGET;
1392 else if (VC_COMMAND_TYPE_FOREGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND;
1393 else if (VC_COMMAND_TYPE_SYSTEM_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND;
1394 else if (VC_COMMAND_TYPE_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_BACKGROUND;
1396 if (NULL != src_cmd->command) {
1397 temp_cmd->command = strdup(src_cmd->command);
1400 if (NULL != src_cmd->parameter) {
1401 temp_cmd->parameter = strdup(src_cmd->parameter);
1404 if (NULL != src_cmd->appid) {
1405 temp_cmd->appid = strdup(src_cmd->appid);
1408 if (NULL != src_cmd->invocation_name) {
1409 temp_cmd->invocation_name = strdup(src_cmd->invocation_name);
1412 if (NULL != src_cmd->fixed) {
1413 temp_cmd->fixed = strdup(src_cmd->fixed);
1416 temp_cmd->key = src_cmd->key;
1417 temp_cmd->modifier = src_cmd->modifier;
1422 static int __vc_db_command_destroy(vc_cmd_h vc_command)
1424 if (NULL == vc_command) {
1425 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Input parameter is NULL");
1426 return VC_ERROR_INVALID_PARAMETER;
1429 vc_cmd_s* command = NULL;
1430 command = (vc_cmd_s*)vc_command;
1432 SLOG(LOG_DEBUG, vc_db_tag(), "[Destroy command][%p]", command);
1434 if (NULL != command) {
1435 if (NULL != command->command) {
1436 free(command->command);
1437 command->command = NULL;
1439 if (NULL != command->parameter) {
1440 free(command->parameter);
1441 command->parameter = NULL;
1443 if (NULL != command->invocation_name) {
1444 free(command->invocation_name);
1445 command->invocation_name = NULL;
1447 if (NULL != command->appid) {
1448 free(command->appid);
1449 command->appid = NULL;
1451 if (NULL != command->fixed) {
1452 free(command->fixed);
1453 command->fixed = NULL;
1455 if (NULL != command->coordinates) {
1456 free(command->coordinates);
1457 command->coordinates = NULL;
1463 return VC_ERROR_NONE;
1467 static int __vc_db_create_table(sqlite3* db_handle, const char* table)
1469 SLOG(LOG_INFO, vc_db_tag(), "[INFO] Create DB table (%s)", table);
1472 if (0 == strncmp(table, VC_RESULT_TABLE, strlen(table))) {
1473 sql = strdup("CREATE TABLE IF NOT EXISTS vc_result (id INTEGER PRIMARY KEY AUTOINCREMENT, result TEXT, event INTEGER, msg TEXT, exclusive INTEGER,\
1474 pid INTEGER, type INTEGER, format INTEGER, domain INTEGER, command TEXT, parameter TEXT, appid TEXT, invocation_name TEXT, fixed TEXT);");
1475 } else if (0 == strncmp(table, VC_INFO_TABLE, strlen(table))) {
1476 sql = strdup("CREATE TABLE IF NOT EXISTS vc_info (id INTEGER PRIMARY KEY AUTOINCREMENT, pid INTEGER, type INTEGER, format INTEGER, domain INTEGER, \
1477 command TEXT, parameter TEXT, appid TEXT, invocation_name TEXT, fixed TEXT);");
1479 return VC_DB_ERROR_INVALID_PARAMETER;
1482 int ret = __vc_db_exec_query(db_handle, sql);
1483 if (ret != VC_DB_ERROR_NONE) {
1484 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", table, ret);
1487 return VC_DB_ERROR_OPERATION_FAILED;
1489 SLOG(LOG_WARN, vc_db_tag(), "[SQL] %s", sql);
1493 return VC_DB_ERROR_NONE;
1496 int __vc_db_open_db_for_daemon(char** path, sqlite3** db_handle)
1499 int ret = db_util_open(*path, db_handle, DB_UTIL_REGISTER_HOOK_METHOD);
1500 if (ret != SQLITE_OK) {
1501 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open db, path = %s, ret(%d)", *path, ret);
1502 if (db_handle && *db_handle) {
1503 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Error msg (%s)", sqlite3_errmsg(*db_handle));
1504 db_util_close(*db_handle);
1510 return VC_DB_ERROR_OPERATION_FAILED;
1513 if (lstat(*path, &stat) < 0) {
1515 SLOG(LOG_ERROR, vc_db_tag(), "%d", strerror_r(errno, buf_err, sizeof(buf_err)));
1517 db_util_close(*db_handle);
1522 return VC_DB_ERROR_OPERATION_FAILED;
1525 if (!S_ISREG(stat.st_mode)) {
1526 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] S_ISREG failed");
1528 db_util_close(*db_handle);
1533 return VC_DB_ERROR_OPERATION_FAILED;
1536 if (!stat.st_size) {
1537 __vc_db_begin_transaction(*db_handle);
1540 ret = __vc_db_create_table(*db_handle, VC_INFO_TABLE);
1541 if (ret != VC_DB_ERROR_NONE) {
1542 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_INFO_TABLE, ret);
1543 __vc_db_rollback_transaction(*db_handle);
1544 return VC_DB_ERROR_OPERATION_FAILED;
1546 ret = __vc_db_create_table(*db_handle, VC_RESULT_TABLE);
1547 if (ret != VC_DB_ERROR_NONE) {
1548 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_RESULT_TABLE, ret);
1549 __vc_db_rollback_transaction(*db_handle);
1550 return VC_DB_ERROR_OPERATION_FAILED;
1553 __vc_db_commit_transaction(*db_handle);
1557 char* err_msg = NULL;
1558 static const char* sql = "PRAGMA journal_mode = WAL";
1559 int ret = sqlite3_exec(*db_handle, sql, NULL, NULL, &err_msg);
1560 if (ret != SQLITE_OK) {
1561 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_exec returned %d: %s", ret, err_msg);
1562 sqlite3_free(err_msg);
1564 return VC_DB_ERROR_OPERATION_FAILED;
1567 return VC_DB_ERROR_NONE;
1570 static int __vc_db_restore_table(sqlite3* db_handle, const char* table)
1572 /* check whether there is a vc_info table or not */
1573 bool is_exist = false;
1574 int ret = __vc_db_check_table(db_handle, table, &is_exist);
1575 if (VC_DB_ERROR_NONE != ret || false == is_exist) {
1576 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] There is no table (%s) (%d). Make a table", table, ret);
1577 if (VC_DB_ERROR_NONE != __vc_db_create_table(db_handle, table)) {
1578 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", table, ret);
1579 return VC_DB_ERROR_OPERATION_FAILED;
1582 SLOG(LOG_INFO, vc_db_tag(), "[INFO] There is the table (%s)", table);
1584 return VC_DB_ERROR_NONE;
1587 bool __vc_db_connect_db_for_daemon(char** path, sqlite3** db_handle)
1589 bool is_connect = false;
1590 int ret = __vc_db_open_db_for_daemon(path, db_handle);
1594 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB for daemon");
1597 if (0 == __vc_db_open_db_for_daemon(path, db_handle)) {
1598 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to open DB for daemon");
1605 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to open DB for daemon");
1611 static int __vc_db_integrity_check_cb(void *NotUsed, int argc, char **argv, char **azColName)
1613 SLOG(LOG_INFO, vc_db_tag(), "integrity check cb is called");
1616 char *check_str = "ok";
1617 if (0 != strncmp(argv[0], check_str, strlen(check_str))) {
1618 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Doesn't have integrity(%s), retry to connect after removing", argv[0]);
1619 if (0 != remove(g_path)) {
1620 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed for daemon", g_path);
1621 g_db_cnt = (g_db_cnt + 1) % 1000;
1622 snprintf(g_path, 256, "%s/.vc_info_%d.db", VC_RUNTIME_INFO_ROOT, g_db_cnt);
1624 bool is_connect = __vc_db_connect_db_for_daemon(&g_path, &g_db_handle);
1625 if (true == is_connect) {
1626 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect main DB for daemon");
1627 ret = __vc_db_restore_table(g_db_handle, VC_INFO_TABLE);
1629 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table (%s)", VC_INFO_TABLE);
1631 ret = __vc_db_restore_table(g_db_handle, VC_RESULT_TABLE);
1633 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table (%s)", VC_RESULT_TABLE);
1635 is_connect = __vc_db_connect_db_for_daemon(&g_backup_path, &g_db_backup_handle);
1636 if (true == is_connect) {
1637 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect backup DB for daemon");
1638 if (0 != vc_db_restore_command()) {
1639 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command");
1643 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to connect main DB for daemon");
1644 return VC_DB_ERROR_OPERATION_FAILED;
1648 SLOG(LOG_INFO, vc_db_tag(), "db integrity result : %s", argv[0]);
1649 return VC_DB_ERROR_NONE;
1652 int vc_db_initialize_for_daemon(void)
1654 SLOG(LOG_INFO, vc_db_tag(), "DB on initialization for daemon");
1656 if (0 < g_ref_cnt) {
1658 return VC_DB_ERROR_NONE;
1661 /* For voice control DB */
1662 g_path = (char*)calloc(256, sizeof(char));
1663 if (NULL == g_path) {
1664 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1665 return VC_DB_ERROR_OUT_OF_MEMORY;
1667 /* This should be changed to general DB space - TZ_USER_DB */
1668 snprintf(g_path, 256, "%s/.vc_info.db", VC_RUNTIME_INFO_ROOT);
1671 g_backup_path = (char*)calloc(256, sizeof(char));
1672 if (NULL == g_backup_path) {
1673 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1674 return VC_DB_ERROR_OUT_OF_MEMORY;
1676 snprintf(g_backup_path, 256, "%s/.vc_backup.db", VC_RUNTIME_INFO_ROOT);
1678 bool is_connect = __vc_db_connect_db_for_daemon(&g_path, &g_db_handle);
1679 if (false == is_connect) {
1680 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to connect main DB, retry to connect after removing");
1681 if (0 != remove(g_path)) {
1682 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed for daemon", g_path);
1683 g_db_cnt = (g_db_cnt + 1) % 1000;
1684 snprintf(g_path, 256, "%s/.vc_info_%d.db", VC_RUNTIME_INFO_ROOT, g_db_cnt);
1686 is_connect = __vc_db_connect_db_for_daemon(&g_path, &g_db_handle);
1687 if (true == is_connect) {
1688 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect main DB for daemon");
1689 is_connect = __vc_db_connect_db_for_daemon(&g_backup_path, &g_db_backup_handle);
1690 if (true == is_connect) {
1691 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect backup DB for daemon");
1692 if (0 != vc_db_restore_command()) {
1693 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command");
1697 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to connect main DB for daemon");
1698 return VC_DB_ERROR_OPERATION_FAILED;
1702 int ret = sqlite3_exec(g_db_handle, "pragma integrity_check", __vc_db_integrity_check_cb, NULL, NULL);
1703 if (SQLITE_CORRUPT == ret) {
1704 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB for daemon");
1706 ret = db_util_close(g_db_handle);
1707 if (ret != SQLITE_OK) {
1708 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to close db, ret %d: %s for daemon", ret, sqlite3_errmsg(g_db_handle));
1712 if (0 != remove(g_path)) {
1713 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed for daemon", g_path);
1714 g_db_cnt = (g_db_cnt + 1) % 1000;
1715 snprintf(g_path, 256, "%s/.vc_info_%d.db", VC_RUNTIME_INFO_ROOT, g_db_cnt);
1717 is_connect = __vc_db_connect_db_for_daemon(&g_path, &g_db_handle);
1718 if (true == is_connect) {
1719 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect main DB for daemon");
1720 is_connect = __vc_db_connect_db_for_daemon(&g_backup_path, &g_db_backup_handle);
1721 if (true == is_connect) {
1722 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect backup DB for daemon");
1723 if (0 != vc_db_restore_command()) {
1724 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command for daemon");
1728 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to connect main DB for daemon");
1729 return VC_DB_ERROR_OPERATION_FAILED;
1733 SLOG(LOG_INFO, vc_db_tag(), "[SUCCESS] DB initialization after restore for daemon");
1734 return VC_DB_ERROR_NONE;
1737 is_connect = __vc_db_connect_db_for_daemon(&g_backup_path, &g_db_backup_handle);
1738 if (false == is_connect) {
1739 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open backup DB, retry to connect after removing file for daemon");
1740 if (0 != remove(g_backup_path)) {
1741 g_backup_db_cnt = (g_backup_db_cnt + 1) % 1000;
1742 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed", g_backup_path);
1743 snprintf(g_backup_path, 256, "%s/.vc_backup_%d.db", VC_RUNTIME_INFO_ROOT, g_backup_db_cnt);
1745 is_connect = __vc_db_connect_db_for_daemon(&g_path, &g_db_backup_handle);
1746 if (true == is_connect) {
1747 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect backup DB for daemon");
1748 if (0 != vc_db_restore_command()) {
1749 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command for daemon");
1756 SLOG(LOG_INFO, vc_db_tag(), "[SUCCESS] DB initialization for daemon");
1757 return VC_DB_ERROR_NONE;
1760 int __vc_db_open_db(char** path, sqlite3** db_handle)
1762 int ret = db_util_open(*path, db_handle, DB_UTIL_REGISTER_HOOK_METHOD);
1763 if (ret != SQLITE_OK) {
1764 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open db for daemon, path = %s, ret(%d)", *path, ret);
1765 if (db_handle && *db_handle) {
1766 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Error msg (%s)", sqlite3_errmsg(*db_handle));
1767 db_util_close(*db_handle);
1773 return VC_DB_ERROR_OPERATION_FAILED;
1775 return VC_DB_ERROR_NONE;
1778 bool __vc_db_connect_db(char** path, sqlite3** db_handle)
1780 bool is_connect = false;
1781 int ret = __vc_db_open_db(path, db_handle);
1785 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB");
1788 if (0 == __vc_db_open_db(path, db_handle)) {
1789 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to open DB");
1796 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to open DB");
1802 int vc_db_initialize(void)
1804 SLOG(LOG_INFO, vc_db_tag(), "DB on initialization");
1806 if (0 < g_ref_cnt) {
1808 return VC_DB_ERROR_NONE;
1811 /* For voice control DB */
1812 g_path = (char*)calloc(256, sizeof(char));
1813 if (NULL == g_path) {
1814 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1815 return VC_DB_ERROR_OUT_OF_MEMORY;
1817 /* This should be changed to general DB space - TZ_USER_DB */
1818 snprintf(g_path, 256, "%s/.vc_info.db", VC_RUNTIME_INFO_ROOT);
1821 g_backup_path = (char*)calloc(256, sizeof(char));
1822 if (NULL == g_backup_path) {
1823 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1824 return VC_DB_ERROR_OUT_OF_MEMORY;
1826 snprintf(g_backup_path, 256, "%s/.vc_backup.db", VC_RUNTIME_INFO_ROOT);
1828 bool is_connect = __vc_db_connect_db(&g_path, &g_db_handle);
1829 if (false == is_connect) {
1830 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to connect main DB, retry to connect after removing");
1831 if (0 != remove(g_path)) {
1832 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed", g_path);
1833 g_db_cnt = (g_db_cnt + 1) % 1000;
1834 snprintf(g_path, 256, "%s/.vc_info_%d.db", VC_RUNTIME_INFO_ROOT, g_db_cnt);
1836 is_connect = __vc_db_connect_db(&g_path, &g_db_handle);
1837 if (true == is_connect) {
1838 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect main DB");
1839 is_connect = __vc_db_connect_db(&g_backup_path, &g_db_backup_handle);
1840 if (true == is_connect) {
1841 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect backup DB");
1842 if (0 != vc_db_restore_command()) {
1843 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command");
1847 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to connect main DB");
1848 return VC_DB_ERROR_OPERATION_FAILED;
1852 is_connect = __vc_db_connect_db(&g_backup_path, &g_db_backup_handle);
1853 if (false == is_connect) {
1854 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open backup DB, retry to connect after removing file");
1855 if (0 != remove(g_backup_path)) {
1856 g_backup_db_cnt = (g_backup_db_cnt + 1) % 1000;
1857 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed", g_backup_path);
1858 snprintf(g_backup_path, 256, "%s/.vc_backup_%d.db", VC_RUNTIME_INFO_ROOT, g_backup_db_cnt);
1860 is_connect = __vc_db_connect_db(&g_path, &g_db_backup_handle);
1861 if (true == is_connect) {
1862 SLOG(LOG_ERROR, vc_db_tag(), "[INFO] Success to connect backup");
1863 if (0 != vc_db_restore_command()) {
1864 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command");
1871 SLOG(LOG_INFO, vc_db_tag(), "[SUCCESS] DB initialization");
1872 return VC_DB_ERROR_NONE;
1875 int vc_db_finalize(void)
1877 if (0 >= g_ref_cnt) return VC_DB_ERROR_INVALID_STATE;
1878 if (0 != --g_ref_cnt)
1879 return VC_DB_ERROR_NONE;
1881 if (NULL != g_path) {
1886 if (NULL != g_backup_path) {
1887 free(g_backup_path);
1888 g_backup_path = NULL;
1892 return VC_DB_ERROR_NONE;
1893 db_util_close(g_db_handle);
1896 if (!g_db_backup_handle)
1897 return VC_DB_ERROR_NONE;
1898 db_util_close(g_db_backup_handle);
1899 g_db_backup_handle = NULL;
1901 return VC_DB_ERROR_NONE;
1904 int vc_db_create_table()
1906 __vc_db_reset_handle();
1907 __vc_db_begin_transaction(g_db_handle);
1909 int ret = __vc_db_create_table(g_db_handle, VC_INFO_TABLE);
1910 if (ret != VC_DB_ERROR_NONE) {
1911 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_INFO_TABLE, ret);
1912 __vc_db_rollback_transaction(g_db_handle);
1913 return VC_DB_ERROR_OPERATION_FAILED;
1915 ret = __vc_db_create_table(g_db_handle, VC_RESULT_TABLE);
1916 if (ret != VC_DB_ERROR_NONE) {
1917 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table(%s), %d", VC_RESULT_TABLE, ret);
1918 __vc_db_rollback_transaction(g_db_handle);
1919 return VC_DB_ERROR_OPERATION_FAILED;
1922 __vc_db_commit_transaction(g_db_handle);
1923 return VC_DB_ERROR_NONE;
1926 int __vc_db_delete_table(sqlite3* db_handle, const char* table)
1929 if (0 == strncmp(table, VC_RESULT_TABLE, strlen(table))) {
1930 sql = strdup("DELETE FROM vc_result;");
1931 } else if (0 == strncmp(table, VC_INFO_TABLE, strlen(table))) {
1932 sql = strdup("DELETE FROM vc_info;");
1934 return VC_DB_ERROR_INVALID_PARAMETER;
1938 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1939 return VC_DB_ERROR_OUT_OF_MEMORY;
1942 int ret = __vc_db_exec_query(db_handle, sql);
1943 if (ret != VC_DB_ERROR_NONE) {
1944 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table, %d", ret);
1953 if (0 == strncmp(table, VC_RESULT_TABLE, strlen(table))) {
1954 sql = strdup("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='vc_result';");
1955 } else if (0 == strncmp(table, VC_INFO_TABLE, strlen(table))) {
1956 sql = strdup("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='vc_info';");
1960 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1961 return VC_DB_ERROR_OUT_OF_MEMORY;
1964 ret = __vc_db_exec_query(db_handle, sql);
1965 if (ret != VC_DB_ERROR_NONE) {
1966 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table, %d", ret);
1972 SLOG(LOG_WARN, vc_db_tag(), "[SQL] %s", sql);
1976 return VC_DB_ERROR_NONE;
1979 int vc_db_delete_table(const char* table)
1981 __vc_db_reset_handle();
1982 __vc_db_begin_transaction(g_db_handle);
1984 int ret = __vc_db_delete_table(g_db_handle, table);
1986 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table");
1987 __vc_db_rollback_transaction(g_db_handle);
1991 __vc_db_commit_transaction(g_db_handle);
1993 return VC_DB_ERROR_NONE;
1996 int vc_db_begin_transaction(void)
1998 __vc_db_reset_handle();
1999 int ret = __vc_db_begin_transaction(g_db_handle);
2003 int vc_db_rollback_transaction(void)
2005 __vc_db_reset_handle();
2006 int ret = __vc_db_rollback_transaction(g_db_handle);
2010 int vc_db_commit_transaction(void)
2012 __vc_db_reset_handle();
2013 int ret = __vc_db_commit_transaction(g_db_handle);
2017 static void __vc_db_remove_space(char** string)
2019 if (NULL == string || NULL == *string)
2022 char* temp = *string;
2024 //remove previous space
2026 memmove(temp, temp + 1, strlen(temp));
2028 // remove next space
2029 if (' ' == temp[strlen(temp) - 1])
2030 temp[strlen(temp) - 1] = '\0';
2033 static bool __vc_db_is_valid_vfixed_string(char* string)
2035 char* temp = strchr(string, '}');
2039 temp = strchr(string, '{');
2043 temp = strchr(string, '|');
2049 static int __vc_db_generate_command(vc_cmd_s* cmd, char** fixed_cmd, GSList** cmd_list)
2051 if (NULL == cmd || NULL == cmd->command) {
2052 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter");
2053 return VC_DB_ERROR_INVALID_PARAMETER;
2056 GSList* temp_list = NULL;
2058 char* src_cmd = strdup(cmd->command);
2059 char* dst_cmd = NULL;
2060 char merge_cmd[256] = {0, };
2062 if (NULL == src_cmd) {
2063 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
2064 return VC_DB_ERROR_OUT_OF_MEMORY;
2067 if (VC_CMD_FORMAT_FIXED_AND_VFIXED == cmd->format) {
2068 // check string validation
2069 if (false == __vc_db_is_valid_vfixed_string(src_cmd)) {
2070 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter, cmd->command(%s)", src_cmd);
2073 return VC_DB_ERROR_INVALID_PARAMETER;
2076 // remove close brace, '}'
2077 char* temp_close = strchr(src_cmd, '}');
2078 if (NULL != temp_close) {
2079 temp_close[0] = '\0';
2082 // extract fixed command and remove space in front of '{'
2083 char *tok_ptr = NULL;
2084 temp = strtok_r(src_cmd, "{", &tok_ptr);
2086 __vc_db_remove_space(&temp);
2087 *fixed_cmd = strdup(temp);
2089 // merge command with fixed and vfixed
2090 while (NULL != (temp = strtok_r(NULL, "|", &tok_ptr))) {
2091 __vc_db_remove_space(&temp);
2093 snprintf(merge_cmd, 256, "%s %s", *fixed_cmd, temp);
2094 dst_cmd = strdup(merge_cmd);
2095 temp_list = g_slist_append(temp_list, dst_cmd);
2096 SLOG(LOG_ERROR, vc_db_tag(), "New generated cmd: %s", dst_cmd);
2099 *fixed_cmd = strdup(cmd->command);
2101 } else if (VC_CMD_FORMAT_VFIXED_AND_FIXED == cmd->format) {
2102 // check string validation
2103 if (false == __vc_db_is_valid_vfixed_string(src_cmd)) {
2104 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter, cmd->command(%s)", src_cmd);
2107 return VC_DB_ERROR_INVALID_PARAMETER;
2110 // extract fixed command
2111 char* temp_fixed = strchr(src_cmd, '}') + 1;
2112 __vc_db_remove_space(&temp_fixed);
2113 *fixed_cmd = strdup(temp_fixed);
2115 // remove close brace, '}'
2116 char *tok_ptr = NULL;
2117 temp = strtok_r(src_cmd, "}", &tok_ptr);
2119 // remove open brace, '{'
2120 temp = strchr(src_cmd, '{') + 1;
2123 temp = strtok_r(temp, "|", &tok_ptr);
2124 __vc_db_remove_space(&temp);
2126 // merge command with fixed and vfixed
2127 snprintf(merge_cmd, 256, "%s %s", temp, *fixed_cmd);
2128 dst_cmd = strdup(merge_cmd);
2129 temp_list = g_slist_append(temp_list, dst_cmd);
2130 SLOG(LOG_ERROR, vc_db_tag(), "New generated cmd: %s", dst_cmd);
2132 while (NULL != (temp = strtok_r(NULL, "|", &tok_ptr))) {
2133 __vc_db_remove_space(&temp);
2135 // merge command with fixed and vfixed
2136 snprintf(merge_cmd, 256, "%s %s", temp, *fixed_cmd);
2137 dst_cmd = strdup(merge_cmd);
2138 temp_list = g_slist_append(temp_list, dst_cmd);
2139 SLOG(LOG_ERROR, vc_db_tag(), "New generated cmd: %s", dst_cmd);
2141 } else if (VC_CMD_FORMAT_FIXED_AND_NONFIXED == cmd->format || VC_CMD_FORMAT_NONFIXED_AND_FIXED == cmd->format) {
2142 dst_cmd = strdup(src_cmd);
2143 temp_list = g_slist_append(temp_list, dst_cmd);
2144 *fixed_cmd = strdup(src_cmd);
2147 dst_cmd = strdup(src_cmd);
2148 temp_list = g_slist_append(temp_list, dst_cmd);
2151 *cmd_list = temp_list;
2155 return VC_DB_ERROR_NONE;
2158 static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e type, vc_cmd_s* cmd, bool skip_invocation)
2160 GSList* cmd_list = NULL;
2161 char* fixed_cmd = NULL;
2162 vc_cmd_s* tmp_cmd = __vc_db_command_copy(cmd);
2164 int ret = __vc_db_generate_command(tmp_cmd, &fixed_cmd, &cmd_list);
2165 if (VC_DB_ERROR_NONE != ret) {
2166 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to generate command, %d", ret);
2168 if (NULL != tmp_cmd) {
2169 __vc_db_command_destroy((vc_cmd_h)tmp_cmd);
2174 if (0 != g_slist_length(cmd_list)) {
2175 GSList *iter = NULL;
2176 char* temp_command = NULL;
2177 iter = g_slist_nth(cmd_list, 0);
2179 while (NULL != iter) {
2180 temp_command = iter->data;
2182 if (NULL != temp_command) {
2183 if (NULL != tmp_cmd->command) {
2184 free(tmp_cmd->command);
2185 tmp_cmd->command = NULL;
2187 tmp_cmd->command = strdup(temp_command);
2189 free(tmp_cmd->fixed);
2190 if (NULL != fixed_cmd)
2191 tmp_cmd->fixed = strdup(fixed_cmd);
2193 tmp_cmd->fixed = NULL;
2195 ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd);
2196 if (ret != VC_DB_ERROR_NONE) {
2200 if (VC_COMMAND_TYPE_BACKGROUND == type && NULL != tmp_cmd->invocation_name && false == skip_invocation) {
2201 char temp[256] = {0, };
2202 snprintf(temp, 256, "%s %s", tmp_cmd->invocation_name, tmp_cmd->command);
2203 if (NULL != tmp_cmd->command)
2204 free(tmp_cmd->command);
2206 tmp_cmd->command = strdup(temp);
2208 ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd);
2209 if (ret != VC_DB_ERROR_NONE) {
2213 cmd_list = g_slist_remove(cmd_list, temp_command);
2215 temp_command = NULL;
2217 iter = g_slist_nth(cmd_list, 0);
2220 if (VC_DB_ERROR_NONE != ret) {
2221 while (NULL != iter) {
2222 temp_command = iter->data;
2224 if (NULL != temp_command) {
2225 cmd_list = g_slist_remove(cmd_list, temp_command);
2227 temp_command = NULL;
2230 iter = g_slist_nth(cmd_list, 0);
2233 g_slist_free(cmd_list);
2234 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command, %d", ret);
2240 if (NULL != fixed_cmd) {
2245 if (NULL != tmp_cmd) {
2246 __vc_db_command_destroy((vc_cmd_h)tmp_cmd);
2248 SLOG(LOG_DEBUG, vc_db_tag(), "[DEBUG] command destroy");
2254 int vc_db_insert_command(int pid, vc_cmd_type_e type, vc_cmd_s* cmd, bool skip_invocation)
2258 while (cnt < 5 && (ret = __vc_db_insert_command(g_db_handle, pid, type, cmd, skip_invocation))) {
2260 SLOG(LOG_DEBUG, vc_db_tag(), "[ERROR] Fail to insert command(%d), retry cnt(%d)", ret, cnt);
2266 static int __vc_db_insert_commands_list(sqlite3* db_handle, int pid, vc_cmd_type_e type, GSList* cmd_list, char* invocation_name, bool skip_invocation)
2268 GSList *iter = NULL;
2272 int count = g_slist_length(cmd_list);
2273 iter = g_slist_nth(cmd_list, 0);
2275 SLOG(LOG_DEBUG, vc_db_tag(), "list count : %d", count);
2277 for (i = 0; i < count; i++) {
2281 temp_cmd = iter->data;
2283 if (NULL == temp_cmd) {
2284 SLOG(LOG_ERROR, vc_db_tag(), "command is NULL");
2288 if (type == temp_cmd->type) {
2289 int ret = vc_cmd_set_invocation_name((vc_cmd_h)temp_cmd, invocation_name);
2290 SLOG(LOG_DEBUG, vc_db_tag(), "Set invocation to command, ret(%d)", ret);
2292 ret = __vc_db_insert_command(db_handle, pid, type, temp_cmd, skip_invocation);
2293 if (ret != VC_DB_ERROR_NONE) {
2294 SLOG(LOG_ERROR, vc_db_tag(), "Fail to insert command, ret(%d)", ret);
2298 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Command type(%d) is NOT valid : request type(%d)", temp_cmd->type, type);
2300 iter = g_slist_next(iter);
2303 return VC_DB_ERROR_NONE;
2306 int vc_db_insert_commands_list(int pid, vc_cmd_type_e type, GSList* cmd_list, char* invocation_name, bool skip_invocation)
2308 __vc_db_reset_handle();
2309 __vc_db_begin_transaction(g_db_handle);
2311 int ret = __vc_db_insert_commands_list(g_db_handle, pid, type, cmd_list, invocation_name, false);
2312 if (ret != VC_DB_ERROR_NONE) {
2313 __vc_db_rollback_transaction(g_db_handle);
2317 __vc_db_commit_transaction(g_db_handle);
2319 return VC_DB_ERROR_NONE;
2322 int vc_db_get_commands(int pid, vc_cmd_type_e type, GSList** cmd_list)
2324 __vc_db_reset_handle();
2325 __vc_db_begin_transaction(g_db_handle);
2327 int ret = __vc_db_get_commands(g_db_handle, pid, type, cmd_list);
2328 if (ret != VC_DB_ERROR_NONE) {
2329 __vc_db_rollback_transaction(g_db_handle);
2333 __vc_db_commit_transaction(g_db_handle);
2334 return VC_DB_ERROR_NONE;
2337 int vc_db_insert_result(const char* result_text, int event, const char* msg, vc_cmd_list_h vc_cmd_list, bool exclusive)
2339 if (NULL == result_text) {
2340 SLOG(LOG_ERROR, vc_db_tag(), "Invalid parameter, result_text is NULL");
2341 return VC_DB_ERROR_INVALID_PARAMETER;
2344 int ret = vc_db_delete_table(VC_RESULT_TABLE);
2346 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table");
2348 if (NULL == vc_cmd_list) {
2349 __vc_db_reset_handle();
2350 __vc_db_begin_transaction(g_db_handle);
2351 int ret = __vc_db_insert_result(g_db_handle, result_text, event, msg, exclusive, NULL);
2352 if (ret != VC_DB_ERROR_NONE) {
2353 __vc_db_rollback_transaction(g_db_handle);
2356 __vc_db_commit_transaction(g_db_handle);
2357 return VC_DB_ERROR_NONE;
2360 /* Make client list node */
2361 vc_cmd_h vc_command = NULL;
2362 vc_cmd_list_first(vc_cmd_list);
2364 while (VC_ERROR_ITERATION_END != ret) {
2365 if (0 != vc_cmd_list_get_current(vc_cmd_list, &vc_command)) {
2366 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get command");
2370 if (NULL == vc_command) {
2371 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] No vc command any more");
2375 vc_cmd_s* temp_cmd = NULL;
2376 temp_cmd = (vc_cmd_s*)vc_command;
2378 __vc_db_reset_handle();
2379 __vc_db_begin_transaction(g_db_handle);
2380 ret = __vc_db_insert_result(g_db_handle, result_text, event, msg, exclusive, temp_cmd);
2381 if (ret != VC_DB_ERROR_NONE) {
2382 __vc_db_rollback_transaction(g_db_handle);
2385 __vc_db_commit_transaction(g_db_handle);
2387 ret = vc_cmd_list_next(vc_cmd_list);
2390 return VC_DB_ERROR_NONE;
2393 int vc_db_get_result(char** result_text, int* event, char** msg, int pid, vc_cmd_list_h vc_cmd_list, bool exclusive)
2395 __vc_db_reset_handle();
2396 __vc_db_begin_transaction(g_db_handle);
2398 int ret = __vc_db_get_result(g_db_handle, result_text, event, msg, pid, NULL, vc_cmd_list, exclusive);
2399 if (ret != VC_DB_ERROR_NONE) {
2400 __vc_db_rollback_transaction(g_db_handle);
2401 return VC_DB_ERROR_OPERATION_FAILED;
2406 ret = vc_cmd_list_get_count(vc_cmd_list, &count);
2407 if (ret != VC_DB_ERROR_NONE) {
2408 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get count");
2412 // Get appid by pid using app control
2413 ret = app_manager_get_app_id(pid, &appid);
2414 if (APP_MANAGER_ERROR_NONE != ret) {
2415 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] fail to get app id, ret(%d), pid(%d)", ret, pid);
2417 ret = __vc_db_get_result(g_db_handle, result_text, event, msg, pid, appid, vc_cmd_list, exclusive);
2418 if (ret != VC_DB_ERROR_NONE) {
2419 __vc_db_rollback_transaction(g_db_handle);
2422 if (NULL != appid) {
2428 __vc_db_commit_transaction(g_db_handle);
2429 return VC_DB_ERROR_NONE;
2432 int vc_db_get_appid_list(const char* result, GSList** app_list)
2434 __vc_db_reset_handle();
2435 __vc_db_begin_transaction(g_db_handle);
2437 int ret = __vc_db_get_appid(g_db_handle, result, app_list);
2438 if (ret != VC_DB_ERROR_NONE) {
2439 __vc_db_rollback_transaction(g_db_handle);
2443 __vc_db_commit_transaction(g_db_handle);
2444 return VC_DB_ERROR_NONE;
2447 int vc_db_get_result_pid_list(const char* result, GSList** pid_list)
2449 __vc_db_reset_handle();
2450 __vc_db_begin_transaction(g_db_handle);
2452 int ret = __vc_db_get_result_pid_list(g_db_handle, result, pid_list);
2453 if (ret != VC_DB_ERROR_NONE) {
2454 __vc_db_rollback_transaction(g_db_handle);
2458 __vc_db_commit_transaction(g_db_handle);
2459 return VC_DB_ERROR_NONE;
2462 int vc_db_append_commands(int pid, int type, vc_cmd_list_h vc_cmd_list)
2464 __vc_db_reset_handle();
2465 __vc_db_begin_transaction(g_db_handle);
2467 int ret = __vc_db_append_commands(g_db_handle, pid, type, vc_cmd_list);
2468 if (ret != VC_DB_ERROR_NONE) {
2469 __vc_db_rollback_transaction(g_db_handle);
2473 __vc_db_commit_transaction(g_db_handle);
2474 return VC_DB_ERROR_NONE;
2477 int vc_db_delete_commands(int pid, vc_cmd_type_e type, char* appid)
2479 __vc_db_reset_handle();
2480 __vc_db_begin_transaction(g_db_handle);
2483 ret = __vc_db_delete_commands(g_db_handle, pid, type, appid);
2484 if (ret != VC_DB_ERROR_NONE) {
2485 __vc_db_rollback_transaction(g_db_handle);
2489 __vc_db_commit_transaction(g_db_handle);
2490 return VC_DB_ERROR_NONE;
2493 static void __free_command_list_element(gpointer data)
2495 vc_cmd_h temp_cmd = (vc_cmd_h)data;
2496 int ret = vc_cmd_destroy(temp_cmd);
2497 if (ret != VC_ERROR_NONE) {
2498 SLOG(LOG_ERROR, vc_db_tag(), "Fail to destroy command. (%d/%s)", ret, get_error_message(ret));
2502 int vc_db_backup_command()
2504 GSList* list = NULL;
2506 __vc_db_reset_handle();
2507 __vc_db_begin_transaction(g_db_backup_handle);
2509 int ret = __vc_db_delete_table(g_db_backup_handle, VC_INFO_TABLE);
2511 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table");
2512 __vc_db_rollback_transaction(g_db_backup_handle);
2515 __vc_db_commit_transaction(g_db_backup_handle);
2517 ret = vc_db_get_commands(-1, VC_COMMAND_TYPE_BACKGROUND, &list);
2518 if (ret != VC_DB_ERROR_NONE) {
2519 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get commands");
2523 __vc_db_begin_transaction(g_db_backup_handle);
2525 ret = __vc_db_insert_commands_list(g_db_backup_handle, -1, VC_COMMAND_TYPE_BACKGROUND, list, NULL, true);
2526 if (ret != VC_DB_ERROR_NONE) {
2527 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command list to backup db");
2528 __vc_db_rollback_transaction(g_db_backup_handle);
2530 SLOG(LOG_ERROR, vc_db_tag(), "[SUCCESS] Backup commands");
2531 __vc_db_commit_transaction(g_db_backup_handle);
2534 g_slist_free_full(list, __free_command_list_element);
2538 int vc_db_restore_command()
2540 GSList* list = NULL;
2542 __vc_db_reset_handle();
2543 __vc_db_begin_transaction(g_db_backup_handle);
2545 int ret = __vc_db_get_commands(g_db_backup_handle, -1, VC_COMMAND_TYPE_BACKGROUND, &list);
2546 if (ret != VC_DB_ERROR_NONE) {
2547 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get commands from backup db");
2548 __vc_db_rollback_transaction(g_db_backup_handle);
2551 __vc_db_commit_transaction(g_db_backup_handle);
2553 ret = vc_db_insert_commands_list(-1, VC_COMMAND_TYPE_BACKGROUND, list, NULL, true);
2554 if (ret != VC_DB_ERROR_NONE) {
2555 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command list. (%d)", ret);
2557 SLOG(LOG_ERROR, vc_db_tag(), "[SUCCESS] Restore commands");
2560 g_slist_free_full(list, __free_command_list_element);