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"
30 #include "ail_convert.h"
32 #include "ail_package.h"
35 char *_get_where_clause(ail_filter_h filter);
41 static inline void _add_cond_to_filter(ail_filter_h filter, struct element *cond)
43 filter->list = g_slist_append(filter->list, cond);
46 EXPORT_API ail_error_e ail_filter_new(ail_filter_h *filter)
50 retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
52 f = (struct ail_filter *)calloc(1, sizeof(struct ail_filter));
53 retv_if (NULL == f, AIL_ERROR_OUT_OF_MEMORY);
60 static inline void _destroy_cond(gpointer data, gpointer user_data)
66 cond = (struct element *)data;
69 ELEMENT_TYPE(cond, t);
70 if (VAL_TYPE_STR == t) {
71 if(ELEMENT_STR(cond)->value)
72 free(ELEMENT_STR(cond)->value);
79 EXPORT_API ail_error_e ail_filter_destroy(ail_filter_h filter)
81 retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
84 g_slist_foreach(filter->list, _destroy_cond, NULL);
85 g_slist_free(filter->list);
94 EXPORT_API ail_error_e ail_filter_add_bool(ail_filter_h filter, const char *property, bool value)
99 retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
100 retv_if (NULL == property, AIL_ERROR_INVALID_PARAMETER);
102 prop = _ail_convert_to_prop_bool(property);
104 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
105 return AIL_ERROR_INVALID_PARAMETER;
107 c = (struct element *)calloc(1, sizeof(struct element_bool));
108 retv_if (NULL == c, AIL_ERROR_OUT_OF_MEMORY);
110 ELEMENT_BOOL(c)->prop = (int)prop;
111 ELEMENT_BOOL(c)->value = value;
113 _add_cond_to_filter(filter, c);
118 EXPORT_API ail_error_e ail_filter_add_int(ail_filter_h filter, const char *property, int value)
123 retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
124 retv_if (NULL == property, AIL_ERROR_INVALID_PARAMETER);
126 prop = _ail_convert_to_prop_int(property);
128 if (prop < E_AIL_PROP_INT_MIN || prop > E_AIL_PROP_INT_MAX)
129 return AIL_ERROR_INVALID_PARAMETER;
131 c = (struct element *)calloc(1, sizeof(struct element_int));
132 retv_if (NULL == c, AIL_ERROR_OUT_OF_MEMORY);
134 ELEMENT_INT(c)->prop = (int)prop;
135 ELEMENT_INT(c)->value = value;
137 _add_cond_to_filter(filter, c);
142 EXPORT_API ail_error_e ail_filter_add_str(ail_filter_h filter, const char *property, const char *value)
144 struct element *c; //condition
147 retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
148 retv_if (NULL == property, AIL_ERROR_INVALID_PARAMETER);
150 prop = _ail_convert_to_prop_str(property);
152 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
153 return AIL_ERROR_INVALID_PARAMETER;
155 retv_if (NULL == value, AIL_ERROR_INVALID_PARAMETER);
156 retv_if (strlen(value) == 0, AIL_ERROR_INVALID_PARAMETER);
158 c = (struct element *)calloc(1, sizeof(struct element_str));
160 retv_if (NULL == c, AIL_ERROR_OUT_OF_MEMORY);
162 ELEMENT_STR(c)->prop = (int)prop;
163 ELEMENT_STR(c)->value = strdup(value);
164 if (!ELEMENT_STR(c)->value) {
166 return AIL_ERROR_OUT_OF_MEMORY;
169 _add_cond_to_filter(filter, c);
174 static void _get_condition(gpointer data, char **condition)
176 struct element *e = (struct element *)data;
178 char buf[AIL_SQL_QUERY_MAX_LEN];
181 f = sql_get_filter(e->prop);
189 snprintf(buf, sizeof(buf), f, ELEMENT_BOOL(e)->value);
192 snprintf(buf, sizeof(buf), f, ELEMENT_INT(e)->value);
195 if (E_AIL_PROP_NAME_STR == e->prop) {
196 snprintf(buf, sizeof(buf), f, ELEMENT_STR(e)->value, ELEMENT_STR(e)->value);
198 snprintf(buf, sizeof(buf), f, ELEMENT_STR(e)->value);
202 _E("Invalid property type");
207 *condition = strdup(buf);
212 char *_get_where_clause(ail_filter_h filter)
215 char w[AIL_SQL_QUERY_MAX_LEN] = {0,};
220 snprintf(w, AIL_SQL_QUERY_MAX_LEN, " WHERE ");
222 for (l = filter->list; l; l = g_slist_next(l)) {
223 _get_condition(l->data, &c);
230 strncat(w, c, sizeof(w)-strlen(w)-1);
231 w[sizeof(w)-1] = '\0';
234 if (g_slist_next(l)) {
235 strncat(w, " and ", sizeof(w)-strlen(w)-1);
236 w[sizeof(w)-1] = '\0';
240 // _D("where = %s", w);
245 EXPORT_API ail_error_e ail_filter_count_appinfo(ail_filter_h filter, int *cnt)
247 char q[AIL_SQL_QUERY_MAX_LEN];
254 int filter_count = 0;
256 retv_if(!cnt, AIL_ERROR_INVALID_PARAMETER);
258 if (db_open(DB_OPEN_RO, GLOBAL_USER) != AIL_ERROR_OK)
259 return AIL_ERROR_DB_FAILED;
261 snprintf(q, sizeof(q), "SELECT %s FROM %s", SQL_FLD_APP_INFO_WITH_LOCALNAME, SQL_TBL_APP_INFO_WITH_LOCALNAME);
264 retv_if (NULL == tmp_q, AIL_ERROR_OUT_OF_MEMORY);
265 l = sql_get_locale();
267 _E("Failed to get locale string");
269 return AIL_ERROR_FAIL;
271 snprintf(q, sizeof(q), tmp_q, l);
275 if (filter && filter->list) {
276 w = _get_where_clause(filter);
277 retv_if (NULL == w, AIL_ERROR_FAIL);
278 strncat(q, w, sizeof(q)-strlen(q)-1);
279 q[sizeof(q)-1] = '\0';
283 _D("No filter exists. All records are retreived");
286 if (db_prepare_globalro(q, &stmt) != AIL_ERROR_OK) {
287 _E("db_prepare_globalro fail for query = %s",q);
288 return AIL_ERROR_DB_FAILED;
290 ai = appinfo_create();
294 return AIL_ERROR_FAIL;
297 appinfo_set_stmt(ai, stmt);
298 while (db_step(stmt) == AIL_ERROR_OK) {
300 if(_appinfo_check_installed_storage(ai) != AIL_ERROR_OK)
314 EXPORT_API ail_error_e ail_filter_count_usr_appinfo(ail_filter_h filter, int *cnt, uid_t uid)
316 char q[AIL_SQL_QUERY_MAX_LEN];
323 int filter_count = 0;
325 retv_if(!cnt, AIL_ERROR_INVALID_PARAMETER);
327 //is_admin ; redirect
328 if (uid == GLOBAL_USER)
329 return ail_filter_count_appinfo(filter, cnt);
331 if (db_open(DB_OPEN_RO, uid) != AIL_ERROR_OK)
332 return AIL_ERROR_DB_FAILED;
334 snprintf(q, sizeof(q), "SELECT %s FROM %s", SQL_FLD_APP_INFO_WITH_LOCALNAME, SQL_TBL_APP_INFO_WITH_LOCALNAME);
337 retv_if (NULL == tmp_q, AIL_ERROR_OUT_OF_MEMORY);
338 l = sql_get_locale();
340 _E("Failed to get locale string");
342 return AIL_ERROR_FAIL;
344 snprintf(q, sizeof(q), tmp_q, l);
348 if (filter && filter->list) {
349 w = _get_where_clause(filter);
350 retv_if (NULL == w, AIL_ERROR_FAIL);
351 strncat(q, w, sizeof(q)-strlen(q)-1);
352 q[sizeof(q)-1] = '\0';
356 _D("No filter exists. All records are retreived");
358 if (db_prepare(q, &stmt) != AIL_ERROR_OK) {
359 _E("db_prepare fail for query = %s",q);
360 return AIL_ERROR_DB_FAILED;
363 ai = appinfo_create();
365 _E("Failed to create appinfo");
367 return AIL_ERROR_OUT_OF_MEMORY;
370 appinfo_set_stmt(ai, stmt);
371 while (db_step(stmt) == AIL_ERROR_OK) {
373 if(_appinfo_check_installed_storage(ai) != AIL_ERROR_OK)
388 EXPORT_API ail_error_e ail_filter_list_appinfo_foreach(ail_filter_h filter, ail_list_appinfo_cb cb, void *user_data)
390 char q[AIL_SQL_QUERY_MAX_LEN];
398 retv_if (NULL == cb, AIL_ERROR_INVALID_PARAMETER);
400 if (db_open(DB_OPEN_RO, GLOBAL_USER) != AIL_ERROR_OK)
401 return AIL_ERROR_DB_FAILED;
403 snprintf(q, sizeof(q), "SELECT %s FROM %s", SQL_FLD_APP_INFO_WITH_LOCALNAME, SQL_TBL_APP_INFO_WITH_LOCALNAME);
406 retv_if (NULL == tmp_q, AIL_ERROR_OUT_OF_MEMORY);
407 l = sql_get_locale();
409 _E("Failed to get locale string");
411 return AIL_ERROR_FAIL;
413 snprintf(q, sizeof(q), tmp_q, l);
417 if (filter && filter->list) {
418 w = _get_where_clause(filter);
419 retv_if (NULL == w, AIL_ERROR_FAIL);
420 strncat(q, w, sizeof(q)-strlen(q)-1);
421 q[sizeof(q)-1] = '\0';
422 strncat(q, " order by app_info.package", sizeof(q)-strlen(q)-1);
423 q[sizeof(q)-1] = '\0';
427 _D("No filter exists. All records are retreived");
429 // _D("Query = %s",q);
431 if (db_prepare_globalro(q, &stmt) != AIL_ERROR_OK) {
432 _E("db_prepare fail for query = %s",q);
433 return AIL_ERROR_DB_FAILED;
435 /*if (db_prepare_globalro(q, &stmt) != AIL_ERROR_OK) {
436 _E("db_prepare fail for query = %s",q);
437 return AIL_ERROR_DB_FAILED;
439 ai = appinfo_create();
443 return AIL_ERROR_FAIL;
446 appinfo_set_stmt(ai, stmt);
448 while (i = db_step(stmt) == AIL_ERROR_OK) {
449 _E("------------------------dbstep : %u\n", i);
450 if(_appinfo_check_installed_storage(ai) != AIL_ERROR_OK)
453 r = cb(ai, user_data,GLOBAL_USER);
454 if (AIL_CB_RET_CANCEL == r)
463 EXPORT_API ail_error_e ail_filter_list_usr_appinfo_foreach(ail_filter_h filter, ail_list_appinfo_cb cb, void *user_data, uid_t uid)
465 char q[AIL_SQL_QUERY_MAX_LEN];
473 retv_if (NULL == cb, AIL_ERROR_INVALID_PARAMETER);
475 if (db_open(DB_OPEN_RO, uid) != AIL_ERROR_OK)
476 return AIL_ERROR_DB_FAILED;
478 snprintf(q, sizeof(q), "SELECT %s FROM %s", SQL_FLD_APP_INFO_WITH_LOCALNAME, SQL_TBL_APP_INFO_WITH_LOCALNAME);
481 retv_if (NULL == tmp_q, AIL_ERROR_OUT_OF_MEMORY);
482 l = sql_get_locale();
484 _E("Failed to get locale string");
486 return AIL_ERROR_FAIL;
488 snprintf(q, sizeof(q), tmp_q, l);
492 if (filter && filter->list) {
493 w = _get_where_clause(filter);
494 retv_if (NULL == w, AIL_ERROR_FAIL);
495 strncat(q, w, sizeof(q)-strlen(q)-1);
496 q[sizeof(q)-1] = '\0';
497 strncat(q, " order by app_info.package", sizeof(q)-strlen(q)-1);
498 q[sizeof(q)-1] = '\0';
502 _D("No filter exists. All records are retreived");
505 if (db_prepare(q, &stmt) != AIL_ERROR_OK) {
506 _E("db_prepare fail for query = %s",q);
507 return AIL_ERROR_DB_FAILED;
510 ai = appinfo_create();
512 _E("Failed to create appinfo");
514 return AIL_ERROR_DB_FAILED;
517 appinfo_set_stmt(ai, stmt);
519 while (i = db_step(stmt) == AIL_ERROR_OK) {
520 if(_appinfo_check_installed_storage(ai) != AIL_ERROR_OK)
523 r = cb(ai, user_data,uid);
524 if (AIL_CB_RET_CANCEL == r)