2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <sys/types.h>
30 #include <livebox-errno.h>
37 #include "client_life.h"
38 #include "slave_life.h"
51 static inline int load_abi_table(void)
67 static const char *field[] = {
73 char group[MAX_ABI + 1];
74 char pkgname[MAX_PKGNAME + 1];
76 fp = fopen("/usr/share/"PACKAGE"/abi.ini", "rt");
78 return LB_STATUS_ERROR_IO;
81 while ((ch = getc(fp)) != EOF && state != ERROR) {
99 DbgPrint("group: %s\n", group);
104 } else if (idx < MAX_ABI) {
107 ErrPrint("Overflow\n");
117 /* New group started */
129 ErrPrint("unknown tag\n");
134 if (*ptr == '\0' && ch == '=') {
140 DbgPrint("tag: %s\n", field[tag_id]);
141 } else if (*ptr == ch) {
146 while (ptr >= field[idx]) {
157 if (idx == 0) { /* LTRIM */
163 } else if (isspace(ch)) {
166 DbgPrint("value: %s\n", pkgname);
168 DbgPrint("Add [%s] - [%s]\n", group, pkgname);
169 ret = abi_add_entry(group, pkgname);
171 ErrPrint("Failed to add %s for %s\n", pkgname, group);
175 } else if (idx < MAX_PKGNAME) {
179 ErrPrint("Overflow\n");
193 if (state == VALUE) {
199 DbgPrint("value: %s\n", pkgname);
200 DbgPrint("Add [%s] - [%s]\n", group, pkgname);
201 ret = abi_add_entry(group, pkgname);
203 ErrPrint("Failed to add %s for %s\n", pkgname, group);
212 ErrPrint("fclose: %s\n", strerror(errno));
213 return LB_STATUS_SUCCESS;
216 static inline int build_client_info(struct pkg_info *info)
218 static const char *dml = "SELECT auto_launch, pd_size FROM client WHERE pkgid = ?";
225 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
226 if (ret != SQLITE_OK) {
227 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
228 return LB_STATUS_ERROR_IO;
231 ret = sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT);
232 if (ret != SQLITE_OK) {
233 ErrPrint("Failed to bind a pkgname %s\n", package_name(info));
234 sqlite3_finalize(stmt);
235 return LB_STATUS_ERROR_IO;
238 if (sqlite3_step(stmt) != SQLITE_ROW) {
239 ErrPrint("%s has no records (%s)\n", package_name(info), sqlite3_errmsg(s_info.handle));
241 sqlite3_clear_bindings(stmt);
242 sqlite3_finalize(stmt);
243 return LB_STATUS_ERROR_IO;
246 package_set_auto_launch(info, (const char *)sqlite3_column_text(stmt, 0));
248 tmp = (const char *)sqlite3_column_text(stmt, 1);
249 if (tmp && strlen(tmp)) {
250 if (sscanf(tmp, "%dx%d", &width, &height) != 2) {
251 ErrPrint("Failed to get PD width and Height (%s)\n", tmp);
253 package_set_pd_width(info, width);
254 package_set_pd_height(info, height);
259 sqlite3_clear_bindings(stmt);
260 sqlite3_finalize(stmt);
261 return LB_STATUS_SUCCESS;
264 static inline int build_provider_info(struct pkg_info *info)
266 static const char *dml = "SELECT provider.network, provider.abi, provider.secured, provider.box_type, provider.box_src, provider.box_group, provider.pd_type, provider.pd_src, provider.pd_group, provider.libexec, provider.timeout, provider.period, provider.script, provider.pinup, pkgmap.appid FROM provider, pkgmap WHERE pkgmap.pkgid = ? AND provider.pkgid = ?";
272 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
273 if (ret != SQLITE_OK) {
274 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
275 return LB_STATUS_ERROR_IO;
278 if (sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT) != SQLITE_OK) {
279 ErrPrint("Failed to bind a pkgname(%s) - %s\n", package_name(info), sqlite3_errmsg(s_info.handle));
280 sqlite3_finalize(stmt);
281 return LB_STATUS_ERROR_IO;
284 if (sqlite3_bind_text(stmt, 2, package_name(info), -1, SQLITE_TRANSIENT) != SQLITE_OK) {
285 ErrPrint("Failed to bind a pkgname(%s) - %s\n", package_name(info), sqlite3_errmsg(s_info.handle));
286 sqlite3_finalize(stmt);
287 return LB_STATUS_ERROR_IO;
290 if (sqlite3_step(stmt) != SQLITE_ROW) {
291 ErrPrint("%s has no record(%s)\n", package_name(info), sqlite3_errmsg(s_info.handle));
293 sqlite3_clear_bindings(stmt);
294 sqlite3_finalize(stmt);
295 return LB_STATUS_ERROR_IO;
298 appid = (const char *)sqlite3_column_text(stmt, 14);
299 if (!appid || !strlen(appid)) {
300 ErrPrint("Failed to execute the DML for %s\n", package_name(info));
302 sqlite3_clear_bindings(stmt);
303 sqlite3_finalize(stmt);
304 return LB_STATUS_ERROR_IO;
307 package_set_network(info, sqlite3_column_int(stmt, 0));
308 package_set_secured(info, sqlite3_column_int(stmt, 2));
310 tmp = (const char *)sqlite3_column_text(stmt, 1);
311 if (tmp && strlen(tmp))
312 package_set_abi(info, tmp);
314 package_set_lb_type(info, sqlite3_column_int(stmt, 3));
315 tmp = (const char *)sqlite3_column_text(stmt, 4);
316 if (tmp && strlen(tmp)) {
317 package_set_lb_path(info, tmp);
318 DbgPrint("LB Path: %s\n", tmp);
320 tmp = (const char *)sqlite3_column_text(stmt, 5);
321 if (tmp && strlen(tmp))
322 package_set_lb_group(info, tmp);
325 package_set_pd_type(info, sqlite3_column_int(stmt, 6));
326 tmp = (const char *)sqlite3_column_text(stmt, 7);
327 if (tmp && strlen(tmp)) {
328 package_set_pd_path(info, tmp);
329 DbgPrint("PD Path: %s\n", tmp);
331 tmp = (const char *)sqlite3_column_text(stmt, 8);
332 if (tmp && strlen(tmp))
333 package_set_pd_group(info, tmp);
336 tmp = (const char *)sqlite3_column_text(stmt, 9);
337 if (tmp && strlen(tmp))
338 package_set_libexec(info, tmp);
340 package_set_timeout(info, sqlite3_column_int(stmt, 10));
342 tmp = (const char *)sqlite3_column_text(stmt, 11);
343 if (tmp && strlen(tmp))
344 package_set_period(info, atof(tmp));
346 tmp = (const char *)sqlite3_column_text(stmt, 12);
347 if (tmp && strlen(tmp))
348 package_set_script(info, tmp);
349 package_set_pinup(info, sqlite3_column_int(stmt, 13));
352 sqlite3_clear_bindings(stmt);
353 sqlite3_finalize(stmt);
354 return LB_STATUS_SUCCESS;
357 static inline int build_box_size_info(struct pkg_info *info)
359 static const char *dml = "SELECT size_type FROM box_size WHERE pkgid = ?";
362 unsigned int size_type;
363 unsigned int size_list;
365 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
366 if (ret != SQLITE_OK) {
367 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
368 return LB_STATUS_ERROR_IO;
371 if (sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT) != SQLITE_OK) {
372 ErrPrint("Failed to bind a pkgname(%s) - %s\n", package_name(info), sqlite3_errmsg(s_info.handle));
373 sqlite3_finalize(stmt);
374 return LB_STATUS_ERROR_IO;
378 while (sqlite3_step(stmt) == SQLITE_ROW) {
379 size_type = sqlite3_column_int(stmt, 0);
380 size_list |= size_type;
383 package_set_size_list(info, size_list);
386 sqlite3_clear_bindings(stmt);
387 sqlite3_finalize(stmt);
388 return LB_STATUS_SUCCESS;
391 static inline int load_context_option(struct context_item *item, int id)
393 static const char *dml = "SELECT key, value FROM option WHERE option_id = ?";
399 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
400 if (ret != SQLITE_OK) {
401 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
402 return LB_STATUS_ERROR_IO;
405 ret = sqlite3_bind_int(stmt, 1, id);
406 if (ret != SQLITE_OK) {
407 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
408 ret = LB_STATUS_ERROR_IO;
412 ret = LB_STATUS_ERROR_NOT_EXIST;
413 while (sqlite3_step(stmt) == SQLITE_ROW) {
414 key = (const char *)sqlite3_column_text(stmt, 0);
415 if (!key || !strlen(key)) {
416 ErrPrint("KEY is nil\n");
420 value = (const char *)sqlite3_column_text(stmt, 1);
421 if (!value || !strlen(value)) {
422 ErrPrint("VALUE is nil\n");
426 ret = group_add_option(item, key, value);
433 sqlite3_clear_bindings(stmt);
434 sqlite3_finalize(stmt);
438 static inline int load_context_item(struct context_info *info, int id)
440 static const char *dml = "SELECT ctx_item, option_id FROM groupmap WHERE id = ?";
441 struct context_item *item;
443 const char *ctx_item;
447 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
448 if (ret != SQLITE_OK) {
449 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
450 return LB_STATUS_ERROR_IO;
453 ret = sqlite3_bind_int(stmt, 1, id);
454 if (ret != SQLITE_OK) {
455 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
456 ret = LB_STATUS_ERROR_IO;
460 ret = LB_STATUS_ERROR_NOT_EXIST;
461 while (sqlite3_step(stmt) == SQLITE_ROW) {
462 ctx_item = (const char *)sqlite3_column_text(stmt, 0);
463 option_id = sqlite3_column_int(stmt, 1);
465 item = group_add_context_item(info, ctx_item);
467 ErrPrint("Failed to add a new context item\n");
468 ret = LB_STATUS_ERROR_FAULT;
472 ret = load_context_option(item, option_id);
479 sqlite3_clear_bindings(stmt);
480 sqlite3_finalize(stmt);
484 static inline int build_group_info(struct pkg_info *info)
486 static const char *dml = "SELECT id, cluster, category FROM groupinfo WHERE pkgid = ?";
490 const char *cluster_name;
491 const char *category_name;
492 struct cluster *cluster;
493 struct category *category;
494 struct context_info *ctx_info;
496 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
497 if (ret != SQLITE_OK) {
498 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
499 return LB_STATUS_ERROR_IO;
502 ret = sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT);
503 if (ret != SQLITE_OK) {
504 ErrPrint("Failed to bind a package name(%s)\n", package_name(info));
505 sqlite3_finalize(stmt);
506 return LB_STATUS_ERROR_IO;
509 while (sqlite3_step(stmt) == SQLITE_ROW) {
510 id = sqlite3_column_int(stmt, 0);
511 cluster_name = (const char *)sqlite3_column_text(stmt, 1);
512 if (!cluster_name || !strlen(cluster_name)) {
513 DbgPrint("Cluster name is not valid\n");
517 category_name = (const char *)sqlite3_column_text(stmt, 2);
518 if (!category_name || !strlen(category_name)) {
519 DbgPrint("Category name is not valid\n");
523 cluster = group_find_cluster(cluster_name);
525 cluster = group_create_cluster(cluster_name);
527 ErrPrint("Failed to create a cluster(%s)\n", cluster_name);
532 category = group_find_category(cluster, category_name);
534 category = group_create_category(cluster, category_name);
536 ErrPrint("Failed to create a category(%s)\n", category_name);
543 * Step 1. Get the list of the context item from the DB using 'id'
544 * {context_item, option_id}
545 * Step 2. Get the list of the options from the DB using option_id
548 ctx_info = group_create_context_info(category, package_name(info));
550 ret = load_context_item(ctx_info, id);
552 if (ret == LB_STATUS_ERROR_NOT_EXIST) {
553 DbgPrint("Has no specific context info\n");
555 DbgPrint("Context info is not valid\n");
556 group_destroy_context_info(ctx_info);
562 package_add_ctx_info(info, ctx_info);
567 sqlite3_clear_bindings(stmt);
568 sqlite3_finalize(stmt);
569 return LB_STATUS_SUCCESS;
572 HAPI int io_is_exists(const char *pkgname) /* Manifest Package Name */
577 if (!s_info.handle) {
578 ErrPrint("DB is not ready\n");
579 return LB_STATUS_ERROR_IO;
582 ret = sqlite3_prepare_v2(s_info.handle, "SELECT COUNT(pkgid) FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
583 if (ret != SQLITE_OK) {
584 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
585 return LB_STATUS_ERROR_IO;
588 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
589 if (ret != SQLITE_OK) {
590 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
591 ret = LB_STATUS_ERROR_IO;
595 if (sqlite3_step(stmt) != SQLITE_ROW) {
596 ErrPrint("%s has no record (%s)\n", pkgname, sqlite3_errmsg(s_info.handle));
597 ret = LB_STATUS_ERROR_IO;
601 ret = sqlite3_column_int(stmt, 0);
604 sqlite3_finalize(stmt);
608 HAPI char *io_livebox_pkgname(const char *pkgname)
617 if (!s_info.handle) {
618 ErrPrint("DB is not ready\n");
622 ret = sqlite3_prepare_v2(s_info.handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
623 if (ret != SQLITE_OK) {
624 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
628 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
629 if (ret != SQLITE_OK) {
630 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
634 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, SQLITE_TRANSIENT);
635 if (ret != SQLITE_OK) {
636 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
640 if (sqlite3_step(stmt) != SQLITE_ROW) {
641 ErrPrint("%s has no record (%s)\n", pkgname, sqlite3_errmsg(s_info.handle));
645 tmp = (char *)sqlite3_column_text(stmt, 0);
646 if (tmp && strlen(tmp)) {
649 ErrPrint("Heap: %s\n", strerror(errno));
654 sqlite3_finalize(stmt);
658 HAPI int io_crawling_liveboxes(int (*cb)(const char *pkgname, int prime, void *data), void *data)
662 if (!s_info.handle) {
663 ErrPrint("DB is not ready\n");
668 ret = sqlite3_prepare_v2(s_info.handle, "SELECT pkgid, prime FROM pkgmap", -1, &stmt, NULL);
669 if (ret != SQLITE_OK) {
670 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
675 while (sqlite3_step(stmt) == SQLITE_ROW) {
676 pkgid = (const char *)sqlite3_column_text(stmt, 0);
677 if (!pkgid || !strlen(pkgid))
680 prime = (int)sqlite3_column_int(stmt, 1);
681 if (cb(pkgid, prime, data) < 0) {
683 sqlite3_finalize(stmt);
684 return LB_STATUS_ERROR_CANCEL;
689 sqlite3_finalize(stmt);
693 dir = opendir(ROOT_PATH);
695 ErrPrint("Error: %s\n", strerror(errno));
699 while ((ent = readdir(dir))) {
700 if (ent->d_name[0] == '.')
703 if (cb(ent->d_name, -1, data) < 0) {
704 if (closedir(dir) < 0)
705 ErrPrint("closedir: %s\n", strerror(errno));
706 return LB_STATUS_ERROR_CANCEL;
710 if (closedir(dir) < 0)
711 ErrPrint("closedir: %s\n", strerror(errno));
714 return LB_STATUS_SUCCESS;
717 HAPI int io_update_livebox_package(const char *pkgname, int (*cb)(const char *lb_pkgname, int prime, void *data), void *data)
725 return LB_STATUS_ERROR_INVALID;
727 if (!s_info.handle) {
728 ErrPrint("DB is not ready\n");
729 return LB_STATUS_ERROR_INVALID;
732 ret = sqlite3_prepare_v2(s_info.handle, "SELECT pkgid, prime FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
733 if (ret != SQLITE_OK) {
734 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
735 return LB_STATUS_ERROR_FAULT;
738 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
739 if (ret != SQLITE_OK) {
740 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
741 ret = LB_STATUS_ERROR_FAULT;
746 while (sqlite3_step(stmt) == SQLITE_ROW) {
747 pkgid = (char *)sqlite3_column_text(stmt, 0);
748 if (!pkgid || !strlen(pkgid))
751 prime = sqlite3_column_int(stmt, 1);
753 if (cb(pkgid, prime, data) < 0) {
754 DbgPrint("Callback canceled\n");
762 sqlite3_finalize(stmt);
766 HAPI int io_load_package_db(struct pkg_info *info)
770 if (!s_info.handle) {
771 ErrPrint("DB is not ready\n");
772 return LB_STATUS_ERROR_IO;
775 ret = build_provider_info(info);
779 ret = build_client_info(info);
783 ret = build_box_size_info(info);
787 ret = build_group_info(info);
791 return LB_STATUS_SUCCESS;
794 static inline int db_init(void)
799 ret = db_util_open(DBFILE, &s_info.handle, DB_UTIL_REGISTER_HOOK_METHOD);
800 if (ret != SQLITE_OK) {
801 ErrPrint("Failed to open a DB\n");
802 return LB_STATUS_ERROR_IO;
805 if (lstat(DBFILE, &stat) < 0) {
806 db_util_close(s_info.handle);
807 s_info.handle = NULL;
808 ErrPrint("%s\n", strerror(errno));
809 return LB_STATUS_ERROR_IO;
812 if (!S_ISREG(stat.st_mode)) {
813 ErrPrint("Invalid file\n");
814 db_util_close(s_info.handle);
815 s_info.handle = NULL;
816 return LB_STATUS_ERROR_INVALID;
819 if (stat.st_size <= 0)
820 DbgPrint("Size is %d (But use this ;)\n", stat.st_size);
822 return LB_STATUS_SUCCESS;
825 static inline int db_fini(void)
828 return LB_STATUS_SUCCESS;
830 db_util_close(s_info.handle);
831 s_info.handle = NULL;
833 return LB_STATUS_SUCCESS;
836 HAPI int io_init(void)
841 DbgPrint("DB initialized: %d\n", ret);
843 ret = load_abi_table();
844 DbgPrint("ABI table is loaded: %d\n", ret);
846 return LB_STATUS_SUCCESS;
849 HAPI int io_fini(void)
856 DbgPrint("DB finalized: %d\n", ret);
857 return LB_STATUS_SUCCESS;