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) {
103 } else if (idx < MAX_ABI) {
106 ErrPrint("Overflow\n");
116 /* New group started */
128 ErrPrint("unknown tag\n");
133 if (*ptr == '\0' && ch == '=') {
139 } else if (*ptr == ch) {
144 while (ptr >= field[idx]) {
155 if (idx == 0) { /* LTRIM */
161 } else if (isspace(ch)) {
165 ret = abi_add_entry(group, pkgname);
167 ErrPrint("Failed to add %s for %s\n", pkgname, group);
171 } else if (idx < MAX_PKGNAME) {
175 ErrPrint("Overflow\n");
189 if (state == VALUE) {
195 ret = abi_add_entry(group, pkgname);
197 ErrPrint("Failed to add %s for %s\n", pkgname, group);
206 ErrPrint("fclose: %s\n", strerror(errno));
207 return LB_STATUS_SUCCESS;
210 static inline int build_client_info(struct pkg_info *info)
212 static const char *dml = "SELECT auto_launch, pd_size FROM client WHERE pkgid = ?";
219 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
220 if (ret != SQLITE_OK) {
221 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
222 return LB_STATUS_ERROR_IO;
225 ret = sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT);
226 if (ret != SQLITE_OK) {
227 ErrPrint("Failed to bind a pkgname %s\n", package_name(info));
228 sqlite3_finalize(stmt);
229 return LB_STATUS_ERROR_IO;
232 if (sqlite3_step(stmt) != SQLITE_ROW) {
233 ErrPrint("%s has no records (%s)\n", package_name(info), sqlite3_errmsg(s_info.handle));
235 sqlite3_clear_bindings(stmt);
236 sqlite3_finalize(stmt);
237 return LB_STATUS_ERROR_IO;
240 package_set_auto_launch(info, (const char *)sqlite3_column_text(stmt, 0));
242 tmp = (const char *)sqlite3_column_text(stmt, 1);
243 if (tmp && strlen(tmp)) {
244 if (sscanf(tmp, "%dx%d", &width, &height) != 2) {
245 ErrPrint("Failed to get PD width and Height (%s)\n", tmp);
247 package_set_pd_width(info, width);
248 package_set_pd_height(info, height);
253 sqlite3_clear_bindings(stmt);
254 sqlite3_finalize(stmt);
255 return LB_STATUS_SUCCESS;
258 static inline int build_provider_info(struct pkg_info *info)
260 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 = ?";
266 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
267 if (ret != SQLITE_OK) {
268 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
269 return LB_STATUS_ERROR_IO;
272 if (sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT) != SQLITE_OK) {
273 ErrPrint("Failed to bind a pkgname(%s) - %s\n", package_name(info), sqlite3_errmsg(s_info.handle));
274 sqlite3_finalize(stmt);
275 return LB_STATUS_ERROR_IO;
278 if (sqlite3_bind_text(stmt, 2, 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_step(stmt) != SQLITE_ROW) {
285 ErrPrint("%s has no record(%s)\n", package_name(info), sqlite3_errmsg(s_info.handle));
287 sqlite3_clear_bindings(stmt);
288 sqlite3_finalize(stmt);
289 return LB_STATUS_ERROR_IO;
292 appid = (const char *)sqlite3_column_text(stmt, 14);
293 if (!appid || !strlen(appid)) {
294 ErrPrint("Failed to execute the DML for %s\n", package_name(info));
296 sqlite3_clear_bindings(stmt);
297 sqlite3_finalize(stmt);
298 return LB_STATUS_ERROR_IO;
301 package_set_network(info, sqlite3_column_int(stmt, 0));
302 package_set_secured(info, sqlite3_column_int(stmt, 2));
304 tmp = (const char *)sqlite3_column_text(stmt, 1);
305 if (tmp && strlen(tmp))
306 package_set_abi(info, tmp);
308 package_set_lb_type(info, sqlite3_column_int(stmt, 3));
309 tmp = (const char *)sqlite3_column_text(stmt, 4);
310 if (tmp && strlen(tmp)) {
311 package_set_lb_path(info, tmp);
313 tmp = (const char *)sqlite3_column_text(stmt, 5);
314 if (tmp && strlen(tmp))
315 package_set_lb_group(info, tmp);
318 package_set_pd_type(info, sqlite3_column_int(stmt, 6));
319 tmp = (const char *)sqlite3_column_text(stmt, 7);
320 if (tmp && strlen(tmp)) {
321 package_set_pd_path(info, tmp);
323 tmp = (const char *)sqlite3_column_text(stmt, 8);
324 if (tmp && strlen(tmp))
325 package_set_pd_group(info, tmp);
328 tmp = (const char *)sqlite3_column_text(stmt, 9);
329 if (tmp && strlen(tmp))
330 package_set_libexec(info, tmp);
332 package_set_timeout(info, sqlite3_column_int(stmt, 10));
334 tmp = (const char *)sqlite3_column_text(stmt, 11);
335 if (tmp && strlen(tmp))
336 package_set_period(info, atof(tmp));
338 tmp = (const char *)sqlite3_column_text(stmt, 12);
339 if (tmp && strlen(tmp))
340 package_set_script(info, tmp);
341 package_set_pinup(info, sqlite3_column_int(stmt, 13));
344 sqlite3_clear_bindings(stmt);
345 sqlite3_finalize(stmt);
346 return LB_STATUS_SUCCESS;
349 static inline int build_box_size_info(struct pkg_info *info)
351 static const char *dml = "SELECT size_type FROM box_size WHERE pkgid = ?";
354 unsigned int size_type;
355 unsigned int size_list;
357 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
358 if (ret != SQLITE_OK) {
359 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
360 return LB_STATUS_ERROR_IO;
363 if (sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT) != SQLITE_OK) {
364 ErrPrint("Failed to bind a pkgname(%s) - %s\n", package_name(info), sqlite3_errmsg(s_info.handle));
365 sqlite3_finalize(stmt);
366 return LB_STATUS_ERROR_IO;
370 while (sqlite3_step(stmt) == SQLITE_ROW) {
371 size_type = sqlite3_column_int(stmt, 0);
372 size_list |= size_type;
375 package_set_size_list(info, size_list);
378 sqlite3_clear_bindings(stmt);
379 sqlite3_finalize(stmt);
380 return LB_STATUS_SUCCESS;
383 static inline int load_context_option(struct context_item *item, int id)
385 static const char *dml = "SELECT key, value FROM option WHERE option_id = ?";
391 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
392 if (ret != SQLITE_OK) {
393 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
394 return LB_STATUS_ERROR_IO;
397 ret = sqlite3_bind_int(stmt, 1, id);
398 if (ret != SQLITE_OK) {
399 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
400 ret = LB_STATUS_ERROR_IO;
404 ret = LB_STATUS_ERROR_NOT_EXIST;
405 while (sqlite3_step(stmt) == SQLITE_ROW) {
406 key = (const char *)sqlite3_column_text(stmt, 0);
407 if (!key || !strlen(key)) {
408 ErrPrint("KEY is nil\n");
412 value = (const char *)sqlite3_column_text(stmt, 1);
413 if (!value || !strlen(value)) {
414 ErrPrint("VALUE is nil\n");
418 ret = group_add_option(item, key, value);
425 sqlite3_clear_bindings(stmt);
426 sqlite3_finalize(stmt);
430 static inline int load_context_item(struct context_info *info, int id)
432 static const char *dml = "SELECT ctx_item, option_id FROM groupmap WHERE id = ?";
433 struct context_item *item;
435 const char *ctx_item;
439 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
440 if (ret != SQLITE_OK) {
441 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
442 return LB_STATUS_ERROR_IO;
445 ret = sqlite3_bind_int(stmt, 1, id);
446 if (ret != SQLITE_OK) {
447 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
448 ret = LB_STATUS_ERROR_IO;
452 ret = LB_STATUS_ERROR_NOT_EXIST;
453 while (sqlite3_step(stmt) == SQLITE_ROW) {
454 ctx_item = (const char *)sqlite3_column_text(stmt, 0);
455 option_id = sqlite3_column_int(stmt, 1);
457 item = group_add_context_item(info, ctx_item);
459 ErrPrint("Failed to add a new context item\n");
460 ret = LB_STATUS_ERROR_FAULT;
464 ret = load_context_option(item, option_id);
471 sqlite3_clear_bindings(stmt);
472 sqlite3_finalize(stmt);
476 static inline int build_group_info(struct pkg_info *info)
478 static const char *dml = "SELECT id, cluster, category FROM groupinfo WHERE pkgid = ?";
482 const char *cluster_name;
483 const char *category_name;
484 struct cluster *cluster;
485 struct category *category;
486 struct context_info *ctx_info;
488 ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
489 if (ret != SQLITE_OK) {
490 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
491 return LB_STATUS_ERROR_IO;
494 ret = sqlite3_bind_text(stmt, 1, package_name(info), -1, SQLITE_TRANSIENT);
495 if (ret != SQLITE_OK) {
496 ErrPrint("Failed to bind a package name(%s)\n", package_name(info));
497 sqlite3_finalize(stmt);
498 return LB_STATUS_ERROR_IO;
501 while (sqlite3_step(stmt) == SQLITE_ROW) {
502 id = sqlite3_column_int(stmt, 0);
503 cluster_name = (const char *)sqlite3_column_text(stmt, 1);
504 if (!cluster_name || !strlen(cluster_name)) {
505 DbgPrint("Cluster name is not valid\n");
509 category_name = (const char *)sqlite3_column_text(stmt, 2);
510 if (!category_name || !strlen(category_name)) {
511 DbgPrint("Category name is not valid\n");
515 cluster = group_find_cluster(cluster_name);
517 cluster = group_create_cluster(cluster_name);
519 ErrPrint("Failed to create a cluster(%s)\n", cluster_name);
524 category = group_find_category(cluster, category_name);
526 category = group_create_category(cluster, category_name);
528 ErrPrint("Failed to create a category(%s)\n", category_name);
535 * Step 1. Get the list of the context item from the DB using 'id'
536 * {context_item, option_id}
537 * Step 2. Get the list of the options from the DB using option_id
540 ctx_info = group_create_context_info(category, package_name(info));
542 ret = load_context_item(ctx_info, id);
544 if (ret == LB_STATUS_ERROR_NOT_EXIST) {
545 DbgPrint("Has no specific context info\n");
547 DbgPrint("Context info is not valid\n");
548 group_destroy_context_info(ctx_info);
554 package_add_ctx_info(info, ctx_info);
559 sqlite3_clear_bindings(stmt);
560 sqlite3_finalize(stmt);
561 return LB_STATUS_SUCCESS;
564 HAPI int io_is_exists(const char *pkgname) /* Manifest Package Name */
569 if (!s_info.handle) {
570 ErrPrint("DB is not ready\n");
571 return LB_STATUS_ERROR_IO;
574 ret = sqlite3_prepare_v2(s_info.handle, "SELECT COUNT(pkgid) FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
575 if (ret != SQLITE_OK) {
576 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
577 return LB_STATUS_ERROR_IO;
580 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
581 if (ret != SQLITE_OK) {
582 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
583 ret = LB_STATUS_ERROR_IO;
587 if (sqlite3_step(stmt) != SQLITE_ROW) {
588 ErrPrint("%s has no record (%s)\n", pkgname, sqlite3_errmsg(s_info.handle));
589 ret = LB_STATUS_ERROR_IO;
593 ret = sqlite3_column_int(stmt, 0);
596 sqlite3_finalize(stmt);
600 HAPI char *io_livebox_pkgname(const char *pkgname)
609 if (!s_info.handle) {
610 ErrPrint("DB is not ready\n");
614 ret = sqlite3_prepare_v2(s_info.handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
615 if (ret != SQLITE_OK) {
616 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
620 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
621 if (ret != SQLITE_OK) {
622 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
626 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, SQLITE_TRANSIENT);
627 if (ret != SQLITE_OK) {
628 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
632 if (sqlite3_step(stmt) != SQLITE_ROW) {
633 ErrPrint("%s has no record (%s)\n", pkgname, sqlite3_errmsg(s_info.handle));
637 tmp = (char *)sqlite3_column_text(stmt, 0);
638 if (tmp && strlen(tmp)) {
641 ErrPrint("Heap: %s\n", strerror(errno));
646 sqlite3_finalize(stmt);
650 HAPI int io_crawling_liveboxes(int (*cb)(const char *pkgname, int prime, void *data), void *data)
654 if (!s_info.handle) {
655 ErrPrint("DB is not ready\n");
660 ret = sqlite3_prepare_v2(s_info.handle, "SELECT pkgid, prime FROM pkgmap", -1, &stmt, NULL);
661 if (ret != SQLITE_OK) {
662 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
667 while (sqlite3_step(stmt) == SQLITE_ROW) {
668 pkgid = (const char *)sqlite3_column_text(stmt, 0);
669 if (!pkgid || !strlen(pkgid))
672 prime = (int)sqlite3_column_int(stmt, 1);
673 if (cb(pkgid, prime, data) < 0) {
675 sqlite3_finalize(stmt);
676 return LB_STATUS_ERROR_CANCEL;
681 sqlite3_finalize(stmt);
685 dir = opendir(ROOT_PATH);
687 ErrPrint("Error: %s\n", strerror(errno));
691 while ((ent = readdir(dir))) {
692 if (ent->d_name[0] == '.')
695 if (cb(ent->d_name, -1, data) < 0) {
696 if (closedir(dir) < 0)
697 ErrPrint("closedir: %s\n", strerror(errno));
698 return LB_STATUS_ERROR_CANCEL;
702 if (closedir(dir) < 0)
703 ErrPrint("closedir: %s\n", strerror(errno));
706 return LB_STATUS_SUCCESS;
709 HAPI int io_update_livebox_package(const char *pkgname, int (*cb)(const char *lb_pkgname, int prime, void *data), void *data)
717 return LB_STATUS_ERROR_INVALID;
719 if (!s_info.handle) {
720 ErrPrint("DB is not ready\n");
721 return LB_STATUS_ERROR_INVALID;
724 ret = sqlite3_prepare_v2(s_info.handle, "SELECT pkgid, prime FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
725 if (ret != SQLITE_OK) {
726 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
727 return LB_STATUS_ERROR_FAULT;
730 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
731 if (ret != SQLITE_OK) {
732 ErrPrint("Error: %s\n", sqlite3_errmsg(s_info.handle));
733 ret = LB_STATUS_ERROR_FAULT;
738 while (sqlite3_step(stmt) == SQLITE_ROW) {
739 pkgid = (char *)sqlite3_column_text(stmt, 0);
740 if (!pkgid || !strlen(pkgid))
743 prime = sqlite3_column_int(stmt, 1);
745 if (cb(pkgid, prime, data) < 0) {
746 DbgPrint("Callback canceled\n");
754 sqlite3_finalize(stmt);
758 HAPI int io_load_package_db(struct pkg_info *info)
762 if (!s_info.handle) {
763 ErrPrint("DB is not ready\n");
764 return LB_STATUS_ERROR_IO;
767 ret = build_provider_info(info);
771 ret = build_client_info(info);
775 ret = build_box_size_info(info);
779 ret = build_group_info(info);
783 return LB_STATUS_SUCCESS;
786 static inline int db_init(void)
791 ret = db_util_open(DBFILE, &s_info.handle, DB_UTIL_REGISTER_HOOK_METHOD);
792 if (ret != SQLITE_OK) {
793 ErrPrint("Failed to open a DB\n");
794 return LB_STATUS_ERROR_IO;
797 if (lstat(DBFILE, &stat) < 0) {
798 db_util_close(s_info.handle);
799 s_info.handle = NULL;
800 ErrPrint("%s\n", strerror(errno));
801 return LB_STATUS_ERROR_IO;
804 if (!S_ISREG(stat.st_mode)) {
805 ErrPrint("Invalid file\n");
806 db_util_close(s_info.handle);
807 s_info.handle = NULL;
808 return LB_STATUS_ERROR_INVALID;
811 if (stat.st_size <= 0)
812 DbgPrint("Size is %d (But use this ;)\n", stat.st_size);
814 return LB_STATUS_SUCCESS;
817 static inline int db_fini(void)
820 return LB_STATUS_SUCCESS;
822 db_util_close(s_info.handle);
823 s_info.handle = NULL;
825 return LB_STATUS_SUCCESS;
828 HAPI int io_init(void)
833 DbgPrint("DB initialized: %d\n", ret);
835 ret = load_abi_table();
836 DbgPrint("ABI table is loaded: %d\n", ret);
838 return LB_STATUS_SUCCESS;
841 HAPI int io_fini(void)
848 DbgPrint("DB finalized: %d\n", ret);
849 return LB_STATUS_SUCCESS;