4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
29 #include "ail_private.h"
32 #define retv_with_dbmsg_if(expr, val) do { \
34 _E("db_info.dbro: %s", sqlite3_errmsg(db_info.dbro)); \
35 _E("db_info.dbrw: %s", sqlite3_errmsg(db_info.dbrw)); \
36 _E("db_info.dbro errcode: %d", sqlite3_extended_errcode(db_info.dbro)); \
37 _E("db_info.dbrw errcode: %d", sqlite3_extended_errcode(db_info.dbrw)); \
43 static __thread struct {
51 static char* getUserAppDB(void)
54 return tzplatform_mkpath(TZ_USER_HOME, ".applications/dbspace/.app_info.db");
56 return APP_INFO_DB_FILE;
59 static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt)
63 retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
64 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
65 retv_if(!db, AIL_ERROR_DB_FAILED);
67 ret = sqlite3_prepare_v2(db, query, strlen(query), stmt, NULL);
68 if (ret != SQLITE_OK) {
69 _E("%s\n", sqlite3_errmsg(db));
70 return AIL_ERROR_DB_FAILED;
75 ail_error_e db_open(db_open_mode mode)
80 if(mode & DB_OPEN_RO) {
82 //ret = db_util_open_with_options(APP_INFO_DB, &db_info.dbro, SQLITE_OPEN_READONLY, NULL);
83 ret = db_util_open(getUserAppDB(), &db_info.dbro, 0);
84 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
88 if(mode & DB_OPEN_RW) {
90 ret = db_util_open(getUserAppDB(), &db_info.dbrw, 0);
91 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
98 ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt)
100 return db_do_prepare(db_info.dbro, query, stmt);
103 ail_error_e db_prepare_rw(const char *query, sqlite3_stmt **stmt)
105 return db_do_prepare(db_info.dbrw, query, stmt);
109 ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value)
113 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
115 ret = sqlite3_bind_int(stmt, idx, (int) value);
116 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
123 ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value)
127 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
129 ret = sqlite3_bind_int(stmt, idx, value);
130 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
135 ail_error_e db_bind_text(sqlite3_stmt *stmt, int idx, char* value)
139 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
141 ret = sqlite3_bind_text(stmt, idx, value, strlen(value), 0);
142 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
148 ail_error_e db_step(sqlite3_stmt *stmt)
152 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
154 ret = sqlite3_step(stmt);
157 return AIL_ERROR_NO_DATA;
162 retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED);
167 ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value)
171 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
172 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
174 out_val = sqlite3_column_int(stmt, index);
175 *value = (out_val == 1)? true:false;
182 ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value)
184 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
185 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
187 *value = sqlite3_column_int(stmt, index);
194 ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str)
196 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
197 retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
199 *str = (char *)sqlite3_column_text(stmt, index);
206 ail_error_e db_reset(sqlite3_stmt *stmt)
210 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
212 sqlite3_clear_bindings(stmt);
214 ret = sqlite3_reset(stmt);
215 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
222 ail_error_e db_finalize(sqlite3_stmt *stmt)
226 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
228 ret = sqlite3_finalize(stmt);
229 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
236 ail_error_e db_exec(const char *query)
241 retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
242 retv_if(!db_info.dbrw, AIL_ERROR_DB_FAILED);
244 ret = sqlite3_exec(db_info.dbrw, query, NULL, NULL, &errmsg);
245 if (ret != SQLITE_OK) {
246 _E("Cannot execute this query - %s. because %s",
247 query, errmsg? errmsg:"uncatched error");
248 sqlite3_free(errmsg);
249 return AIL_ERROR_DB_FAILED;
257 ail_error_e db_close(void)
262 ret = sqlite3_close(db_info.dbro);
263 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
268 ret = sqlite3_close(db_info.dbrw);
269 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
277 EXPORT_API ail_error_e ail_db_close(void)
282 int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
284 char *error_message = NULL;
286 sqlite3_exec(db_info.dbro, query, callback, data, &error_message)) {
287 _E("Don't execute query = %s error message = %s\n", query,
289 sqlite3_free(error_message);
292 sqlite3_free(error_message);