3 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
31 #include <pkgmgr-info.h>
32 //#include <tzplatform_config.h>
35 #include <account_ipc_marshal.h>
36 #include <account_free.h>
37 #include <account-private.h>
38 #include <account_db_helper.h>
39 #include <account_crypto_service.h>
40 #include <account_err.h>
41 #include "account_type.h"
42 #include "account-server-db.h"
44 #define EMAIL_SERVICE_CMDLINE "/usr/bin/email-service"
46 #define EMAIL_APPID "email-setting-efl"
48 #define ACCOUNT_DB_OPEN_READONLY 0
49 #define ACCOUNT_DB_OPEN_READWRITE 1
53 #define _TIZEN_PUBLIC_
54 #ifndef _TIZEN_PUBLIC_
58 static sqlite3* g_hAccountDB = NULL;
59 static sqlite3* g_hAccountDB2 = NULL;
60 static sqlite3* g_hAccountGlobalDB = NULL;
61 static sqlite3* g_hAccountGlobalDB2 = NULL;
62 pthread_mutex_t account_mutex = PTHREAD_MUTEX_INITIALIZER;
63 pthread_mutex_t account_global_mutex = PTHREAD_MUTEX_INITIALIZER;
65 //static char *_account_dup_text(const char *text_data);
66 static int _account_insert_custom(account_s *account, int account_id);
67 static int _account_update_custom(account_s *account, int account_id);
68 static int _account_type_update_provider_feature(sqlite3 * account_db_handle, account_type_s *account_type, const char* app_id);
70 static void _account_insert_delete_update_notification_send(char *noti_name)
73 _ERR("Noti Name is NULL!!!!!!\n");
77 _INFO("noti_type = %s", noti_name);
79 if (vconf_set_str(VCONFKEY_ACCOUNT_MSG_STR, noti_name) != 0) {
80 _ERR("Vconf MSG Str set FAILED !!!!!!\n");;
84 int _account_get_current_appid_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
88 GSList** appid_list = (GSList**)user_data;
91 pkgmgr_ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
93 if (pkgmgr_ret != PMINFO_R_OK)
94 ACCOUNT_DEBUG("pkgmgrinfo_appinfo_get_appid(%d)", pkgmgr_ret);
96 item = _account_dup_text(appid);
97 *appid_list = g_slist_append(*appid_list, item);
102 static inline int __read_proc(const char *path, char *buf, int size)
106 if (buf == NULL || path == NULL) {
107 ACCOUNT_ERROR("path and buffer is mandatory\n");
111 fd = open(path, O_RDONLY);
113 ACCOUNT_ERROR("fd open error(%d)\n", fd);
117 ret = read(fd, buf, size - 1);
119 ACCOUNT_ERROR("fd read error(%d)\n", fd);
131 char *_account_get_proc_cmdline_bypid(int pid)
136 ACCOUNT_SNPRINTF(buf, sizeof(buf), "/proc/%d/cmdline", pid);
137 ret = __read_proc(buf, buf, sizeof(buf));
139 ACCOUNT_DEBUG("No proc directory (%d)\n", pid);
147 static int _account_execute_query_from_global_db(const char *query)
150 char* pszErrorMsg = NULL;
153 ACCOUNT_ERROR("NULL query\n");
154 return _ACCOUNT_ERROR_QUERY_SYNTAX_ERROR;
157 if (!g_hAccountGlobalDB) {
158 ACCOUNT_ERROR("Global DB is not opened\n");
159 return _ACCOUNT_ERROR_DB_NOT_OPENED;
162 rc = sqlite3_exec(g_hAccountGlobalDB, query, NULL, NULL, &pszErrorMsg);
163 if (SQLITE_OK != rc) {
164 ACCOUNT_ERROR("sqlite3_exec rc(%d) query(%s) failed(%s).", rc, query, pszErrorMsg);
165 sqlite3_free(pszErrorMsg);
173 static int _account_begin_transaction_from_global_db(void)
175 ACCOUNT_DEBUG("_account_begin_transaction start");
178 ret = _account_execute_query_from_global_db("BEGIN IMMEDIATE TRANSACTION");
180 if (ret == SQLITE_BUSY) {
181 ACCOUNT_ERROR(" sqlite3 busy = %d", ret);
182 return _ACCOUNT_ERROR_DATABASE_BUSY;
183 } else if (ret != SQLITE_OK) {
184 ACCOUNT_ERROR("_account_svc_begin_transaction_in_global_db fail :: %d", ret);
185 return _ACCOUNT_ERROR_DB_FAILED;
188 ACCOUNT_DEBUG("_account_begin_transaction_in_global_db end");
189 return _ACCOUNT_ERROR_NONE;
192 static int _account_end_transaction_from_global_db(bool is_success)
194 ACCOUNT_DEBUG("_account_end_transaction_in_global_db start");
198 if (is_success == true) {
199 ret = _account_execute_query_from_global_db("COMMIT TRANSACTION");
200 ACCOUNT_DEBUG("_account_end_transaction_in_global_db COMMIT");
202 ret = _account_execute_query_from_global_db("ROLLBACK TRANSACTION");
203 ACCOUNT_DEBUG("_account_end_transaction ROLLBACK");
206 if (ret == SQLITE_PERM) {
207 ACCOUNT_ERROR("Account permission denied :: %d", ret);
208 return _ACCOUNT_ERROR_PERMISSION_DENIED;
211 if (ret == SQLITE_BUSY) {
212 ACCOUNT_DEBUG(" sqlite3 busy = %d", ret);
213 return _ACCOUNT_ERROR_DATABASE_BUSY;
216 if (ret != SQLITE_OK) {
217 ACCOUNT_ERROR("_account_svc_end_transaction_in_global_db fail :: %d", ret);
218 return _ACCOUNT_ERROR_DB_FAILED;
221 ACCOUNT_DEBUG("_account_end_transaction_in_global_db end");
222 return _ACCOUNT_ERROR_NONE;
226 int _account_global_db_open(void)
230 char account_db_path[256] = {0, };
232 _INFO("start _account_global_db_open()");
234 ACCOUNT_MEMSET(account_db_path, 0x00, sizeof(account_db_path));
235 ACCOUNT_GET_GLOBAL_DB_PATH(account_db_path, sizeof(account_db_path));
237 if (g_hAccountGlobalDB) {
238 _ERR("Account database is using in another app. %x", g_hAccountDB);
239 return _ACCOUNT_ERROR_DATABASE_BUSY;
242 ret = _account_db_handle_close(g_hAccountGlobalDB2);
243 if (ret != _ACCOUNT_ERROR_NONE)
244 ACCOUNT_DEBUG("db_util_close(g_hAccountGlobalDB2) fail ret = %d", ret);
246 ACCOUNT_DEBUG("before _account_global_db_open()");
247 // if (mode == ACCOUNT_DB_OPEN_READWRITE)
248 // rc = db_util_open(account_db_path, &g_hAccountDB, DB_UTIL_REGISTER_HOOK_METHOD);
249 // else if (mode == ACCOUNT_DB_OPEN_READONLY)
250 rc = db_util_open_with_options(account_db_path, &g_hAccountGlobalDB, SQLITE_OPEN_READONLY, NULL);
252 // return _ACCOUNT_ERROR_DB_NOT_OPENED;
253 ACCOUNT_DEBUG("after _account_global_db_open() sqlite_rc = %d", rc);
255 if (rc == SQLITE_PERM || _account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
256 ACCOUNT_ERROR("Account permission denied");
257 return _ACCOUNT_ERROR_PERMISSION_DENIED;
260 if (rc == SQLITE_BUSY) {
261 ACCOUNT_ERROR("busy handler fail.");
262 return _ACCOUNT_ERROR_DATABASE_BUSY;
265 if (rc != SQLITE_OK) {
266 ACCOUNT_ERROR("The database isn't connected.");
267 return _ACCOUNT_ERROR_DB_NOT_OPENED;
270 _INFO("end _account_global_db_open()");
271 return _ACCOUNT_ERROR_NONE;
274 int _account_global_db_close(void)
276 ACCOUNT_DEBUG("start account_global_db_close()");
279 ret = _account_db_handle_close(g_hAccountGlobalDB2);
280 if (ret != _ACCOUNT_ERROR_NONE)
281 ACCOUNT_DEBUG("db_util_close(g_hAccountGlobalDB2) fail ret = %d", ret);
283 ret = _account_db_handle_close(g_hAccountGlobalDB);
284 if (ret != _ACCOUNT_ERROR_NONE) {
285 ACCOUNT_ERROR("db_util_close(g_hAccountGlobalDB) fail ret = %d", ret);
286 g_hAccountGlobalDB2 = g_hAccountGlobalDB;
288 g_hAccountGlobalDB = NULL;
293 static bool _account_check_add_more_account(const char* app_id)
295 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
298 ACCOUNT_RETURN_VAL((app_id != 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
299 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
301 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
303 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE AppId = '%s' and MultipleAccountSupport = 1", ACCOUNT_TYPE_TABLE, app_id);
304 rc = _account_get_record_count(g_hAccountDB, query);
306 /* multiple account support case (User DB & global DB) */
307 if (rc > 0 || _account_get_record_count(g_hAccountGlobalDB, query) > 0) {
308 ACCOUNT_SLOGD("app id (%s) supports multiple account. rc(%d)\n", app_id, rc);
312 /* multiple account not support case */
313 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
314 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE package_name = '%s'", ACCOUNT_TABLE, app_id);
315 rc = _account_get_record_count(g_hAccountDB, query);
318 ACCOUNT_SLOGD("app id (%s) supports single account. and there is no account of the app id\n", app_id);
326 int _account_db_open(int mode, int pid, uid_t uid)
330 char account_db_dir[256] = {0, };
331 char account_db_path[256] = {0, };
333 _INFO("start _account_db_open() pid [%d]. uid [%d]", pid, uid);
335 ACCOUNT_MEMSET(account_db_dir, 0x00, sizeof(account_db_dir));
336 ACCOUNT_MEMSET(account_db_path, 0x00, sizeof(account_db_path));
338 ACCOUNT_GET_USER_DB_PATH(account_db_path, sizeof(account_db_path), uid);
341 _ERR("Account database is using in another app. %x", g_hAccountDB);
342 return _ACCOUNT_ERROR_DATABASE_BUSY;
345 ret = _account_db_handle_close(g_hAccountDB2);
346 if (ret != _ACCOUNT_ERROR_NONE)
347 ACCOUNT_DEBUG("db_util_close(g_hAccountDB2) fail ret = %d", ret);
349 ACCOUNT_GET_USER_DB_DIR(account_db_dir, sizeof(account_db_dir), uid);
351 if (mkdir(account_db_dir, 0777) != 0)
352 ACCOUNT_DEBUG("\"%s\" is already exist directory", account_db_dir);
354 ACCOUNT_DEBUG("before db_util_open()");
355 // if (mode == ACCOUNT_DB_OPEN_READWRITE)
356 rc = db_util_open(account_db_path, &g_hAccountDB, DB_UTIL_REGISTER_HOOK_METHOD);
357 // else if (mode == ACCOUNT_DB_OPEN_READONLY)
358 // rc = db_util_open_with_options(account_db_path, &g_hAccountDB, SQLITE_OPEN_READONLY, NULL);
360 // return _ACCOUNT_ERROR_DB_NOT_OPENED;
361 ACCOUNT_DEBUG("after db_util_open() sqlite_rc = %d", rc);
363 if (rc == SQLITE_PERM || _account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
364 ACCOUNT_ERROR("Account permission denied");
365 return _ACCOUNT_ERROR_PERMISSION_DENIED;
368 if (rc == SQLITE_BUSY) {
369 ACCOUNT_ERROR("busy handler fail.");
370 return _ACCOUNT_ERROR_DATABASE_BUSY;
373 if (rc != SQLITE_OK) {
374 ACCOUNT_ERROR("The database isn't connected.");
375 return _ACCOUNT_ERROR_DB_NOT_OPENED;
378 rc = _account_check_is_all_table_exists(g_hAccountDB);
381 _ERR("_account_check_is_all_table_exists rc=[%d]", rc);
383 } else if (rc == ACCOUNT_TABLE_TOTAL_COUNT) {
386 int ret = _account_create_all_tables(g_hAccountDB);
387 if (ret != _ACCOUNT_ERROR_NONE) {
388 _ERR("_account_create_all_tables fail ret=[%d]", ret);
393 _INFO("end _account_db_open()");
394 return _ACCOUNT_ERROR_NONE;
397 int _account_db_close(void)
399 ACCOUNT_DEBUG("start db_util_close()");
402 ret = _account_db_handle_close(g_hAccountDB2);
403 if (ret != _ACCOUNT_ERROR_NONE)
404 ACCOUNT_DEBUG("db_util_close(g_hAccountDB2) fail ret = %d", ret);
406 ret = _account_db_handle_close(g_hAccountDB);
407 if (ret != _ACCOUNT_ERROR_NONE) {
408 ACCOUNT_ERROR("db_util_close(g_hAccountDB) fail ret = %d", ret);
409 g_hAccountDB2 = g_hAccountDB;
416 static int _account_execute_insert_query(account_s *account)
418 _INFO("_account_execute_insert_query start");
421 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
422 int error_code = _ACCOUNT_ERROR_NONE;
423 account_stmt hstmt = NULL;
425 /* check whether app id exist in account type db */
427 if (!account->user_name && !account->display_name && !account->email_address) {
429 ACCOUNT_ERROR("Mandetory fields is NULL. At least one field is required among username, display name, email address\n");
430 return _ACCOUNT_ERROR_INVALID_PARAMETER;
434 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
435 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s (user_name, email_address , display_name , icon_path , source , package_name , "
436 "access_token , domain_name , auth_type , secret , sync_support , txt_custom0, txt_custom1, txt_custom2, txt_custom3, txt_custom4, "
437 "int_custom0, int_custom1, int_custom2, int_custom3, int_custom4, txt_custom0 ) values " // to do urusa
438 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", ACCOUNT_TABLE);
440 hstmt = _account_prepare_query(g_hAccountDB, query);
441 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
444 _account_convert_account_to_sql(account, hstmt, query);
447 rc = _account_query_step(hstmt);
448 if (rc != SQLITE_DONE) {
450 ACCOUNT_ERROR("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
452 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM)
453 error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
455 error_code = _ACCOUNT_ERROR_DB_FAILED;
459 rc = _account_query_finalize(hstmt);
460 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
463 _INFO("_account_execute_insert_query end");
467 static int _account_insert_capability(account_s *account, int account_id)
469 _INFO("_account_insert_capability start");
471 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
472 account_stmt hstmt = NULL;
474 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
476 if (g_slist_length(account->capablity_list) == 0) {
477 ACCOUNT_DEBUG("_account_insert_capability, no capability\n");
478 return _ACCOUNT_ERROR_NONE;
481 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_id);
483 _INFO("_account_insert_capability _account_get_record_count [%s]", query);
484 rc = _account_get_record_count(g_hAccountDB, query);
486 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
487 _ERR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
488 return _ACCOUNT_ERROR_PERMISSION_DENIED;
492 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
498 for (iter = account->capablity_list; iter != NULL; iter = g_slist_next(iter)) {
502 account_capability_s* cap_data = NULL;
503 cap_data = (account_capability_s*)iter->data;
505 _INFO("cap_data->type = %s, cap_data->value = %d \n", cap_data->type, cap_data->value);
507 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
508 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(key, value, package_name, user_name, account_id) VALUES "
509 "(?, ?, ?, ?, ?) ", CAPABILITY_TABLE);
510 hstmt = _account_prepare_query(g_hAccountDB, query);
512 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
514 ret = _account_query_bind_text(hstmt, count++, cap_data->type);
515 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
516 ret = _account_query_bind_int(hstmt, count++, cap_data->value);
517 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Integer binding fail"));
518 ret = _account_query_bind_text(hstmt, count++, (char*)account->package_name);
519 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
520 ret = _account_query_bind_text(hstmt, count++, (char*)account->user_name);
521 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
522 ret = _account_query_bind_int(hstmt, count++, (int)account_id);
523 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Integer binding fail"));
525 rc = _account_query_step(hstmt);
526 _INFO("_account_insert_capability _account_query_step[%d]", rc);
528 if (rc != SQLITE_DONE) {
529 _ERR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
533 rc = _account_query_finalize(hstmt);
534 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
539 _INFO("_account_insert_capability end");
540 return _ACCOUNT_ERROR_NONE;
543 static int _account_update_capability(account_s *account, int account_id)
546 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
547 account_stmt hstmt = NULL;
549 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
551 if (g_slist_length(account->capablity_list) == 0) {
552 ACCOUNT_ERROR("_account_update_capability, no capability\n");
553 return _ACCOUNT_ERROR_NONE;
556 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_id);
558 rc = _account_get_record_count(g_hAccountDB, query);
561 ACCOUNT_SLOGI("_account_update_capability : related account item is not existed rc=%d , %s", rc, _account_db_err_msg(g_hAccountDB));
562 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
565 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
567 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE account_id=? ", CAPABILITY_TABLE);
568 hstmt = _account_prepare_query(g_hAccountDB, query);
570 _account_query_bind_int(hstmt, count++, (int)account_id);
571 rc = _account_query_step(hstmt);
573 if (rc != SQLITE_DONE) {
574 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
575 return _ACCOUNT_ERROR_DB_FAILED;
577 rc = _account_query_finalize(hstmt);
578 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
583 for (iter = account->capablity_list; iter != NULL; iter = g_slist_next(iter)) {
586 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
587 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(key, value, package_name, user_name, account_id) VALUES "
588 "(?, ?, ?, ?, ?) ", CAPABILITY_TABLE);
590 hstmt = _account_prepare_query(g_hAccountDB, query);
592 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
594 account_capability_s* cap_data = NULL;
595 cap_data = (account_capability_s*)iter->data;
597 ret = _account_query_bind_text(hstmt, count++, cap_data->type);
598 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
599 ret = _account_query_bind_int(hstmt, count++, cap_data->value);
600 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Integer binding fail"));
601 ret = _account_query_bind_text(hstmt, count++, (char*)account->package_name);
602 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
603 ret = _account_query_bind_text(hstmt, count++, (char*)account->user_name);
604 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
605 ret = _account_query_bind_int(hstmt, count++, (int)account_id);
606 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Integer binding fail"));
608 rc = _account_query_step(hstmt);
610 if (rc != SQLITE_DONE) {
611 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
615 rc = _account_query_finalize(hstmt);
616 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
621 return _ACCOUNT_ERROR_NONE;
624 static int _account_update_capability_by_user_name(account_s *account, const char *user_name, const char *package_name)
627 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
628 account_stmt hstmt = NULL;
630 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
632 if (g_slist_length(account->capablity_list) == 0) {
633 ACCOUNT_ERROR("_account_update_capability_by_user_name, no capability\n");
634 return _ACCOUNT_ERROR_NONE;
637 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where package_name= '%s' and user_name='%s'", ACCOUNT_TABLE, package_name, user_name);
639 rc = _account_get_record_count(g_hAccountDB, query);
642 ACCOUNT_SLOGI("_account_update_capability_by_user_name : related account item is not existed rc=%d , %s ", rc, _account_db_err_msg(g_hAccountDB));
643 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
646 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
648 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE package_name=? and user_name=? ", CAPABILITY_TABLE);
649 hstmt = _account_prepare_query(g_hAccountDB, query);
651 _account_query_bind_text(hstmt, count++, (char*)account->package_name);
652 _account_query_bind_text(hstmt, count++, (char*)account->user_name);
653 rc = _account_query_step(hstmt);
654 if (rc != SQLITE_DONE) {
655 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
656 return _ACCOUNT_ERROR_DB_FAILED;
659 rc = _account_query_finalize(hstmt);
660 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
665 for (iter = account->capablity_list; iter != NULL; iter = g_slist_next(iter)) {
668 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
669 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(key, value, package_name, user_name, account_id) VALUES "
670 "(?, ?, ?, ?, ?) ", CAPABILITY_TABLE);
672 hstmt = _account_prepare_query(g_hAccountDB, query);
674 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
676 account_capability_s* cap_data = NULL;
677 cap_data = (account_capability_s*)iter->data;
679 ret = _account_query_bind_text(hstmt, count++, cap_data->type);
680 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
681 ret = _account_query_bind_int(hstmt, count++, cap_data->value);
682 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Integer binding fail"));
683 ret = _account_query_bind_text(hstmt, count++, (char*)account->package_name);
684 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
685 ret = _account_query_bind_text(hstmt, count++, (char*)account->user_name);
686 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
687 ret = _account_query_bind_int(hstmt, count++, (int)account->id);
688 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Integer binding fail"));
690 rc = _account_query_step(hstmt);
692 if (rc != SQLITE_DONE) {
693 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
697 rc = _account_query_finalize(hstmt);
698 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
703 return _ACCOUNT_ERROR_NONE;
707 bool _account_add_capability_to_account_cb(const char* capability_type, int capability_value, account_s *account)
709 account_capability_s *cap_data = (account_capability_s*)malloc(sizeof(account_capability_s));
711 if (cap_data == NULL)
713 ACCOUNT_MEMSET(cap_data, 0, sizeof(account_capability_s));
715 cap_data->type = _account_dup_text(capability_type);
716 cap_data->value = capability_value;
717 _INFO("cap_data->type = %s, cap_data->value = %d", cap_data->type, cap_data->value);
719 account->capablity_list = g_slist_append(account->capablity_list, (gpointer)cap_data);
725 bool _account_add_custom_to_account_cb(const char* key, const char* value, account_s *account)
727 account_custom_s *custom_data = (account_custom_s*)malloc(sizeof(account_custom_s));
729 if (custom_data == NULL) {
730 ACCOUNT_DEBUG("_account_add_custom_to_account_cb :: malloc fail\n");
733 ACCOUNT_MEMSET(custom_data, 0, sizeof(account_custom_s));
735 custom_data->account_id = account->id;
736 custom_data->app_id = _account_dup_text(account->package_name);
737 custom_data->key = _account_dup_text(key);
738 custom_data->value = _account_dup_text(value);
739 _INFO("custom_data->key = %s, custom_data->value = %s", custom_data->key, custom_data->value);
741 account->custom_list = g_slist_append(account->custom_list, (gpointer)custom_data);
747 static int _account_compare_old_record_by_user_name(account_s *new_account, const char* user_name, const char* package_name)
749 int error_code = _ACCOUNT_ERROR_NONE;
750 account_stmt hstmt = NULL;
751 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
753 account_s *old_account = NULL;
755 ACCOUNT_RETURN_VAL((new_account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT IS NULL"));
756 ACCOUNT_RETURN_VAL((user_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("USER NAME IS NULL"));
757 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("PACKAGE NAME IS NULL"));
758 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
760 old_account = (account_s*)calloc(1, sizeof(account_s));
762 ACCOUNT_FATAL("Memory alloc fail\n");
763 return _ACCOUNT_ERROR_OUT_OF_MEMORY;
766 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
768 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE user_name = '%s' and package_name='%s'", ACCOUNT_TABLE, user_name, package_name);
769 hstmt = _account_prepare_query(g_hAccountDB, query);
771 rc = _account_query_step(hstmt);
772 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
774 while (rc == SQLITE_ROW) {
775 _account_convert_column_to_account(hstmt, old_account);
776 rc = _account_query_step(hstmt);
779 rc = _account_query_finalize(hstmt);
780 ACCOUNT_CATCH_ERROR((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
784 error_code = _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, old_account->id, (void*)old_account);
785 ACCOUNT_CATCH_ERROR((error_code == _ACCOUNT_ERROR_NONE), {}, error_code, ("account_query_capability_by_account_id error"));
788 error_code = _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, old_account->id, (void*)old_account);
789 ACCOUNT_CATCH_ERROR((error_code == _ACCOUNT_ERROR_NONE), {}, error_code, ("_account_query_custom_by_account_id error"));
792 new_account->id = old_account->id;
795 if (!new_account->user_name) {
796 if (old_account->user_name)
797 new_account->user_name = _account_dup_text(old_account->user_name);
801 if (!new_account->display_name) {
802 if (old_account->display_name)
803 new_account->display_name = _account_dup_text(old_account->display_name);
807 if (!new_account->email_address) {
808 if (old_account->email_address)
809 new_account->email_address = _account_dup_text(old_account->email_address);
813 if (!new_account->domain_name) {
814 if (old_account->domain_name)
815 new_account->domain_name = _account_dup_text(old_account->domain_name);
819 if (!new_account->icon_path) {
820 if (old_account->icon_path)
821 new_account->icon_path = _account_dup_text(old_account->icon_path);
825 if (!new_account->source) {
826 if (old_account->source)
827 new_account->source = _account_dup_text(old_account->source);
830 _ACCOUNT_FREE(new_account->package_name);
831 new_account->package_name = _account_dup_text(old_account->package_name);
834 if (!new_account->access_token) {
835 if (old_account->access_token)
836 new_account->access_token = _account_dup_text(old_account->access_token);
840 if (new_account->auth_type == _ACCOUNT_AUTH_TYPE_INVALID)
841 new_account->auth_type = old_account->auth_type;
844 if (new_account->secret == _ACCOUNT_SECRECY_INVALID)
845 new_account->secret = old_account->secret;
848 if (new_account->sync_support == _ACCOUNT_SYNC_INVALID)
849 new_account->sync_support = old_account->sync_support;
853 for (i = 0; i < USER_TXT_CNT; i++) {
854 if (!new_account->user_data_txt[i]) {
855 if (old_account->user_data_txt[i])
856 new_account->user_data_txt[i] = _account_dup_text(old_account->user_data_txt[i]);
861 for (i = 0; i < USER_INT_CNT; i++) {
862 if (new_account->user_data_int[i] == 0)
863 new_account->user_data_int[i] = old_account->user_data_int[i];
868 _account_free_account_with_items(old_account);
871 rc = _account_query_finalize(hstmt);
872 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
876 return _ACCOUNT_ERROR_NONE;
879 static int _account_update_account_by_user_name(int pid, uid_t uid, account_s *account, const char *user_name, const char *package_name)
881 int rc = 0, binding_count = 0, count = 0;
882 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
883 int error_code = _ACCOUNT_ERROR_NONE;
884 account_stmt hstmt = NULL;
886 ACCOUNT_RETURN_VAL((user_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("user_name is NULL.\n"));
887 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("package_name is NULL.\n"));
889 char* current_appid = NULL;
890 char* verified_appid = NULL;
892 current_appid = _account_get_current_appid(pid, uid);
893 error_code = _account_get_represented_appid_from_db(g_hAccountDB, g_hAccountGlobalDB, current_appid, uid, &verified_appid);
895 _ACCOUNT_FREE(current_appid);
896 _ACCOUNT_FREE(verified_appid);
898 if (error_code != _ACCOUNT_ERROR_NONE) {
899 ACCOUNT_ERROR("No permission to update\n");
900 return _ACCOUNT_ERROR_PERMISSION_DENIED;
903 error_code = encrypt_access_token(account);
904 if (error_code != _ACCOUNT_ERROR_NONE) {
905 _ERR("_encrypt_access_token error");
909 _account_compare_old_record_by_user_name(account, user_name, package_name);
911 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
912 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
913 return _ACCOUNT_ERROR_PERMISSION_DENIED;
916 if (!account->package_name) {
917 ACCOUNT_ERROR("Package name is mandetory field, it can not be NULL!!!!\n");
918 return _ACCOUNT_ERROR_INVALID_PARAMETER;
921 if (!account->user_name && !account->display_name && !account->email_address) {
922 ACCOUNT_ERROR("One field should be set among user name, display name, email address\n");
923 return _ACCOUNT_ERROR_INVALID_PARAMETER;
926 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE user_name='%s' and package_name='%s'"
927 , ACCOUNT_TABLE, user_name, package_name);
929 count = _account_get_record_count(g_hAccountDB, query);
931 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
932 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
933 return _ACCOUNT_ERROR_PERMISSION_DENIED;
937 ACCOUNT_SLOGI("_account_update_account_by_user_name : The account not exist!, count = %d, user_name=%s, package_name=%s\n",
938 count, user_name, package_name);
939 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
942 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
944 //TODO: Is it required to update id ? As of now I can only think of falied rollback cases (between account and gSSO DB)
945 ACCOUNT_SNPRINTF(query, sizeof(query), "UPDATE %s SET user_name=?, email_address =?, display_name =?, "
946 "icon_path =?, source =?, package_name =? , access_token =?, domain_name =?, auth_type =?, secret =?, sync_support =?,"
947 "txt_custom0=?, txt_custom1=?, txt_custom2=?, txt_custom3=?, txt_custom4=?, "
948 "int_custom0=?, int_custom1=?, int_custom2=?, int_custom3=?, int_custom4=? WHERE user_name=? and package_name=? ", ACCOUNT_TABLE);
950 hstmt = _account_prepare_query(g_hAccountDB, query);
951 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
952 _account_end_transaction(g_hAccountDB, FALSE);
953 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
954 return _ACCOUNT_ERROR_PERMISSION_DENIED;
956 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_svc_query_prepare() failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
958 binding_count = _account_convert_account_to_sql(account, hstmt, query);
960 _account_query_bind_text(hstmt, binding_count++, user_name);
961 _account_query_bind_text(hstmt, binding_count++, package_name);
963 rc = _account_query_step(hstmt);
964 if (rc != SQLITE_DONE)
965 ACCOUNT_ERROR("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
967 rc = _account_query_finalize(hstmt);
968 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
971 /*update capability*/
972 error_code = _account_update_capability_by_user_name(account, user_name, package_name);
975 error_code = _account_update_custom(account, account->id);
980 int _account_insert_to_db(account_s* account, int pid, uid_t uid, int *account_id)
983 int error_code = _ACCOUNT_ERROR_NONE;
984 int ret_transaction = 0;
986 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
987 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
988 ACCOUNT_RETURN_VAL((account_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT ID POINTER IS NULL"));
990 if (!account->user_name && !account->display_name && !account->email_address) {
991 ACCOUNT_ERROR("One field should be set among user name, display name, email address\n");
992 return _ACCOUNT_ERROR_INVALID_PARAMETER;
995 account_s *data = (account_s*)account;
996 ACCOUNT_SLOGD("(%s)-(%d) account_insert_to_db: begin_transaction.\n", __FUNCTION__, __LINE__);
998 pthread_mutex_lock(&account_mutex);
1000 /* transaction control required*/
1001 ret_transaction = _account_begin_transaction(g_hAccountDB);
1003 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1004 pthread_mutex_unlock(&account_mutex);
1005 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1006 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1009 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
1010 ACCOUNT_ERROR("account insert:_account_begin_transaction fail %d\n", ret_transaction);
1011 pthread_mutex_unlock(&account_mutex);
1012 return _ACCOUNT_ERROR_DATABASE_BUSY;
1013 } else if (ret_transaction != _ACCOUNT_ERROR_NONE) {
1014 ACCOUNT_ERROR("account insert:_account_begin_transaction fail %d\n", ret_transaction);
1015 pthread_mutex_unlock(&account_mutex);
1016 return ret_transaction;
1019 *account_id = _account_get_next_sequence(g_hAccountDB, ACCOUNT_TABLE);
1020 data->id = *account_id;
1023 appid = _account_get_current_appid(pid, uid);
1027 // API caller cannot be recognized
1028 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1029 ACCOUNT_ERROR("App id is not registered in account type DB, transaction ret (%x)!!!!\n", ret_transaction);
1030 pthread_mutex_unlock(&account_mutex);
1031 return _ACCOUNT_ERROR_NOT_REGISTERED_PROVIDER;
1035 char* verified_appid = NULL;
1036 error_code = _account_get_represented_appid_from_db(g_hAccountDB, g_hAccountGlobalDB, appid, uid, &verified_appid);//FIX
1037 _ACCOUNT_FREE(appid);
1038 if (error_code != _ACCOUNT_ERROR_NONE) {
1039 _ERR("error_code = %d", error_code);
1040 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1041 ACCOUNT_ERROR("App id is not registered in account type DB, transaction ret (%x)!!!!\n", ret_transaction);
1042 _ACCOUNT_FREE(verified_appid);
1043 pthread_mutex_unlock(&account_mutex);
1047 if (verified_appid) {
1049 error_code = _account_check_duplicated(g_hAccountDB, data, verified_appid, uid);
1050 if (error_code != _ACCOUNT_ERROR_NONE) {
1052 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1053 ACCOUNT_DEBUG("_account_check_duplicated(), rollback insert query(%x)!!!!\n", ret_transaction);
1055 pthread_mutex_unlock(&account_mutex);
1058 if (!_account_check_add_more_account(verified_appid)) {
1059 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1060 ACCOUNT_ERROR("No more account cannot be added, transaction ret (%x)!!!!\n", ret_transaction);
1061 pthread_mutex_unlock(&account_mutex);
1062 _ACCOUNT_FREE(verified_appid);
1063 return _ACCOUNT_ERROR_NOT_ALLOW_MULTIPLE;
1066 _ACCOUNT_FREE(data->package_name);
1067 data->package_name = _account_dup_text(verified_appid);
1068 _ACCOUNT_FREE(verified_appid);
1071 if (!_account_check_add_more_account(data->package_name)) {
1073 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1074 ACCOUNT_ERROR("No more account cannot be added, transaction ret (%x)!!!!\n", ret_transaction);
1075 pthread_mutex_unlock(&account_mutex);
1076 return _ACCOUNT_ERROR_NOT_ALLOW_MULTIPLE;
1079 error_code = encrypt_access_token(data);
1080 if (error_code != _ACCOUNT_ERROR_NONE) {
1081 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1082 ACCOUNT_ERROR("encrypt_access_token fail, rollback insert query(%x)!!!!\n", ret_transaction);
1084 pthread_mutex_unlock(&account_mutex);
1088 error_code = _account_execute_insert_query(data);
1090 if (error_code != _ACCOUNT_ERROR_NONE) {
1092 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1093 ACCOUNT_ERROR("INSERT account fail, rollback insert query(%x)!!!!\n", ret_transaction);
1095 pthread_mutex_unlock(&account_mutex);
1100 error_code = _account_insert_capability(data, *account_id);
1101 if (error_code != _ACCOUNT_ERROR_NONE) {
1103 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1104 ACCOUNT_ERROR("INSERT capability fail, rollback insert capability query(%x)!!!!\n", ret_transaction);
1106 pthread_mutex_unlock(&account_mutex);
1111 error_code = _account_insert_custom(data, *account_id);
1112 if (error_code != _ACCOUNT_ERROR_NONE) {
1113 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1114 ACCOUNT_ERROR("INSERT custom fail, rollback insert capability query(%x)!!!!\n", ret_transaction);
1116 pthread_mutex_unlock(&account_mutex);
1122 pthread_mutex_unlock(&account_mutex);
1123 _account_end_transaction(g_hAccountDB, TRUE);
1124 ACCOUNT_SLOGD("(%s)-(%d) account _end_transaction.\n", __FUNCTION__, __LINE__);
1126 char buf[64] = {0,};
1127 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_INSERT, *account_id);
1128 _account_insert_delete_update_notification_send(buf);
1129 _INFO("account _notification_send end.");
1131 return _ACCOUNT_ERROR_NONE;
1134 GSList* _account_get_capability_list_by_account_id(int account_id, int *error_code)
1136 *error_code = _ACCOUNT_ERROR_NONE;
1137 account_stmt hstmt = NULL;
1138 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1140 GSList* capability_list = NULL;
1142 ACCOUNT_RETURN_VAL((account_id > 0), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("ACCOUNT INDEX IS LESS THAN 0"));
1143 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
1145 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1147 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE account_id = %d", CAPABILITY_TABLE, account_id);
1148 hstmt = _account_prepare_query(g_hAccountDB, query);
1150 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1151 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1152 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
1156 rc = _account_query_step(hstmt);
1157 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
1159 account_capability_s* capability_record = NULL;
1161 while (rc == SQLITE_ROW) {
1162 capability_record = (account_capability_s*) malloc(sizeof(account_capability_s));
1164 if (capability_record == NULL) {
1165 ACCOUNT_FATAL("malloc Failed");
1169 ACCOUNT_MEMSET(capability_record, 0x00, sizeof(account_capability_s));
1171 _account_convert_column_to_capability(hstmt, capability_record);
1173 //cb_ret = callback(capability_record->type, capability_record->value, user_data);
1175 //_account_free_capability_items(capability_record);
1176 //_ACCOUNT_FREE(capability_record);
1178 //ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
1180 capability_list = g_slist_append(capability_list, capability_record);
1181 rc = _account_query_step(hstmt);
1184 rc = _account_query_finalize(hstmt);
1185 if (rc != _ACCOUNT_ERROR_NONE) {
1186 _ERR("finalize error");
1187 _account_gslist_capability_free(capability_list);
1194 *error_code = _ACCOUNT_ERROR_NONE;
1197 if (hstmt != NULL) {
1198 rc = _account_query_finalize(hstmt);
1199 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
1203 pthread_mutex_unlock(&account_mutex);
1205 return capability_list;
1208 static int _account_compare_old_record(account_s *new_account, int account_id)
1210 int error_code = _ACCOUNT_ERROR_NONE;
1211 account_stmt hstmt = NULL;
1212 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1214 account_s *old_account = NULL;
1216 ACCOUNT_RETURN_VAL((account_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT INDEX IS LESS THAN 0"));
1217 ACCOUNT_RETURN_VAL((new_account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT IS NULL"));
1218 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1220 old_account = (account_s*)calloc(1, sizeof(account_s));
1221 if (old_account == NULL) {
1222 _ERR("Out of Memory");
1223 return _ACCOUNT_ERROR_OUT_OF_MEMORY;
1226 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1228 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id = %d", ACCOUNT_TABLE, account_id);
1229 hstmt = _account_prepare_query(g_hAccountDB, query);
1231 rc = _account_query_step(hstmt);
1232 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
1234 while (rc == SQLITE_ROW) {
1235 _account_convert_column_to_account(hstmt, old_account);
1236 rc = _account_query_step(hstmt);
1239 rc = _account_query_finalize(hstmt);
1240 ACCOUNT_CATCH_ERROR((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1244 error_code = _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, old_account->id, (void*)old_account);
1245 ACCOUNT_CATCH_ERROR((error_code == _ACCOUNT_ERROR_NONE), {}, error_code, ("account_query_capability_by_account_id error"));
1248 error_code = _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, old_account->id, (void*)old_account);
1249 ACCOUNT_CATCH_ERROR((error_code == _ACCOUNT_ERROR_NONE), {}, error_code, ("_account_query_custom_by_account_id error"));
1253 new_account->id = old_account->id;
1256 if (!new_account->user_name) {
1257 if (old_account->user_name)
1258 new_account->user_name = _account_dup_text(old_account->user_name);
1262 if (!new_account->display_name) {
1263 if (old_account->display_name)
1264 new_account->display_name = _account_dup_text(old_account->display_name);
1268 if (!new_account->email_address) {
1269 if (old_account->email_address)
1270 new_account->email_address = _account_dup_text(old_account->email_address);
1274 if (!new_account->domain_name) {
1275 if (old_account->domain_name)
1276 new_account->domain_name = _account_dup_text(old_account->domain_name);
1280 if (!new_account->icon_path) {
1281 if (old_account->icon_path)
1282 new_account->icon_path = _account_dup_text(old_account->icon_path);
1286 if (!new_account->source) {
1287 if (old_account->source)
1288 new_account->source = _account_dup_text(old_account->source);
1291 _ACCOUNT_FREE(new_account->package_name);
1292 new_account->package_name = _account_dup_text(old_account->package_name);
1295 if (!new_account->access_token) {
1296 if (old_account->access_token)
1297 new_account->access_token = _account_dup_text(old_account->access_token);
1302 for (i = 0; i < USER_TXT_CNT; i++) {
1303 if (!new_account->user_data_txt[i]) {
1304 if (old_account->user_data_txt[i])
1305 new_account->user_data_txt[i] = _account_dup_text(old_account->user_data_txt[i]);
1310 if (new_account->auth_type == _ACCOUNT_AUTH_TYPE_INVALID)
1311 new_account->auth_type = old_account->auth_type;
1314 if (new_account->secret == _ACCOUNT_SECRECY_INVALID)
1315 new_account->secret = old_account->secret;
1318 if (new_account->sync_support == _ACCOUNT_SYNC_INVALID)
1319 new_account->sync_support = old_account->sync_support;
1322 for (i = 0; i < USER_INT_CNT; i++) {
1323 if (new_account->user_data_int[i] == 0)
1324 new_account->user_data_int[i] = old_account->user_data_int[i];
1329 _account_free_account_with_items(old_account);
1331 if (hstmt != NULL) {
1332 rc = _account_query_finalize(hstmt);
1333 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1337 return _ACCOUNT_ERROR_NONE;
1340 static int _account_get_package_name_from_account_id(int account_id, char **package_name)
1342 int error_code = _ACCOUNT_ERROR_NONE;
1343 account_stmt hstmt = NULL;
1344 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1346 account_s *old_account = NULL;
1348 ACCOUNT_RETURN_VAL((account_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT INDEX IS LESS THAN 0"));
1349 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1351 old_account = (account_s*)calloc(1, sizeof(account_s));
1352 if (old_account == NULL) {
1353 _ERR("Out Of memory");
1354 return _ACCOUNT_ERROR_OUT_OF_MEMORY;
1357 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1359 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id = %d", ACCOUNT_TABLE, account_id);
1360 hstmt = _account_prepare_query(g_hAccountDB, query);
1362 rc = _account_query_step(hstmt);
1363 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
1365 while (rc == SQLITE_ROW) {
1366 _account_convert_column_to_account(hstmt, old_account);
1367 rc = _account_query_step(hstmt);
1370 rc = _account_query_finalize(hstmt);
1371 ACCOUNT_CATCH_ERROR((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1374 // get package name.
1375 *package_name = _account_dup_text(old_account->package_name);
1379 _account_free_account_with_items(old_account);
1381 if (hstmt != NULL) {
1382 rc = _account_query_finalize(hstmt);
1383 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1391 static int _account_update_account(int pid, uid_t uid, account_s *account, int account_id)
1393 int rc = 0, binding_count = 0;
1394 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1395 int error_code = _ACCOUNT_ERROR_NONE, count = 0, ret_transaction = 0;
1396 account_stmt hstmt = NULL;
1398 if (!account->package_name) {
1399 ACCOUNT_ERROR("Package name is mandetory field, it can not be NULL!!!!\n");
1400 return _ACCOUNT_ERROR_INVALID_PARAMETER;
1403 /* Check permission of requested appid */
1404 char* current_appid = NULL;
1405 char *package_name = NULL;
1407 current_appid = _account_get_current_appid(pid, uid);
1408 error_code = _account_get_package_name_from_account_id(account_id, &package_name);
1410 if (error_code != _ACCOUNT_ERROR_NONE || package_name == NULL) {
1411 ACCOUNT_ERROR("No package name with account_id\n");
1412 _ACCOUNT_FREE(current_appid);
1413 _ACCOUNT_FREE(package_name);
1414 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1417 error_code = _account_check_appid_group_with_package_name(current_appid, package_name, uid);
1418 ACCOUNT_DEBUG("UPDATE:account_id[%d],current_appid[%s]package_name[%s]", account_id, current_appid, package_name); // TODO: remove the log later.
1420 _ACCOUNT_FREE(current_appid);
1421 _ACCOUNT_FREE(package_name);
1423 if (error_code != _ACCOUNT_ERROR_NONE) {
1424 ACCOUNT_ERROR("No permission to update\n");
1425 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1428 error_code = encrypt_access_token(account);
1429 if (error_code != _ACCOUNT_ERROR_NONE) {
1430 _ERR("_encrypt_access_token error");
1434 error_code = _account_compare_old_record(account, account_id);
1435 if (error_code != _ACCOUNT_ERROR_NONE) {
1436 ACCOUNT_ERROR("_account_compare_old_record fail\n");
1440 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1441 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1442 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1443 } else if (_account_db_err_code(g_hAccountDB) == SQLITE_BUSY) {
1444 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
1445 return _ACCOUNT_ERROR_DATABASE_BUSY;
1448 if (!account->user_name && !account->display_name && !account->email_address) {
1449 ACCOUNT_ERROR("One field should be set among user name, display name, email address\n");
1450 return _ACCOUNT_ERROR_INVALID_PARAMETER;
1453 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
1455 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE _id = %d ", ACCOUNT_TABLE, account_id);
1457 count = _account_get_record_count(g_hAccountDB, query);
1459 ACCOUNT_DEBUG(" Account record not found, count = %d\n", count);
1460 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1463 /* transaction control required*/
1464 ret_transaction = _account_begin_transaction(g_hAccountDB);
1465 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
1466 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
1467 pthread_mutex_unlock(&account_mutex);
1468 return _ACCOUNT_ERROR_DATABASE_BUSY;
1471 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
1472 ACCOUNT_SNPRINTF(query, sizeof(query), "UPDATE %s SET user_name=?, email_address =?, display_name =?, "
1473 "icon_path =?, source =?, package_name =? , access_token =?, domain_name =?, auth_type =?, secret =?, sync_support =?,"
1474 "txt_custom0=?, txt_custom1=?, txt_custom2=?, txt_custom3=?, txt_custom4=?, "
1475 "int_custom0=?, int_custom1=?, int_custom2=?, int_custom3=?, int_custom4=? WHERE _id=? ", ACCOUNT_TABLE);
1477 hstmt = _account_prepare_query(g_hAccountDB, query);
1479 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1480 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1481 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1482 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1485 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_svc_query_prepare() failed(%s)(%x).\n", _account_db_err_msg(g_hAccountDB), _account_end_transaction(g_hAccountDB, FALSE)));
1487 binding_count = _account_convert_account_to_sql(account, hstmt, query);
1488 _account_query_bind_int(hstmt, binding_count++, account_id);
1490 rc = _account_query_step(hstmt);
1491 if (rc != SQLITE_DONE)
1492 ACCOUNT_SLOGE("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
1494 rc = _account_query_finalize(hstmt);
1495 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1498 _INFO("update query=%s", query);
1500 /*update capability*/
1501 error_code = _account_update_capability(account, account_id);
1502 if (error_code != _ACCOUNT_ERROR_NONE && error_code != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
1503 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1504 ACCOUNT_ERROR("update capability Failed, trying to roll back(%x) !!!\n", ret_transaction);
1509 error_code = _account_update_custom(account, account_id);
1510 if (error_code != _ACCOUNT_ERROR_NONE && error_code != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
1511 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1512 ACCOUNT_ERROR("update capability Failed, trying to roll back(%x) !!!\n", ret_transaction);
1516 ret_transaction = _account_end_transaction(g_hAccountDB, TRUE);
1518 _INFO("update end");
1524 static int _account_update_account_ex(account_s *account, int account_id)
1526 int rc = 0, binding_count = 0;
1527 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1528 int error_code = _ACCOUNT_ERROR_NONE, count = 0, ret_transaction = 0;
1529 account_stmt hstmt = NULL;
1531 if (!account->package_name) {
1532 ACCOUNT_ERROR("Package name is mandetory field, it can not be NULL!!!!\n");
1533 return _ACCOUNT_ERROR_INVALID_PARAMETER;
1536 error_code = encrypt_access_token(account);
1537 if (error_code != _ACCOUNT_ERROR_NONE) {
1538 _ERR("_encrypt_access_token error");
1542 error_code = _account_compare_old_record(account, account_id);
1543 if (error_code != _ACCOUNT_ERROR_NONE) {
1544 ACCOUNT_ERROR("_account_compare_old_record fail\n");
1548 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1549 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1550 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1553 if (!account->user_name && !account->display_name && !account->email_address) {
1554 ACCOUNT_ERROR("One field should be set among user name, display name, email address\n");
1555 return _ACCOUNT_ERROR_INVALID_PARAMETER;
1558 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
1560 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE _id = %d ", ACCOUNT_TABLE, account_id);
1562 count = _account_get_record_count(g_hAccountDB, query);
1564 ACCOUNT_DEBUG(" Account record not found, count = %d\n", count);
1565 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1568 /* transaction control required*/
1569 ret_transaction = _account_begin_transaction(g_hAccountDB);
1570 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
1571 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
1572 pthread_mutex_unlock(&account_mutex);
1573 return _ACCOUNT_ERROR_DATABASE_BUSY;
1576 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
1577 ACCOUNT_SNPRINTF(query, sizeof(query), "UPDATE %s SET user_name=?, email_address =?, display_name =?, "
1578 "icon_path =?, source =?, package_name =? , access_token =?, domain_name =?, auth_type =?, secret =?, sync_support =?,"
1579 "txt_custom0=?, txt_custom1=?, txt_custom2=?, txt_custom3=?, txt_custom4=?, "
1580 "int_custom0=?, int_custom1=?, int_custom2=?, int_custom3=?, int_custom4=? WHERE _id=? ", ACCOUNT_TABLE);
1582 hstmt = _account_prepare_query(g_hAccountDB, query);
1584 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1585 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1586 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1587 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1590 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_svc_query_prepare() failed(%s)(%x).\n", _account_db_err_msg(g_hAccountDB), _account_end_transaction(g_hAccountDB, FALSE)));
1592 _INFO("account_update_to_db_by_id_ex_p : before convert() : account_id[%d], user_name=%s", account->id, account->user_name);
1593 binding_count = _account_convert_account_to_sql(account, hstmt, query);
1594 _INFO("account_update_to_db_by_id_ex_p : after convert() : account_id[%d], user_name=%s", account->id, account->user_name);
1595 _INFO("account_update_to_db_by_id_ex_p : before bind()");
1596 rc = _account_query_bind_int(hstmt, binding_count++, account_id);
1597 _INFO("account_update_to_db_by_id_ex_p : after bind() : ret = %d", rc);
1599 rc = _account_query_step(hstmt);
1600 if (rc != SQLITE_DONE)
1601 ACCOUNT_SLOGE("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
1602 _INFO("account_update_to_db_by_id_ex_p : after query_step() : ret = %d", rc);
1604 rc = _account_query_finalize(hstmt);
1605 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1607 _INFO("account_update_to_db_by_id_ex_p : after query_filnalize() : ret = %d", rc);
1609 _INFO("account_update_to_db_by_id_ex_p : before update_capability()");
1610 /*update capability*/
1611 error_code = _account_update_capability(account, account_id);
1612 if (error_code != _ACCOUNT_ERROR_NONE && error_code != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
1613 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1614 ACCOUNT_ERROR("update capability Failed, trying to roll back(%x) !!!\n", ret_transaction);
1617 _INFO("account_update_to_db_by_id_ex_p : after update_capability()");
1619 _INFO("account_update_to_db_by_id_ex_p : before update_custom()");
1621 error_code = _account_update_custom(account, account_id);
1622 if (error_code != _ACCOUNT_ERROR_NONE && error_code != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
1623 ret_transaction = _account_end_transaction(g_hAccountDB, FALSE);
1624 ACCOUNT_ERROR("update capability Failed, trying to roll back(%x) !!!\n", ret_transaction);
1627 _INFO("account_update_to_db_by_id_ex_p : after update_custom()");
1629 ret_transaction = _account_end_transaction(g_hAccountDB, TRUE);
1635 int _account_update_to_db_by_id(int pid, uid_t uid, account_s* account, int account_id)
1637 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("DATA IS NULL"));
1638 ACCOUNT_RETURN_VAL((account_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Account id is not valid"));
1639 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1640 int error_code = _ACCOUNT_ERROR_NONE;
1641 account_s* data = (account_s*)account;
1643 pthread_mutex_lock(&account_mutex);
1645 error_code = _account_update_account(pid, uid, data, account_id);
1647 if (error_code != _ACCOUNT_ERROR_NONE) {
1648 pthread_mutex_unlock(&account_mutex);
1652 pthread_mutex_unlock(&account_mutex);
1654 char buf[64] = {0,};
1655 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_UPDATE, account_id);
1656 _account_insert_delete_update_notification_send(buf);
1658 return _ACCOUNT_ERROR_NONE;
1661 int _account_update_to_db_by_id_ex(account_s* account, int account_id)
1663 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("DATA IS NULL"));
1664 ACCOUNT_RETURN_VAL((account_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Account id is not valid"));
1665 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1666 int error_code = _ACCOUNT_ERROR_NONE;
1667 account_s* data = account;
1669 pthread_mutex_lock(&account_mutex);
1671 _INFO("before update_account_ex() : account_id[%d], user_name=%s", account_id, data->user_name);
1672 error_code = _account_update_account_ex(data, account_id);
1673 _INFO("after update_account_ex() : account_id[%d], user_name=%s", account_id, data->user_name);
1675 if (error_code != _ACCOUNT_ERROR_NONE) {
1676 pthread_mutex_unlock(&account_mutex);
1680 pthread_mutex_unlock(&account_mutex);
1682 char buf[64] = {0,};
1683 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_UPDATE, account_id);
1684 _account_insert_delete_update_notification_send(buf);
1686 return _ACCOUNT_ERROR_NONE;
1689 int _account_update_to_db_by_user_name(int pid, uid_t uid, account_s* account, const char *user_name, const char *package_name)
1691 ACCOUNT_RETURN_VAL((user_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("USER NAME IS NULL"));
1692 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("PACKAGE NAME IS NULL"));
1693 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1695 int error_code = _ACCOUNT_ERROR_NONE;
1696 account_s *data = (account_s*)account;
1698 pthread_mutex_lock(&account_mutex);
1700 error_code = _account_update_account_by_user_name(pid, uid, data, user_name, package_name);
1702 pthread_mutex_unlock(&account_mutex);
1704 char buf[64] = {0,};
1705 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_UPDATE, data->id);
1706 _account_insert_delete_update_notification_send(buf);
1711 GSList* _account_db_query_all(int pid, uid_t uid)
1713 //int error_code = _ACCOUNT_ERROR_NONE;
1714 account_stmt hstmt = NULL;
1715 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1717 GSList *account_list = NULL;
1719 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, NULL, ("The database isn't connected."));
1721 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1723 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s ", ACCOUNT_TABLE);
1724 hstmt = _account_prepare_query(g_hAccountDB, query);
1726 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1727 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1731 rc = _account_query_step(hstmt);
1733 account_s *account_record = NULL;
1735 if (rc != SQLITE_ROW) {
1736 _ERR("The record isn't found");
1740 while (rc == SQLITE_ROW) {
1741 account_record = (account_s*) malloc(sizeof(account_s));
1743 if (account_record == NULL) {
1744 ACCOUNT_FATAL("malloc Failed");
1748 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
1749 _account_convert_column_to_account(hstmt, account_record);
1750 account_list = g_slist_append(account_list, account_record);
1751 rc = _account_query_step(hstmt);
1754 rc = _account_query_finalize(hstmt);
1755 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_gslist_account_free(account_list); }, NULL, ("finalize error"));
1760 for (iter = account_list; iter != NULL; iter = g_slist_next(iter)) {
1761 account_s *account = NULL;
1762 account = (account_s*)iter->data;
1763 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, account->id, (void*)account);
1764 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, account->id, (void*)account);
1768 if (hstmt != NULL) {
1769 rc = _account_query_finalize(hstmt);
1770 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_gslist_account_free(account_list); }, NULL, ("finalize error"));
1775 _remove_sensitive_info_from_non_owning_account_slist(account_list, pid, uid);
1777 return account_list;
1780 int _account_update_sync_status_by_id(uid_t uid, int account_db_id, const int sync_status)
1782 int error_code = _ACCOUNT_ERROR_NONE;
1783 account_stmt hstmt = NULL;
1784 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1788 ACCOUNT_RETURN_VAL((account_db_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT INDEX IS LESS THAN 0"));
1789 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1790 if ((sync_status < 0) || (sync_status >= _ACCOUNT_SYNC_MAX)) {
1791 ACCOUNT_SLOGE("(%s)-(%d) sync_status is less than 0 or more than enum max.\n", __FUNCTION__, __LINE__);
1792 return _ACCOUNT_ERROR_INVALID_PARAMETER;
1795 pthread_mutex_lock(&account_mutex);
1797 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1799 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_db_id);
1801 rc = _account_get_record_count(g_hAccountDB, query);
1803 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1804 pthread_mutex_unlock(&account_mutex);
1805 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1806 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1810 ACCOUNT_SLOGE("account_update_sync_status_by_id : related account item is not existed rc=%d , %s", rc, _account_db_err_msg(g_hAccountDB));
1811 pthread_mutex_unlock(&account_mutex);
1812 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1815 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1817 ACCOUNT_SNPRINTF(query, sizeof(query), "UPDATE %s SET sync_support=? WHERE _id = %d", ACCOUNT_TABLE, account_db_id);
1818 hstmt = _account_prepare_query(g_hAccountDB, query);
1820 _account_query_bind_int(hstmt, count, sync_status);
1822 rc = _account_query_step(hstmt);
1824 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1825 pthread_mutex_unlock(&account_mutex);
1826 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1827 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1830 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_DB_FAILED,
1831 ("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB)));
1833 rc = _account_query_finalize(hstmt);
1834 if (rc != _ACCOUNT_ERROR_NONE) {
1835 ACCOUNT_ERROR("_account_query_finalize error");
1836 pthread_mutex_unlock(&account_mutex);
1840 char buf[64] = {0,};
1841 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_SYNC_UPDATE, account_db_id);
1842 _account_insert_delete_update_notification_send(buf);
1845 error_code = _ACCOUNT_ERROR_NONE;
1848 if (hstmt != NULL) {
1849 rc = _account_query_finalize(hstmt);
1850 pthread_mutex_unlock(&account_mutex);
1851 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1855 pthread_mutex_unlock(&account_mutex);
1860 int account_server_empty_deleted_account_info_tables(const char* del_account_table, const char* del_capability_table,
1861 const char* del_account_custom_table)
1863 _INFO("account_server_empty_deleted_account_info_tables start");
1865 account_stmt hstmt = NULL;
1866 int error_code = _ACCOUNT_ERROR_NONE;
1868 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1870 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1872 rc = _account_begin_transaction(g_hAccountDB);
1873 _INFO("after _account_begin_trasaction");
1875 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1876 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1877 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1880 if (rc == _ACCOUNT_ERROR_DATABASE_BUSY) {
1881 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
1882 return _ACCOUNT_ERROR_DATABASE_BUSY;
1883 } else if (rc != _ACCOUNT_ERROR_NONE) {
1884 ACCOUNT_ERROR("account_delete:_account_begin_transaction fail %d\n", rc);
1888 /*clear deleted account table*/
1889 ACCOUNT_MEMSET(query, 0, sizeof(query));
1890 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s", del_account_table);
1892 _INFO("clearing deleted-account-table - query[%s]", query);
1894 hstmt = _account_prepare_query(g_hAccountDB, query);
1895 if ((_account_db_err_code(g_hAccountDB) == SQLITE_PERM)) {
1896 _account_end_transaction(g_hAccountDB, false);
1897 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1898 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1901 if (hstmt == NULL) {
1902 _ERR("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB));
1903 error_code = _ACCOUNT_ERROR_DB_FAILED;
1907 rc = _account_query_step(hstmt);
1908 if (rc != SQLITE_DONE) {
1909 _ERR("The record isn't found");
1910 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1914 rc = _account_query_finalize(hstmt);
1915 if (rc != _ACCOUNT_ERROR_NONE) {
1916 _ERR("finalize error");
1921 /*clear deleted capability table*/
1922 ACCOUNT_MEMSET(query, 0, sizeof(query));
1923 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s", del_capability_table);
1925 _INFO("clearing deleted-capability-table - query[%s]", query);
1927 hstmt = _account_prepare_query(g_hAccountDB, query);
1928 if (hstmt == NULL) {
1929 _ERR("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB));
1930 error_code = _ACCOUNT_ERROR_DB_FAILED;
1934 rc = _account_query_step(hstmt);
1935 if (rc != SQLITE_DONE) {
1936 _ERR("The record isn't found");
1937 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1941 rc = _account_query_finalize(hstmt);
1942 if (rc != _ACCOUNT_ERROR_NONE) {
1943 _ERR("finalize error");
1948 /*clear deleted account_custom table*/
1949 ACCOUNT_MEMSET(query, 0, sizeof(query));
1950 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s", del_account_custom_table);
1952 _INFO("clearing deleted-account-custom-table - query[%s]", query);
1954 hstmt = _account_prepare_query(g_hAccountDB, query);
1955 if (hstmt == NULL) {
1956 _ERR("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB));
1957 error_code = _ACCOUNT_ERROR_DB_FAILED;
1961 rc = _account_query_step(hstmt);
1962 if (rc != SQLITE_DONE) {
1963 _ERR("The record isn't found");
1964 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1968 rc = _account_query_finalize(hstmt);
1969 if (rc != _ACCOUNT_ERROR_NONE) {
1970 _ERR("finalize error");
1975 rc = _account_end_transaction(g_hAccountDB, true);
1976 if (rc != _ACCOUNT_ERROR_NONE)
1977 _ERR("clear deleted account tables - fail [%d]", rc);
1980 _INFO("account_server_empty_deleted_account_info_tables end");
1985 int _account_query_account_by_account_id(int pid, uid_t uid, int account_db_id, account_s *account_record, bool *IsDeletedAccount)
1987 _INFO("_account_query_account_by_account_id() start, account_db_id=[%d]", account_db_id);
1989 int error_code = _ACCOUNT_ERROR_NONE;
1990 account_stmt hstmt = NULL;
1991 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1994 ACCOUNT_RETURN_VAL((account_db_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT INDEX IS LESS THAN 0"));
1995 ACCOUNT_RETURN_VAL(account_record != NULL, {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT IS NULL"));
1996 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1998 ACCOUNT_DEBUG("starting db operations");
2000 /* prepare query for account-table */
2001 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2002 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id = %d", ACCOUNT_TABLE, account_db_id);
2004 _INFO("after _account_prepare_query, rc=[%d]", rc);
2006 hstmt = _account_prepare_query(g_hAccountDB, query);
2008 rc = _account_db_err_code(g_hAccountDB);
2009 if (rc == SQLITE_PERM) {
2010 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2011 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2014 ACCOUNT_DEBUG("before _account_query_step");
2016 rc = _account_query_step(hstmt);
2018 ACCOUNT_DEBUG("after _account_query_step returned [%d]", rc);
2020 /*querying information from deleted_account_table*/
2021 if (rc != SQLITE_ROW) {
2022 ACCOUNT_DEBUG("checking account info in deleted_account_table");
2023 /* query from deleted-account-info table */
2024 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2025 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id = %d", DELETED_ACCOUNT_TABLE, account_db_id);
2027 /*free previous hstmt*/
2028 if (hstmt != NULL) {
2029 rc = _account_query_finalize(hstmt);
2030 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2034 hstmt = _account_prepare_query(g_hAccountDB, query);
2036 rc = _account_db_err_code(g_hAccountDB);
2037 if (rc == SQLITE_PERM) {
2038 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2039 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2042 rc = _account_query_step(hstmt);
2043 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2045 ACCOUNT_DEBUG("getting account info from deleted_account_table");
2046 *IsDeletedAccount = true;
2049 while (rc == SQLITE_ROW) {
2050 ACCOUNT_DEBUG("before _account_convert_column_to_account");
2051 _account_convert_column_to_account(hstmt, account_record);
2052 ACCOUNT_DEBUG("after _account_convert_column_to_account");
2053 ACCOUNT_DEBUG("user_name = %s, user_txt[0] = %s, user_int[1] = %d", account_record->user_name, account_record->user_data_txt[0], account_record->user_data_int[1]);
2054 rc = _account_query_step(hstmt);
2057 ACCOUNT_DEBUG("account_record->id=[%d]", account_record->id);
2059 rc = _account_query_finalize(hstmt);
2060 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2062 ACCOUNT_DEBUG("before _account_query_capability_by_account_id");
2063 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, account_record->id, (void*)account_record);
2064 ACCOUNT_DEBUG("after _account_query_capability_by_account_id");
2066 ACCOUNT_DEBUG("before _account_query_custom_by_account_id");
2067 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, account_record->id, (void*)account_record);
2068 ACCOUNT_DEBUG("after _account_query_custom_by_account_id");
2071 error_code = _ACCOUNT_ERROR_NONE;
2074 if (hstmt != NULL) {
2075 rc = _account_query_finalize(hstmt);
2076 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2081 _remove_sensitive_info_from_non_owning_account(account_record, pid, uid);
2083 pthread_mutex_unlock(&account_mutex);
2084 ACCOUNT_DEBUG("_account_query_account_by_account_id end [%d]", error_code);
2089 GList* _account_query_account_by_user_name(int pid, uid_t uid, const char *user_name, int *error_code)
2091 *error_code = _ACCOUNT_ERROR_NONE;
2092 account_stmt hstmt = NULL;
2093 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2095 account_s *account_head = NULL;
2097 if (user_name == NULL) {
2098 _ERR("USER NAME IS NULL");
2099 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
2103 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2105 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE user_name = ?", ACCOUNT_TABLE);
2107 hstmt = _account_prepare_query(g_hAccountDB, query);
2109 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2110 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2111 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2115 int binding_count = 1;
2116 _account_query_bind_text(hstmt, binding_count++, user_name);
2118 rc = _account_query_step(hstmt);
2120 if (rc != SQLITE_ROW) {
2121 _ERR("The record isn't found");
2122 *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2128 account_head = (account_s*) malloc(sizeof(account_s));
2129 if (account_head == NULL) {
2130 ACCOUNT_FATAL("malloc Failed");
2131 if (hstmt != NULL) {
2132 rc = _account_query_finalize(hstmt);
2133 if (rc != _ACCOUNT_ERROR_NONE) {
2134 _ERR("finalize error");
2140 *error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
2143 ACCOUNT_MEMSET(account_head, 0x00, sizeof(account_s));
2145 while (rc == SQLITE_ROW) {
2146 account_s* account_record = NULL;
2148 account_record = (account_s*) malloc(sizeof(account_s));
2150 if (account_record == NULL) {
2151 ACCOUNT_FATAL("malloc Failed");
2154 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
2156 _account_convert_column_to_account(hstmt, account_record);
2158 account_head->account_list = g_list_append(account_head->account_list, account_record);
2160 rc = _account_query_step(hstmt);
2164 rc = _account_query_finalize(hstmt);
2166 if (rc != _ACCOUNT_ERROR_NONE) {
2167 _ERR("finalize error");
2176 tmp = g_list_length(account_head->account_list);
2178 for (iter = account_head->account_list; iter != NULL; iter = g_list_next(iter)) {
2179 //account_h account;
2180 //account = (account_h)iter->data;
2182 account_s *testaccount = (account_s*)iter->data;
2184 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, testaccount->id, (void*)testaccount);
2185 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, testaccount->id, (void*)testaccount);
2188 *error_code = _ACCOUNT_ERROR_NONE;
2191 if (hstmt != NULL) {
2192 rc = _account_query_finalize(hstmt);
2193 if (rc != _ACCOUNT_ERROR_NONE) {
2194 _ERR("finalize error");
2200 pthread_mutex_unlock(&account_mutex);
2203 _remove_sensitive_info_from_non_owning_account_list(account_head->account_list, pid, uid);
2204 GList* result = account_head->account_list;
2205 _ACCOUNT_FREE(account_head);
2213 _account_query_account_by_capability(int pid, uid_t uid, const char* capability_type, const int capability_value, int *error_code)
2215 *error_code = _ACCOUNT_ERROR_NONE;
2216 account_stmt hstmt = NULL;
2217 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2220 ACCOUNT_RETURN_VAL((capability_type != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("capability_type IS NULL"));
2222 if ((capability_value < 0) || (capability_value >= _ACCOUNT_CAPABILITY_STATE_MAX)) {
2223 ACCOUNT_SLOGE("(%s)-(%d) capability_value is not equal to 0 or 1.\n", __FUNCTION__, __LINE__);
2224 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
2228 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
2230 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2232 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id IN (SELECT account_id from %s WHERE key=? AND value=?)", ACCOUNT_TABLE, CAPABILITY_TABLE);
2234 hstmt = _account_prepare_query(g_hAccountDB, query);
2236 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2237 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2238 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2242 int binding_count = 1;
2243 _account_query_bind_text(hstmt, binding_count++, capability_type);
2244 _account_query_bind_int(hstmt, binding_count++, capability_value);
2246 rc = _account_query_step(hstmt);
2248 account_s* account_head = NULL;
2250 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2254 account_head = (account_s*) malloc(sizeof(account_s));
2255 if (account_head == NULL) {
2256 ACCOUNT_FATAL("malloc Failed");
2257 if (hstmt != NULL) {
2258 rc = _account_query_finalize(hstmt);
2259 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
2262 *error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
2265 ACCOUNT_MEMSET(account_head, 0x00, sizeof(account_s));
2267 while (rc == SQLITE_ROW) {
2268 account_s* account_record = NULL;
2270 account_record = (account_s*) malloc(sizeof(account_s));
2272 if (account_record == NULL) {
2273 ACCOUNT_FATAL("malloc Failed");
2276 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
2278 _account_convert_column_to_account(hstmt, account_record);
2280 account_head->account_list = g_list_append(account_head->account_list, account_record);
2282 rc = _account_query_step(hstmt);
2286 rc = _account_query_finalize(hstmt);
2287 ACCOUNT_CATCH_ERROR_P((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2293 tmp = g_list_length(account_head->account_list);
2295 for (iter = account_head->account_list; iter != NULL; iter = g_list_next(iter)) {
2296 //account_h account = NULL;
2297 //account = (account_h)iter->data;
2298 account_s* testaccount = (account_s*)iter->data;
2300 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, testaccount->id, (void*)testaccount);
2301 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, testaccount->id, (void*)testaccount);
2305 *error_code = _ACCOUNT_ERROR_NONE;
2308 if (hstmt != NULL) {
2309 rc = _account_query_finalize(hstmt);
2310 if (rc != _ACCOUNT_ERROR_NONE) {
2312 _ERR("finalize error");
2317 if (*error_code != _ACCOUNT_ERROR_NONE && account_head) {
2318 _account_glist_account_free(account_head->account_list);
2319 _ACCOUNT_FREE(account_head);
2320 account_head = NULL;
2323 pthread_mutex_unlock(&account_mutex);
2326 _remove_sensitive_info_from_non_owning_account_list(account_head->account_list, pid, uid);
2327 GList* result = account_head->account_list;
2328 _ACCOUNT_FREE(account_head);
2335 GList* _account_query_account_by_capability_type(int pid, uid_t uid, const char* capability_type, int *error_code)
2337 *error_code = _ACCOUNT_ERROR_NONE;
2338 account_stmt hstmt = NULL;
2339 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2342 ACCOUNT_RETURN_VAL((capability_type != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("capability_type IS NULL"));
2343 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; },
2344 NULL, ("The database isn't connected."));
2346 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2348 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id IN (SELECT account_id from %s WHERE key=?)", ACCOUNT_TABLE, CAPABILITY_TABLE);
2350 hstmt = _account_prepare_query(g_hAccountDB, query);
2352 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2353 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2354 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2358 int binding_count = 1;
2359 _account_query_bind_text(hstmt, binding_count++, capability_type);
2361 rc = _account_query_step(hstmt);
2363 account_s* account_head = NULL;
2365 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2369 account_head = (account_s*) malloc(sizeof(account_s));
2370 if (account_head == NULL) {
2371 ACCOUNT_FATAL("malloc Failed");
2372 if (hstmt != NULL) {
2373 rc = _account_query_finalize(hstmt);
2374 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
2377 *error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
2380 ACCOUNT_MEMSET(account_head, 0x00, sizeof(account_s));
2382 while (rc == SQLITE_ROW) {
2383 account_s* account_record = NULL;
2385 account_record = (account_s*) malloc(sizeof(account_s));
2387 if (account_record == NULL) {
2388 ACCOUNT_FATAL("malloc Failed");
2391 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
2393 _account_convert_column_to_account(hstmt, account_record);
2395 account_head->account_list = g_list_append(account_head->account_list, account_record);
2397 rc = _account_query_step(hstmt);
2401 rc = _account_query_finalize(hstmt);
2402 ACCOUNT_CATCH_ERROR_P((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2408 tmp = g_list_length(account_head->account_list);
2410 for (iter = account_head->account_list; iter != NULL; iter = g_list_next(iter)) {
2411 account_s* testaccount = (account_s*)iter->data;
2413 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, testaccount->id, (void*)testaccount);
2414 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, testaccount->id, (void*)testaccount);
2418 *error_code = _ACCOUNT_ERROR_NONE;
2421 if (hstmt != NULL) {
2422 rc = _account_query_finalize(hstmt);
2423 if (rc != _ACCOUNT_ERROR_NONE) {
2425 _ERR("finalize error");
2430 if ((*error_code != _ACCOUNT_ERROR_NONE) && account_head) {
2431 _account_glist_account_free(account_head->account_list);
2432 _ACCOUNT_FREE(account_head);
2433 account_head = NULL;
2436 pthread_mutex_unlock(&account_mutex);
2439 _remove_sensitive_info_from_non_owning_account_list(account_head->account_list, pid, uid);
2440 GList* result = account_head->account_list;
2441 _ACCOUNT_FREE(account_head);
2448 GList* account_server_query_account_by_package_name(const char* package_name, int *error_code, int pid, uid_t uid)
2450 _INFO("account_server_query_account_by_package_name start");
2452 GList * account_list = NULL;
2453 *error_code = _ACCOUNT_ERROR_NONE;
2455 ACCOUNT_RETURN_VAL((package_name != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("PACKAGE NAME IS NULL"));
2456 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
2458 account_list = _account_query_account_by_package_name(g_hAccountDB, package_name, error_code, pid, uid);
2460 _INFO("account_server_query_account_by_package_name end");
2462 return account_list;
2465 int account_server_delete_account_by_package_name(const char* package_name, bool permission, int pid, uid_t uid)
2467 _INFO("account_db_delete_account_by_package_name");
2469 int error_code = _ACCOUNT_ERROR_NONE;
2471 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("PACKAGE NAME IS NULL"));
2472 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2474 error_code = _account_delete_account_by_package_name(g_hAccountDB, package_name, permission, pid, uid);
2476 _INFO("account_server_delete_account_by_package_name end");
2481 int _account_delete(int pid, uid_t uid, int account_id)
2483 int error_code = _ACCOUNT_ERROR_NONE;
2484 account_stmt hstmt = NULL;
2485 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2487 int ret_transaction = 0;
2488 bool is_success = FALSE;
2490 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2493 /* Check requested ID to delete */
2494 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE _id=%d", ACCOUNT_TABLE, account_id);
2496 count = _account_get_record_count(g_hAccountDB, query);
2498 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2499 pthread_mutex_unlock(&account_mutex);
2500 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2501 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2505 ACCOUNT_ERROR("account id(%d) is not exist. count(%d)\n", account_id, count);
2506 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2509 /* Check permission of requested appid */
2510 char* current_appid = NULL;
2511 char *package_name = NULL;
2513 current_appid = _account_get_current_appid(pid, uid);
2515 error_code = _account_get_package_name_from_account_id(account_id, &package_name);
2517 if (error_code != _ACCOUNT_ERROR_NONE) {
2518 ACCOUNT_ERROR("No package name with account_id\n");
2519 _ACCOUNT_FREE(current_appid);
2520 _ACCOUNT_FREE(package_name);
2521 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2523 ACCOUNT_DEBUG("DELETE:account_id[%d],current_appid[%s]package_name[%s]", account_id, current_appid, package_name);
2525 error_code = _account_check_appid_group_with_package_name(current_appid, package_name, uid);
2527 _ACCOUNT_FREE(current_appid);
2528 _ACCOUNT_FREE(package_name);
2530 if (error_code != _ACCOUNT_ERROR_NONE) {
2531 ACCOUNT_ERROR("No permission to delete\n");
2532 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2535 /* transaction control required*/
2536 ret_transaction = _account_begin_transaction(g_hAccountDB);
2538 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2539 pthread_mutex_unlock(&account_mutex);
2540 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2541 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2544 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
2545 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
2546 pthread_mutex_unlock(&account_mutex);
2547 return _ACCOUNT_ERROR_DATABASE_BUSY;
2550 if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2551 ACCOUNT_ERROR("account_delete:_account_begin_transaction fail %d\n", ret_transaction);
2552 pthread_mutex_unlock(&account_mutex);
2553 return ret_transaction;
2556 /* capability table */
2557 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
2558 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE account_id = %d", CAPABILITY_TABLE, account_id);
2560 hstmt = _account_prepare_query(g_hAccountDB, query);
2562 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2563 pthread_mutex_unlock(&account_mutex);
2564 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2565 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2568 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2569 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2571 rc = _account_query_step(hstmt);
2572 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2574 rc = _account_query_finalize(hstmt);
2576 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2580 ACCOUNT_MEMSET(query, 0, sizeof(query));
2581 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE _id = %d", ACCOUNT_TABLE, account_id);
2583 hstmt = _account_prepare_query(g_hAccountDB, query);
2584 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2585 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2587 rc = _account_query_step(hstmt);
2588 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found. id=%d, rc=%d\n", account_id, rc));
2590 rc = _account_query_finalize(hstmt);
2591 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2594 /* delete custom data */
2595 ACCOUNT_MEMSET(query, 0, sizeof(query));
2596 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AccountId = %d", ACCOUNT_CUSTOM_TABLE, account_id);
2598 hstmt = _account_prepare_query(g_hAccountDB, query);
2600 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2601 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2603 rc = _account_query_step(hstmt);
2604 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found. id=%d, rc=%d\n", account_id, rc));
2606 rc = _account_query_finalize(hstmt);
2607 ACCOUNT_CATCH_ERROR(rc == _ACCOUNT_ERROR_NONE, {}, rc, ("finalize error", account_id, rc));
2613 if (hstmt != NULL) {
2614 rc = _account_query_finalize(hstmt);
2615 if (rc != _ACCOUNT_ERROR_NONE) {
2616 ACCOUNT_ERROR("rc (%d)", rc);
2623 ret_transaction = _account_end_transaction(g_hAccountDB, is_success);
2625 if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2626 ACCOUNT_ERROR("account_delete:_account_end_transaction fail %d, is_success=%d\n", ret_transaction, is_success);
2628 if (is_success == true) {
2629 char buf[64] = {0,};
2630 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_DELETE, account_id);
2631 _account_insert_delete_update_notification_send(buf);
2635 pthread_mutex_unlock(&account_mutex);
2640 static int _account_query_account_by_username_and_package(const char* username, const char* package_name, account_s *account)
2644 int error_code = _ACCOUNT_ERROR_NONE;
2645 account_stmt hstmt = NULL;
2646 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2648 int binding_count = 1;
2650 ACCOUNT_RETURN_VAL((username != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("username IS NULL"));
2651 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("package_name IS NULL"));
2652 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT IS NULL"));
2653 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2655 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2657 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE user_name = ? and package_name = ?", ACCOUNT_TABLE);
2658 hstmt = _account_prepare_query(g_hAccountDB, query);
2660 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2661 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2662 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2665 _account_query_bind_text(hstmt, binding_count++, username);
2666 _account_query_bind_text(hstmt, binding_count++, package_name);
2668 rc = _account_query_step(hstmt);
2669 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2671 account_s *account_record = account;
2673 while (rc == SQLITE_ROW) {
2674 _account_convert_column_to_account(hstmt, account_record);
2675 rc = _account_query_step(hstmt);
2678 rc = _account_query_finalize(hstmt);
2679 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2680 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, account_record->id, (void*)account_record);
2681 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, account_record->id, (void*)account_record);
2684 error_code = _ACCOUNT_ERROR_NONE;
2687 if (hstmt != NULL) {
2688 rc = _account_query_finalize(hstmt);
2689 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2693 pthread_mutex_unlock(&account_mutex);
2698 int _account_create(account_s **account)
2701 ACCOUNT_SLOGE("(%s)-(%d) account is NULL.\n", __FUNCTION__, __LINE__);
2702 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2705 account_s *data = (account_s*)malloc(sizeof(account_s));
2708 ACCOUNT_FATAL("Memory Allocation Failed");
2709 return _ACCOUNT_ERROR_OUT_OF_MEMORY;
2711 ACCOUNT_MEMSET(data, 0, sizeof(account_s));
2713 /*Setting account as visible by default*/
2714 //data->secret = _ACCOUNT_SECRECY_VISIBLE;
2716 /*Setting account as not supporting sync by default*/
2717 //data->sync_support = _ACCOUNT_SYNC_NOT_SUPPORT;
2721 return _ACCOUNT_ERROR_NONE;
2724 int _account_destroy(account_s *account)
2726 account_s *data = account;
2728 ACCOUNT_RETURN_VAL((data != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Account handle is null!"));
2730 _account_free_account_with_items(data);
2732 return _ACCOUNT_ERROR_NONE;
2735 int _account_get_account_id(account_s* account, int *account_id)
2738 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2741 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2743 *account_id = account->id;
2745 return _ACCOUNT_ERROR_NONE;
2748 int _account_delete_from_db_by_user_name(int pid, uid_t uid, const char *user_name, const char *package_name)
2750 _INFO("[%s][%s]", user_name, package_name);
2752 int error_code = _ACCOUNT_ERROR_NONE;
2753 account_stmt hstmt = NULL;
2754 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2756 int ret_transaction = 0;
2757 bool is_success = FALSE;
2758 account_s *account = NULL;
2759 int binding_count = 1;
2760 int account_id = -1;
2762 ACCOUNT_RETURN_VAL((user_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("user_name is null!"));
2763 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("package_name is null!"));
2764 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2766 /* Check permission of requested appid */
2767 char* current_appid = NULL;
2768 char* package_name_temp = NULL;
2770 current_appid = _account_get_current_appid(pid, uid);
2772 package_name_temp = _account_dup_text(package_name);
2774 ACCOUNT_DEBUG("DELETE:user_name[%s],current_appid[%s], package_name[%s]", user_name, current_appid, package_name_temp);
2776 error_code = _account_check_appid_group_with_package_name(current_appid, package_name_temp, uid);
2778 _ACCOUNT_FREE(current_appid);
2779 _ACCOUNT_FREE(package_name_temp);
2781 if (error_code != _ACCOUNT_ERROR_NONE) {
2782 ACCOUNT_ERROR("No permission to delete\n");
2783 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2786 rc = _account_create(&account);
2787 rc = _account_query_account_by_username_and_package(user_name, package_name, account);
2791 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2792 _account_destroy(account);
2793 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2794 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2798 account_s* account_data = (account_s*)account;
2800 rc = _account_get_account_id(account_data, &account_id);
2802 rc = _account_destroy(account);
2804 /* transaction control required*/
2805 ret_transaction = _account_begin_transaction(g_hAccountDB);
2807 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2808 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2809 pthread_mutex_unlock(&account_mutex);
2810 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2814 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
2815 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
2816 pthread_mutex_unlock(&account_mutex);
2817 return _ACCOUNT_ERROR_DATABASE_BUSY;
2818 } else if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2819 ACCOUNT_ERROR("account_delete:_account_begin_transaction fail %d\n", ret_transaction);
2820 pthread_mutex_unlock(&account_mutex);
2821 return ret_transaction;
2824 /* delete custom data */
2825 ACCOUNT_MEMSET(query, 0, sizeof(query));
2826 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AccountId = ?", ACCOUNT_CUSTOM_TABLE);
2828 hstmt = _account_prepare_query(g_hAccountDB, query);
2830 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2831 _account_end_transaction(g_hAccountDB, FALSE);
2832 pthread_mutex_unlock(&account_mutex);
2833 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2834 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2837 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2838 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2840 _account_query_bind_int(hstmt, binding_count++, account_id);
2842 rc = _account_query_step(hstmt);
2843 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2845 rc = _account_query_finalize(hstmt);
2846 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2849 /* delete capability */
2850 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE user_name = ? and package_name = ?", CAPABILITY_TABLE);
2852 hstmt = _account_prepare_query(g_hAccountDB, query);
2854 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2855 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2858 _account_query_bind_text(hstmt, binding_count++, user_name);
2859 _account_query_bind_text(hstmt, binding_count++, package_name);
2861 rc = _account_query_step(hstmt);
2862 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2864 rc = _account_query_finalize(hstmt);
2865 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2868 ACCOUNT_MEMSET(query, 0, sizeof(query));
2871 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE user_name = ? and package_name = ?", ACCOUNT_TABLE);
2873 hstmt = _account_prepare_query(g_hAccountDB, query);
2874 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2875 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2879 _account_query_bind_text(hstmt, binding_count++, user_name);
2880 _account_query_bind_text(hstmt, binding_count++, package_name);
2882 rc = _account_query_step(hstmt);
2883 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found. user_name=%s, package_name=%s, rc=%d\n", user_name, package_name, rc));
2885 rc = _account_query_finalize(hstmt);
2886 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2892 if (hstmt != NULL) {
2893 rc = _account_query_finalize(hstmt);
2894 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2898 ret_transaction = _account_end_transaction(g_hAccountDB, is_success);
2900 if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2901 ACCOUNT_ERROR("account_svc_delete:_account_svc_end_transaction fail %d, is_success=%d\n", ret_transaction, is_success);
2903 if (is_success == true) {
2904 char buf[64] = {0,};
2905 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_DELETE, account_id);
2906 _account_insert_delete_update_notification_send(buf);
2910 pthread_mutex_unlock(&account_mutex);
2916 int _account_get_total_count_from_db(gboolean include_hidden, int *count)
2919 ACCOUNT_SLOGE("(%s)-(%d) count is NULL.\n", __FUNCTION__, __LINE__);
2920 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2923 if (!g_hAccountDB) {
2924 ACCOUNT_ERROR("DB is not opened\n");
2925 return _ACCOUNT_ERROR_DB_NOT_OPENED;
2928 char query[1024] = {0, };
2929 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
2932 ACCOUNT_SNPRINTF(query, sizeof(query), "select count(*) from %s", ACCOUNT_TABLE);
2934 ACCOUNT_SNPRINTF(query, sizeof(query), "select count(*) from %s where secret = %d", ACCOUNT_TABLE, _ACCOUNT_SECRECY_VISIBLE);
2936 *count = _account_get_record_count(g_hAccountDB, query);
2938 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2939 pthread_mutex_unlock(&account_mutex);
2940 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2941 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2946 account_stmt pStmt = NULL;
2948 rc = sqlite3_prepare_v2(g_hAccountDB, query, strlen(query), &pStmt, NULL);
2949 if (SQLITE_OK != rc) {
2950 ACCOUNT_SLOGE("sqlite3_prepare_v2() failed(%d, %s).", rc, _account_db_err_msg(g_hAccountDB));
2951 sqlite3_finalize(pStmt);
2952 return _ACCOUNT_ERROR_DB_FAILED;
2955 rc = sqlite3_step(pStmt);
2956 if (SQLITE_ROW != rc) {
2957 ACCOUNT_ERROR("[ERROR] sqlite3_step() failed\n");
2958 sqlite3_finalize(pStmt);
2959 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2962 ncount = sqlite3_column_int(pStmt, 0);
2966 sqlite3_finalize(pStmt);
2969 ACCOUNT_ERROR("[ERROR] Number of account : %d, End", ncount);
2970 return _ACCOUNT_ERROR_DB_FAILED;
2973 return _ACCOUNT_ERROR_NONE;
2977 int account_server_query_app_id_exist(const char* app_id)
2979 _INFO("account_server_query_app_id_exist start app_id=[%s]", app_id);
2980 int ret = _ACCOUNT_ERROR_NONE;
2982 ret = _account_type_query_app_id_exist_from_all_db(g_hAccountDB, g_hAccountGlobalDB, app_id);
2984 _INFO("account_server_query_app_id_exist end error_code=[%d]", ret);
2989 int account_server_insert_account_type_to_user_db(account_type_s *account_type, int *account_type_id, uid_t uid)
2991 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT TYPE HANDLE IS NULL"));
2992 ACCOUNT_RETURN_VAL((account_type->app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID OF ACCOUNT TYPE IS NULL"));
2993 ACCOUNT_RETURN_VAL((account_type_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT TYPE ID IS NULL"));
2995 _INFO("account_server_insert_account_type_to_user_db start uid=[%d]", uid);
2996 int ret = _ACCOUNT_ERROR_NONE;
2998 if (_account_type_check_duplicated(g_hAccountDB, account_type->app_id) ||
2999 _account_type_check_duplicated(g_hAccountGlobalDB, account_type->app_id)) {
3000 *account_type_id = -1;
3001 return _ACCOUNT_ERROR_DUPLICATED;
3004 ret = _account_type_insert_to_db(g_hAccountDB, account_type, account_type_id);
3005 _INFO("account_server_insert_account_type_to_user_db end error_code=[%d]", ret);
3010 int account_server_delete_account_type_by_app_id_from_user_db(const char * app_id)
3012 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID OF ACCOUNT TYPE IS NULL"));
3014 _INFO("account_server_delete_account_type_by_app_id_from_user_db start");
3015 int ret = _ACCOUNT_ERROR_NONE;
3017 ret = _account_type_delete_by_app_id(g_hAccountDB, app_id);
3018 _INFO("account_server_delete_account_type_by_app_id_from_user_db end error_code=[%d]", ret);
3023 GSList* _account_type_query_provider_feature_by_app_id_from_global_db(const char* app_id, int *error_code)
3025 _INFO("_account_type_query_provider_feature_by_app_id_in_global_db app_id=%s", app_id);
3026 account_stmt hstmt = NULL;
3027 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3028 int rc = 0, binding_count = 1;
3029 GSList* feature_list = NULL;
3031 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
3032 ACCOUNT_RETURN_VAL((error_code != NULL), {_ERR("error_code pointer is NULL"); }, NULL, (""));
3033 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; _ERR("The database isn't connected."); }, NULL, ("The database isn't connected."));
3035 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3037 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
3038 _INFO("account query=[%s]", query);
3040 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3042 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3043 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3044 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3048 _INFO("before _account_query_bind_text");
3049 _account_query_bind_text(hstmt, binding_count++, app_id);
3051 rc = _account_query_step(hstmt);
3053 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, { *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND; _ERR("The record isn't found from global db. rc=[%d]", rc); }, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3055 provider_feature_s* feature_record = NULL;
3057 while (rc == SQLITE_ROW) {
3059 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
3061 if (feature_record == NULL) {
3062 ACCOUNT_FATAL("malloc Failed");
3066 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
3068 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
3070 _INFO("Adding account feature_list");
3071 feature_list = g_slist_append(feature_list, feature_record);
3073 rc = _account_query_step(hstmt);
3076 *error_code = _ACCOUNT_ERROR_NONE;
3079 if (hstmt != NULL) {
3080 rc = _account_query_finalize(hstmt);
3081 if (rc != _ACCOUNT_ERROR_NONE) {
3083 _ERR("global db fianlize error");
3087 if (*error_code != _ACCOUNT_ERROR_NONE)
3088 _account_type_gslist_feature_free(feature_list);
3090 _INFO("Returning account feature_list from global db");
3092 return feature_list;
3095 GSList* _account_type_query_provider_feature_by_app_id(const char* app_id, int *error_code)
3097 _INFO("_account_type_query_provider_feature_by_app_id app_id=%s", app_id);
3098 account_stmt hstmt = NULL;
3099 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3100 int rc = 0, binding_count = 1;
3101 GSList* feature_list = NULL;
3103 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
3104 ACCOUNT_RETURN_VAL((error_code != NULL), {_ERR("error_code pointer is NULL"); }, NULL, (""));
3105 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
3107 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3109 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
3110 _INFO("account query=[%s]", query);
3112 hstmt = _account_prepare_query(g_hAccountDB, query);
3114 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3115 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3116 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3120 _account_query_bind_text(hstmt, binding_count++, app_id);
3122 rc = _account_query_step(hstmt);
3124 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, { *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
3125 _ERR("The record isn't found from user db. rc=[%d]", rc); },
3126 _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3128 provider_feature_s* feature_record = NULL;
3130 while (rc == SQLITE_ROW) {
3132 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
3134 if (feature_record == NULL) {
3135 ACCOUNT_FATAL("malloc Failed");
3139 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
3141 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
3143 _INFO("Adding account feature_list");
3144 feature_list = g_slist_append(feature_list, feature_record);
3146 rc = _account_query_step(hstmt);
3149 *error_code = _ACCOUNT_ERROR_NONE;
3151 rc = _account_query_finalize(hstmt);
3152 ACCOUNT_CATCH_ERROR_P((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, rc, ("account finalize error"));
3156 if (hstmt != NULL) {
3157 rc = _account_query_finalize(hstmt);
3158 if (rc != _ACCOUNT_ERROR_NONE) {
3160 _ERR("account fianlize error");
3164 _INFO("*error_code=[%d]", *error_code);
3166 if (*error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3167 feature_list = _account_type_query_provider_feature_by_app_id_from_global_db(app_id, error_code);
3169 if (*error_code != _ACCOUNT_ERROR_NONE) {
3170 _account_type_gslist_feature_free(feature_list);
3174 _INFO("Returning account feature_list");
3176 return feature_list;
3179 int _account_type_query_provider_feature_cb_by_app_id_from_global_db(account_type_provider_feature_cb callback, const char* app_id, void *user_data)
3181 int error_code = _ACCOUNT_ERROR_NONE;
3182 account_stmt hstmt = NULL;
3183 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3184 int rc = 0, binding_count = 1;
3186 _INFO("_account_type_query_provider_feature_cb_by_app_id_in_global_db start app_id=%s", app_id);
3187 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3188 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3189 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3191 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3193 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
3194 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3196 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3197 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3198 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_PERMISSION_DENIED, ("global db permission denied.\n"));
3201 _account_query_bind_text(hstmt, binding_count++, app_id);
3203 rc = _account_query_step(hstmt);
3204 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {_ERR("The record isn't found. rc=[%d]", rc); }, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3206 provider_feature_s* feature_record = NULL;
3208 while (rc == SQLITE_ROW) {
3209 bool cb_ret = FALSE;
3210 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
3212 if (feature_record == NULL) {
3213 ACCOUNT_FATAL("malloc Failed");
3217 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
3219 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
3221 cb_ret = callback(feature_record->app_id, feature_record->key, user_data);
3223 _account_type_free_feature_with_items(feature_record);
3225 ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returns FALSE, its iteration is stopped!!!!\n"));
3227 rc = _account_query_step(hstmt);
3230 error_code = _ACCOUNT_ERROR_NONE;
3233 if (hstmt != NULL) {
3234 rc = _account_query_finalize(hstmt);
3235 if (rc != _ACCOUNT_ERROR_NONE) {
3237 _ERR("global db finalize error[%d]", rc);
3242 _INFO("_account_type_query_provider_feature_cb_by_app_id_in_global_db end. error_code=[%d]", error_code);
3247 int _account_type_query_provider_feature_cb_by_app_id(account_type_provider_feature_cb callback, const char* app_id, void *user_data)
3249 int error_code = _ACCOUNT_ERROR_NONE;
3250 account_stmt hstmt = NULL;
3251 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3252 int rc = 0, binding_count = 1;
3254 _INFO("_account_type_query_provider_feature_cb_by_app_id start app_id=%s", app_id);
3255 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3256 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3257 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3259 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3261 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
3262 hstmt = _account_prepare_query(g_hAccountDB, query);
3264 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3265 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3266 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3269 _account_query_bind_text(hstmt, binding_count++, app_id);
3271 rc = _account_query_step(hstmt);
3272 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found in user db.\n"));
3274 provider_feature_s* feature_record = NULL;
3276 while (rc == SQLITE_ROW) {
3277 bool cb_ret = FALSE;
3278 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
3280 if (feature_record == NULL) {
3281 ACCOUNT_FATAL("malloc Failed");
3285 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
3287 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
3289 cb_ret = callback(feature_record->app_id, feature_record->key, user_data);
3291 _account_type_free_feature_with_items(feature_record);
3293 ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
3295 rc = _account_query_step(hstmt);
3298 rc = _account_query_finalize(hstmt);
3299 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3302 error_code = _ACCOUNT_ERROR_NONE;
3305 if (hstmt != NULL) {
3306 rc = _account_query_finalize(hstmt);
3307 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3311 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3312 error_code = _account_type_query_provider_feature_cb_by_app_id_from_global_db(callback, app_id, user_data);
3314 _INFO("_account_type_query_provider_feature_cb_by_app_id end");
3319 int account_type_query_provider_feature_cb_by_app_id(account_type_provider_feature_cb callback, const char* app_id, void *user_data)
3321 int error_code = _ACCOUNT_ERROR_NONE;
3323 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3324 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3325 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3327 error_code = _account_type_query_provider_feature_cb_by_app_id(callback, app_id, user_data);
3329 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3330 error_code = _account_type_query_provider_feature_cb_by_app_id_from_global_db(callback, app_id, user_data);
3335 bool _account_type_query_supported_feature_from_global_db(const char* app_id, const char* capability, int *error_code)
3337 _INFO("_account_type_query_supported_feature_in_global_db start");
3338 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3340 *error_code = _ACCOUNT_ERROR_NONE;
3342 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3343 int record_count = 0;
3345 if (app_id == NULL || capability == NULL) {
3346 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
3350 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s where app_id='%s' and key='%s'", PROVIDER_FEATURE_TABLE, app_id, capability);
3352 record_count = _account_get_record_count(g_hAccountGlobalDB, query);
3354 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3355 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3356 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3359 if (record_count <= 0) {
3360 *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
3364 _INFO("_account_type_query_supported_feature_in_global_db end");
3369 bool _account_type_query_supported_feature(const char* app_id, const char* capability, int *error_code)
3371 _INFO("_account_type_query_supported_feature start");
3373 *error_code = _ACCOUNT_ERROR_NONE;
3375 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3376 int record_count = 0;
3378 if (app_id == NULL || capability == NULL) {
3379 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
3383 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s where app_id='%s' and key='%s'", PROVIDER_FEATURE_TABLE, app_id, capability);
3385 record_count = _account_get_record_count(g_hAccountDB, query);
3387 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3388 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3389 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3393 if (record_count <= 0) {
3394 bool is_exist = false;
3395 is_exist = _account_type_query_supported_feature_from_global_db(app_id, capability, error_code);
3400 _INFO("_account_type_query_supported_feature end");
3406 static int _account_type_update_provider_feature(sqlite3 *account_db_handle, account_type_s *account_type, const char* app_id)
3409 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3410 account_stmt hstmt = NULL;
3412 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
3414 if (g_slist_length(account_type->provider_feature_list) == 0) {
3415 ACCOUNT_ERROR("no feature\n");
3416 return _ACCOUNT_ERROR_NONE;
3419 ACCOUNT_DEBUG("app id", app_id);
3421 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3423 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE app_id=? ", PROVIDER_FEATURE_TABLE);
3424 hstmt = _account_prepare_query(account_db_handle, query);
3426 if (_account_db_err_code(account_db_handle) == SQLITE_PERM) {
3427 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(account_db_handle));
3428 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3432 _account_query_bind_text(hstmt, count++, app_id);
3433 rc = _account_query_step(hstmt);
3435 if (rc != SQLITE_DONE) {
3436 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3437 return _ACCOUNT_ERROR_DB_FAILED;
3439 rc = _account_query_finalize(hstmt);
3440 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3445 for (iter = account_type->provider_feature_list; iter != NULL; iter = g_slist_next(iter)) {
3448 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3449 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(app_id, key) VALUES "
3450 "(?, ?) ", PROVIDER_FEATURE_TABLE);
3452 hstmt = _account_prepare_query(account_db_handle, query);
3454 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query() failed(%s).\n", _account_db_err_msg(account_db_handle)));
3456 provider_feature_s* feature_data = NULL;
3457 feature_data = (provider_feature_s*)iter->data;
3459 ret = _account_query_bind_text(hstmt, count++, account_type->app_id);
3460 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3461 ret = _account_query_bind_text(hstmt, count++, feature_data->key);
3462 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3464 rc = _account_query_step(hstmt);
3466 if (rc != SQLITE_DONE) {
3467 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3470 rc = _account_query_finalize(hstmt);
3471 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3475 return _ACCOUNT_ERROR_NONE;
3478 static int _account_type_update_label(sqlite3 *account_db_handle, account_type_s *account_type, const char* app_id)
3481 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3482 account_stmt hstmt = NULL;
3484 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
3486 if (g_slist_length(account_type->label_list) == 0)
3487 return _ACCOUNT_ERROR_NONE;
3489 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3491 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AppId=? ", LABEL_TABLE);
3492 hstmt = _account_prepare_query(account_db_handle, query);
3494 if (_account_db_err_code(account_db_handle) == SQLITE_PERM) {
3495 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(account_db_handle));
3496 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3500 _account_query_bind_text(hstmt, count++, app_id);
3501 rc = _account_query_step(hstmt);
3503 if (rc != SQLITE_DONE) {
3504 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3505 return _ACCOUNT_ERROR_DB_FAILED;
3507 rc = _account_query_finalize(hstmt);
3508 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3513 for (iter = account_type->label_list; iter != NULL; iter = g_slist_next(iter)) {
3516 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3517 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(AppId, Label, Locale) VALUES "
3518 "(?, ?, ?) ", LABEL_TABLE);
3520 hstmt = _account_prepare_query(account_db_handle, query);
3522 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query() failed(%s).\n", _account_db_err_msg(account_db_handle)));
3524 label_s* label_data = NULL;
3525 label_data = (label_s*)iter->data;
3527 ret = _account_query_bind_text(hstmt, count++, account_type->app_id);
3528 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3529 ret = _account_query_bind_text(hstmt, count++, label_data->label);
3530 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3531 ret = _account_query_bind_text(hstmt, count++, label_data->locale);
3532 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3534 rc = _account_query_step(hstmt);
3536 if (rc != SQLITE_DONE) {
3537 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3540 rc = _account_query_finalize(hstmt);
3541 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3545 return _ACCOUNT_ERROR_NONE;
3549 static int _account_type_update_account(sqlite3 *account_db_handle, account_type_s *account_type, const char* app_id)
3551 int rc = 0, binding_count = 1;
3552 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3553 int error_code = _ACCOUNT_ERROR_NONE;
3554 account_stmt hstmt = NULL;
3556 if (!account_type->app_id) {
3557 ACCOUNT_ERROR("app id is mandetory field, it can not be NULL!!!!\n");
3558 return _ACCOUNT_ERROR_INVALID_PARAMETER;
3561 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3562 ACCOUNT_SNPRINTF(query, sizeof(query), "UPDATE %s SET AppId=?, ServiceProviderId=?, IconPath=?, "
3563 "SmallIconPath=?, MultipleAccountSupport=? WHERE AppId=? ", ACCOUNT_TYPE_TABLE);
3565 hstmt = _account_prepare_query(account_db_handle, query);
3567 if (_account_db_err_code(account_db_handle) == SQLITE_PERM) {
3568 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(account_db_handle));
3569 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3570 } else if (_account_db_err_code(account_db_handle) == SQLITE_BUSY) {
3571 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(account_db_handle));
3572 return _ACCOUNT_ERROR_DATABASE_BUSY;
3575 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_svc_query_prepare() failed(%s).\n", _account_db_err_msg(account_db_handle)));
3577 binding_count = _account_type_convert_account_to_sql(account_type, hstmt, query);
3578 _account_query_bind_text(hstmt, binding_count++, app_id);
3580 rc = _account_query_step(hstmt);
3581 if (rc != SQLITE_DONE)
3582 ACCOUNT_ERROR("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3584 rc = _account_query_finalize(hstmt);
3585 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3589 error_code = _account_type_update_label(account_db_handle, account_type, app_id);
3590 /* update provider feature */
3591 error_code = _account_type_update_provider_feature(account_db_handle, account_type, app_id);
3596 int _account_type_update_to_db_by_app_id(account_type_s* account_type, const char* app_id)
3598 int error_code = _ACCOUNT_ERROR_NONE;
3600 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("DATA IS NULL"));
3601 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3602 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3604 account_type_s* data = account_type;
3606 pthread_mutex_lock(&account_mutex);
3608 error_code = _account_type_update_account(g_hAccountDB, data, app_id);
3610 pthread_mutex_unlock(&account_mutex);
3615 GSList* _account_type_get_label_list_by_app_id_from_global_db(const char* app_id, int *error_code)
3617 *error_code = _ACCOUNT_ERROR_NONE;
3618 account_stmt hstmt = NULL;
3619 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3620 int rc = 0, binding_count = 1;
3621 GSList* label_list = NULL;
3623 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
3624 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3626 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3628 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3629 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3631 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3632 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3633 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3638 _account_query_bind_text(hstmt, binding_count++, app_id);
3640 rc = _account_query_step(hstmt);
3641 ACCOUNT_CATCH_ERROR_P((rc == SQLITE_ROW), {_ERR("The record isn't found. rc=[%d] done", rc); }, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3643 label_s* label_record = NULL;
3645 while (rc == SQLITE_ROW) {
3646 label_record = (label_s*) malloc(sizeof(label_s));
3648 if (label_record == NULL) {
3649 ACCOUNT_FATAL("malloc Failed");
3653 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3655 _account_type_convert_column_to_label(hstmt, label_record);
3657 _INFO("Adding account label_list");
3658 label_list = g_slist_append(label_list, label_record);
3660 rc = _account_query_step(hstmt);
3663 *error_code = _ACCOUNT_ERROR_NONE;
3666 if (hstmt != NULL) {
3667 rc = _account_query_finalize(hstmt);
3668 if (rc != _ACCOUNT_ERROR_NONE)
3669 _ERR("global db finalize error[%d]", rc);
3673 _INFO("Returning account global label_list");
3678 GSList* _account_type_get_label_list_by_app_id(const char* app_id, int *error_code)
3680 *error_code = _ACCOUNT_ERROR_NONE;
3681 account_stmt hstmt = NULL;
3682 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3683 int rc = 0, binding_count = 1;
3684 GSList* label_list = NULL;
3686 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
3687 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
3689 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3691 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3692 hstmt = _account_prepare_query(g_hAccountDB, query);
3694 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3695 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3696 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3700 _account_query_bind_text(hstmt, binding_count++, app_id);
3702 rc = _account_query_step(hstmt);
3703 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3705 label_s* label_record = NULL;
3707 while (rc == SQLITE_ROW) {
3708 label_record = (label_s*) malloc(sizeof(label_s));
3710 if (label_record == NULL) {
3711 ACCOUNT_FATAL("malloc Failed");
3715 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3717 _account_type_convert_column_to_label(hstmt, label_record);
3719 _INFO("Adding account label_list");
3720 label_list = g_slist_append(label_list, label_record);
3722 rc = _account_query_step(hstmt);
3725 rc = _account_query_finalize(hstmt);
3726 if (rc != _ACCOUNT_ERROR_NONE) {
3727 _account_type_gslist_label_free(label_list);
3729 _ERR("finalize error");
3734 *error_code = _ACCOUNT_ERROR_NONE;
3737 if (hstmt != NULL) {
3738 rc = _account_query_finalize(hstmt);
3739 if (rc != _ACCOUNT_ERROR_NONE) {
3740 _account_type_gslist_label_free(label_list);
3742 _ERR("finalize error");
3748 if (*error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3749 label_list = _account_type_get_label_list_by_app_id_from_global_db(app_id, error_code);
3751 _INFO("Returning account label_list");
3756 int _account_type_query_label_by_app_id_from_global_db(account_type_label_cb callback, const char* app_id, void *user_data)
3758 int error_code = _ACCOUNT_ERROR_NONE;
3759 account_stmt hstmt = NULL;
3760 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3761 int rc = 0, binding_count = 1;
3763 _INFO("account_type_query_label_by_app_id_from_global_db start");
3765 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3766 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3767 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3769 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3771 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3772 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3774 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3775 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3776 error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3780 _account_query_bind_text(hstmt, binding_count++, app_id);
3782 rc = _account_query_step(hstmt);
3783 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3785 label_s* label_record = NULL;
3787 while (rc == SQLITE_ROW) {
3788 bool cb_ret = FALSE;
3789 label_record = (label_s*) malloc(sizeof(label_s));
3791 if (label_record == NULL) {
3792 ACCOUNT_FATAL("malloc Failed");
3796 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3798 _account_type_convert_column_to_label(hstmt, label_record);
3800 cb_ret = callback(label_record->app_id, label_record->label , label_record->locale, user_data);
3802 _account_type_free_label_with_items(label_record);
3804 ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
3806 rc = _account_query_step(hstmt);
3809 error_code = _ACCOUNT_ERROR_NONE;
3812 if (hstmt != NULL) {
3813 rc = _account_query_finalize(hstmt);
3814 if (rc != _ACCOUNT_ERROR_NONE)
3815 _ERR("global db finalize error[%d]", rc);
3819 _INFO("account_type_query_label_by_app_id_from_global_db end [%d]", error_code);
3824 int _account_type_query_label_by_app_id(account_type_label_cb callback, const char* app_id, void *user_data)
3826 int error_code = _ACCOUNT_ERROR_NONE;
3827 account_stmt hstmt = NULL;
3828 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3829 int rc = 0, binding_count = 1;
3831 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3832 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3833 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3835 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3837 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3838 hstmt = _account_prepare_query(g_hAccountDB, query);
3840 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3841 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3842 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3845 _account_query_bind_text(hstmt, binding_count++, app_id);
3847 rc = _account_query_step(hstmt);
3848 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3850 label_s* label_record = NULL;
3852 while (rc == SQLITE_ROW) {
3853 bool cb_ret = FALSE;
3854 label_record = (label_s*) malloc(sizeof(label_s));
3856 if (label_record == NULL) {
3857 ACCOUNT_FATAL("malloc Failed");
3861 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3863 _account_type_convert_column_to_label(hstmt, label_record);
3865 cb_ret = callback(label_record->app_id, label_record->label , label_record->locale, user_data);
3867 _account_type_free_label_with_items(label_record);
3869 //ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
3870 if (cb_ret != TRUE) {
3871 _INFO("Callback func returs FALSE, its iteration is stopped!!!!\n");
3875 rc = _account_query_step(hstmt);
3878 rc = _account_query_finalize(hstmt);
3879 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3882 error_code = _ACCOUNT_ERROR_NONE;
3885 if (hstmt != NULL) {
3886 rc = _account_query_finalize(hstmt);
3887 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3891 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
3892 error_code = account_type_query_label_by_app_id_from_global_db(callback, app_id, user_data);
3898 int account_type_query_label_by_app_id(account_type_label_cb callback, const char* app_id, void *user_data)
3900 int error_code = _ACCOUNT_ERROR_NONE;
3902 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3903 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3904 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3906 error_code = _account_type_query_label_by_app_id(callback, app_id, user_data);
3908 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3909 error_code = _account_type_query_label_by_app_id_from_global_db(callback, app_id, user_data);
3914 bool _account_get_label_text_cb(char* app_id, char* label, char* locale, void *user_data)
3916 account_type_s *data = (account_type_s*)user_data;
3918 label_s *label_data = (label_s*)malloc(sizeof(label_s));
3920 if (label_data == NULL) {
3921 ACCOUNT_FATAL("_account_get_label_text_cb : MALLOC FAIL\n");
3924 ACCOUNT_MEMSET(label_data, 0, sizeof(label_s));
3926 label_data->app_id = _account_dup_text(app_id);
3927 label_data->label = _account_dup_text(label);
3928 label_data->locale = _account_dup_text(locale);
3930 data->label_list = g_slist_append(data->label_list, (gpointer)label_data);
3935 bool _account_get_provider_feature_cb(char* app_id, char* key, void* user_data)
3937 account_type_s *data = (account_type_s*)user_data;
3939 provider_feature_s *feature_data = (provider_feature_s*)malloc(sizeof(provider_feature_s));
3941 if (feature_data == NULL) {
3942 ACCOUNT_FATAL("_account_get_provider_feature_cb : MALLOC FAIL\n");
3945 ACCOUNT_MEMSET(feature_data, 0, sizeof(provider_feature_s));
3947 feature_data->app_id = _account_dup_text(app_id);
3948 feature_data->key = _account_dup_text(key);
3950 data->provider_feature_list = g_slist_append(data->provider_feature_list, (gpointer)feature_data);
3955 int _account_type_query_by_app_id_from_global_db(const char* app_id, account_type_s** account_type_record)
3957 _INFO("_account_type_query_by_app_id_from_global_db start");
3959 int error_code = _ACCOUNT_ERROR_NONE;
3960 account_stmt hstmt = NULL;
3961 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3962 int rc = 0, binding_count = 1;
3964 ACCOUNT_RETURN_VAL((app_id != 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3965 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3966 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3968 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3970 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", ACCOUNT_TYPE_TABLE);
3971 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3973 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3974 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3975 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3978 _account_query_bind_text(hstmt, binding_count++, app_id);
3980 rc = _account_query_step(hstmt);
3981 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3983 *account_type_record = create_empty_account_type_instance();
3985 while (rc == SQLITE_ROW) {
3986 _account_type_convert_column_to_account_type(hstmt, *account_type_record);
3987 rc = _account_query_step(hstmt);
3990 rc = _account_query_finalize(hstmt);
3991 ACCOUNT_CATCH_ERROR((rc == _ACCOUNT_ERROR_NONE), {_ERR("global db finalize error rc=[%d]", rc); }, rc, ("finalize error"));
3992 _account_type_query_label_by_app_id_from_global_db(_account_get_label_text_cb, app_id, (void*)(*account_type_record));
3993 _account_type_query_provider_feature_cb_by_app_id_from_global_db(_account_get_provider_feature_cb, app_id, (void*)(*account_type_record));
3996 error_code = _ACCOUNT_ERROR_NONE;
3999 if (hstmt != NULL) {
4000 rc = _account_query_finalize(hstmt);
4001 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4005 _INFO("_account_type_query_by_app_id_from_global_db end [%d]", error_code);
4010 int _account_type_query_by_app_id(const char* app_id, account_type_s** account_type_record)
4012 _INFO("_account_type_query_by_app_id start");
4014 int error_code = _ACCOUNT_ERROR_NONE;
4015 account_stmt hstmt = NULL;
4016 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4017 int rc = 0, binding_count = 1;
4019 ACCOUNT_RETURN_VAL((app_id != 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
4020 ACCOUNT_RETURN_VAL((account_type_record != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("account type record(account_type_s**) is NULL"));
4021 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
4023 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4025 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", ACCOUNT_TYPE_TABLE);
4026 hstmt = _account_prepare_query(g_hAccountDB, query);
4028 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4029 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4030 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4033 _account_query_bind_text(hstmt, binding_count++, app_id);
4035 rc = _account_query_step(hstmt);
4036 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
4038 *account_type_record = create_empty_account_type_instance();
4039 if (*account_type_record == NULL) {
4040 _ERR("Out of Memory");
4041 error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
4045 while (rc == SQLITE_ROW) {
4046 _account_type_convert_column_to_account_type(hstmt, *account_type_record);
4047 rc = _account_query_step(hstmt);
4050 rc = _account_query_finalize(hstmt);
4051 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4052 _account_type_query_label_by_app_id(_account_get_label_text_cb, app_id, (void*)(*account_type_record));
4053 _account_type_query_provider_feature_cb_by_app_id(_account_get_provider_feature_cb, app_id, (void*)(*account_type_record));
4056 error_code = _ACCOUNT_ERROR_NONE;
4059 if (hstmt != NULL) {
4060 rc = _account_query_finalize(hstmt);
4061 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4065 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
4066 error_code = _account_type_query_by_app_id_from_global_db(app_id, account_type_record);
4068 _INFO("_account_type_query_by_app_id end [%d]", error_code);
4073 int _account_type_query_by_provider_feature_from_global_db(const char* key, GSList **account_type_list_all)
4075 int error_code = _ACCOUNT_ERROR_NONE;
4076 account_stmt hstmt = NULL;
4077 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4079 GSList *account_type_list = NULL;
4081 _INFO("_account_type_query_by_provider_feature_from_global_db start key=%s", key);
4083 ACCOUNT_ERROR("capability_type IS NULL.");
4084 error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
4088 if (g_hAccountGlobalDB == NULL) {
4089 ACCOUNT_ERROR("The database isn't connected.");
4090 error_code = _ACCOUNT_ERROR_DB_NOT_OPENED;
4094 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4096 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId IN (SELECT app_id from %s WHERE key=?)", ACCOUNT_TYPE_TABLE, PROVIDER_FEATURE_TABLE);
4098 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
4100 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
4101 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
4102 error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
4106 int binding_count = 1;
4107 _account_query_bind_text(hstmt, binding_count++, key);
4109 rc = _account_query_step(hstmt);
4111 account_type_s *account_type_record = NULL;
4113 if (rc != SQLITE_ROW) {
4114 ACCOUNT_ERROR("The record isn't found. rc=[%d]", rc);
4115 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4119 while (rc == SQLITE_ROW) {
4120 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4122 if (account_type_record == NULL) {
4123 ACCOUNT_FATAL("malloc Failed");
4127 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4128 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4129 account_type_list = g_slist_append(account_type_list, account_type_record);
4130 rc = _account_query_step(hstmt);
4133 rc = _account_query_finalize(hstmt);
4134 if (rc != _ACCOUNT_ERROR_NONE) {
4135 _account_type_gslist_account_type_free(account_type_list);
4136 ACCOUNT_ERROR("finalize error(%s)", rc);
4144 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4145 account_type_s *account_type = NULL;
4146 account_type = (account_type_s*)iter->data;
4147 _account_type_query_label_by_app_id_from_global_db(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4148 _account_type_query_provider_feature_cb_by_app_id_from_global_db(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4149 _INFO("add label & provider_feature");
4152 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4154 account_type_s *account_type = NULL;
4155 account_type = (account_type_s*)iter->data;
4156 *account_type_list_all = g_slist_append(*account_type_list_all, account_type);
4157 _INFO("add account_type");
4159 g_slist_free(account_type_list);
4161 error_code = _ACCOUNT_ERROR_NONE;
4164 if (hstmt != NULL) {
4165 rc = _account_query_finalize(hstmt);
4166 if (rc != _ACCOUNT_ERROR_NONE) {
4167 ACCOUNT_ERROR("finalize error(%s)", rc);
4173 _INFO("_account_type_query_by_provider_feature_from_global_db end. error_code=[%d]", error_code);
4178 GSList* _account_type_query_by_provider_feature(const char* key, int *error_code)
4180 *error_code = _ACCOUNT_ERROR_NONE;
4181 account_stmt hstmt = NULL;
4182 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4184 GSList *account_type_list = NULL;
4186 _INFO("account_type_query_by_provider_feature start key=%s", key);
4188 ACCOUNT_ERROR("capability_type IS NULL.");
4189 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
4193 if (g_hAccountDB == NULL) {
4194 ACCOUNT_ERROR("The database isn't connected.");
4195 *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED;
4199 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4201 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId IN (SELECT app_id from %s WHERE key=?)", ACCOUNT_TYPE_TABLE, PROVIDER_FEATURE_TABLE);
4203 hstmt = _account_prepare_query(g_hAccountDB, query);
4205 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4206 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4207 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
4211 int binding_count = 1;
4212 _account_query_bind_text(hstmt, binding_count++, key);
4214 rc = _account_query_step(hstmt);
4216 account_type_s *account_type_record = NULL;
4218 if (rc != SQLITE_ROW) {
4219 ACCOUNT_ERROR("The record isn't found. rc=[%d]", rc);
4220 *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4224 while (rc == SQLITE_ROW) {
4225 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4227 if (account_type_record == NULL) {
4228 ACCOUNT_FATAL("malloc Failed");
4232 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4233 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4234 account_type_list = g_slist_append(account_type_list, account_type_record);
4235 rc = _account_query_step(hstmt);
4238 rc = _account_query_finalize(hstmt);
4239 if (rc != _ACCOUNT_ERROR_NONE) {
4240 _account_type_gslist_account_type_free(account_type_list);
4241 ACCOUNT_ERROR("finalize error(%s)", rc);
4249 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4250 account_type_s *account_type = NULL;
4251 account_type = (account_type_s*)iter->data;
4252 _account_type_query_label_by_app_id(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4253 _account_type_query_provider_feature_cb_by_app_id(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4256 *error_code = _ACCOUNT_ERROR_NONE;
4259 if (hstmt != NULL) {
4260 rc = _account_query_finalize(hstmt);
4261 if (rc != _ACCOUNT_ERROR_NONE) {
4268 if (*error_code == _ACCOUNT_ERROR_NONE || *error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4269 rc = _account_type_query_by_provider_feature_from_global_db(key, &account_type_list);
4270 if (rc != _ACCOUNT_ERROR_NONE && rc != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4271 ACCOUNT_ERROR("_account_type_query_by_provider_feature_from_global_db fail=[%d]", rc);
4272 _account_type_gslist_account_type_free(account_type_list);
4275 if (rc == _ACCOUNT_ERROR_NONE)
4279 _INFO("account_type_query_by_provider_feature end");
4281 return account_type_list;
4284 int _account_type_query_all_from_global_db(GSList **account_type_list_all)
4286 account_stmt hstmt = NULL;
4287 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4288 int rc = _ACCOUNT_ERROR_NONE;
4289 int error_code = _ACCOUNT_ERROR_NONE;
4290 GSList *account_type_list = NULL;
4292 _INFO("_account_type_query_all_in_global_db start");
4293 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, NULL, ("The database isn't connected."));
4295 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4297 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s ", ACCOUNT_TYPE_TABLE);
4298 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
4300 rc = _account_query_step(hstmt);
4302 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
4303 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
4304 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4307 account_type_s *account_type_record = NULL;
4309 if (rc != SQLITE_ROW) {
4310 _INFO("[_ACCOUNT_ERROR_RECORD_NOT_FOUND]The record isn't found.");
4311 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4315 while (rc == SQLITE_ROW) {
4316 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4318 if (account_type_record == NULL) {
4319 ACCOUNT_FATAL("malloc Failed");
4323 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4324 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4325 account_type_list = g_slist_append(account_type_list, account_type_record);
4326 rc = _account_query_step(hstmt);
4329 rc = _account_query_finalize(hstmt);
4330 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, rc, ("finalize error"));
4335 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4336 account_type_s *account_type = NULL;
4337 account_type = (account_type_s*)iter->data;
4338 _account_type_query_label_by_app_id_from_global_db(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4339 _account_type_query_provider_feature_cb_by_app_id_from_global_db(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4342 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4343 account_type_s *account_type = NULL;
4344 account_type = (account_type_s*)iter->data;
4345 *account_type_list_all = g_slist_append(*account_type_list_all, account_type);
4347 g_slist_free(account_type_list);
4349 error_code = _ACCOUNT_ERROR_NONE;
4352 if (hstmt != NULL) {
4353 rc = _account_query_finalize(hstmt);
4354 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, rc, ("finalize error"));
4358 _INFO("_account_type_query_all_in_global_db end");
4363 GSList* _account_type_query_all(void)
4365 account_stmt hstmt = NULL;
4366 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4368 int error_code = _ACCOUNT_ERROR_NONE;
4369 GSList *account_type_list = NULL;
4371 _INFO("_account_type_query_all start");
4372 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, NULL, ("The database isn't connected."));
4374 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4376 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s ", ACCOUNT_TYPE_TABLE);
4377 hstmt = _account_prepare_query(g_hAccountDB, query);
4379 rc = _account_query_step(hstmt);
4381 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4382 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4386 account_type_s *account_type_record = NULL;
4388 if (rc != SQLITE_ROW) {
4389 _INFO("[_ACCOUNT_ERROR_RECORD_NOT_FOUND]The record isn't found.");
4390 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4394 while (rc == SQLITE_ROW) {
4395 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4397 if (account_type_record == NULL) {
4398 ACCOUNT_FATAL("malloc Failed");
4402 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4403 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4404 account_type_list = g_slist_append(account_type_list, account_type_record);
4405 rc = _account_query_step(hstmt);
4408 rc = _account_query_finalize(hstmt);
4409 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, NULL, ("finalize error"));
4414 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4415 account_type_s *account_type = NULL;
4416 account_type = (account_type_s*)iter->data;
4417 _account_type_query_label_by_app_id(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4418 _account_type_query_provider_feature_cb_by_app_id(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4421 error_code = _ACCOUNT_ERROR_NONE;
4424 if (hstmt != NULL) {
4425 rc = _account_query_finalize(hstmt);
4426 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, NULL, ("finalize error"));
4430 if (error_code == _ACCOUNT_ERROR_NONE || error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4431 error_code = _account_type_query_all_from_global_db(&account_type_list);
4432 if (rc != _ACCOUNT_ERROR_NONE && rc != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4433 ACCOUNT_ERROR("_account_type_query_all_from_global_db fail=[%d]", rc);
4434 _account_type_gslist_account_type_free(account_type_list);
4439 _INFO("_account_type_query_all end");
4441 return account_type_list;
4444 // output parameter label must be free
4445 int _account_type_query_label_by_locale_from_global_db(const char* app_id, const char* locale, char **label)
4447 int error_code = _ACCOUNT_ERROR_NONE;
4448 account_stmt hstmt = NULL;
4449 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4450 int rc = 0, binding_count = 1;
4451 char* converted_locale = NULL;
4453 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO APP ID"));
4454 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
4455 ACCOUNT_RETURN_VAL((label != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("label char is null"));
4456 ACCOUNT_RETURN_VAL((locale != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("locale char is null"));
4457 //Making label newly created
4459 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4461 converted_locale = _account_dup_text(locale);
4462 gchar** tokens = g_strsplit(converted_locale, "-", 2);
4464 if (tokens != NULL) {
4465 if ((char*)(tokens[1]) != NULL) {
4466 char* upper_token = g_ascii_strup(tokens[1], strlen(tokens[1]));
4467 if (upper_token != NULL) {
4468 _ACCOUNT_FREE(converted_locale);
4469 converted_locale = g_strdup_printf("%s_%s", tokens[0], upper_token);
4471 _ACCOUNT_FREE(upper_token);
4476 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ? AND Locale = '%s' ", LABEL_TABLE, converted_locale);
4477 _ACCOUNT_FREE(converted_locale);
4479 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
4481 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
4482 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
4483 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4486 _account_query_bind_text(hstmt, binding_count++, app_id);
4488 rc = _account_query_step(hstmt);
4489 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
4491 label_s* label_record = NULL;
4493 while (rc == SQLITE_ROW) {
4494 label_record = (label_s*) malloc(sizeof(label_s));
4496 if (label_record == NULL) {
4497 ACCOUNT_FATAL("malloc Failed");
4501 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
4503 _account_type_convert_column_to_label(hstmt, label_record);
4505 _ACCOUNT_FREE(*label);
4506 //Making label newly created
4507 *label = _account_dup_text(label_record->label);
4509 _account_type_free_label_with_items(label_record);
4511 rc = _account_query_step(hstmt);
4514 rc = _account_query_finalize(hstmt);
4515 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4518 error_code = _ACCOUNT_ERROR_NONE;
4521 if (hstmt != NULL) {
4522 rc = _account_query_finalize(hstmt);
4523 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4527 _INFO("_account_type_query_label_by_locale_from_global_db() end : error_code = %d", error_code);
4532 // output parameter label must be free
4533 int _account_type_query_label_by_locale(const char* app_id, const char* locale, char **label)
4535 int error_code = _ACCOUNT_ERROR_NONE;
4536 account_stmt hstmt = NULL;
4537 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4538 int rc = 0, binding_count = 1;
4539 char* converted_locale = NULL;
4541 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO APP ID"));
4542 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
4543 ACCOUNT_RETURN_VAL((label != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("label char is null"));
4544 ACCOUNT_RETURN_VAL((locale != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("locale char is null"));
4545 //Making label newly created
4547 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4549 converted_locale = _account_dup_text(locale);
4550 gchar** tokens = g_strsplit(converted_locale, "-", 2);
4552 if (tokens != NULL) {
4553 if ((char*)(tokens[1]) != NULL) {
4554 char* upper_token = g_ascii_strup(tokens[1], strlen(tokens[1]));
4555 if (upper_token != NULL) {
4556 _ACCOUNT_FREE(converted_locale);
4557 converted_locale = g_strdup_printf("%s_%s", tokens[0], upper_token);
4559 _ACCOUNT_FREE(upper_token);
4564 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ? AND Locale = '%s' ", LABEL_TABLE, converted_locale);
4565 _ACCOUNT_FREE(converted_locale);
4567 hstmt = _account_prepare_query(g_hAccountDB, query);
4569 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4570 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4571 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4574 _account_query_bind_text(hstmt, binding_count++, app_id);
4576 rc = _account_query_step(hstmt);
4577 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
4579 label_s* label_record = NULL;
4581 while (rc == SQLITE_ROW) {
4582 label_record = (label_s*) malloc(sizeof(label_s));
4584 if (label_record == NULL) {
4585 ACCOUNT_FATAL("malloc Failed");
4589 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
4591 _account_type_convert_column_to_label(hstmt, label_record);
4593 _ACCOUNT_FREE(*label);
4594 //Making label newly created
4595 *label = _account_dup_text(label_record->label);
4597 _account_type_free_label_with_items(label_record);
4599 rc = _account_query_step(hstmt);
4602 rc = _account_query_finalize(hstmt);
4603 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4606 error_code = _ACCOUNT_ERROR_NONE;
4609 if (hstmt != NULL) {
4610 rc = _account_query_finalize(hstmt);
4611 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4615 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
4616 error_code = _account_type_query_label_by_locale_from_global_db(app_id, locale, label);
4618 _INFO("_account_type_query_label_by_locale() end : error_code = %d", error_code);
4623 static int _account_insert_custom(account_s *account, int account_id)
4625 _INFO("_account_insert_custom start");
4628 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4629 account_stmt hstmt = NULL;
4631 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
4633 if (g_slist_length(account->custom_list) == 0) {
4634 ACCOUNT_DEBUG("_account_insert_custom, no custom data\n");
4635 return _ACCOUNT_ERROR_NONE;
4638 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_id);
4640 rc = _account_get_record_count(g_hAccountDB, query);
4642 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4643 ACCOUNT_ERROR("Access failed(%d, %s)", _account_db_err_msg(g_hAccountDB));
4644 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4648 ACCOUNT_SLOGE("_account_insert_custom : related account item is not existed rc=%d , %s", rc, _account_db_err_msg(g_hAccountDB));
4649 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4656 for (iter = account->custom_list; iter != NULL; iter = g_slist_next(iter)) {
4659 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
4660 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s (AccountId, AppId, Key, Value) VALUES "
4661 "(?, ?, ?, ?) ", ACCOUNT_CUSTOM_TABLE);
4663 hstmt = _account_prepare_query(g_hAccountDB, query);
4665 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4666 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4667 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4670 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
4672 account_custom_s* custom_data = NULL;
4673 custom_data = (account_custom_s*)iter->data;
4675 ret = _account_query_bind_int(hstmt, count++, account_id);
4676 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Int binding fail"));
4677 ret = _account_query_bind_text(hstmt, count++, account->package_name);
4678 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4679 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->key);
4680 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4681 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->value);
4682 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4684 rc = _account_query_step(hstmt);
4686 if (rc != SQLITE_DONE) {
4687 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4691 rc = _account_query_finalize(hstmt);
4692 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4697 _INFO("_account_insert_custom end");
4699 return _ACCOUNT_ERROR_NONE;
4702 static int _account_update_custom(account_s *account, int account_id)
4705 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4706 account_stmt hstmt = NULL;
4708 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
4710 if (g_slist_length(account->custom_list) == 0) {
4711 ACCOUNT_DEBUG("_account_update_custom, no custom data\n");
4712 return _ACCOUNT_ERROR_NONE;
4715 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_id);
4717 rc = _account_get_record_count(g_hAccountDB, query);
4719 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4720 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4721 pthread_mutex_unlock(&account_mutex);
4722 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4723 } else if (_account_db_err_code(g_hAccountDB) == SQLITE_BUSY) {
4724 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
4725 pthread_mutex_unlock(&account_mutex);
4726 return _ACCOUNT_ERROR_DATABASE_BUSY;
4730 ACCOUNT_SLOGE("_account_update_custom : related account item is not existed rc=%d , %s", rc, _account_db_err_msg(g_hAccountDB));
4731 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4734 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
4736 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AccountId=? ", ACCOUNT_CUSTOM_TABLE);
4737 hstmt = _account_prepare_query(g_hAccountDB, query);
4739 _account_query_bind_int(hstmt, count++, (int)account_id);
4740 rc = _account_query_step(hstmt);
4742 if (rc == SQLITE_BUSY) {
4743 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4744 return _ACCOUNT_ERROR_DATABASE_BUSY;
4745 } else if (rc != SQLITE_DONE) {
4746 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4747 return _ACCOUNT_ERROR_DB_FAILED;
4750 rc = _account_query_finalize(hstmt);
4751 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4756 for (iter = account->custom_list; iter != NULL; iter = g_slist_next(iter)) {
4759 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
4760 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(AccountId, AppId, Key, Value) VALUES "
4761 "(?, ?, ?, ?) ", ACCOUNT_CUSTOM_TABLE);
4763 hstmt = _account_prepare_query(g_hAccountDB, query);
4765 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4766 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4767 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4770 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
4772 account_custom_s* custom_data = NULL;
4773 custom_data = (account_custom_s*)iter->data;
4775 ret = _account_query_bind_int(hstmt, count++, (int)account_id);
4776 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Int binding fail"));
4777 ret = _account_query_bind_text(hstmt, count++, (char*)account->package_name);
4778 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4779 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->key);
4780 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4781 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->value);
4782 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4784 rc = _account_query_step(hstmt);
4786 if (rc != SQLITE_DONE) {
4787 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4791 rc = _account_query_finalize(hstmt);
4792 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4797 return _ACCOUNT_ERROR_NONE;