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, false);
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, false);
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, false);
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, false);
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, false);
1764 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, account->id, (void*)account, false);
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_query_account_by_account_id(int pid, uid_t uid, int account_db_id, account_s *account_record, bool query_del_acc)
1862 _INFO("_account_query_account_by_account_id() start, account_db_id=[%d], query_del_acc=[%d]", account_db_id, query_del_acc);
1864 int error_code = _ACCOUNT_ERROR_NONE;
1865 account_stmt hstmt = NULL;
1866 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1869 ACCOUNT_RETURN_VAL((account_db_id > 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT INDEX IS LESS THAN 0"));
1870 ACCOUNT_RETURN_VAL(account_record != NULL, {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT IS NULL"));
1871 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
1873 ACCOUNT_DEBUG("starting db operations");
1875 /* prepare query for account-table */
1876 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1878 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id = %d", ACCOUNT_TABLE, account_db_id);
1880 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id = %d", DELETED_ACCOUNT_TABLE, account_db_id);
1882 _INFO("after _account_prepare_query, rc=[%d]", rc);
1884 hstmt = _account_prepare_query(g_hAccountDB, query);
1886 rc = _account_db_err_code(g_hAccountDB);
1887 if (rc == SQLITE_PERM) {
1888 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1889 return _ACCOUNT_ERROR_PERMISSION_DENIED;
1892 ACCOUNT_DEBUG("before _account_query_step");
1894 rc = _account_query_step(hstmt);
1896 ACCOUNT_DEBUG("after _account_query_step returned [%d]", rc);
1898 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
1900 while (rc == SQLITE_ROW) {
1901 ACCOUNT_DEBUG("before _account_convert_column_to_account");
1902 _account_convert_column_to_account(hstmt, account_record);
1903 ACCOUNT_DEBUG("after _account_convert_column_to_account");
1904 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]);
1905 rc = _account_query_step(hstmt);
1908 ACCOUNT_DEBUG("account_record->id=[%d]", account_record->id);
1910 rc = _account_query_finalize(hstmt);
1911 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1913 ACCOUNT_DEBUG("before _account_query_capability_by_account_id");
1914 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, account_record->id, (void*)account_record, query_del_acc);
1915 ACCOUNT_DEBUG("after _account_query_capability_by_account_id");
1917 ACCOUNT_DEBUG("before _account_query_custom_by_account_id");
1918 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, account_record->id, (void*)account_record, query_del_acc);
1919 ACCOUNT_DEBUG("after _account_query_custom_by_account_id");
1922 error_code = _ACCOUNT_ERROR_NONE;
1925 if (hstmt != NULL) {
1926 rc = _account_query_finalize(hstmt);
1927 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
1932 _remove_sensitive_info_from_non_owning_account(account_record, pid, uid);
1934 pthread_mutex_unlock(&account_mutex);
1935 ACCOUNT_DEBUG("_account_query_account_by_account_id end [%d]", error_code);
1940 GList* _account_query_account_by_user_name(int pid, uid_t uid, const char *user_name, int *error_code)
1942 *error_code = _ACCOUNT_ERROR_NONE;
1943 account_stmt hstmt = NULL;
1944 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
1946 account_s *account_head = NULL;
1948 if (user_name == NULL) {
1949 _ERR("USER NAME IS NULL");
1950 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
1954 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
1956 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE user_name = ?", ACCOUNT_TABLE);
1958 hstmt = _account_prepare_query(g_hAccountDB, query);
1960 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
1961 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
1962 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
1966 int binding_count = 1;
1967 _account_query_bind_text(hstmt, binding_count++, user_name);
1969 rc = _account_query_step(hstmt);
1971 if (rc != SQLITE_ROW) {
1972 _ERR("The record isn't found");
1973 *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
1979 account_head = (account_s*) malloc(sizeof(account_s));
1980 if (account_head == NULL) {
1981 ACCOUNT_FATAL("malloc Failed");
1982 if (hstmt != NULL) {
1983 rc = _account_query_finalize(hstmt);
1984 if (rc != _ACCOUNT_ERROR_NONE) {
1985 _ERR("finalize error");
1991 *error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
1994 ACCOUNT_MEMSET(account_head, 0x00, sizeof(account_s));
1996 while (rc == SQLITE_ROW) {
1997 account_s* account_record = NULL;
1999 account_record = (account_s*) malloc(sizeof(account_s));
2001 if (account_record == NULL) {
2002 ACCOUNT_FATAL("malloc Failed");
2005 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
2007 _account_convert_column_to_account(hstmt, account_record);
2009 account_head->account_list = g_list_append(account_head->account_list, account_record);
2011 rc = _account_query_step(hstmt);
2015 rc = _account_query_finalize(hstmt);
2017 if (rc != _ACCOUNT_ERROR_NONE) {
2018 _ERR("finalize error");
2027 tmp = g_list_length(account_head->account_list);
2029 for (iter = account_head->account_list; iter != NULL; iter = g_list_next(iter)) {
2030 //account_h account;
2031 //account = (account_h)iter->data;
2033 account_s *testaccount = (account_s*)iter->data;
2035 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, testaccount->id, (void*)testaccount, false);
2036 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, testaccount->id, (void*)testaccount, false);
2039 *error_code = _ACCOUNT_ERROR_NONE;
2042 if (hstmt != NULL) {
2043 rc = _account_query_finalize(hstmt);
2044 if (rc != _ACCOUNT_ERROR_NONE) {
2045 _ERR("finalize error");
2051 pthread_mutex_unlock(&account_mutex);
2054 _remove_sensitive_info_from_non_owning_account_list(account_head->account_list, pid, uid);
2055 GList* result = account_head->account_list;
2056 _ACCOUNT_FREE(account_head);
2064 _account_query_account_by_capability(int pid, uid_t uid, const char* capability_type, const int capability_value, int *error_code)
2066 *error_code = _ACCOUNT_ERROR_NONE;
2067 account_stmt hstmt = NULL;
2068 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2071 ACCOUNT_RETURN_VAL((capability_type != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("capability_type IS NULL"));
2073 if ((capability_value < 0) || (capability_value >= _ACCOUNT_CAPABILITY_STATE_MAX)) {
2074 ACCOUNT_SLOGE("(%s)-(%d) capability_value is not equal to 0 or 1.\n", __FUNCTION__, __LINE__);
2075 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
2079 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
2081 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2083 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id IN (SELECT account_id from %s WHERE key=? AND value=?)", ACCOUNT_TABLE, CAPABILITY_TABLE);
2085 hstmt = _account_prepare_query(g_hAccountDB, query);
2087 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2088 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2089 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2093 int binding_count = 1;
2094 _account_query_bind_text(hstmt, binding_count++, capability_type);
2095 _account_query_bind_int(hstmt, binding_count++, capability_value);
2097 rc = _account_query_step(hstmt);
2099 account_s* account_head = NULL;
2101 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2105 account_head = (account_s*) malloc(sizeof(account_s));
2106 if (account_head == NULL) {
2107 ACCOUNT_FATAL("malloc Failed");
2108 if (hstmt != NULL) {
2109 rc = _account_query_finalize(hstmt);
2110 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
2113 *error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
2116 ACCOUNT_MEMSET(account_head, 0x00, sizeof(account_s));
2118 while (rc == SQLITE_ROW) {
2119 account_s* account_record = NULL;
2121 account_record = (account_s*) malloc(sizeof(account_s));
2123 if (account_record == NULL) {
2124 ACCOUNT_FATAL("malloc Failed");
2127 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
2129 _account_convert_column_to_account(hstmt, account_record);
2131 account_head->account_list = g_list_append(account_head->account_list, account_record);
2133 rc = _account_query_step(hstmt);
2137 rc = _account_query_finalize(hstmt);
2138 ACCOUNT_CATCH_ERROR_P((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2144 tmp = g_list_length(account_head->account_list);
2146 for (iter = account_head->account_list; iter != NULL; iter = g_list_next(iter)) {
2147 //account_h account = NULL;
2148 //account = (account_h)iter->data;
2149 account_s* testaccount = (account_s*)iter->data;
2151 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, testaccount->id, (void*)testaccount, false);
2152 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, testaccount->id, (void*)testaccount, false);
2156 *error_code = _ACCOUNT_ERROR_NONE;
2159 if (hstmt != NULL) {
2160 rc = _account_query_finalize(hstmt);
2161 if (rc != _ACCOUNT_ERROR_NONE) {
2163 _ERR("finalize error");
2168 if (*error_code != _ACCOUNT_ERROR_NONE && account_head) {
2169 _account_glist_account_free(account_head->account_list);
2170 _ACCOUNT_FREE(account_head);
2171 account_head = NULL;
2174 pthread_mutex_unlock(&account_mutex);
2177 _remove_sensitive_info_from_non_owning_account_list(account_head->account_list, pid, uid);
2178 GList* result = account_head->account_list;
2179 _ACCOUNT_FREE(account_head);
2186 GList* _account_query_account_by_capability_type(int pid, uid_t uid, const char* capability_type, int *error_code)
2188 *error_code = _ACCOUNT_ERROR_NONE;
2189 account_stmt hstmt = NULL;
2190 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2193 ACCOUNT_RETURN_VAL((capability_type != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("capability_type IS NULL"));
2194 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; },
2195 NULL, ("The database isn't connected."));
2197 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2199 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE _id IN (SELECT account_id from %s WHERE key=?)", ACCOUNT_TABLE, CAPABILITY_TABLE);
2201 hstmt = _account_prepare_query(g_hAccountDB, query);
2203 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2204 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2205 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2209 int binding_count = 1;
2210 _account_query_bind_text(hstmt, binding_count++, capability_type);
2212 rc = _account_query_step(hstmt);
2214 account_s* account_head = NULL;
2216 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2220 account_head = (account_s*) malloc(sizeof(account_s));
2221 if (account_head == NULL) {
2222 ACCOUNT_FATAL("malloc Failed");
2223 if (hstmt != NULL) {
2224 rc = _account_query_finalize(hstmt);
2225 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
2228 *error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
2231 ACCOUNT_MEMSET(account_head, 0x00, sizeof(account_s));
2233 while (rc == SQLITE_ROW) {
2234 account_s* account_record = NULL;
2236 account_record = (account_s*) malloc(sizeof(account_s));
2238 if (account_record == NULL) {
2239 ACCOUNT_FATAL("malloc Failed");
2242 ACCOUNT_MEMSET(account_record, 0x00, sizeof(account_s));
2244 _account_convert_column_to_account(hstmt, account_record);
2246 account_head->account_list = g_list_append(account_head->account_list, account_record);
2248 rc = _account_query_step(hstmt);
2252 rc = _account_query_finalize(hstmt);
2253 ACCOUNT_CATCH_ERROR_P((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2259 tmp = g_list_length(account_head->account_list);
2261 for (iter = account_head->account_list; iter != NULL; iter = g_list_next(iter)) {
2262 account_s* testaccount = (account_s*)iter->data;
2264 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, testaccount->id, (void*)testaccount, false);
2265 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, testaccount->id, (void*)testaccount, false);
2269 *error_code = _ACCOUNT_ERROR_NONE;
2272 if (hstmt != NULL) {
2273 rc = _account_query_finalize(hstmt);
2274 if (rc != _ACCOUNT_ERROR_NONE) {
2276 _ERR("finalize error");
2281 if ((*error_code != _ACCOUNT_ERROR_NONE) && account_head) {
2282 _account_glist_account_free(account_head->account_list);
2283 _ACCOUNT_FREE(account_head);
2284 account_head = NULL;
2287 pthread_mutex_unlock(&account_mutex);
2290 _remove_sensitive_info_from_non_owning_account_list(account_head->account_list, pid, uid);
2291 GList* result = account_head->account_list;
2292 _ACCOUNT_FREE(account_head);
2299 GList* account_server_query_account_by_package_name(const char* package_name, int *error_code, int pid, uid_t uid)
2301 _INFO("account_server_query_account_by_package_name start");
2303 GList * account_list = NULL;
2304 *error_code = _ACCOUNT_ERROR_NONE;
2306 ACCOUNT_RETURN_VAL((package_name != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("PACKAGE NAME IS NULL"));
2307 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
2309 account_list = _account_query_account_by_package_name(g_hAccountDB, package_name, error_code, pid, uid);
2311 _INFO("account_server_query_account_by_package_name end");
2313 return account_list;
2316 int account_server_delete_account_by_package_name(const char* package_name, bool permission, int pid, uid_t uid)
2318 _INFO("account_db_delete_account_by_package_name");
2320 int error_code = _ACCOUNT_ERROR_NONE;
2322 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("PACKAGE NAME IS NULL"));
2323 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2325 error_code = _account_delete_account_by_package_name(g_hAccountDB, package_name, permission, pid, uid);
2327 _INFO("account_server_delete_account_by_package_name end");
2332 int _account_delete(int pid, uid_t uid, int account_id)
2334 int error_code = _ACCOUNT_ERROR_NONE;
2335 account_stmt hstmt = NULL;
2336 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2338 int ret_transaction = 0;
2339 bool is_success = FALSE;
2341 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2344 /* Check requested ID to delete */
2345 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE _id=%d", ACCOUNT_TABLE, account_id);
2347 count = _account_get_record_count(g_hAccountDB, query);
2349 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2350 pthread_mutex_unlock(&account_mutex);
2351 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2352 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2356 ACCOUNT_ERROR("account id(%d) is not exist. count(%d)\n", account_id, count);
2357 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2360 /* Check permission of requested appid */
2361 char* current_appid = NULL;
2362 char *package_name = NULL;
2364 current_appid = _account_get_current_appid(pid, uid);
2366 error_code = _account_get_package_name_from_account_id(account_id, &package_name);
2368 if (error_code != _ACCOUNT_ERROR_NONE) {
2369 ACCOUNT_ERROR("No package name with account_id\n");
2370 _ACCOUNT_FREE(current_appid);
2371 _ACCOUNT_FREE(package_name);
2372 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2374 ACCOUNT_DEBUG("DELETE:account_id[%d],current_appid[%s]package_name[%s]", account_id, current_appid, package_name);
2376 error_code = _account_check_appid_group_with_package_name(current_appid, package_name, uid);
2378 _ACCOUNT_FREE(current_appid);
2379 _ACCOUNT_FREE(package_name);
2381 if (error_code != _ACCOUNT_ERROR_NONE) {
2382 ACCOUNT_ERROR("No permission to delete\n");
2383 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2386 /* transaction control required*/
2387 ret_transaction = _account_begin_transaction(g_hAccountDB);
2389 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2390 pthread_mutex_unlock(&account_mutex);
2391 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2392 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2395 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
2396 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
2397 pthread_mutex_unlock(&account_mutex);
2398 return _ACCOUNT_ERROR_DATABASE_BUSY;
2401 if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2402 ACCOUNT_ERROR("account_delete:_account_begin_transaction fail %d\n", ret_transaction);
2403 pthread_mutex_unlock(&account_mutex);
2404 return ret_transaction;
2407 /* capability table */
2408 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
2409 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE account_id = %d", CAPABILITY_TABLE, account_id);
2411 hstmt = _account_prepare_query(g_hAccountDB, query);
2413 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2414 pthread_mutex_unlock(&account_mutex);
2415 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2416 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2419 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2420 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2422 rc = _account_query_step(hstmt);
2423 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2425 rc = _account_query_finalize(hstmt);
2427 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2431 ACCOUNT_MEMSET(query, 0, sizeof(query));
2432 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE _id = %d", ACCOUNT_TABLE, account_id);
2434 hstmt = _account_prepare_query(g_hAccountDB, query);
2435 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2436 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2438 rc = _account_query_step(hstmt);
2439 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found. id=%d, rc=%d\n", account_id, rc));
2441 rc = _account_query_finalize(hstmt);
2442 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2445 /* delete custom data */
2446 ACCOUNT_MEMSET(query, 0, sizeof(query));
2447 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AccountId = %d", ACCOUNT_CUSTOM_TABLE, account_id);
2449 hstmt = _account_prepare_query(g_hAccountDB, query);
2451 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2452 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2454 rc = _account_query_step(hstmt);
2455 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found. id=%d, rc=%d\n", account_id, rc));
2457 rc = _account_query_finalize(hstmt);
2458 ACCOUNT_CATCH_ERROR(rc == _ACCOUNT_ERROR_NONE, {}, rc, ("finalize error", account_id, rc));
2464 if (hstmt != NULL) {
2465 rc = _account_query_finalize(hstmt);
2466 if (rc != _ACCOUNT_ERROR_NONE) {
2467 ACCOUNT_ERROR("rc (%d)", rc);
2474 ret_transaction = _account_end_transaction(g_hAccountDB, is_success);
2476 if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2477 ACCOUNT_ERROR("account_delete:_account_end_transaction fail %d, is_success=%d\n", ret_transaction, is_success);
2479 if (is_success == true) {
2480 char buf[64] = {0,};
2481 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_DELETE, account_id);
2482 _account_insert_delete_update_notification_send(buf);
2486 pthread_mutex_unlock(&account_mutex);
2491 static int _account_query_account_by_username_and_package(const char* username, const char* package_name, account_s *account)
2495 int error_code = _ACCOUNT_ERROR_NONE;
2496 account_stmt hstmt = NULL;
2497 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2499 int binding_count = 1;
2501 ACCOUNT_RETURN_VAL((username != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("username IS NULL"));
2502 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("package_name IS NULL"));
2503 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT IS NULL"));
2504 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2506 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2508 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE user_name = ? and package_name = ?", ACCOUNT_TABLE);
2509 hstmt = _account_prepare_query(g_hAccountDB, query);
2511 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2512 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2513 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2516 _account_query_bind_text(hstmt, binding_count++, username);
2517 _account_query_bind_text(hstmt, binding_count++, package_name);
2519 rc = _account_query_step(hstmt);
2520 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2522 account_s *account_record = account;
2524 while (rc == SQLITE_ROW) {
2525 _account_convert_column_to_account(hstmt, account_record);
2526 rc = _account_query_step(hstmt);
2529 rc = _account_query_finalize(hstmt);
2530 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2531 _account_query_capability_by_account_id(g_hAccountDB, _account_add_capability_to_account_cb, account_record->id, (void*)account_record, false);
2532 _account_query_custom_by_account_id(g_hAccountDB, _account_add_custom_to_account_cb, account_record->id, (void*)account_record, false);
2535 error_code = _ACCOUNT_ERROR_NONE;
2538 if (hstmt != NULL) {
2539 rc = _account_query_finalize(hstmt);
2540 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2544 pthread_mutex_unlock(&account_mutex);
2549 int _account_create(account_s **account)
2552 ACCOUNT_SLOGE("(%s)-(%d) account is NULL.\n", __FUNCTION__, __LINE__);
2553 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2556 account_s *data = (account_s*)malloc(sizeof(account_s));
2559 ACCOUNT_FATAL("Memory Allocation Failed");
2560 return _ACCOUNT_ERROR_OUT_OF_MEMORY;
2562 ACCOUNT_MEMSET(data, 0, sizeof(account_s));
2564 /*Setting account as visible by default*/
2565 //data->secret = _ACCOUNT_SECRECY_VISIBLE;
2567 /*Setting account as not supporting sync by default*/
2568 //data->sync_support = _ACCOUNT_SYNC_NOT_SUPPORT;
2572 return _ACCOUNT_ERROR_NONE;
2575 int _account_destroy(account_s *account)
2577 account_s *data = account;
2579 ACCOUNT_RETURN_VAL((data != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Account handle is null!"));
2581 _account_free_account_with_items(data);
2583 return _ACCOUNT_ERROR_NONE;
2586 int _account_get_account_id(account_s* account, int *account_id)
2589 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2592 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2594 *account_id = account->id;
2596 return _ACCOUNT_ERROR_NONE;
2599 int _account_delete_from_db_by_user_name(int pid, uid_t uid, const char *user_name, const char *package_name)
2601 _INFO("[%s][%s]", user_name, package_name);
2603 int error_code = _ACCOUNT_ERROR_NONE;
2604 account_stmt hstmt = NULL;
2605 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2607 int ret_transaction = 0;
2608 bool is_success = FALSE;
2609 account_s *account = NULL;
2610 int binding_count = 1;
2611 int account_id = -1;
2613 ACCOUNT_RETURN_VAL((user_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("user_name is null!"));
2614 ACCOUNT_RETURN_VAL((package_name != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("package_name is null!"));
2615 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
2617 /* Check permission of requested appid */
2618 char* current_appid = NULL;
2619 char* package_name_temp = NULL;
2621 current_appid = _account_get_current_appid(pid, uid);
2623 package_name_temp = _account_dup_text(package_name);
2625 ACCOUNT_DEBUG("DELETE:user_name[%s],current_appid[%s], package_name[%s]", user_name, current_appid, package_name_temp);
2627 error_code = _account_check_appid_group_with_package_name(current_appid, package_name_temp, uid);
2629 _ACCOUNT_FREE(current_appid);
2630 _ACCOUNT_FREE(package_name_temp);
2632 if (error_code != _ACCOUNT_ERROR_NONE) {
2633 ACCOUNT_ERROR("No permission to delete\n");
2634 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2637 rc = _account_create(&account);
2638 rc = _account_query_account_by_username_and_package(user_name, package_name, account);
2642 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2643 _account_destroy(account);
2644 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2645 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2649 account_s* account_data = (account_s*)account;
2651 rc = _account_get_account_id(account_data, &account_id);
2653 rc = _account_destroy(account);
2655 /* transaction control required*/
2656 ret_transaction = _account_begin_transaction(g_hAccountDB);
2658 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2659 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2660 pthread_mutex_unlock(&account_mutex);
2661 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2665 if (ret_transaction == _ACCOUNT_ERROR_DATABASE_BUSY) {
2666 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
2667 pthread_mutex_unlock(&account_mutex);
2668 return _ACCOUNT_ERROR_DATABASE_BUSY;
2669 } else if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2670 ACCOUNT_ERROR("account_delete:_account_begin_transaction fail %d\n", ret_transaction);
2671 pthread_mutex_unlock(&account_mutex);
2672 return ret_transaction;
2675 /* delete custom data */
2676 ACCOUNT_MEMSET(query, 0, sizeof(query));
2677 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AccountId = ?", ACCOUNT_CUSTOM_TABLE);
2679 hstmt = _account_prepare_query(g_hAccountDB, query);
2681 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2682 _account_end_transaction(g_hAccountDB, FALSE);
2683 pthread_mutex_unlock(&account_mutex);
2684 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2685 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2688 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2689 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2691 _account_query_bind_int(hstmt, binding_count++, account_id);
2693 rc = _account_query_step(hstmt);
2694 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2696 rc = _account_query_finalize(hstmt);
2697 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2700 /* delete capability */
2701 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE user_name = ? and package_name = ?", CAPABILITY_TABLE);
2703 hstmt = _account_prepare_query(g_hAccountDB, query);
2705 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2706 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2709 _account_query_bind_text(hstmt, binding_count++, user_name);
2710 _account_query_bind_text(hstmt, binding_count++, package_name);
2712 rc = _account_query_step(hstmt);
2713 ACCOUNT_CATCH_ERROR(rc == SQLITE_DONE, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2715 rc = _account_query_finalize(hstmt);
2716 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2719 ACCOUNT_MEMSET(query, 0, sizeof(query));
2722 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE user_name = ? and package_name = ?", ACCOUNT_TABLE);
2724 hstmt = _account_prepare_query(g_hAccountDB, query);
2725 ACCOUNT_CATCH_ERROR(hstmt != NULL, {}, _ACCOUNT_ERROR_DB_FAILED,
2726 ("_account_svc_query_prepare(%s) failed(%s).\n", query, _account_db_err_msg(g_hAccountDB)));
2730 _account_query_bind_text(hstmt, binding_count++, user_name);
2731 _account_query_bind_text(hstmt, binding_count++, package_name);
2733 rc = _account_query_step(hstmt);
2734 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));
2736 rc = _account_query_finalize(hstmt);
2737 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2743 if (hstmt != NULL) {
2744 rc = _account_query_finalize(hstmt);
2745 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
2749 ret_transaction = _account_end_transaction(g_hAccountDB, is_success);
2751 if (ret_transaction != _ACCOUNT_ERROR_NONE) {
2752 ACCOUNT_ERROR("account_svc_delete:_account_svc_end_transaction fail %d, is_success=%d\n", ret_transaction, is_success);
2754 if (is_success == true) {
2755 char buf[64] = {0,};
2756 ACCOUNT_SNPRINTF(buf, sizeof(buf), "%s:%d", _ACCOUNT_NOTI_NAME_DELETE, account_id);
2757 _account_insert_delete_update_notification_send(buf);
2761 pthread_mutex_unlock(&account_mutex);
2767 int _account_get_total_count_from_db(gboolean include_hidden, int *count)
2770 ACCOUNT_SLOGE("(%s)-(%d) count is NULL.\n", __FUNCTION__, __LINE__);
2771 return _ACCOUNT_ERROR_INVALID_PARAMETER;
2774 if (!g_hAccountDB) {
2775 ACCOUNT_ERROR("DB is not opened\n");
2776 return _ACCOUNT_ERROR_DB_NOT_OPENED;
2779 char query[1024] = {0, };
2780 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
2783 ACCOUNT_SNPRINTF(query, sizeof(query), "select count(*) from %s", ACCOUNT_TABLE);
2785 ACCOUNT_SNPRINTF(query, sizeof(query), "select count(*) from %s where secret = %d", ACCOUNT_TABLE, _ACCOUNT_SECRECY_VISIBLE);
2787 *count = _account_get_record_count(g_hAccountDB, query);
2789 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2790 pthread_mutex_unlock(&account_mutex);
2791 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2792 return _ACCOUNT_ERROR_PERMISSION_DENIED;
2797 account_stmt pStmt = NULL;
2799 rc = sqlite3_prepare_v2(g_hAccountDB, query, strlen(query), &pStmt, NULL);
2800 if (SQLITE_OK != rc) {
2801 ACCOUNT_SLOGE("sqlite3_prepare_v2() failed(%d, %s).", rc, _account_db_err_msg(g_hAccountDB));
2802 sqlite3_finalize(pStmt);
2803 return _ACCOUNT_ERROR_DB_FAILED;
2806 rc = sqlite3_step(pStmt);
2807 if (SQLITE_ROW != rc) {
2808 ACCOUNT_ERROR("[ERROR] sqlite3_step() failed\n");
2809 sqlite3_finalize(pStmt);
2810 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2813 ncount = sqlite3_column_int(pStmt, 0);
2817 sqlite3_finalize(pStmt);
2820 ACCOUNT_ERROR("[ERROR] Number of account : %d, End", ncount);
2821 return _ACCOUNT_ERROR_DB_FAILED;
2824 return _ACCOUNT_ERROR_NONE;
2828 int account_server_query_app_id_exist(const char* app_id)
2830 _INFO("account_server_query_app_id_exist start app_id=[%s]", app_id);
2831 int ret = _ACCOUNT_ERROR_NONE;
2833 ret = _account_type_query_app_id_exist_from_all_db(g_hAccountDB, g_hAccountGlobalDB, app_id);
2835 _INFO("account_server_query_app_id_exist end error_code=[%d]", ret);
2840 int account_server_insert_account_type_to_user_db(account_type_s *account_type, int *account_type_id, uid_t uid)
2842 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT TYPE HANDLE IS NULL"));
2843 ACCOUNT_RETURN_VAL((account_type->app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID OF ACCOUNT TYPE IS NULL"));
2844 ACCOUNT_RETURN_VAL((account_type_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT TYPE ID IS NULL"));
2846 _INFO("account_server_insert_account_type_to_user_db start uid=[%d]", uid);
2847 int ret = _ACCOUNT_ERROR_NONE;
2849 if (_account_type_check_duplicated(g_hAccountDB, account_type->app_id) ||
2850 _account_type_check_duplicated(g_hAccountGlobalDB, account_type->app_id)) {
2851 *account_type_id = -1;
2852 return _ACCOUNT_ERROR_DUPLICATED;
2855 ret = _account_type_insert_to_db(g_hAccountDB, account_type, account_type_id);
2856 _INFO("account_server_insert_account_type_to_user_db end error_code=[%d]", ret);
2861 int account_server_delete_account_type_by_app_id_from_user_db(const char * app_id)
2863 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID OF ACCOUNT TYPE IS NULL"));
2865 _INFO("account_server_delete_account_type_by_app_id_from_user_db start");
2866 int ret = _ACCOUNT_ERROR_NONE;
2868 ret = _account_type_delete_by_app_id(g_hAccountDB, app_id);
2869 _INFO("account_server_delete_account_type_by_app_id_from_user_db end error_code=[%d]", ret);
2874 GSList* _account_type_query_provider_feature_by_app_id_from_global_db(const char* app_id, int *error_code)
2876 _INFO("_account_type_query_provider_feature_by_app_id_in_global_db app_id=%s", app_id);
2877 account_stmt hstmt = NULL;
2878 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2879 int rc = 0, binding_count = 1;
2880 GSList* feature_list = NULL;
2882 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
2883 ACCOUNT_RETURN_VAL((error_code != NULL), {_ERR("error_code pointer is NULL"); }, NULL, (""));
2884 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; _ERR("The database isn't connected."); }, NULL, ("The database isn't connected."));
2886 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2888 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
2889 _INFO("account query=[%s]", query);
2891 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
2893 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
2894 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2895 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2899 _INFO("before _account_query_bind_text");
2900 _account_query_bind_text(hstmt, binding_count++, app_id);
2902 rc = _account_query_step(hstmt);
2904 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"));
2906 provider_feature_s* feature_record = NULL;
2908 while (rc == SQLITE_ROW) {
2910 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
2912 if (feature_record == NULL) {
2913 ACCOUNT_FATAL("malloc Failed");
2917 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
2919 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
2921 _INFO("Adding account feature_list");
2922 feature_list = g_slist_append(feature_list, feature_record);
2924 rc = _account_query_step(hstmt);
2927 *error_code = _ACCOUNT_ERROR_NONE;
2930 if (hstmt != NULL) {
2931 rc = _account_query_finalize(hstmt);
2932 if (rc != _ACCOUNT_ERROR_NONE) {
2934 _ERR("global db fianlize error");
2938 if (*error_code != _ACCOUNT_ERROR_NONE)
2939 _account_type_gslist_feature_free(feature_list);
2941 _INFO("Returning account feature_list from global db");
2943 return feature_list;
2946 GSList* _account_type_query_provider_feature_by_app_id(const char* app_id, int *error_code)
2948 _INFO("_account_type_query_provider_feature_by_app_id app_id=%s", app_id);
2949 account_stmt hstmt = NULL;
2950 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
2951 int rc = 0, binding_count = 1;
2952 GSList* feature_list = NULL;
2954 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
2955 ACCOUNT_RETURN_VAL((error_code != NULL), {_ERR("error_code pointer is NULL"); }, NULL, (""));
2956 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
2958 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
2960 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
2961 _INFO("account query=[%s]", query);
2963 hstmt = _account_prepare_query(g_hAccountDB, query);
2965 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
2966 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
2967 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
2971 _account_query_bind_text(hstmt, binding_count++, app_id);
2973 rc = _account_query_step(hstmt);
2975 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, { *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
2976 _ERR("The record isn't found from user db. rc=[%d]", rc); },
2977 _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
2979 provider_feature_s* feature_record = NULL;
2981 while (rc == SQLITE_ROW) {
2983 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
2985 if (feature_record == NULL) {
2986 ACCOUNT_FATAL("malloc Failed");
2990 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
2992 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
2994 _INFO("Adding account feature_list");
2995 feature_list = g_slist_append(feature_list, feature_record);
2997 rc = _account_query_step(hstmt);
3000 *error_code = _ACCOUNT_ERROR_NONE;
3002 rc = _account_query_finalize(hstmt);
3003 ACCOUNT_CATCH_ERROR_P((rc == _ACCOUNT_ERROR_NONE), { *error_code = rc; }, rc, ("account finalize error"));
3007 if (hstmt != NULL) {
3008 rc = _account_query_finalize(hstmt);
3009 if (rc != _ACCOUNT_ERROR_NONE) {
3011 _ERR("account fianlize error");
3015 _INFO("*error_code=[%d]", *error_code);
3017 if (*error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3018 feature_list = _account_type_query_provider_feature_by_app_id_from_global_db(app_id, error_code);
3020 if (*error_code != _ACCOUNT_ERROR_NONE) {
3021 _account_type_gslist_feature_free(feature_list);
3025 _INFO("Returning account feature_list");
3027 return feature_list;
3030 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)
3032 int error_code = _ACCOUNT_ERROR_NONE;
3033 account_stmt hstmt = NULL;
3034 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3035 int rc = 0, binding_count = 1;
3037 _INFO("_account_type_query_provider_feature_cb_by_app_id_in_global_db start app_id=%s", app_id);
3038 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3039 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3040 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3042 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3044 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
3045 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3047 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3048 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3049 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_PERMISSION_DENIED, ("global db permission denied.\n"));
3052 _account_query_bind_text(hstmt, binding_count++, app_id);
3054 rc = _account_query_step(hstmt);
3055 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"));
3057 provider_feature_s* feature_record = NULL;
3059 while (rc == SQLITE_ROW) {
3060 bool cb_ret = FALSE;
3061 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
3063 if (feature_record == NULL) {
3064 ACCOUNT_FATAL("malloc Failed");
3068 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
3070 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
3072 cb_ret = callback(feature_record->app_id, feature_record->key, user_data);
3074 _account_type_free_feature_with_items(feature_record);
3076 ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returns FALSE, its iteration is stopped!!!!\n"));
3078 rc = _account_query_step(hstmt);
3081 error_code = _ACCOUNT_ERROR_NONE;
3084 if (hstmt != NULL) {
3085 rc = _account_query_finalize(hstmt);
3086 if (rc != _ACCOUNT_ERROR_NONE) {
3088 _ERR("global db finalize error[%d]", rc);
3093 _INFO("_account_type_query_provider_feature_cb_by_app_id_in_global_db end. error_code=[%d]", error_code);
3098 int _account_type_query_provider_feature_cb_by_app_id(account_type_provider_feature_cb callback, const char* app_id, void *user_data)
3100 int error_code = _ACCOUNT_ERROR_NONE;
3101 account_stmt hstmt = NULL;
3102 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3103 int rc = 0, binding_count = 1;
3105 _INFO("_account_type_query_provider_feature_cb_by_app_id start app_id=%s", app_id);
3106 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3107 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3108 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3110 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3112 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE app_id = ?", PROVIDER_FEATURE_TABLE);
3113 hstmt = _account_prepare_query(g_hAccountDB, query);
3115 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3116 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3117 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3120 _account_query_bind_text(hstmt, binding_count++, app_id);
3122 rc = _account_query_step(hstmt);
3123 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found in user db.\n"));
3125 provider_feature_s* feature_record = NULL;
3127 while (rc == SQLITE_ROW) {
3128 bool cb_ret = FALSE;
3129 feature_record = (provider_feature_s*) malloc(sizeof(provider_feature_s));
3131 if (feature_record == NULL) {
3132 ACCOUNT_FATAL("malloc Failed");
3136 ACCOUNT_MEMSET(feature_record, 0x00, sizeof(provider_feature_s));
3138 _account_type_convert_column_to_provider_feature(hstmt, feature_record);
3140 cb_ret = callback(feature_record->app_id, feature_record->key, user_data);
3142 _account_type_free_feature_with_items(feature_record);
3144 ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
3146 rc = _account_query_step(hstmt);
3149 rc = _account_query_finalize(hstmt);
3150 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3153 error_code = _ACCOUNT_ERROR_NONE;
3156 if (hstmt != NULL) {
3157 rc = _account_query_finalize(hstmt);
3158 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3162 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3163 error_code = _account_type_query_provider_feature_cb_by_app_id_from_global_db(callback, app_id, user_data);
3165 _INFO("_account_type_query_provider_feature_cb_by_app_id end");
3170 int account_type_query_provider_feature_cb_by_app_id(account_type_provider_feature_cb callback, const char* app_id, void *user_data)
3172 int error_code = _ACCOUNT_ERROR_NONE;
3174 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3175 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3176 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3178 error_code = _account_type_query_provider_feature_cb_by_app_id(callback, app_id, user_data);
3180 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3181 error_code = _account_type_query_provider_feature_cb_by_app_id_from_global_db(callback, app_id, user_data);
3186 bool _account_type_query_supported_feature_from_global_db(const char* app_id, const char* capability, int *error_code)
3188 _INFO("_account_type_query_supported_feature_in_global_db start");
3189 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3191 *error_code = _ACCOUNT_ERROR_NONE;
3193 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3194 int record_count = 0;
3196 if (app_id == NULL || capability == NULL) {
3197 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
3201 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s where app_id='%s' and key='%s'", PROVIDER_FEATURE_TABLE, app_id, capability);
3203 record_count = _account_get_record_count(g_hAccountGlobalDB, query);
3205 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3206 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3207 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3210 if (record_count <= 0) {
3211 *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
3215 _INFO("_account_type_query_supported_feature_in_global_db end");
3220 bool _account_type_query_supported_feature(const char* app_id, const char* capability, int *error_code)
3222 _INFO("_account_type_query_supported_feature start");
3224 *error_code = _ACCOUNT_ERROR_NONE;
3226 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3227 int record_count = 0;
3229 if (app_id == NULL || capability == NULL) {
3230 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
3234 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) FROM %s where app_id='%s' and key='%s'", PROVIDER_FEATURE_TABLE, app_id, capability);
3236 record_count = _account_get_record_count(g_hAccountDB, query);
3238 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3239 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3240 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3244 if (record_count <= 0) {
3245 bool is_exist = false;
3246 is_exist = _account_type_query_supported_feature_from_global_db(app_id, capability, error_code);
3251 _INFO("_account_type_query_supported_feature end");
3257 static int _account_type_update_provider_feature(sqlite3 *account_db_handle, account_type_s *account_type, const char* app_id)
3260 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3261 account_stmt hstmt = NULL;
3263 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
3265 if (g_slist_length(account_type->provider_feature_list) == 0) {
3266 ACCOUNT_ERROR("no feature\n");
3267 return _ACCOUNT_ERROR_NONE;
3270 ACCOUNT_DEBUG("app id", app_id);
3272 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3274 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE app_id=? ", PROVIDER_FEATURE_TABLE);
3275 hstmt = _account_prepare_query(account_db_handle, query);
3277 if (_account_db_err_code(account_db_handle) == SQLITE_PERM) {
3278 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(account_db_handle));
3279 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3283 _account_query_bind_text(hstmt, count++, app_id);
3284 rc = _account_query_step(hstmt);
3286 if (rc != SQLITE_DONE) {
3287 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3288 return _ACCOUNT_ERROR_DB_FAILED;
3290 rc = _account_query_finalize(hstmt);
3291 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3296 for (iter = account_type->provider_feature_list; iter != NULL; iter = g_slist_next(iter)) {
3299 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3300 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(app_id, key) VALUES "
3301 "(?, ?) ", PROVIDER_FEATURE_TABLE);
3303 hstmt = _account_prepare_query(account_db_handle, query);
3305 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query() failed(%s).\n", _account_db_err_msg(account_db_handle)));
3307 provider_feature_s* feature_data = NULL;
3308 feature_data = (provider_feature_s*)iter->data;
3310 ret = _account_query_bind_text(hstmt, count++, account_type->app_id);
3311 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3312 ret = _account_query_bind_text(hstmt, count++, feature_data->key);
3313 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3315 rc = _account_query_step(hstmt);
3317 if (rc != SQLITE_DONE) {
3318 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3321 rc = _account_query_finalize(hstmt);
3322 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3326 return _ACCOUNT_ERROR_NONE;
3329 static int _account_type_update_label(sqlite3 *account_db_handle, account_type_s *account_type, const char* app_id)
3332 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3333 account_stmt hstmt = NULL;
3335 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
3337 if (g_slist_length(account_type->label_list) == 0)
3338 return _ACCOUNT_ERROR_NONE;
3340 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3342 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AppId=? ", LABEL_TABLE);
3343 hstmt = _account_prepare_query(account_db_handle, query);
3345 if (_account_db_err_code(account_db_handle) == SQLITE_PERM) {
3346 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(account_db_handle));
3347 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3351 _account_query_bind_text(hstmt, count++, app_id);
3352 rc = _account_query_step(hstmt);
3354 if (rc != SQLITE_DONE) {
3355 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3356 return _ACCOUNT_ERROR_DB_FAILED;
3358 rc = _account_query_finalize(hstmt);
3359 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3364 for (iter = account_type->label_list; iter != NULL; iter = g_slist_next(iter)) {
3367 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3368 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(AppId, Label, Locale) VALUES "
3369 "(?, ?, ?) ", LABEL_TABLE);
3371 hstmt = _account_prepare_query(account_db_handle, query);
3373 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query() failed(%s).\n", _account_db_err_msg(account_db_handle)));
3375 label_s* label_data = NULL;
3376 label_data = (label_s*)iter->data;
3378 ret = _account_query_bind_text(hstmt, count++, account_type->app_id);
3379 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3380 ret = _account_query_bind_text(hstmt, count++, label_data->label);
3381 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3382 ret = _account_query_bind_text(hstmt, count++, label_data->locale);
3383 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
3385 rc = _account_query_step(hstmt);
3387 if (rc != SQLITE_DONE) {
3388 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3391 rc = _account_query_finalize(hstmt);
3392 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3396 return _ACCOUNT_ERROR_NONE;
3400 static int _account_type_update_account(sqlite3 *account_db_handle, account_type_s *account_type, const char* app_id)
3402 int rc = 0, binding_count = 1;
3403 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3404 int error_code = _ACCOUNT_ERROR_NONE;
3405 account_stmt hstmt = NULL;
3407 if (!account_type->app_id) {
3408 ACCOUNT_ERROR("app id is mandetory field, it can not be NULL!!!!\n");
3409 return _ACCOUNT_ERROR_INVALID_PARAMETER;
3412 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
3413 ACCOUNT_SNPRINTF(query, sizeof(query), "UPDATE %s SET AppId=?, ServiceProviderId=?, IconPath=?, "
3414 "SmallIconPath=?, MultipleAccountSupport=? WHERE AppId=? ", ACCOUNT_TYPE_TABLE);
3416 hstmt = _account_prepare_query(account_db_handle, query);
3418 if (_account_db_err_code(account_db_handle) == SQLITE_PERM) {
3419 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(account_db_handle));
3420 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3421 } else if (_account_db_err_code(account_db_handle) == SQLITE_BUSY) {
3422 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(account_db_handle));
3423 return _ACCOUNT_ERROR_DATABASE_BUSY;
3426 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_svc_query_prepare() failed(%s).\n", _account_db_err_msg(account_db_handle)));
3428 binding_count = _account_type_convert_account_to_sql(account_type, hstmt, query);
3429 _account_query_bind_text(hstmt, binding_count++, app_id);
3431 rc = _account_query_step(hstmt);
3432 if (rc != SQLITE_DONE)
3433 ACCOUNT_ERROR("account_db_query_step() failed(%d, %s)", rc, _account_db_err_msg(account_db_handle));
3435 rc = _account_query_finalize(hstmt);
3436 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3440 error_code = _account_type_update_label(account_db_handle, account_type, app_id);
3441 /* update provider feature */
3442 error_code = _account_type_update_provider_feature(account_db_handle, account_type, app_id);
3447 int _account_type_update_to_db_by_app_id(account_type_s* account_type, const char* app_id)
3449 int error_code = _ACCOUNT_ERROR_NONE;
3451 ACCOUNT_RETURN_VAL((account_type != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("DATA IS NULL"));
3452 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3453 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3455 account_type_s* data = account_type;
3457 pthread_mutex_lock(&account_mutex);
3459 error_code = _account_type_update_account(g_hAccountDB, data, app_id);
3461 pthread_mutex_unlock(&account_mutex);
3466 GSList* _account_type_get_label_list_by_app_id_from_global_db(const char* app_id, int *error_code)
3468 *error_code = _ACCOUNT_ERROR_NONE;
3469 account_stmt hstmt = NULL;
3470 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3471 int rc = 0, binding_count = 1;
3472 GSList* label_list = NULL;
3474 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
3475 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3477 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3479 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3480 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3482 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3483 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3484 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3489 _account_query_bind_text(hstmt, binding_count++, app_id);
3491 rc = _account_query_step(hstmt);
3492 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"));
3494 label_s* label_record = NULL;
3496 while (rc == SQLITE_ROW) {
3497 label_record = (label_s*) malloc(sizeof(label_s));
3499 if (label_record == NULL) {
3500 ACCOUNT_FATAL("malloc Failed");
3504 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3506 _account_type_convert_column_to_label(hstmt, label_record);
3508 _INFO("Adding account label_list");
3509 label_list = g_slist_append(label_list, label_record);
3511 rc = _account_query_step(hstmt);
3514 *error_code = _ACCOUNT_ERROR_NONE;
3517 if (hstmt != NULL) {
3518 rc = _account_query_finalize(hstmt);
3519 if (rc != _ACCOUNT_ERROR_NONE)
3520 _ERR("global db finalize error[%d]", rc);
3524 _INFO("Returning account global label_list");
3529 GSList* _account_type_get_label_list_by_app_id(const char* app_id, int *error_code)
3531 *error_code = _ACCOUNT_ERROR_NONE;
3532 account_stmt hstmt = NULL;
3533 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3534 int rc = 0, binding_count = 1;
3535 GSList* label_list = NULL;
3537 ACCOUNT_RETURN_VAL((app_id != NULL), { *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER; }, NULL, ("APP ID IS NULL"));
3538 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), { *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
3540 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3542 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3543 hstmt = _account_prepare_query(g_hAccountDB, query);
3545 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3546 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3547 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3551 _account_query_bind_text(hstmt, binding_count++, app_id);
3553 rc = _account_query_step(hstmt);
3554 ACCOUNT_CATCH_ERROR_P(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3556 label_s* label_record = NULL;
3558 while (rc == SQLITE_ROW) {
3559 label_record = (label_s*) malloc(sizeof(label_s));
3561 if (label_record == NULL) {
3562 ACCOUNT_FATAL("malloc Failed");
3566 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3568 _account_type_convert_column_to_label(hstmt, label_record);
3570 _INFO("Adding account label_list");
3571 label_list = g_slist_append(label_list, label_record);
3573 rc = _account_query_step(hstmt);
3576 rc = _account_query_finalize(hstmt);
3577 if (rc != _ACCOUNT_ERROR_NONE) {
3578 _account_type_gslist_label_free(label_list);
3580 _ERR("finalize error");
3585 *error_code = _ACCOUNT_ERROR_NONE;
3588 if (hstmt != NULL) {
3589 rc = _account_query_finalize(hstmt);
3590 if (rc != _ACCOUNT_ERROR_NONE) {
3591 _account_type_gslist_label_free(label_list);
3593 _ERR("finalize error");
3599 if (*error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3600 label_list = _account_type_get_label_list_by_app_id_from_global_db(app_id, error_code);
3602 _INFO("Returning account label_list");
3607 int _account_type_query_label_by_app_id_from_global_db(account_type_label_cb callback, const char* app_id, void *user_data)
3609 int error_code = _ACCOUNT_ERROR_NONE;
3610 account_stmt hstmt = NULL;
3611 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3612 int rc = 0, binding_count = 1;
3614 _INFO("account_type_query_label_by_app_id_from_global_db start");
3616 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3617 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3618 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3620 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3622 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3623 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3625 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3626 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3627 error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3631 _account_query_bind_text(hstmt, binding_count++, app_id);
3633 rc = _account_query_step(hstmt);
3634 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3636 label_s* label_record = NULL;
3638 while (rc == SQLITE_ROW) {
3639 bool cb_ret = FALSE;
3640 label_record = (label_s*) malloc(sizeof(label_s));
3642 if (label_record == NULL) {
3643 ACCOUNT_FATAL("malloc Failed");
3647 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3649 _account_type_convert_column_to_label(hstmt, label_record);
3651 cb_ret = callback(label_record->app_id, label_record->label , label_record->locale, user_data);
3653 _account_type_free_label_with_items(label_record);
3655 ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
3657 rc = _account_query_step(hstmt);
3660 error_code = _ACCOUNT_ERROR_NONE;
3663 if (hstmt != NULL) {
3664 rc = _account_query_finalize(hstmt);
3665 if (rc != _ACCOUNT_ERROR_NONE)
3666 _ERR("global db finalize error[%d]", rc);
3670 _INFO("account_type_query_label_by_app_id_from_global_db end [%d]", error_code);
3675 int _account_type_query_label_by_app_id(account_type_label_cb callback, const char* app_id, void *user_data)
3677 int error_code = _ACCOUNT_ERROR_NONE;
3678 account_stmt hstmt = NULL;
3679 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3680 int rc = 0, binding_count = 1;
3682 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3683 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3684 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3686 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3688 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", LABEL_TABLE);
3689 hstmt = _account_prepare_query(g_hAccountDB, query);
3691 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3692 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3693 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3696 _account_query_bind_text(hstmt, binding_count++, app_id);
3698 rc = _account_query_step(hstmt);
3699 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3701 label_s* label_record = NULL;
3703 while (rc == SQLITE_ROW) {
3704 bool cb_ret = FALSE;
3705 label_record = (label_s*) malloc(sizeof(label_s));
3707 if (label_record == NULL) {
3708 ACCOUNT_FATAL("malloc Failed");
3712 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
3714 _account_type_convert_column_to_label(hstmt, label_record);
3716 cb_ret = callback(label_record->app_id, label_record->label , label_record->locale, user_data);
3718 _account_type_free_label_with_items(label_record);
3720 //ACCOUNT_CATCH_ERROR(cb_ret == TRUE, {}, _ACCOUNT_ERROR_NONE, ("Callback func returs FALSE, its iteration is stopped!!!!\n"));
3721 if (cb_ret != TRUE) {
3722 _INFO("Callback func returs FALSE, its iteration is stopped!!!!\n");
3726 rc = _account_query_step(hstmt);
3729 rc = _account_query_finalize(hstmt);
3730 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3733 error_code = _ACCOUNT_ERROR_NONE;
3736 if (hstmt != NULL) {
3737 rc = _account_query_finalize(hstmt);
3738 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3742 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
3743 error_code = account_type_query_label_by_app_id_from_global_db(callback, app_id, user_data);
3749 int account_type_query_label_by_app_id(account_type_label_cb callback, const char* app_id, void *user_data)
3751 int error_code = _ACCOUNT_ERROR_NONE;
3753 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3754 ACCOUNT_RETURN_VAL((callback != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO CALLBACK FUNCTION"));
3755 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3757 error_code = _account_type_query_label_by_app_id(callback, app_id, user_data);
3759 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3760 error_code = _account_type_query_label_by_app_id_from_global_db(callback, app_id, user_data);
3765 bool _account_get_label_text_cb(char* app_id, char* label, char* locale, void *user_data)
3767 account_type_s *data = (account_type_s*)user_data;
3769 label_s *label_data = (label_s*)malloc(sizeof(label_s));
3771 if (label_data == NULL) {
3772 ACCOUNT_FATAL("_account_get_label_text_cb : MALLOC FAIL\n");
3775 ACCOUNT_MEMSET(label_data, 0, sizeof(label_s));
3777 label_data->app_id = _account_dup_text(app_id);
3778 label_data->label = _account_dup_text(label);
3779 label_data->locale = _account_dup_text(locale);
3781 data->label_list = g_slist_append(data->label_list, (gpointer)label_data);
3786 bool _account_get_provider_feature_cb(char* app_id, char* key, void* user_data)
3788 account_type_s *data = (account_type_s*)user_data;
3790 provider_feature_s *feature_data = (provider_feature_s*)malloc(sizeof(provider_feature_s));
3792 if (feature_data == NULL) {
3793 ACCOUNT_FATAL("_account_get_provider_feature_cb : MALLOC FAIL\n");
3796 ACCOUNT_MEMSET(feature_data, 0, sizeof(provider_feature_s));
3798 feature_data->app_id = _account_dup_text(app_id);
3799 feature_data->key = _account_dup_text(key);
3801 data->provider_feature_list = g_slist_append(data->provider_feature_list, (gpointer)feature_data);
3806 int _account_type_query_by_app_id_from_global_db(const char* app_id, account_type_s** account_type_record)
3808 _INFO("_account_type_query_by_app_id_from_global_db start");
3810 int error_code = _ACCOUNT_ERROR_NONE;
3811 account_stmt hstmt = NULL;
3812 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3813 int rc = 0, binding_count = 1;
3815 ACCOUNT_RETURN_VAL((app_id != 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3816 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3817 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3819 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3821 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", ACCOUNT_TYPE_TABLE);
3822 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3824 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3825 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3826 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3829 _account_query_bind_text(hstmt, binding_count++, app_id);
3831 rc = _account_query_step(hstmt);
3832 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3834 *account_type_record = create_empty_account_type_instance();
3836 while (rc == SQLITE_ROW) {
3837 _account_type_convert_column_to_account_type(hstmt, *account_type_record);
3838 rc = _account_query_step(hstmt);
3841 rc = _account_query_finalize(hstmt);
3842 ACCOUNT_CATCH_ERROR((rc == _ACCOUNT_ERROR_NONE), {_ERR("global db finalize error rc=[%d]", rc); }, rc, ("finalize error"));
3843 _account_type_query_label_by_app_id_from_global_db(_account_get_label_text_cb, app_id, (void*)(*account_type_record));
3844 _account_type_query_provider_feature_cb_by_app_id_from_global_db(_account_get_provider_feature_cb, app_id, (void*)(*account_type_record));
3847 error_code = _ACCOUNT_ERROR_NONE;
3850 if (hstmt != NULL) {
3851 rc = _account_query_finalize(hstmt);
3852 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3856 _INFO("_account_type_query_by_app_id_from_global_db end [%d]", error_code);
3861 int _account_type_query_by_app_id(const char* app_id, account_type_s** account_type_record)
3863 _INFO("_account_type_query_by_app_id start");
3865 int error_code = _ACCOUNT_ERROR_NONE;
3866 account_stmt hstmt = NULL;
3867 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3868 int rc = 0, binding_count = 1;
3870 ACCOUNT_RETURN_VAL((app_id != 0), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("APP ID IS NULL"));
3871 ACCOUNT_RETURN_VAL((account_type_record != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("account type record(account_type_s**) is NULL"));
3872 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
3874 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3876 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ?", ACCOUNT_TYPE_TABLE);
3877 hstmt = _account_prepare_query(g_hAccountDB, query);
3879 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
3880 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
3881 return _ACCOUNT_ERROR_PERMISSION_DENIED;
3884 _account_query_bind_text(hstmt, binding_count++, app_id);
3886 rc = _account_query_step(hstmt);
3887 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
3889 *account_type_record = create_empty_account_type_instance();
3890 if (*account_type_record == NULL) {
3891 _ERR("Out of Memory");
3892 error_code = _ACCOUNT_ERROR_OUT_OF_MEMORY;
3896 while (rc == SQLITE_ROW) {
3897 _account_type_convert_column_to_account_type(hstmt, *account_type_record);
3898 rc = _account_query_step(hstmt);
3901 rc = _account_query_finalize(hstmt);
3902 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3903 _account_type_query_label_by_app_id(_account_get_label_text_cb, app_id, (void*)(*account_type_record));
3904 _account_type_query_provider_feature_cb_by_app_id(_account_get_provider_feature_cb, app_id, (void*)(*account_type_record));
3907 error_code = _ACCOUNT_ERROR_NONE;
3910 if (hstmt != NULL) {
3911 rc = _account_query_finalize(hstmt);
3912 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
3916 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
3917 error_code = _account_type_query_by_app_id_from_global_db(app_id, account_type_record);
3919 _INFO("_account_type_query_by_app_id end [%d]", error_code);
3924 int _account_type_query_by_provider_feature_from_global_db(const char* key, GSList **account_type_list_all)
3926 int error_code = _ACCOUNT_ERROR_NONE;
3927 account_stmt hstmt = NULL;
3928 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
3930 GSList *account_type_list = NULL;
3932 _INFO("_account_type_query_by_provider_feature_from_global_db start key=%s", key);
3934 ACCOUNT_ERROR("capability_type IS NULL.");
3935 error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
3939 if (g_hAccountGlobalDB == NULL) {
3940 ACCOUNT_ERROR("The database isn't connected.");
3941 error_code = _ACCOUNT_ERROR_DB_NOT_OPENED;
3945 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
3947 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId IN (SELECT app_id from %s WHERE key=?)", ACCOUNT_TYPE_TABLE, PROVIDER_FEATURE_TABLE);
3949 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
3951 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
3952 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
3953 error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
3957 int binding_count = 1;
3958 _account_query_bind_text(hstmt, binding_count++, key);
3960 rc = _account_query_step(hstmt);
3962 account_type_s *account_type_record = NULL;
3964 if (rc != SQLITE_ROW) {
3965 ACCOUNT_ERROR("The record isn't found. rc=[%d]", rc);
3966 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
3970 while (rc == SQLITE_ROW) {
3971 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
3973 if (account_type_record == NULL) {
3974 ACCOUNT_FATAL("malloc Failed");
3978 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
3979 _account_type_convert_column_to_account_type(hstmt, account_type_record);
3980 account_type_list = g_slist_append(account_type_list, account_type_record);
3981 rc = _account_query_step(hstmt);
3984 rc = _account_query_finalize(hstmt);
3985 if (rc != _ACCOUNT_ERROR_NONE) {
3986 _account_type_gslist_account_type_free(account_type_list);
3987 ACCOUNT_ERROR("finalize error(%s)", rc);
3995 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
3996 account_type_s *account_type = NULL;
3997 account_type = (account_type_s*)iter->data;
3998 _account_type_query_label_by_app_id_from_global_db(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
3999 _account_type_query_provider_feature_cb_by_app_id_from_global_db(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4000 _INFO("add label & provider_feature");
4003 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4005 account_type_s *account_type = NULL;
4006 account_type = (account_type_s*)iter->data;
4007 *account_type_list_all = g_slist_append(*account_type_list_all, account_type);
4008 _INFO("add account_type");
4010 g_slist_free(account_type_list);
4012 error_code = _ACCOUNT_ERROR_NONE;
4015 if (hstmt != NULL) {
4016 rc = _account_query_finalize(hstmt);
4017 if (rc != _ACCOUNT_ERROR_NONE) {
4018 ACCOUNT_ERROR("finalize error(%s)", rc);
4024 _INFO("_account_type_query_by_provider_feature_from_global_db end. error_code=[%d]", error_code);
4029 GSList* _account_type_query_by_provider_feature(const char* key, int *error_code)
4031 *error_code = _ACCOUNT_ERROR_NONE;
4032 account_stmt hstmt = NULL;
4033 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4035 GSList *account_type_list = NULL;
4037 _INFO("account_type_query_by_provider_feature start key=%s", key);
4039 ACCOUNT_ERROR("capability_type IS NULL.");
4040 *error_code = _ACCOUNT_ERROR_INVALID_PARAMETER;
4044 if (g_hAccountDB == NULL) {
4045 ACCOUNT_ERROR("The database isn't connected.");
4046 *error_code = _ACCOUNT_ERROR_DB_NOT_OPENED;
4050 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4052 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId IN (SELECT app_id from %s WHERE key=?)", ACCOUNT_TYPE_TABLE, PROVIDER_FEATURE_TABLE);
4054 hstmt = _account_prepare_query(g_hAccountDB, query);
4056 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4057 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4058 *error_code = _ACCOUNT_ERROR_PERMISSION_DENIED;
4062 int binding_count = 1;
4063 _account_query_bind_text(hstmt, binding_count++, key);
4065 rc = _account_query_step(hstmt);
4067 account_type_s *account_type_record = NULL;
4069 if (rc != SQLITE_ROW) {
4070 ACCOUNT_ERROR("The record isn't found. rc=[%d]", rc);
4071 *error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4075 while (rc == SQLITE_ROW) {
4076 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4078 if (account_type_record == NULL) {
4079 ACCOUNT_FATAL("malloc Failed");
4083 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4084 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4085 account_type_list = g_slist_append(account_type_list, account_type_record);
4086 rc = _account_query_step(hstmt);
4089 rc = _account_query_finalize(hstmt);
4090 if (rc != _ACCOUNT_ERROR_NONE) {
4091 _account_type_gslist_account_type_free(account_type_list);
4092 ACCOUNT_ERROR("finalize error(%s)", rc);
4100 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4101 account_type_s *account_type = NULL;
4102 account_type = (account_type_s*)iter->data;
4103 _account_type_query_label_by_app_id(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4104 _account_type_query_provider_feature_cb_by_app_id(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4107 *error_code = _ACCOUNT_ERROR_NONE;
4110 if (hstmt != NULL) {
4111 rc = _account_query_finalize(hstmt);
4112 if (rc != _ACCOUNT_ERROR_NONE) {
4119 if (*error_code == _ACCOUNT_ERROR_NONE || *error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4120 rc = _account_type_query_by_provider_feature_from_global_db(key, &account_type_list);
4121 if (rc != _ACCOUNT_ERROR_NONE && rc != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4122 ACCOUNT_ERROR("_account_type_query_by_provider_feature_from_global_db fail=[%d]", rc);
4123 _account_type_gslist_account_type_free(account_type_list);
4126 if (rc == _ACCOUNT_ERROR_NONE)
4130 _INFO("account_type_query_by_provider_feature end");
4132 return account_type_list;
4135 int _account_type_query_all_from_global_db(GSList **account_type_list_all)
4137 account_stmt hstmt = NULL;
4138 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4139 int rc = _ACCOUNT_ERROR_NONE;
4140 int error_code = _ACCOUNT_ERROR_NONE;
4141 GSList *account_type_list = NULL;
4143 _INFO("_account_type_query_all_in_global_db start");
4144 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, NULL, ("The database isn't connected."));
4146 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4148 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s ", ACCOUNT_TYPE_TABLE);
4149 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
4151 rc = _account_query_step(hstmt);
4153 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
4154 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
4155 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4158 account_type_s *account_type_record = NULL;
4160 if (rc != SQLITE_ROW) {
4161 _INFO("[_ACCOUNT_ERROR_RECORD_NOT_FOUND]The record isn't found.");
4162 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4166 while (rc == SQLITE_ROW) {
4167 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4169 if (account_type_record == NULL) {
4170 ACCOUNT_FATAL("malloc Failed");
4174 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4175 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4176 account_type_list = g_slist_append(account_type_list, account_type_record);
4177 rc = _account_query_step(hstmt);
4180 rc = _account_query_finalize(hstmt);
4181 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, rc, ("finalize error"));
4186 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4187 account_type_s *account_type = NULL;
4188 account_type = (account_type_s*)iter->data;
4189 _account_type_query_label_by_app_id_from_global_db(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4190 _account_type_query_provider_feature_cb_by_app_id_from_global_db(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4193 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4194 account_type_s *account_type = NULL;
4195 account_type = (account_type_s*)iter->data;
4196 *account_type_list_all = g_slist_append(*account_type_list_all, account_type);
4198 g_slist_free(account_type_list);
4200 error_code = _ACCOUNT_ERROR_NONE;
4203 if (hstmt != NULL) {
4204 rc = _account_query_finalize(hstmt);
4205 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, rc, ("finalize error"));
4209 _INFO("_account_type_query_all_in_global_db end");
4214 GSList* _account_type_query_all(void)
4216 account_stmt hstmt = NULL;
4217 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4219 int error_code = _ACCOUNT_ERROR_NONE;
4220 GSList *account_type_list = NULL;
4222 _INFO("_account_type_query_all start");
4223 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, NULL, ("The database isn't connected."));
4225 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4227 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s ", ACCOUNT_TYPE_TABLE);
4228 hstmt = _account_prepare_query(g_hAccountDB, query);
4230 rc = _account_query_step(hstmt);
4232 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4233 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4237 account_type_s *account_type_record = NULL;
4239 if (rc != SQLITE_ROW) {
4240 _INFO("[_ACCOUNT_ERROR_RECORD_NOT_FOUND]The record isn't found.");
4241 error_code = _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4245 while (rc == SQLITE_ROW) {
4246 account_type_record = (account_type_s*) malloc(sizeof(account_type_s));
4248 if (account_type_record == NULL) {
4249 ACCOUNT_FATAL("malloc Failed");
4253 ACCOUNT_MEMSET(account_type_record, 0x00, sizeof(account_type_s));
4254 _account_type_convert_column_to_account_type(hstmt, account_type_record);
4255 account_type_list = g_slist_append(account_type_list, account_type_record);
4256 rc = _account_query_step(hstmt);
4259 rc = _account_query_finalize(hstmt);
4260 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, NULL, ("finalize error"));
4265 for (iter = account_type_list; iter != NULL; iter = g_slist_next(iter)) {
4266 account_type_s *account_type = NULL;
4267 account_type = (account_type_s*)iter->data;
4268 _account_type_query_label_by_app_id(_account_get_label_text_cb, account_type->app_id, (void*)account_type);
4269 _account_type_query_provider_feature_cb_by_app_id(_account_get_provider_feature_cb, account_type->app_id, (void*)account_type);
4272 error_code = _ACCOUNT_ERROR_NONE;
4275 if (hstmt != NULL) {
4276 rc = _account_query_finalize(hstmt);
4277 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {_account_type_gslist_account_type_free(account_type_list); }, NULL, ("finalize error"));
4281 if (error_code == _ACCOUNT_ERROR_NONE || error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4282 error_code = _account_type_query_all_from_global_db(&account_type_list);
4283 if (rc != _ACCOUNT_ERROR_NONE && rc != _ACCOUNT_ERROR_RECORD_NOT_FOUND) {
4284 ACCOUNT_ERROR("_account_type_query_all_from_global_db fail=[%d]", rc);
4285 _account_type_gslist_account_type_free(account_type_list);
4290 _INFO("_account_type_query_all end");
4292 return account_type_list;
4295 // output parameter label must be free
4296 int _account_type_query_label_by_locale_from_global_db(const char* app_id, const char* locale, char **label)
4298 int error_code = _ACCOUNT_ERROR_NONE;
4299 account_stmt hstmt = NULL;
4300 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4301 int rc = 0, binding_count = 1;
4302 char* converted_locale = NULL;
4304 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO APP ID"));
4305 ACCOUNT_RETURN_VAL((g_hAccountGlobalDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
4306 ACCOUNT_RETURN_VAL((label != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("label char is null"));
4307 ACCOUNT_RETURN_VAL((locale != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("locale char is null"));
4308 //Making label newly created
4310 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4312 converted_locale = _account_dup_text(locale);
4313 gchar** tokens = g_strsplit(converted_locale, "-", 2);
4315 if (tokens != NULL) {
4316 if ((char*)(tokens[1]) != NULL) {
4317 char* upper_token = g_ascii_strup(tokens[1], strlen(tokens[1]));
4318 if (upper_token != NULL) {
4319 _ACCOUNT_FREE(converted_locale);
4320 converted_locale = g_strdup_printf("%s_%s", tokens[0], upper_token);
4322 _ACCOUNT_FREE(upper_token);
4327 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ? AND Locale = '%s' ", LABEL_TABLE, converted_locale);
4328 _ACCOUNT_FREE(converted_locale);
4330 hstmt = _account_prepare_query(g_hAccountGlobalDB, query);
4332 if (_account_db_err_code(g_hAccountGlobalDB) == SQLITE_PERM) {
4333 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountGlobalDB));
4334 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4337 _account_query_bind_text(hstmt, binding_count++, app_id);
4339 rc = _account_query_step(hstmt);
4340 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
4342 label_s* label_record = NULL;
4344 while (rc == SQLITE_ROW) {
4345 label_record = (label_s*) malloc(sizeof(label_s));
4347 if (label_record == NULL) {
4348 ACCOUNT_FATAL("malloc Failed");
4352 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
4354 _account_type_convert_column_to_label(hstmt, label_record);
4356 _ACCOUNT_FREE(*label);
4357 //Making label newly created
4358 *label = _account_dup_text(label_record->label);
4360 _account_type_free_label_with_items(label_record);
4362 rc = _account_query_step(hstmt);
4365 rc = _account_query_finalize(hstmt);
4366 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4369 error_code = _ACCOUNT_ERROR_NONE;
4372 if (hstmt != NULL) {
4373 rc = _account_query_finalize(hstmt);
4374 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4378 _INFO("_account_type_query_label_by_locale_from_global_db() end : error_code = %d", error_code);
4383 // output parameter label must be free
4384 int _account_type_query_label_by_locale(const char* app_id, const char* locale, char **label)
4386 int error_code = _ACCOUNT_ERROR_NONE;
4387 account_stmt hstmt = NULL;
4388 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4389 int rc = 0, binding_count = 1;
4390 char* converted_locale = NULL;
4392 ACCOUNT_RETURN_VAL((app_id != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("NO APP ID"));
4393 ACCOUNT_RETURN_VAL((g_hAccountDB != NULL), {}, _ACCOUNT_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
4394 ACCOUNT_RETURN_VAL((label != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("label char is null"));
4395 ACCOUNT_RETURN_VAL((locale != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("locale char is null"));
4396 //Making label newly created
4398 ACCOUNT_MEMSET(query, 0x00, ACCOUNT_SQL_LEN_MAX);
4400 converted_locale = _account_dup_text(locale);
4401 gchar** tokens = g_strsplit(converted_locale, "-", 2);
4403 if (tokens != NULL) {
4404 if ((char*)(tokens[1]) != NULL) {
4405 char* upper_token = g_ascii_strup(tokens[1], strlen(tokens[1]));
4406 if (upper_token != NULL) {
4407 _ACCOUNT_FREE(converted_locale);
4408 converted_locale = g_strdup_printf("%s_%s", tokens[0], upper_token);
4410 _ACCOUNT_FREE(upper_token);
4415 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT * FROM %s WHERE AppId = ? AND Locale = '%s' ", LABEL_TABLE, converted_locale);
4416 _ACCOUNT_FREE(converted_locale);
4418 hstmt = _account_prepare_query(g_hAccountDB, query);
4420 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4421 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4422 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4425 _account_query_bind_text(hstmt, binding_count++, app_id);
4427 rc = _account_query_step(hstmt);
4428 ACCOUNT_CATCH_ERROR(rc == SQLITE_ROW, {}, _ACCOUNT_ERROR_RECORD_NOT_FOUND, ("The record isn't found.\n"));
4430 label_s* label_record = NULL;
4432 while (rc == SQLITE_ROW) {
4433 label_record = (label_s*) malloc(sizeof(label_s));
4435 if (label_record == NULL) {
4436 ACCOUNT_FATAL("malloc Failed");
4440 ACCOUNT_MEMSET(label_record, 0x00, sizeof(label_s));
4442 _account_type_convert_column_to_label(hstmt, label_record);
4444 _ACCOUNT_FREE(*label);
4445 //Making label newly created
4446 *label = _account_dup_text(label_record->label);
4448 _account_type_free_label_with_items(label_record);
4450 rc = _account_query_step(hstmt);
4453 rc = _account_query_finalize(hstmt);
4454 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4457 error_code = _ACCOUNT_ERROR_NONE;
4460 if (hstmt != NULL) {
4461 rc = _account_query_finalize(hstmt);
4462 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4466 if (error_code == _ACCOUNT_ERROR_RECORD_NOT_FOUND)
4467 error_code = _account_type_query_label_by_locale_from_global_db(app_id, locale, label);
4469 _INFO("_account_type_query_label_by_locale() end : error_code = %d", error_code);
4474 static int _account_insert_custom(account_s *account, int account_id)
4476 _INFO("_account_insert_custom start");
4479 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4480 account_stmt hstmt = NULL;
4482 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
4484 if (g_slist_length(account->custom_list) == 0) {
4485 ACCOUNT_DEBUG("_account_insert_custom, no custom data\n");
4486 return _ACCOUNT_ERROR_NONE;
4489 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_id);
4491 rc = _account_get_record_count(g_hAccountDB, query);
4493 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4494 ACCOUNT_ERROR("Access failed(%d, %s)", _account_db_err_msg(g_hAccountDB));
4495 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4499 ACCOUNT_SLOGE("_account_insert_custom : related account item is not existed rc=%d , %s", rc, _account_db_err_msg(g_hAccountDB));
4500 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4507 for (iter = account->custom_list; iter != NULL; iter = g_slist_next(iter)) {
4510 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
4511 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s (AccountId, AppId, Key, Value) VALUES "
4512 "(?, ?, ?, ?) ", ACCOUNT_CUSTOM_TABLE);
4514 hstmt = _account_prepare_query(g_hAccountDB, query);
4516 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4517 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4518 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4521 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
4523 account_custom_s* custom_data = NULL;
4524 custom_data = (account_custom_s*)iter->data;
4526 ret = _account_query_bind_int(hstmt, count++, account_id);
4527 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Int binding fail"));
4528 ret = _account_query_bind_text(hstmt, count++, account->package_name);
4529 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4530 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->key);
4531 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4532 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->value);
4533 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4535 rc = _account_query_step(hstmt);
4537 if (rc != SQLITE_DONE) {
4538 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4542 rc = _account_query_finalize(hstmt);
4543 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4548 _INFO("_account_insert_custom end");
4550 return _ACCOUNT_ERROR_NONE;
4553 static int _account_update_custom(account_s *account, int account_id)
4556 char query[ACCOUNT_SQL_LEN_MAX] = {0, };
4557 account_stmt hstmt = NULL;
4559 ACCOUNT_RETURN_VAL((account != NULL), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("ACCOUNT HANDLE IS NULL"));
4561 if (g_slist_length(account->custom_list) == 0) {
4562 ACCOUNT_DEBUG("_account_update_custom, no custom data\n");
4563 return _ACCOUNT_ERROR_NONE;
4566 ACCOUNT_SNPRINTF(query, sizeof(query), "SELECT COUNT(*) from %s where _id=%d", ACCOUNT_TABLE, account_id);
4568 rc = _account_get_record_count(g_hAccountDB, query);
4570 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4571 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4572 pthread_mutex_unlock(&account_mutex);
4573 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4574 } else if (_account_db_err_code(g_hAccountDB) == SQLITE_BUSY) {
4575 ACCOUNT_ERROR("database busy(%s)", _account_db_err_msg(g_hAccountDB));
4576 pthread_mutex_unlock(&account_mutex);
4577 return _ACCOUNT_ERROR_DATABASE_BUSY;
4581 ACCOUNT_SLOGE("_account_update_custom : related account item is not existed rc=%d , %s", rc, _account_db_err_msg(g_hAccountDB));
4582 return _ACCOUNT_ERROR_RECORD_NOT_FOUND;
4585 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
4587 ACCOUNT_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE AccountId=? ", ACCOUNT_CUSTOM_TABLE);
4588 hstmt = _account_prepare_query(g_hAccountDB, query);
4590 _account_query_bind_int(hstmt, count++, (int)account_id);
4591 rc = _account_query_step(hstmt);
4593 if (rc == SQLITE_BUSY) {
4594 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4595 return _ACCOUNT_ERROR_DATABASE_BUSY;
4596 } else if (rc != SQLITE_DONE) {
4597 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4598 return _ACCOUNT_ERROR_DB_FAILED;
4601 rc = _account_query_finalize(hstmt);
4602 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4607 for (iter = account->custom_list; iter != NULL; iter = g_slist_next(iter)) {
4610 ACCOUNT_MEMSET(query, 0x00, sizeof(query));
4611 ACCOUNT_SNPRINTF(query, sizeof(query), "INSERT INTO %s(AccountId, AppId, Key, Value) VALUES "
4612 "(?, ?, ?, ?) ", ACCOUNT_CUSTOM_TABLE);
4614 hstmt = _account_prepare_query(g_hAccountDB, query);
4616 if (_account_db_err_code(g_hAccountDB) == SQLITE_PERM) {
4617 ACCOUNT_ERROR("Access failed(%s)", _account_db_err_msg(g_hAccountDB));
4618 return _ACCOUNT_ERROR_PERMISSION_DENIED;
4621 ACCOUNT_RETURN_VAL((hstmt != NULL), {}, _ACCOUNT_ERROR_DB_FAILED, ("_account_prepare_query(g_hAccountDB, ) failed(%s).\n", _account_db_err_msg(g_hAccountDB)));
4623 account_custom_s* custom_data = NULL;
4624 custom_data = (account_custom_s*)iter->data;
4626 ret = _account_query_bind_int(hstmt, count++, (int)account_id);
4627 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Int binding fail"));
4628 ret = _account_query_bind_text(hstmt, count++, (char*)account->package_name);
4629 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4630 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->key);
4631 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4632 ret = _account_query_bind_text(hstmt, count++, (char*)custom_data->value);
4633 ACCOUNT_RETURN_VAL((ret == _ACCOUNT_ERROR_NONE), {}, _ACCOUNT_ERROR_INVALID_PARAMETER, ("Text binding fail"));
4635 rc = _account_query_step(hstmt);
4637 if (rc != SQLITE_DONE) {
4638 ACCOUNT_ERROR("_account_query_step() failed(%d, %s)", rc, _account_db_err_msg(g_hAccountDB));
4642 rc = _account_query_finalize(hstmt);
4643 ACCOUNT_RETURN_VAL((rc == _ACCOUNT_ERROR_NONE), {}, rc, ("finalize error"));
4648 return _ACCOUNT_ERROR_NONE;