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;
62 char* g_backup_path = NULL;
66 static int __vc_db_transaction(sqlite3* db_handle, const char* transaction)
68 sqlite3_stmt* pStmt = NULL;
70 int ret = sqlite3_prepare_v2(db_handle, transaction, -1, &pStmt, NULL);
71 if (ret != SQLITE_OK) {
72 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_prepare_v2: transaction(%s), ret(%d), err(%s)", transaction, ret, sqlite3_errmsg(db_handle));
73 return VC_DB_ERROR_OPERATION_FAILED;
76 if (sqlite3_step(pStmt) != SQLITE_DONE) {
77 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: transaction(%s), ret(%d), err(%s)", transaction, ret, sqlite3_errmsg(db_handle));
78 sqlite3_finalize(pStmt);
79 return VC_DB_ERROR_OPERATION_FAILED;
82 sqlite3_finalize(pStmt);
83 return VC_DB_ERROR_NONE;
86 static int __vc_db_begin_transaction(sqlite3* db_handle)
88 int ret = __vc_db_transaction(db_handle, "BEGIN IMMEDIATE TRANSACTION");
92 static int __vc_db_rollback_transaction(sqlite3* db_handle)
94 int ret = __vc_db_transaction(db_handle, "ROLLBACK TRANSACTION");
98 static int __vc_db_commit_transaction(sqlite3* db_handle)
100 int ret = __vc_db_transaction(db_handle, "COMMIT TRANSACTION");
104 static int __vc_db_exec_query(sqlite3* db_handle, const char* sql)
106 char* err_msg = NULL;
108 int ret = sqlite3_exec(db_handle, sql, NULL, NULL, &err_msg);
109 if (ret != SQLITE_OK) {
110 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_exec return fail, ret(%d), err(%s)", ret, err_msg);
111 sqlite3_free(err_msg);
112 return VC_DB_ERROR_OPERATION_FAILED;
114 return VC_DB_ERROR_NONE;
117 static int __vc_db_delete_commands(sqlite3* db_handle, int pid, vc_cmd_type_e type, const char* appid)
119 sqlite3_stmt* stmt = NULL;
122 if (VC_COMMAND_TYPE_BACKGROUND != type && -1 == pid)
123 sql = strdup("DELETE FROM vc_info WHERE type = ?;");
124 else if (NULL != appid)
125 sql = strdup("DELETE FROM vc_info WHERE type = ? AND appid = ?;");
127 sql = strdup("DELETE FROM vc_info WHERE type = ? AND pid = ?;");
130 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
131 return VC_DB_ERROR_OUT_OF_MEMORY;
135 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
136 if (ret != SQLITE_OK) {
137 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
140 return VC_DB_ERROR_OPERATION_FAILED;
142 ret = sqlite3_bind_int(stmt, 1, (int)type);
143 if (ret != SQLITE_OK) {
144 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
145 sqlite3_finalize(stmt);
148 return VC_DB_ERROR_OPERATION_FAILED;
151 if (VC_COMMAND_TYPE_BACKGROUND != type && -1 == pid) {
152 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] DELETE FROM vc_info WHERE type = %d;", type);
153 } else if (NULL != appid) {
154 ret = sqlite3_bind_text(stmt, 2, appid, -1, SQLITE_TRANSIENT);
155 if (ret != SQLITE_OK) {
156 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
157 sqlite3_clear_bindings(stmt);
158 sqlite3_finalize(stmt);
161 return VC_DB_ERROR_OPERATION_FAILED;
163 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] DELETE FROM vc_info WHERE type = %d AND appid = %s", type, appid);
165 ret = sqlite3_bind_int(stmt, 2, pid);
166 if (ret != SQLITE_OK) {
167 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
168 sqlite3_clear_bindings(stmt);
169 sqlite3_finalize(stmt);
172 return VC_DB_ERROR_OPERATION_FAILED;
174 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] DELETE FROM vc_info WHERE type = %d AND pid = %d", type, pid);
177 ret = sqlite3_step(stmt);
178 if (ret != SQLITE_DONE) {
179 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned, sql(%s), ret(%d), err(%s)", sql, ret, sqlite3_errmsg(db_handle));
180 sqlite3_clear_bindings(stmt);
181 sqlite3_finalize(stmt);
184 return VC_DB_ERROR_OPERATION_FAILED;
188 sqlite3_clear_bindings(stmt);
189 sqlite3_finalize(stmt);
193 return VC_DB_ERROR_NONE;
196 static int __vc_db_insert_commands(sqlite3* db_handle, int pid, vc_cmd_type_e type, vc_cmd_s* cmd)
198 SLOG(LOG_DEBUG, vc_db_tag(), "pid(%d), type(%d)", pid, type);
200 sqlite3_stmt* stmt = NULL;
201 const char* sql = "INSERT INTO vc_info (id, pid, type, format, domain, command, parameter, appid, invocation_name, fixed) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
203 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
204 if (ret != SQLITE_OK) {
205 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: err(%s)", sqlite3_errmsg(db_handle));
206 return VC_DB_ERROR_OPERATION_FAILED;
208 ret = sqlite3_bind_int(stmt, 2, pid);
209 if (ret != SQLITE_OK) {
210 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
211 sqlite3_finalize(stmt);
212 return VC_DB_ERROR_OPERATION_FAILED;
214 ret = sqlite3_bind_int(stmt, 3, cmd->type);
215 if (ret != SQLITE_OK) {
216 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
217 sqlite3_clear_bindings(stmt);
218 sqlite3_finalize(stmt);
219 return VC_DB_ERROR_OPERATION_FAILED;
221 ret = sqlite3_bind_int(stmt, 4, cmd->format);
222 if (ret != SQLITE_OK) {
223 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
224 sqlite3_clear_bindings(stmt);
225 sqlite3_finalize(stmt);
226 return VC_DB_ERROR_OPERATION_FAILED;
228 ret = sqlite3_bind_int(stmt, 5, cmd->domain);
229 if (ret != SQLITE_OK) {
230 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: err(%s)", sqlite3_errmsg(db_handle));
231 sqlite3_clear_bindings(stmt);
232 sqlite3_finalize(stmt);
233 return VC_DB_ERROR_OPERATION_FAILED;
235 ret = sqlite3_bind_text(stmt, 6, cmd->command, -1, SQLITE_TRANSIENT);
236 if (ret != SQLITE_OK) {
237 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
238 sqlite3_clear_bindings(stmt);
239 sqlite3_finalize(stmt);
240 return VC_DB_ERROR_OPERATION_FAILED;
244 if (NULL == cmd->appid) {
245 // Get appid by pid using app control
246 ret = app_manager_get_app_id(pid, &appid);
247 if (APP_MANAGER_ERROR_NONE != ret) {
248 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] fail to get app id, ret(%d), pid(%d)", ret, pid);
251 cmd->appid = strdup(appid);
255 ret = sqlite3_bind_text(stmt, 8, cmd->appid, -1, SQLITE_TRANSIENT);
256 if (ret != SQLITE_OK) {
257 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
258 sqlite3_clear_bindings(stmt);
259 sqlite3_finalize(stmt);
260 return VC_DB_ERROR_OPERATION_FAILED;
262 if (VC_COMMAND_TYPE_BACKGROUND == type && NULL != cmd->invocation_name) {
263 ret = sqlite3_bind_text(stmt, 9, cmd->invocation_name, -1, SQLITE_TRANSIENT);
264 if (ret != SQLITE_OK) {
265 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
266 sqlite3_clear_bindings(stmt);
267 sqlite3_finalize(stmt);
268 return VC_DB_ERROR_OPERATION_FAILED;
271 ret = sqlite3_bind_text(stmt, 10, cmd->fixed, -1, SQLITE_TRANSIENT);
272 if (ret != SQLITE_OK) {
273 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: err(%s)", sqlite3_errmsg(db_handle));
274 sqlite3_clear_bindings(stmt);
275 sqlite3_finalize(stmt);
276 return VC_DB_ERROR_OPERATION_FAILED;
278 ret = sqlite3_step(stmt);
279 if (ret != SQLITE_DONE) {
280 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned %d, %s", ret, sqlite3_errmsg(db_handle));
281 sqlite3_clear_bindings(stmt);
282 sqlite3_finalize(stmt);
283 return VC_DB_ERROR_OPERATION_FAILED;
286 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);
287 SLOG(LOG_INFO, vc_db_tag(), "[SQL] @@ appid(%s), invocation(%s), fixed(%s)", cmd->appid, cmd->invocation_name, cmd->fixed);
290 sqlite3_clear_bindings(stmt);
291 sqlite3_finalize(stmt);
292 return VC_DB_ERROR_NONE;
295 static int __vc_db_get_commands(sqlite3* db_handle, int pid, vc_cmd_type_e type, GSList** cmd_list)
297 SLOG(LOG_DEBUG, vc_db_tag(), "pid(%d), type(%d)", pid, type);
300 sqlite3_stmt* stmt = NULL;
304 if (VC_COMMAND_TYPE_BACKGROUND == type) {
305 /* For background command */
306 sql = strdup("SELECT * FROM vc_info WHERE type = ?;");
308 sql = strdup("SELECT * FROM vc_info WHERE type = ? AND pid = ?;");
312 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
313 return VC_DB_ERROR_OUT_OF_MEMORY;
315 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
316 if (ret != SQLITE_OK) {
317 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
320 return VC_DB_ERROR_OPERATION_FAILED;
323 ret = sqlite3_bind_int(stmt, 1, (int)type);
324 if (ret != SQLITE_OK) {
325 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
326 sqlite3_finalize(stmt);
329 return VC_DB_ERROR_OPERATION_FAILED;
331 if (VC_COMMAND_TYPE_BACKGROUND != type) {
332 ret = sqlite3_bind_int(stmt, 2, pid);
333 if (ret != SQLITE_OK) {
334 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
335 sqlite3_clear_bindings(stmt);
336 sqlite3_finalize(stmt);
339 return VC_DB_ERROR_OPERATION_FAILED;
343 if (VC_COMMAND_TYPE_BACKGROUND == type)
344 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_info WHERE type = %d", type);
346 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_info WHERE type = %d and pid = %d", type, pid);
348 ret = sqlite3_step(stmt);
349 if (ret == SQLITE_DONE) {
350 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
351 sqlite3_clear_bindings(stmt);
352 sqlite3_finalize(stmt);
355 return VC_DB_ERROR_NONE;
358 if (VC_COMMAND_TYPE_BACKGROUND == type && -1 != pid) {
359 if (APP_MANAGER_ERROR_NONE != app_manager_get_app_id(pid, &appid)) {
360 SLOG(LOG_WARN, vc_db_tag(), "[WARN] fail to get app id, pid(%d)", pid);
364 while (SQLITE_ROW == ret) {
367 char* temp_text = NULL;
369 ret = vc_cmd_create(&temp_cmd);
372 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
378 sqlite3_clear_bindings(stmt);
379 sqlite3_finalize(stmt);
382 return VC_DB_ERROR_OUT_OF_MEMORY;
385 temp_text = (char*)sqlite3_column_text(stmt, 7);
386 if (NULL != temp_text)
387 vc_cmd_set_appid(temp_cmd, temp_text);
389 ret = vc_cmd_get_appid(temp_cmd, &temp_text);
390 if (NULL != appid && 0 == ret) {
391 if (VC_COMMAND_TYPE_BACKGROUND == type && 0 == strncmp(appid, temp_text, strlen(appid))) {
392 SLOG(LOG_DEBUG, vc_db_tag(), "Skip get background commands when app is foreground, appid(%s)", appid);
397 vc_cmd_destroy(temp_cmd);
400 ret = sqlite3_step(stmt);
401 if (SQLITE_DONE == ret)
408 if (NULL != temp_text) {
413 temp = sqlite3_column_int(stmt, 0);
414 vc_cmd_set_id(temp_cmd, temp);
416 temp = sqlite3_column_int(stmt, 1);
417 vc_cmd_set_pid(temp_cmd, temp);
419 temp = sqlite3_column_int(stmt, 2);
420 vc_cmd_set_type(temp_cmd, temp);
422 temp = sqlite3_column_int(stmt, 3);
423 vc_cmd_set_format(temp_cmd, temp);
425 temp = sqlite3_column_int(stmt, 4);
426 vc_cmd_set_domain(temp_cmd, temp);
428 temp_text = (char*)sqlite3_column_text(stmt, 5);
429 if (NULL != temp_text)
430 vc_cmd_set_command(temp_cmd, temp_text);
432 temp_text = (char*)sqlite3_column_text(stmt, 6);
433 if (NULL != temp_text)
434 vc_cmd_set_unfixed_command(temp_cmd, temp_text);
436 temp_text = (char*)sqlite3_column_text(stmt, 8);
437 if (NULL != temp_text)
438 vc_cmd_set_invocation_name(temp_cmd, temp_text);
440 temp_text = (char*)sqlite3_column_text(stmt, 9);
441 if (NULL != temp_text)
442 vc_cmd_set_fixed_command(temp_cmd, temp_text);
444 ret = vc_cmd_get_type(temp_cmd, &temp);
445 if (0 == ret && type == temp) {
446 *cmd_list = g_slist_append(*cmd_list, temp_cmd);
448 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Command type(%d) is NOT valid : request type(%d)", temp, type);
450 vc_cmd_destroy(temp_cmd);
453 ret = sqlite3_step(stmt);
454 if (SQLITE_DONE == ret)
464 sqlite3_clear_bindings(stmt);
465 sqlite3_finalize(stmt);
469 return VC_DB_ERROR_NONE;
472 static int __vc_db_get_pid(const char* appid, int* pid)
474 bool running = false;
475 int ret = app_manager_is_running(appid, &running);
476 if (APP_MANAGER_ERROR_NONE != ret) {
477 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to check running with appid(%s)", appid);
478 return VC_DB_ERROR_OPERATION_FAILED;
480 if (true == running) {
481 app_context_h app_context = NULL;
482 ret = app_manager_get_app_context(appid, &app_context);
483 if (APP_MANAGER_ERROR_NONE != ret) {
484 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get app_context, ret(%d), appid(%s)", ret, appid);
485 return VC_DB_ERROR_OPERATION_FAILED;
488 ret = app_context_get_pid(app_context, pid);
489 if (APP_MANAGER_ERROR_NONE != ret) {
490 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get pid, ret(%d), appid(%s)", ret, appid);
491 return VC_DB_ERROR_OPERATION_FAILED;
494 ret = app_context_destroy(app_context);
495 if (APP_MANAGER_ERROR_NONE != ret) {
496 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to destroy app context, ret(%d), appid(%s)", ret, appid);
497 return VC_DB_ERROR_OPERATION_FAILED;
500 SLOG(LOG_ERROR, vc_db_tag(), "app is not running, appid(%s)", appid);
502 return VC_DB_ERROR_NONE;
505 static int __vc_db_insert_result(sqlite3* db_handle, const char* result_text, int event, const char* msg, bool exclusive, vc_cmd_s* cmd)
507 SLOG(LOG_DEBUG, vc_db_tag(), "result_text(%s), event(%d), msg(%s), exclusive(%d), cmd(%p)", result_text, event, msg, exclusive, cmd);
509 sqlite3_stmt* stmt = NULL;
510 const char* sql = "INSERT INTO vc_result (id, result, event, msg, exclusive, pid, type, format, domain, command, parameter, appid, invocation_name, fixed) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
512 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
513 if (ret != SQLITE_OK) {
514 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
515 return VC_DB_ERROR_OPERATION_FAILED;
517 ret = sqlite3_bind_text(stmt, 2, result_text, -1, SQLITE_TRANSIENT);
518 if (ret != SQLITE_OK) {
519 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
520 sqlite3_finalize(stmt);
521 return VC_DB_ERROR_OPERATION_FAILED;
523 ret = sqlite3_bind_int(stmt, 3, event);
524 if (ret != SQLITE_OK) {
525 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
526 sqlite3_clear_bindings(stmt);
527 sqlite3_finalize(stmt);
528 return VC_DB_ERROR_OPERATION_FAILED;
530 ret = sqlite3_bind_text(stmt, 4, msg, -1, SQLITE_TRANSIENT);
531 if (ret != SQLITE_OK) {
532 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
533 sqlite3_clear_bindings(stmt);
534 sqlite3_finalize(stmt);
535 return VC_DB_ERROR_OPERATION_FAILED;
537 ret = sqlite3_bind_int(stmt, 5, exclusive);
538 if (ret != SQLITE_OK) {
539 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
540 sqlite3_clear_bindings(stmt);
541 sqlite3_finalize(stmt);
542 return VC_DB_ERROR_OPERATION_FAILED;
546 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] INSERT INTO vc_result result(%s), event(%d), msg(%s), exclusive(%d))", result_text, event, msg, exclusive);
548 ret = sqlite3_step(stmt);
549 if (ret != SQLITE_DONE) {
550 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned %d, %s", ret, sqlite3_errmsg(db_handle));
551 sqlite3_clear_bindings(stmt);
552 sqlite3_finalize(stmt);
553 return VC_DB_ERROR_OPERATION_FAILED;
556 sqlite3_clear_bindings(stmt);
557 sqlite3_finalize(stmt);
558 return VC_DB_ERROR_NONE;
561 if (VC_COMMAND_TYPE_BACKGROUND == cmd->type) {
563 ret = __vc_db_get_pid(cmd->appid, &pid);
565 SLOG(LOG_WARN, vc_db_tag(), "Fail to get pid, appid(%s) ret(%d)", cmd->appid, ret);
567 SLOG(LOG_ERROR, vc_db_tag(), "pid(%d)", pid);
572 ret = sqlite3_bind_int(stmt, 6, cmd->pid);
573 if (ret != SQLITE_OK) {
574 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
575 sqlite3_clear_bindings(stmt);
576 sqlite3_finalize(stmt);
577 return VC_DB_ERROR_OPERATION_FAILED;
579 ret = sqlite3_bind_int(stmt, 7, cmd->type);
580 if (ret != SQLITE_OK) {
581 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
582 sqlite3_clear_bindings(stmt);
583 sqlite3_finalize(stmt);
584 return VC_DB_ERROR_OPERATION_FAILED;
586 ret = sqlite3_bind_int(stmt, 8, cmd->format);
587 if (ret != SQLITE_OK) {
588 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
589 sqlite3_clear_bindings(stmt);
590 sqlite3_finalize(stmt);
591 return VC_DB_ERROR_OPERATION_FAILED;
593 ret = sqlite3_bind_int(stmt, 9, cmd->domain);
594 if (ret != SQLITE_OK) {
595 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
596 sqlite3_clear_bindings(stmt);
597 sqlite3_finalize(stmt);
598 return VC_DB_ERROR_OPERATION_FAILED;
600 ret = sqlite3_bind_text(stmt, 10, cmd->command, -1, SQLITE_TRANSIENT);
601 if (ret != SQLITE_OK) {
602 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
603 sqlite3_clear_bindings(stmt);
604 sqlite3_finalize(stmt);
605 return VC_DB_ERROR_OPERATION_FAILED;
607 ret = sqlite3_bind_text(stmt, 11, cmd->parameter, -1, SQLITE_TRANSIENT);
608 if (ret != SQLITE_OK) {
609 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
610 sqlite3_clear_bindings(stmt);
611 sqlite3_finalize(stmt);
612 return VC_DB_ERROR_OPERATION_FAILED;
614 ret = sqlite3_bind_text(stmt, 12, cmd->appid, -1, SQLITE_TRANSIENT);
615 if (ret != SQLITE_OK) {
616 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
617 sqlite3_clear_bindings(stmt);
618 sqlite3_finalize(stmt);
619 return VC_DB_ERROR_OPERATION_FAILED;
621 ret = sqlite3_bind_text(stmt, 13, cmd->invocation_name, -1, SQLITE_TRANSIENT);
622 if (ret != SQLITE_OK) {
623 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
624 sqlite3_clear_bindings(stmt);
625 sqlite3_finalize(stmt);
626 return VC_DB_ERROR_OPERATION_FAILED;
628 ret = sqlite3_bind_text(stmt, 14, cmd->fixed, -1, SQLITE_TRANSIENT);
629 if (ret != SQLITE_OK) {
630 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_text: %s", sqlite3_errmsg(db_handle));
631 sqlite3_clear_bindings(stmt);
632 sqlite3_finalize(stmt);
633 return VC_DB_ERROR_OPERATION_FAILED;
635 ret = sqlite3_step(stmt);
636 if (ret != SQLITE_DONE) {
637 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_step: fail returned %d, %s", ret, sqlite3_errmsg(db_handle));
638 sqlite3_clear_bindings(stmt);
639 sqlite3_finalize(stmt);
640 return VC_DB_ERROR_OPERATION_FAILED;
643 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)",
644 result_text, event, msg, exclusive, cmd->pid, cmd->type, cmd->format, cmd->domain, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
647 sqlite3_clear_bindings(stmt);
648 sqlite3_finalize(stmt);
650 return VC_DB_ERROR_NONE;
653 static int __vc_db_remove_invocation_name(char* org_cmd, const char* invocation_name, char** new_cmd)
655 if (NULL == org_cmd || NULL == new_cmd) {
656 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter");
657 return VC_DB_ERROR_INVALID_PARAMETER;
660 if (NULL == invocation_name) {
661 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Invalid parameter, invocation name is NULL, org_cmd(%s)", org_cmd);
662 return VC_DB_ERROR_INVALID_PARAMETER;
665 if (strlen(org_cmd) <= strlen(invocation_name)) {
666 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] No need to remove invocation name, org_cmd(%s) invocation(%s)", org_cmd, invocation_name);
667 return VC_DB_ERROR_INVALID_PARAMETER;
670 if (0 == strncasecmp(org_cmd, invocation_name, strlen(invocation_name))) {
671 *new_cmd = strdup(org_cmd + strlen(invocation_name) + 1);
673 SLOG(LOG_DEBUG, vc_db_tag(), "Original cmd[%s], New cmd[%s], Invocation name[%s]", org_cmd, *new_cmd, invocation_name);
674 return VC_DB_ERROR_NONE;
677 static int __vc_db_extract_unfixed_command(char* command, char* fixed, char** temp_unfixed)
679 if (NULL == command || NULL == temp_unfixed) {
680 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter");
681 return VC_DB_ERROR_INVALID_PARAMETER;
685 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Invalid parameter, fixed cmd is NULL, org_cmd(%s)", command);
686 return VC_DB_ERROR_INVALID_PARAMETER;
689 if (strlen(command) <= strlen(fixed)) {
690 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] No need to extract unfixed command, cmd(%s) fixed(%s)", command, fixed);
691 return VC_DB_ERROR_INVALID_PARAMETER;
694 char* temp = (char*)calloc(256, sizeof(char));
696 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
697 return VC_DB_ERROR_OUT_OF_MEMORY;
699 if (0 == strncasecmp(command, fixed, strlen(fixed))) {
700 strncpy(temp, command + strlen(fixed) + 1, strlen(command) - strlen(fixed) - 1);
701 SLOG(LOG_WARN, vc_db_tag(), "@@@");
702 } else if (0 == strncasecmp(command + strlen(command) - strlen(fixed), fixed, strlen(fixed))) {
703 strncpy(temp, command, strlen(command) - strlen(fixed) - 1);
704 SLOG(LOG_WARN, vc_db_tag(), "@@@");
707 SLOG(LOG_WARN, vc_db_tag(), "Command(%s) Fixed(%s) Unfixed(%s)", command, fixed, temp);
709 *temp_unfixed = strdup(temp);
713 return VC_DB_ERROR_NONE;
716 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)
719 sqlite3_stmt* stmt = NULL;
722 sql = strdup("SELECT * FROM vc_result;");
723 else if (NULL != appid)
724 sql = strdup("SELECT * FROM vc_result WHERE appid = ?;");
726 sql = strdup("SELECT * FROM vc_result WHERE pid = ?;");
729 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
730 return VC_DB_ERROR_OUT_OF_MEMORY;
733 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
734 if (ret != SQLITE_OK) {
735 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
738 return VC_DB_ERROR_OPERATION_FAILED;
741 ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
742 if (ret != SQLITE_OK) {
743 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
744 sqlite3_finalize(stmt);
747 return VC_DB_ERROR_OPERATION_FAILED;
749 } else if (-1 != pid) {
750 ret = sqlite3_bind_int(stmt, 1, pid);
751 if (ret != SQLITE_OK) {
752 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
753 sqlite3_finalize(stmt);
756 return VC_DB_ERROR_OPERATION_FAILED;
759 ret = sqlite3_step(stmt);
760 if (ret == SQLITE_DONE) {
761 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
762 sqlite3_clear_bindings(stmt);
763 sqlite3_finalize(stmt);
766 return VC_DB_ERROR_NONE;
770 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] %s", sql);
771 else if (NULL != appid)
772 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE appid = %s;", appid);
775 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE pid = %d;", pid);
777 vc_cmd_h temp_cmd = NULL;
778 while (SQLITE_ROW == ret) {
780 char* temp_text = NULL;
781 const char* invocation_name = NULL;
783 temp_text = (char*)sqlite3_column_text(stmt, 1);
784 if (NULL != temp_text)
785 *result_text = strdup(temp_text);
787 temp = sqlite3_column_int(stmt, 2);
791 temp_text = (char*)sqlite3_column_text(stmt, 3);
792 if (NULL != temp_text)
793 *msg = strdup(temp_text);
796 if (0 != vc_cmd_create(&temp_cmd)) {
797 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create command!!");
798 if (NULL != *result_text) {
803 if (NULL != msg && NULL != *msg) {
809 sqlite3_clear_bindings(stmt);
810 sqlite3_finalize(stmt);
816 temp = sqlite3_column_int(stmt, 0);
817 vc_cmd_set_id(temp_cmd, temp);
819 temp = sqlite3_column_int(stmt, 5);
820 vc_cmd_set_pid(temp_cmd, temp);
822 temp = sqlite3_column_int(stmt, 6);
823 vc_cmd_set_type(temp_cmd, temp);
825 temp = sqlite3_column_int(stmt, 7);
826 vc_cmd_set_format(temp_cmd, temp);
828 temp = sqlite3_column_int(stmt, 8);
829 vc_cmd_set_domain(temp_cmd, temp);
832 invocation_name = (char*)sqlite3_column_text(stmt, 12);
834 temp_text = (char*)sqlite3_column_text(stmt, 9);
835 SLOG(LOG_DEBUG, vc_db_tag(), "org command (%s)", temp_text);
837 if (NULL != temp_text) {
838 char* temp_command = NULL;
839 char* temp_unfixed = NULL;
840 char* temp_fixed = NULL;
842 if (NULL != invocation_name)
843 __vc_db_remove_invocation_name(*result_text, invocation_name, &temp_command);
845 if (NULL == temp_command) {
846 temp_command = strdup(temp_text);
848 // remove invocation name from result_text
850 *result_text = strdup(temp_command);
854 temp_fixed = (char*)sqlite3_column_text(stmt, 13);
855 if (NULL != temp_fixed)
856 vc_cmd_set_fixed_command(temp_cmd, temp_fixed);
859 temp_unfixed = (char*)sqlite3_column_text(stmt, 10);
861 if (NULL != temp_unfixed) {
862 char merge_result[256] = {0, };
863 vc_cmd_set_command(temp_cmd, temp_command);
864 vc_cmd_set_unfixed_command(temp_cmd, temp_unfixed);
865 snprintf(merge_result, 256, "%s %s", temp_command, temp_unfixed);
866 if (NULL != *result_text)
868 *result_text = strdup(merge_result);
869 } else if (NULL != temp_fixed) {
870 __vc_db_extract_unfixed_command(*result_text, temp_fixed, &temp_unfixed);
871 vc_cmd_set_command(temp_cmd, temp_fixed);
872 vc_cmd_set_unfixed_command(temp_cmd, temp_unfixed);
873 if (NULL != temp_unfixed) {
878 vc_cmd_set_command(temp_cmd, temp_command);
884 temp_text = (char*)sqlite3_column_text(stmt, 11);
885 if (NULL != temp_text)
886 vc_cmd_set_appid(temp_cmd, temp_text);
888 if (0 != vc_cmd_list_add(vc_cmd_list, temp_cmd)) {
889 SLOG(LOG_DEBUG, vc_db_tag(), "Fail to add command to list");
890 vc_cmd_destroy(temp_cmd);
891 vc_cmd_list_destroy(vc_cmd_list, true);
892 if (NULL != *result_text) {
897 if (NULL != msg && NULL != *msg) {
903 sqlite3_clear_bindings(stmt);
904 sqlite3_finalize(stmt);
907 return VC_DB_ERROR_OPERATION_FAILED;
910 ret = sqlite3_step(stmt);
911 if (SQLITE_DONE == ret)
916 sqlite3_clear_bindings(stmt);
917 sqlite3_finalize(stmt);
921 return VC_DB_ERROR_NONE;
924 void __vc_db_demandable_client_free(void* data)
926 vc_deactivated_app_s* d_app = (vc_deactivated_app_s*)data;
929 if (NULL != d_app->appid) {
938 static int __vc_db_get_appid(sqlite3* db_handle, const char* result, GSList** app_list)
940 GSList* temp_app_list = NULL;
943 sqlite3_stmt* stmt = NULL;
944 const char* sql = "SELECT * FROM vc_result WHERE type = ? AND result = ? COLLATE NOCASE;";
946 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
947 if (ret != SQLITE_OK) {
948 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
949 return VC_DB_ERROR_OPERATION_FAILED;
951 ret = sqlite3_bind_int(stmt, 1, VC_COMMAND_TYPE_BACKGROUND);
952 if (ret != SQLITE_OK) {
953 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
954 sqlite3_finalize(stmt);
955 return VC_DB_ERROR_OPERATION_FAILED;
957 ret = sqlite3_bind_text(stmt, 2, result, -1, SQLITE_TRANSIENT);
958 if (ret != SQLITE_OK) {
959 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
960 sqlite3_clear_bindings(stmt);
961 sqlite3_finalize(stmt);
962 return VC_DB_ERROR_OPERATION_FAILED;
964 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE type = 2 and result = %s", result);
965 ret = sqlite3_step(stmt);
966 if (ret == SQLITE_DONE) {
967 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
968 sqlite3_clear_bindings(stmt);
969 sqlite3_finalize(stmt);
970 return VC_DB_ERROR_NONE;
973 while (SQLITE_ROW == ret) {
974 char* temp_text = NULL;
975 vc_deactivated_app_s* temp_app = NULL;
976 temp_app = (vc_deactivated_app_s*)calloc(1, sizeof(vc_deactivated_app_s));
977 if (NULL == temp_app) {
978 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] memory allocation fail");
980 if (NULL != temp_app_list) {
981 g_slist_free_full(temp_app_list, __vc_db_demandable_client_free);
982 temp_app_list = NULL;
986 sqlite3_clear_bindings(stmt);
987 sqlite3_finalize(stmt);
988 return VC_DB_ERROR_OUT_OF_MEMORY;
991 temp_text = (char*)sqlite3_column_text(stmt, 11);
992 if (NULL != temp_text)
993 temp_app->appid = strdup(temp_text);
995 temp_app_list = g_slist_append(temp_app_list, temp_app);
997 ret = sqlite3_step(stmt);
998 if (SQLITE_DONE == ret)
1002 *app_list = temp_app_list;
1004 sqlite3_reset(stmt);
1005 sqlite3_clear_bindings(stmt);
1006 sqlite3_finalize(stmt);
1007 return VC_DB_ERROR_NONE;
1010 int __vc_db_get_result_pid_list(sqlite3* db_handle, const char* result, GSList** pid_list)
1012 GSList* temp_pid_list = NULL;
1015 sqlite3_stmt* stmt = NULL;
1016 const char* sql = "SELECT DISTINCT pid, type FROM vc_result WHERE result = ? COLLATE NOCASE ORDER BY pid ASC;";
1019 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
1020 if (ret != SQLITE_OK) {
1021 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
1022 return VC_DB_ERROR_OPERATION_FAILED;
1024 ret = sqlite3_bind_text(stmt, 1, result, -1, SQLITE_TRANSIENT);
1025 if (ret != SQLITE_OK) {
1026 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1027 sqlite3_finalize(stmt);
1028 return VC_DB_ERROR_OPERATION_FAILED;
1030 ret = sqlite3_step(stmt);
1031 if (ret == SQLITE_DONE) {
1032 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
1033 sqlite3_clear_bindings(stmt);
1034 sqlite3_finalize(stmt);
1035 return VC_DB_ERROR_NONE;
1038 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result result = %s", result);
1040 while (SQLITE_ROW == ret) {
1042 vc_cmd_s* temp_cmd = NULL;
1043 temp_cmd = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
1044 if (NULL == temp_cmd) {
1045 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] memory allocation fail");
1047 if (NULL != temp_pid_list) {
1048 g_slist_free_full(temp_pid_list, free);
1049 temp_pid_list = NULL;
1052 sqlite3_reset(stmt);
1053 sqlite3_clear_bindings(stmt);
1054 sqlite3_finalize(stmt);
1055 return VC_DB_ERROR_OUT_OF_MEMORY;
1058 temp = sqlite3_column_int(stmt, 0);
1059 temp_cmd->pid = temp;
1061 temp = sqlite3_column_int(stmt, 1);
1062 temp_cmd->type = temp;
1064 temp_pid_list = g_slist_append(temp_pid_list, temp_cmd);
1066 ret = sqlite3_step(stmt);
1067 if (SQLITE_DONE == ret)
1071 *pid_list = temp_pid_list;
1073 sqlite3_reset(stmt);
1074 sqlite3_clear_bindings(stmt);
1075 sqlite3_finalize(stmt);
1076 return VC_DB_ERROR_NONE;
1079 static int __vc_db_append_commands(sqlite3* db_handle, int pid, int type, vc_cmd_list_h vc_cmd_list)
1081 SLOG(LOG_ERROR, vc_db_tag(), "pid(%d), type(%d)", pid, type);
1084 sqlite3_stmt* stmt = NULL;
1085 const char* sql = "SELECT * FROM vc_info WHERE pid = ? AND type = ?;";
1087 ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL);
1088 if (ret != SQLITE_OK) {
1089 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_prepare_v2: %s", sqlite3_errmsg(db_handle));
1090 return VC_DB_ERROR_OPERATION_FAILED;
1092 ret = sqlite3_bind_int(stmt, 1, pid);
1093 if (ret != SQLITE_OK) {
1094 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1095 sqlite3_finalize(stmt);
1096 return VC_DB_ERROR_OPERATION_FAILED;
1098 ret = sqlite3_bind_int(stmt, 2, type);
1099 if (ret != SQLITE_OK) {
1100 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_bind_int: %s", sqlite3_errmsg(db_handle));
1101 sqlite3_clear_bindings(stmt);
1102 sqlite3_finalize(stmt);
1103 return VC_DB_ERROR_OPERATION_FAILED;
1105 ret = sqlite3_step(stmt);
1106 if (ret == SQLITE_DONE) {
1107 SLOG(LOG_DEBUG, vc_db_tag(), "No matched commands");
1108 sqlite3_clear_bindings(stmt);
1109 sqlite3_finalize(stmt);
1110 return VC_DB_ERROR_NONE;
1113 SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_info WHERE pid = %d and type = %d", pid, type);
1115 vc_cmd_h temp_cmd = NULL;
1117 while (SQLITE_ROW == ret) {
1119 char* temp_text = NULL;
1121 if (0 != vc_cmd_create(&temp_cmd)) {
1122 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create command!!");
1123 sqlite3_reset(stmt);
1124 sqlite3_clear_bindings(stmt);
1125 sqlite3_finalize(stmt);
1128 temp = sqlite3_column_int(stmt, 0);
1129 vc_cmd_set_id(temp_cmd, temp);
1131 temp = sqlite3_column_int(stmt, 1);
1132 vc_cmd_set_pid(temp_cmd, temp);
1134 temp = sqlite3_column_int(stmt, 2);
1135 vc_cmd_set_type(temp_cmd, temp);
1137 temp = sqlite3_column_int(stmt, 3);
1138 vc_cmd_set_format(temp_cmd, temp);
1140 temp = sqlite3_column_int(stmt, 4);
1141 vc_cmd_set_domain(temp_cmd, temp);
1143 temp_text = (char*)sqlite3_column_text(stmt, 5);
1144 if (NULL != temp_text)
1145 vc_cmd_set_command(temp_cmd, temp_text);
1147 temp_text = (char*)sqlite3_column_text(stmt, 6);
1148 if (NULL != temp_text)
1149 vc_cmd_set_unfixed_command(temp_cmd, temp_text);
1151 temp_text = (char*)sqlite3_column_text(stmt, 7);
1152 if (NULL != temp_text)
1153 vc_cmd_set_appid(temp_cmd, temp_text);
1155 temp_text = (char*)sqlite3_column_text(stmt, 8);
1156 if (NULL != temp_text)
1157 vc_cmd_set_invocation_name(temp_cmd, temp_text);
1159 temp_text = (char*)sqlite3_column_text(stmt, 9);
1160 if (NULL != temp_text)
1161 vc_cmd_set_fixed_command(temp_cmd, temp_text);
1163 if (0 != vc_cmd_list_add(vc_cmd_list, temp_cmd)) {
1164 SLOG(LOG_DEBUG, vc_db_tag(), "Fail to add command to list");
1165 vc_cmd_destroy(temp_cmd);
1166 vc_cmd_list_destroy(vc_cmd_list, true);
1167 sqlite3_reset(stmt);
1168 sqlite3_clear_bindings(stmt);
1169 sqlite3_finalize(stmt);
1170 return VC_DB_ERROR_OPERATION_FAILED;
1173 ret = sqlite3_step(stmt);
1174 if (SQLITE_DONE == ret)
1178 sqlite3_reset(stmt);
1179 sqlite3_clear_bindings(stmt);
1180 sqlite3_finalize(stmt);
1181 return VC_DB_ERROR_NONE;
1184 static vc_cmd_s* __vc_db_command_copy(vc_cmd_s* src_cmd)
1186 if (NULL == src_cmd) {
1187 SLOG(LOG_WARN, vc_db_tag(), "[Client Data] Input command is NULL");
1191 vc_cmd_s* temp_cmd = NULL;
1192 temp_cmd = (vc_cmd_s*)calloc(sizeof(vc_cmd_s), 1);
1193 if (NULL == temp_cmd) {
1194 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1198 temp_cmd->id = src_cmd->id;
1199 temp_cmd->pid = src_cmd->pid;
1200 temp_cmd->index = src_cmd->index;
1201 temp_cmd->type = src_cmd->type;
1202 temp_cmd->format = src_cmd->format;
1203 temp_cmd->domain = src_cmd->domain;
1205 if (VC_COMMAND_TYPE_SYSTEM == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM;
1206 else if (VC_COMMAND_TYPE_EXCLUSIVE == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_EXCLUSIVE;
1207 else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_WIDGET;
1208 else if (VC_COMMAND_TYPE_FOREGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND;
1209 else if (VC_COMMAND_TYPE_SYSTEM_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND;
1210 else if (VC_COMMAND_TYPE_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_BACKGROUND;
1212 if (NULL != src_cmd->command) {
1213 temp_cmd->command = strdup(src_cmd->command);
1216 if (NULL != src_cmd->parameter) {
1217 temp_cmd->parameter = strdup(src_cmd->parameter);
1220 if (NULL != src_cmd->appid) {
1221 temp_cmd->appid = strdup(src_cmd->appid);
1224 if (NULL != src_cmd->invocation_name) {
1225 temp_cmd->invocation_name = strdup(src_cmd->invocation_name);
1228 if (NULL != src_cmd->fixed) {
1229 temp_cmd->fixed = strdup(src_cmd->fixed);
1232 temp_cmd->key = src_cmd->key;
1233 temp_cmd->modifier = src_cmd->modifier;
1238 int __vc_db_create_table(sqlite3* db_handle)
1240 const char* vc_info_sql = "CREATE TABLE IF NOT EXISTS vc_info (id INTEGER PRIMARY KEY AUTOINCREMENT, pid INTEGER, type INTEGER, format INTEGER, domain INTEGER, \
1241 command TEXT, parameter TEXT, appid TEXT, invocation_name TEXT, fixed TEXT);";
1242 const char* vc_result_sql = "CREATE TABLE IF NOT EXISTS vc_result (id INTEGER PRIMARY KEY AUTOINCREMENT, result TEXT, event INTEGER, msg TEXT, exclusive INTEGER,\
1243 pid INTEGER, type INTEGER, format INTEGER, domain INTEGER, command TEXT, parameter TEXT, appid TEXT, invocation_name TEXT, fixed TEXT);";
1245 int ret = __vc_db_exec_query(db_handle, vc_info_sql);
1246 if (ret != VC_DB_ERROR_NONE) {
1247 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table, %d", ret);
1248 return VC_DB_ERROR_OPERATION_FAILED;
1250 SLOG(LOG_WARN, vc_db_tag(), "[SQL] %s", vc_info_sql);
1252 ret = __vc_db_exec_query(db_handle, vc_result_sql);
1253 if (ret != VC_DB_ERROR_NONE) {
1254 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table, %d", ret);
1257 SLOG(LOG_WARN, vc_db_tag(), "[SQL] %s", vc_result_sql);
1259 return VC_DB_ERROR_NONE;
1262 int __vc_db_open_db(char** path, sqlite3** db_handle)
1265 int ret = db_util_open(*path, db_handle, DB_UTIL_REGISTER_HOOK_METHOD);
1266 if (ret != SQLITE_OK) {
1267 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open db, path = %s, ret %d: %s", *path, ret, sqlite3_errmsg(*db_handle));
1269 db_util_close(*db_handle);
1275 return VC_DB_ERROR_OPERATION_FAILED;
1278 if (lstat(*path, &stat) < 0) {
1280 SLOG(LOG_ERROR, vc_db_tag(), "%d", strerror_r(errno, buf_err, sizeof(buf_err)));
1282 db_util_close(*db_handle);
1287 return VC_DB_ERROR_OPERATION_FAILED;
1290 if (!S_ISREG(stat.st_mode)) {
1291 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] S_ISREG failed");
1293 db_util_close(*db_handle);
1298 return VC_DB_ERROR_OPERATION_FAILED;
1301 if (!stat.st_size) {
1302 __vc_db_begin_transaction(*db_handle);
1304 int ret = __vc_db_create_table(*db_handle);
1305 if (ret != VC_DB_ERROR_NONE) {
1306 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table, %d", ret);
1307 __vc_db_rollback_transaction(*db_handle);
1308 return VC_DB_ERROR_OPERATION_FAILED;
1311 __vc_db_commit_transaction(*db_handle);
1315 char* err_msg = NULL;
1316 static const const char* sql = "PRAGMA journal_mode = WAL";
1317 int ret = sqlite3_exec(*db_handle, sql, NULL, NULL, &err_msg);
1318 if (ret != SQLITE_OK) {
1319 SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_exec returned %d: %s", ret, err_msg);
1322 return VC_DB_ERROR_NONE;
1325 static int __vc_db_integrity_check_cb(void *NotUsed, int argc, char **argv, char **azColName)
1327 SLOG(LOG_INFO, vc_db_tag(), "integrity check cb is called");
1331 int vc_db_initialize(void)
1333 SLOG(LOG_INFO, vc_db_tag(), "DB initialization");
1335 if (0 < g_ref_cnt) {
1337 return VC_DB_ERROR_NONE;
1340 /* For voice control DB */
1341 g_path = (char*)calloc(256, sizeof(char));
1342 if (NULL == g_path) {
1343 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1344 return VC_DB_ERROR_OUT_OF_MEMORY;
1346 /* This should be changed to general DB space - TZ_USER_DB */
1347 snprintf(g_path, 256, "%s/.vc_info.db", VC_RUNTIME_INFO_ROOT);
1350 g_backup_path = (char*)calloc(256, sizeof(char));
1351 if (NULL == g_backup_path) {
1352 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1353 return VC_DB_ERROR_OUT_OF_MEMORY;
1355 snprintf(g_backup_path, 256, "%s/.vc_backup.db", VC_RUNTIME_INFO_ROOT);
1357 if (0 != __vc_db_open_db(&g_path, &g_db_handle)) {
1359 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB");
1360 if (0 != remove(g_path)) {
1361 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed", g_path);
1363 if (0 != __vc_db_open_db(&g_path, &g_db_handle)) {
1364 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB");
1367 if (0 != __vc_db_open_db(&g_backup_path, &g_db_backup_handle)) {
1368 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open backup DB");
1374 if (0 != vc_db_restore_command()) {
1375 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command");
1379 if (SQLITE_CORRUPT == sqlite3_exec(g_db_handle, "pragma integrity_check", __vc_db_integrity_check_cb, NULL, NULL)) {
1381 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB");
1382 if (0 != remove(g_path)) {
1383 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed", g_path);
1385 if (0 != __vc_db_open_db(&g_path, &g_db_handle)) {
1386 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open DB");
1389 if (0 != __vc_db_open_db(&g_backup_path, &g_db_backup_handle)) {
1390 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open backup DB");
1396 if (0 != vc_db_restore_command()) {
1397 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to restore command");
1401 if (0 != __vc_db_open_db(&g_backup_path, &g_db_backup_handle)) {
1402 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open backup DB");
1403 if (0 != remove(g_backup_path)) {
1404 SLOG(LOG_ERROR, vc_db_tag(), "[Error] remove file(%s) is failed", g_backup_path);
1406 if (0 != __vc_db_open_db(&g_backup_path, &g_db_backup_handle)) {
1407 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to open backup DB");
1409 if (0 != vc_db_backup_command()) {
1410 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to backup command");
1415 return VC_DB_ERROR_NONE;
1418 int vc_db_finalize(void)
1420 if (0 >= g_ref_cnt) return VC_DB_ERROR_INVALID_STATE;
1421 if (0 != --g_ref_cnt)
1422 return VC_DB_ERROR_NONE;
1424 if (NULL != g_path) {
1429 if (NULL != g_backup_path) {
1430 free(g_backup_path);
1431 g_backup_path = NULL;
1436 db_util_close(g_db_handle);
1439 if (!g_db_backup_handle)
1441 db_util_close(g_db_backup_handle);
1442 g_db_backup_handle = NULL;
1444 return VC_DB_ERROR_NONE;
1447 int vc_db_create_table()
1449 __vc_db_begin_transaction(g_db_handle);
1451 int ret = __vc_db_create_table(g_db_handle);
1452 if (ret != VC_DB_ERROR_NONE) {
1453 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to create table, %d", ret);
1454 __vc_db_rollback_transaction(g_db_handle);
1455 return VC_DB_ERROR_OPERATION_FAILED;
1458 __vc_db_commit_transaction(g_db_handle);
1459 return VC_DB_ERROR_NONE;
1462 int __vc_db_delete_table(sqlite3* db_handle, const char* table)
1465 if (0 == strncmp(table, VC_RESULT_TABLE, strlen(table))) {
1466 sql = strdup("DELETE FROM vc_result;");
1467 } else if (0 == strncmp(table, VC_INFO_TABLE, strlen(table))) {
1468 sql = strdup("DELETE FROM vc_info;");
1470 return VC_DB_ERROR_INVALID_PARAMETER;
1474 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1475 return VC_DB_ERROR_OUT_OF_MEMORY;
1478 int ret = __vc_db_exec_query(db_handle, sql);
1479 if (ret != VC_DB_ERROR_NONE) {
1480 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table, %d", ret);
1489 if (0 == strncmp(table, VC_RESULT_TABLE, strlen(table))) {
1490 sql = strdup("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='vc_result';");
1491 } else if (0 == strncmp(table, VC_INFO_TABLE, strlen(table))) {
1492 sql = strdup("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='vc_info';");
1496 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1497 return VC_DB_ERROR_OUT_OF_MEMORY;
1500 ret = __vc_db_exec_query(db_handle, sql);
1501 if (ret != VC_DB_ERROR_NONE) {
1502 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table, %d", ret);
1508 SLOG(LOG_WARN, vc_db_tag(), "[SQL] %s", sql);
1512 return VC_DB_ERROR_NONE;
1515 int vc_db_delete_table(const char* table)
1517 __vc_db_begin_transaction(g_db_handle);
1519 int ret = __vc_db_delete_table(g_db_handle, table);
1521 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table");
1522 __vc_db_rollback_transaction(g_db_handle);
1526 __vc_db_commit_transaction(g_db_handle);
1528 return VC_DB_ERROR_NONE;
1531 int vc_db_begin_transaction(void)
1533 int ret = __vc_db_begin_transaction(g_db_handle);
1537 int vc_db_rollback_transaction(void)
1539 int ret = __vc_db_rollback_transaction(g_db_handle);
1543 int vc_db_commit_transaction(void)
1545 int ret = __vc_db_commit_transaction(g_db_handle);
1549 static void __vc_db_remove_space(char** string)
1551 if (NULL == string || NULL == *string)
1554 char* temp = *string;
1556 //remove previous space
1558 memmove(temp, temp + 1, strlen(temp));
1560 // remove next space
1561 if (' ' == temp[strlen(temp) - 1])
1562 temp[strlen(temp) - 1] = '\0';
1565 static bool __vc_db_is_valid_vfixed_string(char* string)
1567 char* temp = strchr(string, '}');
1571 temp = strchr(string, '{');
1575 temp = strchr(string, '|');
1581 static int __vc_db_generate_command(vc_cmd_s* cmd, char** fixed_cmd, GSList** cmd_list)
1583 if (NULL == cmd || NULL == cmd->command) {
1584 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter");
1585 return VC_DB_ERROR_INVALID_PARAMETER;
1588 GSList* temp_list = NULL;
1590 char* src_cmd = strdup(cmd->command);
1591 char* dst_cmd = NULL;
1592 char merge_cmd[256] = {0, };
1594 if (NULL == src_cmd) {
1595 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory");
1596 return VC_DB_ERROR_OUT_OF_MEMORY;
1599 if (VC_CMD_FORMAT_FIXED_AND_VFIXED == cmd->format) {
1600 // check string validation
1601 if (false == __vc_db_is_valid_vfixed_string(src_cmd)) {
1602 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter, cmd->command(%s)", src_cmd);
1605 return VC_DB_ERROR_INVALID_PARAMETER;
1608 // remove close brace, '}'
1609 char* temp_close = strchr(src_cmd, '}');
1610 if (NULL != temp_close) {
1611 temp_close[0] = '\0';
1614 // extract fixed command and remove space in front of '{'
1615 char *tok_ptr = NULL;
1616 temp = strtok_r(src_cmd, "{", &tok_ptr);
1618 __vc_db_remove_space(&temp);
1619 *fixed_cmd = strdup(temp);
1621 // merge command with fixed and vfixed
1622 while (NULL != (temp = strtok_r(NULL, "|", &tok_ptr))) {
1623 __vc_db_remove_space(&temp);
1625 snprintf(merge_cmd, 256, "%s %s", *fixed_cmd, temp);
1626 dst_cmd = strdup(merge_cmd);
1627 temp_list = g_slist_append(temp_list, dst_cmd);
1628 SLOG(LOG_ERROR, vc_db_tag(), "New generated cmd: %s", dst_cmd);
1631 *fixed_cmd = strdup(cmd->command);
1633 } else if (VC_CMD_FORMAT_VFIXED_AND_FIXED == cmd->format) {
1634 // check string validation
1635 if (false == __vc_db_is_valid_vfixed_string(src_cmd)) {
1636 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Invalid parameter, cmd->command(%s)", src_cmd);
1639 return VC_DB_ERROR_INVALID_PARAMETER;
1642 // extract fixed command
1643 char* temp_fixed = strchr(src_cmd, '}') + 1;
1644 __vc_db_remove_space(&temp_fixed);
1645 *fixed_cmd = strdup(temp_fixed);
1647 // remove close brace, '}'
1648 char *tok_ptr = NULL;
1649 temp = strtok_r(src_cmd, "}", &tok_ptr);
1651 // remove open brace, '{'
1652 temp = strchr(src_cmd, '{') + 1;
1655 temp = strtok_r(temp, "|", &tok_ptr);
1656 __vc_db_remove_space(&temp);
1658 // merge command with fixed and vfixed
1659 snprintf(merge_cmd, 256, "%s %s", temp, *fixed_cmd);
1660 dst_cmd = strdup(merge_cmd);
1661 temp_list = g_slist_append(temp_list, dst_cmd);
1662 SLOG(LOG_ERROR, vc_db_tag(), "New generated cmd: %s", dst_cmd);
1664 while (NULL != (temp = strtok_r(NULL, "|", &tok_ptr))) {
1665 __vc_db_remove_space(&temp);
1667 // merge command with fixed and vfixed
1668 snprintf(merge_cmd, 256, "%s %s", temp, *fixed_cmd);
1669 dst_cmd = strdup(merge_cmd);
1670 temp_list = g_slist_append(temp_list, dst_cmd);
1671 SLOG(LOG_ERROR, vc_db_tag(), "New generated cmd: %s", dst_cmd);
1673 } else if (VC_CMD_FORMAT_FIXED_AND_NONFIXED == cmd->format || VC_CMD_FORMAT_NONFIXED_AND_FIXED == cmd->format) {
1674 dst_cmd = strdup(src_cmd);
1675 temp_list = g_slist_append(temp_list, dst_cmd);
1676 *fixed_cmd = strdup(src_cmd);
1679 dst_cmd = strdup(src_cmd);
1680 temp_list = g_slist_append(temp_list, dst_cmd);
1683 *cmd_list = temp_list;
1687 return VC_DB_ERROR_NONE;
1690 static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e type, vc_cmd_s* cmd, bool skip_invocation)
1692 GSList* cmd_list = NULL;
1693 char* fixed_cmd = NULL;
1694 vc_cmd_s* tmp_cmd = __vc_db_command_copy(cmd);
1696 int ret = __vc_db_generate_command(tmp_cmd, &fixed_cmd, &cmd_list);
1698 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to generate command, %d", ret);
1700 if (NULL != tmp_cmd) {
1701 vc_cmd_destroy((vc_cmd_h)tmp_cmd);
1706 if (0 != g_slist_length(cmd_list)) {
1707 GSList *iter = NULL;
1708 char* temp_command = NULL;
1709 iter = g_slist_nth(cmd_list, 0);
1711 while (NULL != iter) {
1712 temp_command = iter->data;
1714 if (NULL != temp_command) {
1715 if (NULL != tmp_cmd->command) {
1716 free(tmp_cmd->command);
1717 tmp_cmd->command = NULL;
1719 tmp_cmd->command = strdup(temp_command);
1720 if (NULL != fixed_cmd)
1721 tmp_cmd->fixed = strdup(fixed_cmd);
1723 tmp_cmd->fixed = NULL;
1725 ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd);
1726 if (ret != VC_DB_ERROR_NONE) {
1727 if (NULL != fixed_cmd) {
1731 vc_cmd_destroy((vc_cmd_h)tmp_cmd);
1735 if (VC_COMMAND_TYPE_BACKGROUND == type && NULL != tmp_cmd->invocation_name && false == skip_invocation) {
1736 char temp[256] = {0, };
1737 snprintf(temp, 256, "%s %s", tmp_cmd->invocation_name, tmp_cmd->command);
1738 if (NULL != tmp_cmd->command)
1739 free(tmp_cmd->command);
1741 tmp_cmd->command = strdup(temp);
1743 ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd);
1744 if (ret != VC_DB_ERROR_NONE) {
1745 if (NULL != fixed_cmd) {
1749 vc_cmd_destroy((vc_cmd_h)tmp_cmd);
1753 cmd_list = g_slist_remove(cmd_list, temp_command);
1755 temp_command = NULL;
1757 iter = g_slist_nth(cmd_list, 0);
1760 if (VC_DB_ERROR_NONE != ret) {
1761 while (NULL != iter) {
1762 temp_command = iter->data;
1764 if (NULL != temp_command) {
1765 cmd_list = g_slist_remove(cmd_list, temp_command);
1767 temp_command = NULL;
1770 iter = g_slist_nth(cmd_list, 0);
1773 g_slist_free(cmd_list);
1774 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command, %d", ret);
1781 if (NULL != fixed_cmd) {
1785 vc_cmd_destroy((vc_cmd_h)tmp_cmd);
1786 return VC_DB_ERROR_NONE;
1789 int vc_db_insert_command(int pid, vc_cmd_type_e type, vc_cmd_s* cmd, bool skip_invocation)
1791 int ret = __vc_db_insert_command(g_db_handle, pid, type, cmd, skip_invocation);
1793 SLOG(LOG_DEBUG, vc_db_tag(), "[ERROR] Fail to insert command, %d", ret);
1799 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)
1801 GSList *iter = NULL;
1805 int count = g_slist_length(cmd_list);
1806 iter = g_slist_nth(cmd_list, 0);
1808 SLOG(LOG_DEBUG, vc_db_tag(), "list count : %d", count);
1810 for (i = 0; i < count; i++) {
1814 temp_cmd = iter->data;
1816 if (NULL == temp_cmd) {
1817 SLOG(LOG_ERROR, vc_db_tag(), "command is NULL");
1821 if (type == temp_cmd->type) {
1822 if (NULL != invocation_name)
1823 temp_cmd->invocation_name = strdup(invocation_name);
1825 int ret = __vc_db_insert_command(db_handle, pid, type, temp_cmd, skip_invocation);
1826 if (ret != VC_DB_ERROR_NONE) {
1827 SLOG(LOG_ERROR, vc_db_tag(), "Fail to insert command, ret(%d)", ret);
1831 SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Command type(%d) is NOT valid : request type(%d)", temp_cmd->type, type);
1833 iter = g_slist_next(iter);
1836 return VC_DB_ERROR_NONE;
1839 int vc_db_insert_commands_list(int pid, vc_cmd_type_e type, GSList* cmd_list, char* invocation_name, bool skip_invocation)
1841 __vc_db_begin_transaction(g_db_handle);
1843 int ret = __vc_db_insert_commands_list(g_db_handle, pid, type, cmd_list, invocation_name, false);
1844 if (ret != VC_DB_ERROR_NONE) {
1845 __vc_db_rollback_transaction(g_db_handle);
1849 __vc_db_commit_transaction(g_db_handle);
1851 return VC_DB_ERROR_NONE;
1854 int vc_db_get_commands(int pid, vc_cmd_type_e type, GSList** cmd_list)
1856 __vc_db_begin_transaction(g_db_handle);
1858 int ret = __vc_db_get_commands(g_db_handle, pid, type, cmd_list);
1859 if (ret != VC_DB_ERROR_NONE) {
1860 __vc_db_rollback_transaction(g_db_handle);
1864 __vc_db_commit_transaction(g_db_handle);
1865 return VC_DB_ERROR_NONE;
1868 int vc_db_insert_result(const char* result_text, int event, const char* msg, vc_cmd_list_h vc_cmd_list, bool exclusive)
1870 if (NULL == result_text) {
1871 SLOG(LOG_ERROR, vc_db_tag(), "Invalid parameter, result_text is NULL");
1872 return VC_DB_ERROR_INVALID_PARAMETER;
1875 int ret = vc_db_delete_table(VC_RESULT_TABLE);
1877 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table");
1879 if (NULL == vc_cmd_list) {
1880 __vc_db_begin_transaction(g_db_handle);
1881 int ret = __vc_db_insert_result(g_db_handle, result_text, event, msg, exclusive, NULL);
1882 if (ret != VC_DB_ERROR_NONE) {
1883 __vc_db_rollback_transaction(g_db_handle);
1886 __vc_db_commit_transaction(g_db_handle);
1887 return VC_DB_ERROR_NONE;
1890 /* Make client list node */
1891 vc_cmd_h vc_command = NULL;
1892 vc_cmd_list_first(vc_cmd_list);
1894 while (VC_ERROR_ITERATION_END != ret) {
1895 if (0 != vc_cmd_list_get_current(vc_cmd_list, &vc_command)) {
1896 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get command");
1900 if (NULL == vc_command) {
1901 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] No vc command any more");
1905 vc_cmd_s* temp_cmd = NULL;
1906 temp_cmd = (vc_cmd_s*)vc_command;
1908 __vc_db_begin_transaction(g_db_handle);
1909 ret = __vc_db_insert_result(g_db_handle, result_text, event, msg, exclusive, temp_cmd);
1910 if (ret != VC_DB_ERROR_NONE) {
1911 __vc_db_rollback_transaction(g_db_handle);
1914 __vc_db_commit_transaction(g_db_handle);
1916 ret = vc_cmd_list_next(vc_cmd_list);
1919 return VC_DB_ERROR_NONE;
1922 int vc_db_get_result(char** result_text, int* event, char** msg, int pid, vc_cmd_list_h vc_cmd_list, bool exclusive)
1924 __vc_db_begin_transaction(g_db_handle);
1926 int ret = __vc_db_get_result(g_db_handle, result_text, event, msg, pid, NULL, vc_cmd_list, exclusive);
1927 if (ret != VC_DB_ERROR_NONE) {
1928 __vc_db_rollback_transaction(g_db_handle);
1929 return VC_DB_ERROR_OPERATION_FAILED;
1934 ret = vc_cmd_list_get_count(vc_cmd_list, &count);
1935 if (ret != VC_DB_ERROR_NONE) {
1936 LOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get count");
1940 // Get appid by pid using app control
1941 ret = app_manager_get_app_id(pid, &appid);
1942 if (APP_MANAGER_ERROR_NONE != ret) {
1943 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] fail to get app id, ret(%d), pid(%d)", ret, pid);
1945 ret = __vc_db_get_result(g_db_handle, result_text, event, msg, pid, appid, vc_cmd_list, exclusive);
1946 if (ret != VC_DB_ERROR_NONE) {
1947 __vc_db_rollback_transaction(g_db_handle);
1950 if (NULL != appid) {
1956 __vc_db_commit_transaction(g_db_handle);
1957 return VC_DB_ERROR_NONE;
1960 int vc_db_get_appid_list(const char* result, GSList** app_list)
1962 __vc_db_begin_transaction(g_db_handle);
1964 int ret = __vc_db_get_appid(g_db_handle, result, app_list);
1965 if (ret != VC_DB_ERROR_NONE) {
1966 __vc_db_rollback_transaction(g_db_handle);
1970 __vc_db_commit_transaction(g_db_handle);
1971 return VC_DB_ERROR_NONE;
1974 int vc_db_get_result_pid_list(const char* result, GSList** pid_list)
1976 __vc_db_begin_transaction(g_db_handle);
1978 int ret = __vc_db_get_result_pid_list(g_db_handle, result, pid_list);
1979 if (ret != VC_DB_ERROR_NONE) {
1980 __vc_db_rollback_transaction(g_db_handle);
1984 __vc_db_commit_transaction(g_db_handle);
1985 return VC_DB_ERROR_NONE;
1988 int vc_db_append_commands(int pid, int type, vc_cmd_list_h vc_cmd_list)
1990 __vc_db_begin_transaction(g_db_handle);
1992 int ret = __vc_db_append_commands(g_db_handle, pid, type, vc_cmd_list);
1993 if (ret != VC_DB_ERROR_NONE) {
1994 __vc_db_rollback_transaction(g_db_handle);
1998 __vc_db_commit_transaction(g_db_handle);
1999 return VC_DB_ERROR_NONE;
2002 int vc_db_delete_commands(int pid, vc_cmd_type_e type, char* appid)
2004 __vc_db_begin_transaction(g_db_handle);
2007 ret = __vc_db_delete_commands(g_db_handle, pid, type, appid);
2008 if (ret != VC_DB_ERROR_NONE) {
2009 __vc_db_rollback_transaction(g_db_handle);
2013 __vc_db_commit_transaction(g_db_handle);
2014 return VC_DB_ERROR_NONE;
2017 int vc_db_backup_command()
2019 GSList* list = NULL;
2021 __vc_db_begin_transaction(g_db_backup_handle);
2023 int ret = __vc_db_delete_table(g_db_backup_handle, VC_INFO_TABLE);
2025 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to delete table");
2026 __vc_db_rollback_transaction(g_db_backup_handle);
2029 __vc_db_commit_transaction(g_db_backup_handle);
2031 ret = vc_db_get_commands(-1, VC_COMMAND_TYPE_BACKGROUND, &list);
2032 if (ret != VC_DB_ERROR_NONE) {
2033 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get commands");
2037 __vc_db_begin_transaction(g_db_backup_handle);
2039 ret = __vc_db_insert_commands_list(g_db_backup_handle, -1, VC_COMMAND_TYPE_BACKGROUND, list, NULL, true);
2040 if (ret != VC_DB_ERROR_NONE) {
2041 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command list to backup db");
2042 __vc_db_rollback_transaction(g_db_backup_handle);
2046 __vc_db_commit_transaction(g_db_backup_handle);
2048 SLOG(LOG_ERROR, vc_db_tag(), "[SUCCESS] Backup commands");
2049 return VC_DB_ERROR_NONE;
2052 int vc_db_restore_command()
2054 GSList* list = NULL;
2056 __vc_db_begin_transaction(g_db_backup_handle);
2058 int ret = __vc_db_get_commands(g_db_backup_handle, -1, VC_COMMAND_TYPE_BACKGROUND, &list);
2059 if (ret != VC_DB_ERROR_NONE) {
2060 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to get commands from backup db");
2061 __vc_db_rollback_transaction(g_db_backup_handle);
2064 __vc_db_commit_transaction(g_db_backup_handle);
2066 ret = vc_db_insert_commands_list(-1, VC_COMMAND_TYPE_BACKGROUND, list, NULL, true);
2067 if (ret != VC_DB_ERROR_NONE) {
2068 SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command list");
2072 SLOG(LOG_ERROR, vc_db_tag(), "[SUCCESS] Restore commands");
2073 return VC_DB_ERROR_NONE;