4 #include <shortcut_private.h>
5 #include <shortcut_db.h>
7 #include <vconf-keys.h>
11 static sqlite3 * _open_db(void)
14 const char *dbfile = DB_PATH;
17 ret = db_util_open(dbfile, &db, 0);
18 if (ret != SQLITE_OK) {
19 DbgPrint("Failed to open a %s\n", dbfile);
26 static int _close_db(sqlite3 ** db)
30 if (db == NULL || *db == NULL)
31 return SHORTCUT_ERROR_INVALID_PARAMETER;
33 ret = db_util_close(*db);
34 if (ret != SQLITE_OK) {
35 DbgPrint("DB close error(%d)", ret);
36 return SHORTCUT_ERROR_IO_ERROR;
41 return SHORTCUT_ERROR_NONE;
46 * \note this function will returns allocated(heap) string
48 static inline int _get_i18n_name(sqlite3 *handle, const char *lang, int id, char **name, char **icon)
51 static const char *query = "SELECT name, icon FROM shortcut_name WHERE id = ? AND lang = ? COLLATE NOCASE";
52 const unsigned char *_name;
53 const unsigned char *_icon;
57 status = sqlite3_prepare_v2(handle, query, -1, &stmt, NULL);
58 if (status != SQLITE_OK) {
59 ErrPrint("Failed to prepare stmt: %s\n", sqlite3_errmsg(handle));
63 status = sqlite3_bind_int(stmt, 1, id);
64 if (status != SQLITE_OK) {
65 ErrPrint("Failed to bind id: %s\n", sqlite3_errmsg(handle));
70 status = sqlite3_bind_text(stmt, 2, lang, -1, SQLITE_TRANSIENT);
71 if (status != SQLITE_OK) {
72 ErrPrint("Failed to bind lang: %s\n", sqlite3_errmsg(handle));
77 DbgPrint("id: %d, lang: %s\n", id, lang);
78 if (SQLITE_ROW != sqlite3_step(stmt)) {
79 ErrPrint("Failed to do step: %s\n", sqlite3_errmsg(handle));
84 _name = sqlite3_column_text(stmt, 0);
86 if (_name && strlen((const char *)_name)) {
87 *name = strdup((const char *)_name);
89 ErrPrint("strdup: %d\n", errno);
98 _icon = sqlite3_column_text(stmt, 1);
100 if (_icon && strlen((const char *)_icon)) {
101 *icon = strdup((const char *)_icon);
103 ErrPrint("strdup: %d\n", errno);
117 sqlite3_clear_bindings(stmt);
118 sqlite3_finalize(stmt);
122 static inline char *_cur_locale(void)
127 language = vconf_get_str(VCONFKEY_LANGSET);
142 language = strdup("en-us");
144 ErrPrint("Heap: %d\n", errno);
150 EAPI int shortcut_db_get_list(const char *package_name, GList **shortcut_list)
153 sqlite3 *handle = NULL;
155 const unsigned char *name;
156 char *i18n_name = NULL;
157 char *i18n_icon = NULL;
158 const unsigned char *extra_data;
159 const unsigned char *extra_key;
160 const unsigned char *icon;
161 shortcut_info_s *shortcut;
169 ErrPrint("Failed to open a DB\n");
170 return SHORTCUT_ERROR_IO_ERROR;
173 language = _cur_locale();
175 ErrPrint("Locale is not valid\n");
177 return SHORTCUT_ERROR_FAULT;
181 query = "SELECT id, appid, name, extra_key, extra_data, icon FROM shortcut_service WHERE appid = ?";
182 ret = sqlite3_prepare_v2(handle, query, -1, &stmt, NULL);
183 if (ret != SQLITE_OK) {
184 ErrPrint("prepare: %s\n", sqlite3_errmsg(handle));
187 return SHORTCUT_ERROR_IO_ERROR;
190 ret = sqlite3_bind_text(stmt, 1, package_name, -1, SQLITE_TRANSIENT);
191 if (ret != SQLITE_OK) {
192 ErrPrint("bind text: %s\n", sqlite3_errmsg(handle));
193 sqlite3_finalize(stmt);
196 return SHORTCUT_ERROR_IO_ERROR;
199 query = "SELECT id, appid, name, extra_key, extra_data, icon FROM shortcut_service";
200 ret = sqlite3_prepare_v2(handle, query, -1, &stmt, NULL);
201 if (ret != SQLITE_OK) {
202 ErrPrint("prepare: %s\n", sqlite3_errmsg(handle));
205 return SHORTCUT_ERROR_IO_ERROR;
210 *shortcut_list = NULL;
211 while (SQLITE_ROW == sqlite3_step(stmt)) {
212 id = sqlite3_column_int(stmt, 0);
214 package_name = (const char *)sqlite3_column_text(stmt, 1);
216 LOGE("Failed to get package name\n");
220 name = sqlite3_column_text(stmt, 2);
222 LOGE("Failed to get name\n");
226 extra_key = sqlite3_column_text(stmt, 3);
228 LOGE("Failed to get service\n");
232 extra_data = sqlite3_column_text(stmt, 4);
234 LOGE("Failed to get service\n");
238 icon = sqlite3_column_text(stmt, 5);
240 LOGE("Failed to get icon\n");
246 * Implement the "GET LOCALE" code
248 /* if (get_i18n_name(language, id, &i18n_name, &i18n_icon) < 0) { */
249 /* Okay, we can't manage this. just use the fallback string */
251 _get_i18n_name(handle, language, id, &i18n_name, &i18n_icon);
254 shortcut = (shortcut_info_s *)calloc(sizeof(shortcut_info_s), 1);
255 if (shortcut == NULL) {
259 shortcut->package_name = strdup(package_name);
260 shortcut->icon = strdup((i18n_icon != NULL ? i18n_icon : (char *)icon));
261 shortcut->name = strdup((i18n_name != NULL ? i18n_name : (char *)name));
262 shortcut->extra_key = strdup((char *)extra_key);
263 shortcut->extra_data = strdup((char *)extra_key);
264 *shortcut_list = g_list_append(*shortcut_list, shortcut);
274 sqlite3_clear_bindings(stmt);
275 sqlite3_finalize(stmt);