1 /* Copyright 2014 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
21 #include <ss_manager.h>
23 #include <bluetooth.h>
25 #include <tzplatform_config.h>
26 #include <sys/types.h>
29 #include "debug_util.h"
30 #include "geofence_server.h"
31 #include "geofence_server_db.h"
32 #include "geofence_server_private.h"
34 /* dbspace path for Tizen 3.0 was changed.
35 #define GEOFENCE_SERVER_DB_FILE ".geofence-server.db"
36 #define GEOFENCE_SERVER_DB_PATH "/opt/dbspace/"GEOFENCE_SERVER_DB_FILE
39 #define GEOFENCE_DB_NAME ".geofence-server.db"
40 #define GEOFENCE_DB_FILE tzplatform_mkpath(TZ_USER_DB, GEOFENCE_DB_NAME)
42 #define MAX_DATA_NAME 20
45 #define GEOFENCE_INVALID 0
47 char *menu_table[4] = { "GeoFence", "FenceGeocoordinate", "FenceGeopointWifi", "FenceBssid" };
49 const char *group_id = NULL;
50 static char *password = "k1s2c3w4k5a6";
51 const char *col_latitude = "la";
52 const char *col_longitude = "lo";
53 const char *col_radius = "r";
56 FENCE_MAIN_TABLE = 0, /*GeoFence */
57 FENCE_GEOCOORDINATE_TAB, /*FenceGeocoordinate */
58 FENCE_GEOPOINT_WIFI_TABLE, /*FenceCurrentLocation */
59 FENCE_BSSID_TABLE /*FenceBluetoothBssid */
68 #define SQLITE3_RETURN(ret, msg, state) \
69 if (ret != SQLITE_OK) { \
70 LOGI_GEOFENCE("sqlite3 Error[%d] : %s", ret, msg); \
71 sqlite3_reset(state); \
72 sqlite3_clear_bindings(state); \
73 sqlite3_finalize(state); \
74 return FENCE_ERR_SQLITE_FAIL; \
82 * +----------+-------+-------+------------+-------+-------+-----------+---------+
83 * | fence_id | name | app_id | geofence_type |direction |enable |smart_assist_id|time_stamp
84 * +-------+-------+-------+-------+
86 * +-------+-------+-------+-------+
87 * CREATE TABLE GeoFence ( fence_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, app_id TEXT NOT NULL, geofence_type INTEGER," \
88 "direction INTEGER, enable INTEGER, smart_assist_id INTEGER, time_stamp INTEGER)";
92 * +----------+---------+--------+------+
93 * | fence_id | latitude | longitude | radius
94 * +-------+---------+-----+---------+
95 * | - | - | - | - | - | - |
96 * +-------+---------+-----+---------+
97 * CREATE TABLE FenceGeocoordinate ( fence_id INTEGER , latitude DOUBLE, longitude DOUBLE, radius DOUBLE, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE)";
100 * FenceCurrentLocation
101 * +-----+-------+------
102 * |bssid 1|fence_id1 |...
103 * +-----+-------+------
104 * |bssid 2|fence_id1|...
105 * +-----+-------+------
106 * |bssid 3|fence_id1|...
107 * +-----+-------+------
108 * |bssid 1|fence_id2|...
109 * +-----+-------+------
110 * |bssid 2|fence_id2|...
111 * +-------+---------+-----+---------+
112 * | - | - | - | - | - | - |
113 * +-------+---------+-----+---------+
114 *CREATE TABLE FenceCurrentLocation ( fence_id INTEGER, bssid TEXT, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE)";
117 static inline int begin_transaction(void)
119 FUNC_ENTRANCE_SERVER;
123 ret = sqlite3_prepare_v2(db_info_s.handle, "BEGIN TRANSACTION", -1, &stmt, NULL);
125 if (ret != SQLITE_OK) {
126 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
127 return FENCE_ERR_SQLITE_FAIL;
130 if (sqlite3_step(stmt) != SQLITE_DONE) {
131 LOGI_GEOFENCE("Failed to do update (%s)", sqlite3_errmsg(db_info_s.handle));
132 sqlite3_finalize(stmt);
133 return FENCE_ERR_SQLITE_FAIL;
136 sqlite3_finalize(stmt);
137 return FENCE_ERR_NONE;
140 static inline int rollback_transaction(void)
142 FUNC_ENTRANCE_SERVER;
146 ret = sqlite3_prepare_v2(db_info_s.handle, "ROLLBACK TRANSACTION", -1, &stmt, NULL);
147 if (ret != SQLITE_OK) {
148 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
149 return FENCE_ERR_SQLITE_FAIL;
152 if (sqlite3_step(stmt) != SQLITE_DONE) {
153 LOGI_GEOFENCE("Failed to do update (%s)", sqlite3_errmsg(db_info_s.handle));
154 sqlite3_finalize(stmt);
155 return FENCE_ERR_SQLITE_FAIL;
158 sqlite3_finalize(stmt);
159 return FENCE_ERR_NONE;
162 static inline int commit_transaction(void)
164 FUNC_ENTRANCE_SERVER;
168 ret = sqlite3_prepare_v2(db_info_s.handle, "COMMIT TRANSACTION", -1, &stmt, NULL);
169 if (ret != SQLITE_OK) {
170 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
171 return FENCE_ERR_SQLITE_FAIL;
174 if (sqlite3_step(stmt) != SQLITE_DONE) {
175 LOGI_GEOFENCE("Failed to do update (%s)", sqlite3_errmsg(db_info_s.handle));
176 sqlite3_finalize(stmt);
177 return FENCE_ERR_SQLITE_FAIL;
180 sqlite3_finalize(stmt);
181 return FENCE_ERR_NONE;
184 static inline int __geofence_manager_db_create_places_table(void)
186 FUNC_ENTRANCE_SERVER;
190 ddl = sqlite3_mprintf("CREATE TABLE Places ( place_id INTEGER PRIMARY KEY AUTOINCREMENT, access_type INTEGER, place_name TEXT NOT NULL, app_id TEXT NOT NULL)");
191 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
192 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
194 return FENCE_ERR_SQLITE_FAIL;
197 if (sqlite3_changes(db_info_s.handle) == 0) {
198 LOGI_GEOFENCE("No changes to DB");
201 return FENCE_ERR_NONE;
204 static inline int __geofence_manager_db_create_geofence_table(void)
206 FUNC_ENTRANCE_SERVER;
210 ddl = sqlite3_mprintf("CREATE TABLE GeoFence ( fence_id INTEGER PRIMARY KEY AUTOINCREMENT, place_id INTEGER, enable INTEGER, app_id TEXT NOT NULL, geofence_type INTEGER, access_type INTEGER, running_status INTEGER, FOREIGN KEY(place_id) REFERENCES Places(place_id) ON DELETE CASCADE)");
212 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
213 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
215 return FENCE_ERR_SQLITE_FAIL;
218 if (sqlite3_changes(db_info_s.handle) == 0) {
219 LOGI_GEOFENCE("No changes to DB");
222 return FENCE_ERR_NONE;
225 static inline int __geofence_manager_db_create_geocoordinate_table(void)
227 FUNC_ENTRANCE_SERVER;
231 ddl = sqlite3_mprintf("CREATE TABLE FenceGeocoordinate ( fence_id INTEGER PRIMARY KEY, latitude TEXT NOT NULL, longitude TEXT NOT NULL, radius TEXT NOT NULL, address TEXT, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE ON UPDATE CASCADE)");
233 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
234 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
236 return FENCE_ERR_SQLITE_FAIL;
239 if (sqlite3_changes(db_info_s.handle) == 0) {
240 LOGI_GEOFENCE("No changes to DB");
243 return FENCE_ERR_NONE;
246 static inline int __geofence_manager_db_create_wifi_data_table(void)
248 FUNC_ENTRANCE_SERVER;
252 ddl = sqlite3_mprintf("CREATE TABLE FenceGeopointWifi (fence_id INTEGER, bssid TEXT, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE ON UPDATE CASCADE)");
254 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
255 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
257 return FENCE_ERR_SQLITE_FAIL;
260 if (sqlite3_changes(db_info_s.handle) == 0) {
261 LOGI_GEOFENCE("No changes to DB");
264 return FENCE_ERR_NONE;
267 /* DB table for save the pair of fence id and bluetooth bssid */
268 static inline int __geofence_manager_db_create_bssid_table(void)
274 ddl = sqlite3_mprintf("CREATE TABLE FenceBssid (fence_id INTEGER PRIMARY KEY, bssid TEXT, ssid TEXT, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE ON UPDATE CASCADE)");
276 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
277 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
279 return FENCE_ERR_SQLITE_FAIL;
282 if (sqlite3_changes(db_info_s.handle) == 0)
283 LOGI_GEOFENCE("No changes to DB");
285 return FENCE_ERR_NONE;
288 static int __geofence_manager_open_db_handle(const int open_flag)
290 LOGI_GEOFENCE("enter");
293 ret = db_util_open_with_options(GEOFENCE_DB_FILE, &db_info_s.handle, open_flag, NULL);
294 if (ret != SQLITE_OK) {
295 LOGI_GEOFENCE("sqlite3_open_v2 Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
296 return FENCE_ERR_SQLITE_FAIL;
299 return FENCE_ERR_NONE;
302 static int __geofence_manager_db_get_count_by_fence_id_and_bssid(int fence_id, char *bssid, fence_table_type_e table_type, int *count)
304 FUNC_ENTRANCE_SERVER;
305 g_return_val_if_fail(bssid, FENCE_ERR_INVALID_PARAMETER);
306 sqlite3_stmt *state = NULL;
308 const char *tail = NULL;
310 char *query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM %Q where fence_id = %d AND bssid = %Q;", menu_table[table_type], fence_id, bssid);
312 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
313 if (ret != SQLITE_OK) {
314 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
316 return FENCE_ERR_PREPARE;
319 ret = sqlite3_step(state);
320 if (ret != SQLITE_ROW) {
321 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
322 sqlite3_finalize(state);
324 return FENCE_ERR_SQLITE_FAIL;
326 *count = sqlite3_column_int(state, 0);
327 sqlite3_reset(state);
328 sqlite3_finalize(state);
331 return FENCE_ERR_NONE;
334 static int __geofence_manager_db_insert_bssid_info(const int fence_id, const char *bssid_info, const char *ssid)
336 FUNC_ENTRANCE_SERVER;
337 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
338 g_return_val_if_fail(bssid_info, FENCE_ERR_INVALID_PARAMETER);
339 sqlite3_stmt *state = NULL;
346 char *query = sqlite3_mprintf("INSERT INTO %Q(fence_id, bssid, ssid) VALUES (?, ?, ?)", menu_table[FENCE_BSSID_TABLE]);
347 bssid = (char *)g_malloc0(sizeof(char) * WLAN_BSSID_LEN);
348 g_strlcpy(bssid, bssid_info, WLAN_BSSID_LEN);
349 LOGI_GEOFENCE("fence_id[%d], bssid[%s], ssid[%s]", fence_id, bssid, ssid);
351 ret = __geofence_manager_db_get_count_by_fence_id_and_bssid(fence_id, bssid, FENCE_BSSID_TABLE, &count);
352 if (ret != FENCE_ERR_NONE) {
353 LOGI_GEOFENCE("__geofence_manager_db_get_count_by_fence_id_and_bssid() failed. ERROR(%d)", ret);
358 LOGI_GEOFENCE("count = %d", count);
359 return FENCE_ERR_NONE;
362 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
363 if (ret != SQLITE_OK) {
364 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
366 return FENCE_ERR_PREPARE;
369 ret = sqlite3_bind_int(state, ++index, fence_id);
370 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
372 ret = sqlite3_bind_text(state, ++index, bssid, -1, SQLITE_STATIC);
373 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
375 ret = sqlite3_bind_text(state, ++index, ssid, -1, SQLITE_STATIC);
376 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
378 ret = sqlite3_step(state);
379 if (ret != SQLITE_DONE) {
380 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
381 sqlite3_finalize(state);
384 return FENCE_ERR_SQLITE_FAIL;
387 sqlite3_reset(state);
388 sqlite3_clear_bindings(state);
389 sqlite3_finalize(state);
392 LOGI_GEOFENCE("fence_id[%d], bssid[%s], ssid[%s] inserted db table [%s] successfully.", fence_id, bssid_info, ssid, menu_table[FENCE_BSSID_TABLE]);
394 return FENCE_ERR_NONE;
397 static int __geofence_manager_db_insert_wifi_data_info(gpointer data, gpointer user_data)
399 FUNC_ENTRANCE_SERVER;
400 g_return_val_if_fail(data, FENCE_ERR_INVALID_PARAMETER);
401 g_return_val_if_fail(user_data, FENCE_ERR_INVALID_PARAMETER);
402 int *fence_id = (int *) user_data;
403 sqlite3_stmt *state = NULL;
404 wifi_info_s *wifi_info = NULL;
410 wifi_info = (wifi_info_s *) data;
411 bssid = (char *)g_malloc0(sizeof(char) * WLAN_BSSID_LEN);
412 g_strlcpy(bssid, wifi_info->bssid, WLAN_BSSID_LEN);
413 LOGI_GEOFENCE("fence_id[%d] bssid[%s]", *fence_id, wifi_info->bssid);
415 char *query = sqlite3_mprintf("INSERT INTO FenceGeopointWifi(fence_id, bssid) VALUES (?, ?)");
417 ret = __geofence_manager_db_get_count_by_fence_id_and_bssid(*fence_id, bssid, FENCE_GEOPOINT_WIFI_TABLE, &count);
419 LOGI_GEOFENCE("count = %d", count);
424 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
425 if (ret != SQLITE_OK) {
426 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
428 return FENCE_ERR_PREPARE;
431 ret = sqlite3_bind_int(state, ++index, *fence_id);
432 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
434 ret = sqlite3_bind_text(state, ++index, bssid, -1, SQLITE_STATIC);
435 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
437 ret = sqlite3_step(state);
438 if (ret != SQLITE_DONE) {
439 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
440 sqlite3_finalize(state);
443 return FENCE_ERR_SQLITE_FAIL;
446 sqlite3_reset(state);
447 sqlite3_clear_bindings(state);
448 sqlite3_finalize(state);
452 return FENCE_ERR_NONE;
455 static int __geofence_manager_delete_table(int fence_id, fence_table_type_e table_type)
457 FUNC_ENTRANCE_SERVER;
458 sqlite3_stmt *state = NULL;
461 char *query = sqlite3_mprintf("DELETE from %Q where fence_id = %d;", menu_table[table_type], fence_id);
462 LOGI_GEOFENCE("current fence id is [%d]", fence_id);
463 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
464 if (SQLITE_OK != ret) {
465 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
467 return FENCE_ERR_SQLITE_FAIL;
470 ret = sqlite3_step(state);
471 if (SQLITE_DONE != ret) {
472 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
473 sqlite3_finalize(state);
475 return FENCE_ERR_SQLITE_FAIL;
477 sqlite3_finalize(state);
478 LOGI_GEOFENCE("fence_id[%d], deleted from db table [%s] successfully.", fence_id, menu_table[table_type]);
480 return FENCE_ERR_NONE;
483 static int __geofence_manager_delete_place_table(int place_id)
485 FUNC_ENTRANCE_SERVER;
486 sqlite3_stmt *state = NULL;
489 char *query = sqlite3_mprintf("DELETE from Places where place_id = %d;", place_id);
491 LOGI_GEOFENCE("current place id is [%d]", place_id);
492 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
493 if (SQLITE_OK != ret) {
494 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
496 return FENCE_ERR_SQLITE_FAIL;
499 ret = sqlite3_step(state);
500 if (SQLITE_DONE != ret) {
501 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
502 sqlite3_finalize(state);
504 return FENCE_ERR_SQLITE_FAIL;
506 sqlite3_finalize(state);
507 LOGI_GEOFENCE("place_id[%d], deleted place from db table Places successfully.", place_id);
509 return FENCE_ERR_NONE;
512 static inline void __geofence_manager_db_create_table(void)
514 FUNC_ENTRANCE_SERVER;
518 ret = __geofence_manager_db_create_places_table();
520 rollback_transaction();
524 ret = __geofence_manager_db_create_geofence_table();
526 rollback_transaction();
530 ret = __geofence_manager_db_create_geocoordinate_table();
532 rollback_transaction();
536 ret = __geofence_manager_db_create_wifi_data_table();
538 rollback_transaction();
542 ret = __geofence_manager_db_create_bssid_table();
544 rollback_transaction();
548 commit_transaction();
551 /* Get fence id count in certain table, such as GeoFence/FenceGeocoordinate/FenceCurrentLocation */
552 static int __geofence_manager_db_get_count_of_fence_id(int fence_id, fence_table_type_e table_type, int *count)
554 sqlite3_stmt *state = NULL;
556 const char *tail = NULL;
558 char *query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM %Q where fence_id = %d;", menu_table[table_type], fence_id);
560 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
561 if (ret != SQLITE_OK) {
562 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
564 return FENCE_ERR_PREPARE;
567 ret = sqlite3_step(state);
568 if (ret != SQLITE_ROW) {
569 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
570 sqlite3_finalize(state);
572 return FENCE_ERR_SQLITE_FAIL;
574 *count = sqlite3_column_int(state, 0);
575 sqlite3_reset(state);
576 sqlite3_finalize(state);
578 return FENCE_ERR_NONE;
581 static int __geofence_manager_db_enable_foreign_keys(void)
583 sqlite3_stmt *state = NULL;
584 int ret = FENCE_ERR_NONE;
585 char *query = sqlite3_mprintf("PRAGMA foreign_keys = ON;");
587 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
588 if (SQLITE_OK != ret) {
589 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
591 return FENCE_ERR_SQLITE_FAIL;
594 ret = sqlite3_step(state);
595 if (SQLITE_DONE != ret) {
596 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
597 sqlite3_finalize(state);
599 return FENCE_ERR_SQLITE_FAIL;
601 sqlite3_reset(state);
602 sqlite3_finalize(state);
604 return FENCE_ERR_NONE;
607 void replaceChar(char *src, char oldChar, char newChar)
616 void __geofence_manager_genarate_password(char *password)
618 char *bt_address = NULL;
619 char *wifi_address = NULL;
621 int bt_temp[6] = {0}, wifi_temp[6] = {0};
622 int i = 0, fkey[6], lkey[6];
623 char s1[100], s2[100], result[200];
624 char keyword[6] = { 'b', 'w', 'd', 's', 'j', 'f' };
626 bt_adapter_get_address(&bt_address);
627 wifi_get_mac_address(&wifi_address);
629 token = strtok(bt_address, ":");
632 bt_temp[i++] = atoi(token);
633 token = strtok(NULL, ":");
637 token = strtok(wifi_address, ":");
640 wifi_temp[i++] = atoi(token);
641 token = strtok(NULL, ":");
646 memset((void *) s1, 0, sizeof(s1));
647 memset((void *) s2, 0, sizeof(s2));
648 memset((void *) result, 0, sizeof(result));
650 for (i = 0; i < 6; i++) {
651 fkey[i] = bt_temp[i] * wifi_temp[i];
652 lkey[i] = bt_temp[i] + wifi_temp[i];
655 for (i = 0; i < 6; i++) {
656 sprintf(s1, "%s%x", s1, fkey[i]);
657 sprintf(s2, "%s%x", s2, lkey[i]);
658 replaceChar(s1, 0x30 + ((i * 2) % 10), keyword[i]);
659 replaceChar(s2, 0x30 + ((i * 2 + 1) % 10), keyword[i]);
660 LOGD_GEOFENCE("s1 %s", s1);
661 LOGD_GEOFENCE("s2 %s", s2);
664 sprintf(result, "%s%s", s1, s2);
667 LOGD_GEOFENCE("result : %s", result);
671 static int __check_db_file()
675 fd = open(GEOFENCE_DB_FILE, O_RDONLY);
677 LOGW_GEOFENCE("DB file(%s) is not exist.", GEOFENCE_DB_FILE);
685 * This function in DB and create GeoFence/FenceGeocoordinate /FenceCurrentLocation four table on DB if necessary.
687 * @param[in] struct of fence_point_info_s
688 * @return FENCE_ERR_NONE on success, negative values for errors
690 int geofence_manager_db_init(void)
692 FUNC_ENTRANCE_SERVER;
697 geofence_db_file = g_strdup_printf("%s/%s", GEOFENCE_DB_PATH, GEOFENCE_DB_FILE);
700 if (__check_db_file()) {
701 LOGW_GEOFENCE("db(%s) file doesn't exist.", GEOFENCE_DB_FILE);
702 open_flag = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE| SQLITE_OPEN_FULLMUTEX;
705 if (lstat(GEOFENCE_DB_FILE, &stat) < 0) {
706 LOGE_GEOFENCE("Can't get db(%s) information.", GEOFENCE_DB_FILE);
707 return FENCE_ERR_SQLITE_FAIL;
709 open_flag = SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX;
712 if (__geofence_manager_open_db_handle(open_flag) != FENCE_ERR_NONE) {
713 LOGI_GEOFENCE("Fail to create db file(%s).", GEOFENCE_DB_FILE);
714 return FENCE_ERR_SQLITE_FAIL;
718 __geofence_manager_db_create_table();
720 return FENCE_ERR_NONE;
723 int geofence_manager_db_reset(void)
725 FUNC_ENTRANCE_SERVER;
726 sqlite3_stmt *state = NULL;
731 for (idx = 0; idx < 4; idx++) {
732 query = sqlite3_mprintf("DELETE from %Q;", menu_table[idx]);
734 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
735 if (SQLITE_OK != ret) {
736 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
738 return FENCE_ERR_SQLITE_FAIL;
741 ret = sqlite3_step(state);
742 if (SQLITE_DONE != ret) {
743 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
744 sqlite3_finalize(state);
746 return FENCE_ERR_SQLITE_FAIL;
748 sqlite3_finalize(state);
751 return FENCE_ERR_NONE;
754 int geofence_manager_set_place_info(place_info_s *place_info, int *place_id)
756 FUNC_ENTRANCE_SERVER;
757 g_return_val_if_fail(place_info, FENCE_ERR_INVALID_PARAMETER);
758 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
759 sqlite3_stmt *state = NULL;
764 char *place_name = NULL;
765 char *query = sqlite3_mprintf("INSERT INTO Places (access_type, place_name, app_id) VALUES (?, ?, ?)");
767 place_name = (char *)g_malloc0(sizeof(char) * PLACE_NAME_LEN);
768 g_strlcpy(place_name, place_info->place_name, PLACE_NAME_LEN);
769 appid = (char *)g_malloc0(sizeof(char) * APP_ID_LEN);
770 g_strlcpy(appid, place_info->appid, APP_ID_LEN);
772 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
773 if (ret != SQLITE_OK) {
774 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
776 return FENCE_ERR_PREPARE;
778 LOGD_GEOFENCE("appid[%s] access_type[%d] place_name[%s]", appid, place_info->access_type, place_info->place_name);
780 ret = sqlite3_bind_int(state, ++index, place_info->access_type);
781 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
783 ret = sqlite3_bind_text(state, ++index, place_name, -1, SQLITE_STATIC);
784 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
786 ret = sqlite3_bind_text(state, ++index, appid, -1, SQLITE_STATIC);
787 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
789 ret = sqlite3_step(state);
790 if (ret != SQLITE_DONE) {
791 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
792 sqlite3_finalize(state);
796 return FENCE_ERR_SQLITE_FAIL;
798 *place_id = sqlite3_last_insert_rowid(db_info_s.handle);
799 LOGI_GEOFENCE(" auto-genarated place_id[%d]", *place_id);
800 sqlite3_reset(state);
801 sqlite3_clear_bindings(state);
802 sqlite3_finalize(state);
808 LOGI_GEOFENCE("TMP Invalid fence_id");
812 return FENCE_ERR_NONE;
815 int geofence_manager_set_common_info(fence_common_info_s *fence_info, int *fence_id)
817 FUNC_ENTRANCE_SERVER;
818 g_return_val_if_fail(fence_info, FENCE_ERR_INVALID_PARAMETER);
819 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
820 sqlite3_stmt *state = NULL;
825 char *query = sqlite3_mprintf("INSERT INTO GeoFence (place_id, enable, app_id, geofence_type, access_type, running_status) VALUES (?, ?, ?, ?, ?, ?)");
826 appid = (char *)g_malloc0(sizeof(char) * APP_ID_LEN);
827 g_strlcpy(appid, fence_info->appid, APP_ID_LEN);
829 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
830 if (ret != SQLITE_OK) {
831 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
833 return FENCE_ERR_PREPARE;
836 LOGD_GEOFENCE("place_id[%d], enable[%d], appid[%s] geofence_type[%d] access_type[%d] running_status[%d]", fence_info->place_id, fence_info->enable, appid, fence_info->running_status, fence_info->type, fence_info->access_type, fence_info->place_id);
838 ret = sqlite3_bind_int(state, ++index, fence_info->place_id);
839 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
841 ret = sqlite3_bind_int(state, ++index, fence_info->enable);
842 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
844 ret = sqlite3_bind_text(state, ++index, appid, -1, SQLITE_STATIC);
845 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
847 ret = sqlite3_bind_int(state, ++index, fence_info->type);
848 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
850 ret = sqlite3_bind_int(state, ++index, fence_info->access_type);
851 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
853 ret = sqlite3_bind_int(state, ++index, fence_info->running_status);
854 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
856 ret = sqlite3_step(state);
857 if (ret != SQLITE_DONE) {
858 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
859 sqlite3_finalize(state);
862 return FENCE_ERR_SQLITE_FAIL;
864 *fence_id = sqlite3_last_insert_rowid(db_info_s.handle);
865 LOGI_GEOFENCE(" auto-genarated fence_id[%d]", *fence_id);
866 sqlite3_reset(state);
867 sqlite3_clear_bindings(state);
868 sqlite3_finalize(state);
873 LOGI_GEOFENCE("TMP Invalid fence_id");
877 return FENCE_ERR_NONE;
880 int geofence_manager_get_place_list_from_db(int *number_of_places, GList **places)
882 FUNC_ENTRANCE_SERVER;
883 sqlite3_stmt *state = NULL;
885 const char *tail = NULL;
889 query = sqlite3_mprintf("SELECT place_id, place_name, access_type, app_id FROM Places");
891 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
892 if (ret != SQLITE_OK) {
893 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
895 return FENCE_ERR_PREPARE;
897 GList *place_list = NULL;
898 int column_index = 0;
900 ret = sqlite3_step(state);
902 if (ret != SQLITE_ROW) {
903 LOGI_GEOFENCE("DONE...!!! : %d", ret);
907 place_info_s *place = g_slice_new0(place_info_s);
912 place->place_id = sqlite3_column_int(state, column_index++);
913 g_strlcpy(place->place_name, (char *) sqlite3_column_text(state, column_index++), PLACE_NAME_LEN);
914 place->access_type = sqlite3_column_int(state, column_index++);
915 g_strlcpy(place->appid, (char *) sqlite3_column_text(state, column_index++), APP_ID_LEN);
916 place_list = g_list_append(place_list, place);
918 } while (ret != SQLITE_DONE);
920 *places = place_list;
921 *number_of_places = count;
923 sqlite3_reset(state);
924 sqlite3_finalize(state);
926 return FENCE_ERR_NONE;
929 int geofence_manager_get_fence_list_from_db(int *number_of_fences, GList **fences, int place_id)
931 FUNC_ENTRANCE_SERVER;
933 sqlite3_stmt *state = NULL;
935 const char *tail = NULL;
940 query = sqlite3_mprintf("SELECT DISTINCT A.fence_id, A.app_id, A.geofence_type, A.access_type, A.place_id, B.latitude, B.longitude, B.radius, B.address, C.bssid, C.ssid FROM GeoFence A LEFT JOIN FenceGeocoordinate B ON A.fence_id = B.fence_id LEFT JOIN FenceBssid C ON A.fence_id = C.fence_id GROUP BY A.fence_id");
942 query = sqlite3_mprintf("SELECT DISTINCT A.fence_id, A.app_id, A.geofence_type, A.access_type, A.place_id, B.latitude, B.longitude, B.radius, B.address, C.bssid, C.ssid FROM GeoFence A LEFT JOIN FenceGeocoordinate B ON A.fence_id = B.fence_id LEFT JOIN FenceBssid C ON A.fence_id = C.fence_id WHERE A.place_id = %d GROUP BY A.fence_id", place_id);
944 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
945 if (ret != SQLITE_OK) {
946 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
948 return FENCE_ERR_PREPARE;
950 GList *fence_list = NULL;
952 ret = sqlite3_step(state);
954 if (ret != SQLITE_ROW) {
955 LOGI_GEOFENCE("DONE...!!! : %d", ret);
958 int column_index = 0;
960 geofence_info_s *fence = g_slice_new0(geofence_info_s);
965 fence->fence_id = sqlite3_column_int(state, column_index++);
966 g_strlcpy(fence->app_id, (char *) sqlite3_column_text(state, column_index++), APP_ID_LEN);
967 fence->param.type = sqlite3_column_int(state, column_index++);
968 fence->access_type = sqlite3_column_int(state, column_index++);
969 fence->param.place_id = sqlite3_column_int(state, column_index++);
970 char *data_name = NULL;
972 data_name = (char *) sqlite3_column_text(state, column_index++);
973 if (!data_name || !strlen(data_name))
974 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
976 fence->param.latitude = atof(data_name);
978 data_name = (char *) sqlite3_column_text(state, column_index++);
979 if (!data_name || !strlen(data_name))
980 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
982 fence->param.longitude = atof(data_name);
984 data_name = (char *) sqlite3_column_text(state, column_index++);
985 if (!data_name || !strlen(data_name))
986 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
988 fence->param.radius = atof(data_name);
990 g_strlcpy(fence->param.address, (char *) sqlite3_column_text(state, column_index++), ADDRESS_LEN);
991 g_strlcpy(fence->param.bssid, (char *) sqlite3_column_text(state, column_index++), WLAN_BSSID_LEN);
992 g_strlcpy(fence->param.ssid, (char *) sqlite3_column_text(state, column_index++), WLAN_BSSID_LEN);
993 LOGI_GEOFENCE("radius = %d, bssid = %s", fence->param.radius, fence->param.bssid);
994 fence_list = g_list_append(fence_list, fence);
996 } while (ret != SQLITE_DONE);
998 *fences = fence_list;
999 *number_of_fences = count;
1001 sqlite3_reset(state);
1002 sqlite3_finalize(state);
1003 sqlite3_free(query);
1004 return FENCE_ERR_NONE;
1007 int geofence_manager_get_fenceid_list_from_db(int *number_of_fences, GList **fences, int place_id)
1009 FUNC_ENTRANCE_SERVER;
1010 sqlite3_stmt *state = NULL;
1011 int ret = SQLITE_OK;
1012 const char *tail = NULL;
1015 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence WHERE place_id = %d", place_id);
1017 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1018 if (ret != SQLITE_OK) {
1019 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1020 sqlite3_free(query);
1021 return FENCE_ERR_PREPARE;
1023 GList *fence_list = NULL;
1024 int column_index = 0;
1027 ret = sqlite3_step(state);
1028 if (ret != SQLITE_ROW) {
1029 LOGI_GEOFENCE("DONE...!!! : %d", ret);
1033 fence_id = sqlite3_column_int(state, column_index);
1034 fence_list = g_list_append(fence_list, GINT_TO_POINTER(fence_id));
1036 } while (ret != SQLITE_DONE);
1037 *fences = fence_list;
1038 *number_of_fences = count;
1040 sqlite3_reset(state);
1041 sqlite3_finalize(state);
1042 sqlite3_free(query);
1043 return FENCE_ERR_NONE;
1046 int geofence_manager_update_geocoordinate_info(int fence_id, geocoordinate_info_s *geocoordinate_info)
1048 FUNC_ENTRANCE_SERVER;
1049 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1050 g_return_val_if_fail(geocoordinate_info, FENCE_ERR_INVALID_PARAMETER);
1051 sqlite3_stmt *state = NULL;
1053 int ret = SQLITE_OK;
1055 char *query = sqlite3_mprintf("UPDATE FenceGeocoordinate SET latitude = %lf, longitude = %lf, radius = %lf where fence_id = %d;", geocoordinate_info->latitude, geocoordinate_info->longitude, geocoordinate_info->radius, fence_id);
1057 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1058 if (ret != SQLITE_OK) {
1059 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1060 sqlite3_free(query);
1061 return FENCE_ERR_PREPARE;
1064 ret = sqlite3_step(state);
1065 if (ret != SQLITE_DONE) {
1066 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1067 sqlite3_finalize(state);
1068 sqlite3_free(query);
1069 return FENCE_ERR_SQLITE_FAIL;
1072 sqlite3_finalize(state);
1073 sqlite3_free(query);
1074 LOGI_GEOFENCE("fence_id: %d has been successfully updated.", fence_id);
1075 return FENCE_ERR_NONE;
1078 int geofence_manager_update_place_info(int place_id, const char *place_info_name)
1080 FUNC_ENTRANCE_SERVER;
1081 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
1082 sqlite3_stmt *state = NULL;
1084 int ret = SQLITE_OK;
1085 char *place_name = NULL;
1087 place_name = (char *)g_malloc0(sizeof(char) * PLACE_NAME_LEN);
1088 g_strlcpy(place_name, place_info_name, PLACE_NAME_LEN);
1090 char *query = sqlite3_mprintf("UPDATE Places SET place_name = %Q where place_id = %d", place_name, place_id);
1092 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1093 if (ret != SQLITE_OK) {
1094 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1095 sqlite3_free(query);
1097 return FENCE_ERR_PREPARE;
1100 ret = sqlite3_step(state);
1101 if (ret != SQLITE_DONE) {
1102 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1103 sqlite3_finalize(state);
1105 sqlite3_free(query);
1106 return FENCE_ERR_SQLITE_FAIL;
1109 sqlite3_finalize(state);
1111 sqlite3_free(query);
1112 LOGI_GEOFENCE("place_id: %d has been successfully updated.", place_id);
1113 return FENCE_ERR_NONE;
1117 * This function set geocoordinate info in DB.
1119 * @param[in] fence_id
1120 * @param[out] struct of geocoordinate_info_s
1121 * @return FENCE_ERR_NONE on success, negative values for errors
1123 int geofence_manager_set_geocoordinate_info(int fence_id, geocoordinate_info_s *geocoordinate_info)
1125 FUNC_ENTRANCE_SERVER;
1126 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1127 g_return_val_if_fail(geocoordinate_info, FENCE_ERR_INVALID_PARAMETER);
1128 sqlite3_stmt *state = NULL;
1129 int ret = SQLITE_OK;
1133 char data_name_lat[MAX_DATA_NAME] = { 0 };
1134 char data_name_lon[MAX_DATA_NAME] = { 0 };
1135 char data_name_rad[MAX_DATA_NAME] = { 0 };
1137 char ssa_data_lat[DATA_LEN] = { 0 };
1138 char ssa_data_lon[DATA_LEN] = { 0 };
1139 char ssa_data_rad[DATA_LEN] = { 0 };
1141 char *query = sqlite3_mprintf("INSERT INTO FenceGeocoordinate(fence_id, latitude, longitude, radius, address) VALUES (?, ?, ?, ?, ?)");
1143 ret = __geofence_manager_db_get_count_of_fence_id(fence_id, FENCE_GEOCOORDINATE_TAB, &count);
1144 if (ret != FENCE_ERR_NONE) {
1145 LOGI_GEOFENCE("Fail to get geofence_manager_db_get_count_of_fence_id [%d]", ret);
1146 sqlite3_free(query);
1148 } else if (count) { /* fence id has been in FenceGeocoordinate table */
1149 sqlite3_free(query);
1150 return FENCE_ERR_FENCE_ID;
1153 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1154 if (ret != SQLITE_OK) {
1155 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1156 sqlite3_free(query);
1157 return FENCE_ERR_PREPARE;
1160 ret = sqlite3_bind_int(state, ++index, fence_id);
1161 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1163 if (password == NULL)
1164 __geofence_manager_genarate_password(password);
1166 /* ssa_put : latitude*/
1167 ret = snprintf(data_name_lat, MAX_DATA_NAME, "%lf", geocoordinate_info->latitude);
1169 ret = sqlite3_bind_text(state, ++index, data_name_lat, -1, SQLITE_STATIC);
1171 /*ret = sqlite3_bind_double (state, ++index, geocoordinate_info->latitude);*/
1172 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1174 /* ssa_put : longitude*/
1175 ret = snprintf(data_name_lon, MAX_DATA_NAME, "%lf", geocoordinate_info->longitude);
1177 LOGD_GEOFENCE("ERROR: String will be truncated");
1178 return FENCE_ERR_STRING_TRUNCATED;
1181 ret = sqlite3_bind_text(state, ++index, data_name_lon, -1, SQLITE_STATIC);
1182 /*ret = sqlite3_bind_double (state, ++index, geocoordinate_info->longitude);*/
1183 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1185 /* ssa_put : radius*/
1186 ret = snprintf(data_name_rad, MAX_DATA_NAME, "%lf", geocoordinate_info->radius);
1188 LOGD_GEOFENCE("ERROR: String will be truncated");
1189 return FENCE_ERR_STRING_TRUNCATED;
1192 ret = sqlite3_bind_text(state, ++index, data_name_rad, -1, SQLITE_STATIC);
1193 /*ret = sqlite3_bind_double (state, ++index, geocoordinate_info->radius);*/
1194 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1196 ret = sqlite3_bind_text(state, ++index, geocoordinate_info->address, -1, SQLITE_STATIC);
1197 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1199 ret = sqlite3_step(state);
1200 if (ret != SQLITE_DONE) {
1201 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1202 sqlite3_finalize(state);
1203 return FENCE_ERR_SQLITE_FAIL;
1206 sqlite3_reset(state);
1207 sqlite3_clear_bindings(state);
1208 sqlite3_finalize(state);
1209 sqlite3_free(query);
1211 return FENCE_ERR_NONE;
1215 * This function get geocoordinate info from DB.
1217 * @param[in] fence_id
1218 * @param[out] struct of geocoordinate_info_s
1219 * @return FENCE_ERR_NONE on success, negative values for errors
1221 int geofence_manager_get_geocoordinate_info(int fence_id, geocoordinate_info_s **geocoordinate_info)
1223 FUNC_ENTRANCE_SERVER;
1224 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1225 sqlite3_stmt *state = NULL;
1226 int ret = SQLITE_OK;
1227 const char *tail = NULL;
1229 char *data_name = NULL;
1231 char *ssa_data = NULL;
1234 char *query = sqlite3_mprintf("SELECT * FROM FenceGeocoordinate where fence_id = %d;", fence_id);
1236 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1237 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1238 if (ret != SQLITE_OK) {
1239 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1240 sqlite3_free(query);
1241 return FENCE_ERR_PREPARE;
1244 ret = sqlite3_step(state);
1245 if (ret != SQLITE_ROW) {
1246 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1247 sqlite3_finalize(state);
1248 sqlite3_free(query);
1249 return FENCE_ERR_SQLITE_FAIL;
1252 *geocoordinate_info = (geocoordinate_info_s *)g_malloc0(sizeof(geocoordinate_info_s));
1253 g_return_val_if_fail(*geocoordinate_info, FENCE_ERR_INVALID_PARAMETER);
1255 if (password == NULL)
1256 __geofence_manager_genarate_password(password);
1258 data_name = (char *) sqlite3_column_text(state, ++index);
1260 if (!data_name || !strlen(data_name)) {
1261 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1263 (*geocoordinate_info)->latitude = atof(data_name);
1266 data_name = (char *) sqlite3_column_text(state, ++index);
1267 if (!data_name || !strlen(data_name)) {
1268 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1270 (*geocoordinate_info)->longitude = atof(data_name);
1273 data_name = (char *) sqlite3_column_text(state, ++index);
1274 if (!data_name || !strlen(data_name)) {
1275 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1277 (*geocoordinate_info)->radius = atof(data_name);
1280 g_strlcpy((*geocoordinate_info)->address, (char *) sqlite3_column_text(state, ++index), ADDRESS_LEN);
1282 sqlite3_finalize(state);
1283 sqlite3_free(query);
1285 return FENCE_ERR_NONE;
1289 * This function get ap list from DB.
1291 * @param[in] fence_id
1292 * @param[out] ap_list
1293 * @return FENCE_ERR_NONE on success, negative values for errors
1295 int geofence_manager_get_ap_info(const int fence_id, GList **ap_list)
1297 FUNC_ENTRANCE_SERVER;
1298 sqlite3_stmt *state = NULL;
1299 int ret = SQLITE_OK;
1300 const char *tail = NULL;
1303 wifi_info_s *wifi_info = NULL;
1304 const char *bssid = NULL;
1306 char *query1 = sqlite3_mprintf("SELECT COUNT(bssid) FROM FenceGeopointWifi where fence_id = %d;", fence_id);
1308 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1309 ret = sqlite3_prepare_v2(db_info_s.handle, query1, -1, &state, &tail);
1310 if (ret != SQLITE_OK) {
1311 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1312 sqlite3_free(query1);
1313 return FENCE_ERR_PREPARE;
1316 ret = sqlite3_step(state);
1317 if (ret != SQLITE_ROW) {
1318 LOGD_GEOFENCE("Fail to get count sqlite3_step");
1319 sqlite3_finalize(state);
1320 sqlite3_free(query1);
1321 return FENCE_ERR_SQLITE_FAIL;
1324 count = sqlite3_column_int(state, 0);
1325 sqlite3_reset(state);
1326 sqlite3_finalize(state);
1327 sqlite3_free(query1);
1329 LOGI_GEOFENCE("ERROR: count = %d", count);
1330 return FENCE_ERR_COUNT;
1332 LOGD_GEOFENCE("count[%d]", count);
1335 char *query2 = sqlite3_mprintf("SELECT * FROM FenceGeopointWifi where fence_id = %d;", fence_id);
1337 ret = sqlite3_prepare_v2(db_info_s.handle, query2, -1, &state, &tail);
1338 if (ret != SQLITE_OK) {
1339 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1340 sqlite3_free(query2);
1341 return FENCE_ERR_PREPARE;
1344 for (i = 0; i < count; i++) {
1345 ret = sqlite3_step(state);
1346 if (ret != SQLITE_ROW) {
1347 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1350 wifi_info = g_slice_new0(wifi_info_s);
1351 g_return_val_if_fail(wifi_info, -1);
1353 bssid = (const char *) sqlite3_column_text(state, 1);
1354 g_strlcpy(wifi_info->bssid, bssid, WLAN_BSSID_LEN);
1355 *ap_list = g_list_append(*ap_list, (gpointer) wifi_info);
1359 sqlite3_finalize(state);
1360 sqlite3_free(query2);
1361 return FENCE_ERR_NONE;
1364 /*This function get place info from DB.
1366 * @param[in] place_id
1367 * @param[out] struct of place_info_s
1368 * @return FENCE_ERR_NONE on success, negative values for errors
1370 int geofence_manager_get_place_info(int place_id, place_info_s **place_info)
1372 FUNC_ENTRANCE_SERVER;
1373 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
1374 sqlite3_stmt *state = NULL;
1375 int ret = SQLITE_OK;
1376 const char *tail = NULL;
1378 char *data_name = NULL;
1380 char *ssa_data = NULL;
1382 char *query = sqlite3_mprintf("SELECT * FROM Places where place_id = %d;", place_id);
1383 LOGD_GEOFENCE("current place id is [%d]", place_id);
1384 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1385 if (ret != SQLITE_OK) {
1386 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1387 sqlite3_free(query);
1388 return FENCE_ERR_PREPARE;
1390 ret = sqlite3_step(state);
1391 if (ret != SQLITE_ROW) {
1392 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1393 sqlite3_finalize(state);
1394 sqlite3_free(query);
1395 return FENCE_ERR_SQLITE_FAIL;
1397 *place_info = (place_info_s *)g_malloc0(sizeof(place_info_s));
1398 g_return_val_if_fail(*place_info, FENCE_ERR_INVALID_PARAMETER);
1400 data_name = (char *)sqlite3_column_text(state, ++index);
1401 if (!data_name || !strlen(data_name)) {
1402 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1404 (*place_info)->access_type = atof(data_name);
1407 g_strlcpy((*place_info)->place_name, (char *)sqlite3_column_text(state, ++index), PLACE_NAME_LEN);
1408 g_strlcpy((*place_info)->appid, (char *)sqlite3_column_text(state, ++index), APP_ID_LEN);
1409 sqlite3_finalize(state);
1410 sqlite3_free(query);
1412 return FENCE_ERR_NONE;
1416 * This function insert ap list in DB.
1418 * @param[in] fence_id
1419 * @param[out] ap_list
1420 * @return FENCE_ERR_NONE on success, negative values for errors
1422 int geofence_manager_set_ap_info(int fence_id, GList *ap_list)
1424 FUNC_ENTRANCE_SERVER;
1425 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1426 g_return_val_if_fail(ap_list, FENCE_ERR_INVALID_PARAMETER);
1427 int ret = FENCE_ERR_NONE;
1430 ret = __geofence_manager_db_get_count_of_fence_id(fence_id, FENCE_GEOPOINT_WIFI_TABLE, &count);
1431 if (ret != FENCE_ERR_NONE) {
1432 LOGI_GEOFENCE("Fail to get geofence_manager_db_get_count_of_fence_id [%d]", ret);
1435 if (count) { /* fence id has been in FenceCurrentLocation table */
1436 LOGI_GEOFENCE("count is [%d]", count);
1437 return FENCE_ERR_FENCE_ID;
1441 g_list_foreach(ap_list, (GFunc) __geofence_manager_db_insert_wifi_data_info, &fence_id);
1443 return FENCE_ERR_NONE;
1447 * This function get bluetooth info from DB.
1449 * @param[in] fence_id
1450 * @param[out] bt_info which contained bssid of bluetooth and correspond of fence_id.
1451 * @return FENCE_ERR_NONE on success, negative values for errors
1453 int geofence_manager_get_bssid_info(const int fence_id, bssid_info_s **bssid_info)
1455 FUNC_ENTRANCE_SERVER;
1456 sqlite3_stmt *state = NULL;
1457 int ret = SQLITE_OK;
1458 const char *tail = NULL;
1461 bssid_info_s *bssid_info_from_db = NULL;
1462 const char *bssid = NULL;
1463 const char *ssid = NULL;
1465 char *query1 = sqlite3_mprintf("SELECT COUNT(bssid) FROM %s where fence_id = %d;", menu_table[FENCE_BSSID_TABLE], fence_id);
1467 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1468 ret = sqlite3_prepare_v2(db_info_s.handle, query1, -1, &state, &tail);
1469 if (ret != SQLITE_OK) {
1470 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1471 sqlite3_free(query1);
1472 return FENCE_ERR_PREPARE;
1475 ret = sqlite3_step(state);
1476 if (ret != SQLITE_ROW) {
1477 LOGD_GEOFENCE("Fail to get count sqlite3_step");
1478 sqlite3_finalize(state);
1479 sqlite3_free(query1);
1480 return FENCE_ERR_SQLITE_FAIL;
1483 count = sqlite3_column_int(state, 0);
1484 sqlite3_reset(state);
1485 sqlite3_finalize(state);
1486 sqlite3_free(query1);
1488 LOGI_GEOFENCE("ERROR: count = %d", count);
1489 return FENCE_ERR_COUNT;
1491 LOGD_GEOFENCE("count[%d]", count);
1494 char *query2 = sqlite3_mprintf("SELECT * FROM %s where fence_id = %d;", menu_table[FENCE_BSSID_TABLE], fence_id);
1496 ret = sqlite3_prepare_v2(db_info_s.handle, query2, -1, &state, &tail);
1497 if (ret != SQLITE_OK) {
1498 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1499 sqlite3_free(query2);
1500 return FENCE_ERR_PREPARE;
1503 /*'count' should be 1. because bluetooth bssid and fence_id matched one by one.*/
1504 for (i = 0; i < count; i++) {
1505 ret = sqlite3_step(state);
1506 if (ret != SQLITE_ROW) {
1507 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1510 bssid_info_from_db = g_slice_new0(bssid_info_s);
1511 g_return_val_if_fail(bssid_info_from_db, -1);
1512 if (bssid_info_from_db) {
1513 bssid = (const char *)sqlite3_column_text(state, 1);
1514 ssid = (const char *)sqlite3_column_text(state, 2);
1515 g_strlcpy(bssid_info_from_db->bssid, bssid, WLAN_BSSID_LEN);
1516 g_strlcpy(bssid_info_from_db->ssid, ssid, WLAN_BSSID_LEN);
1517 *bssid_info = bssid_info_from_db;
1521 sqlite3_finalize(state);
1522 sqlite3_free(query2);
1523 return FENCE_ERR_NONE;
1526 int geofence_manager_update_bssid_info(const int fence_id, bssid_info_s *bssid_info)
1528 FUNC_ENTRANCE_SERVER
1529 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1530 g_return_val_if_fail(bssid_info, FENCE_ERR_INVALID_PARAMETER);
1531 sqlite3_stmt *state = NULL;
1532 int ret = SQLITE_OK;
1534 char *query = sqlite3_mprintf("UPDATE %Q SET bssid = %Q where fence_id = %d;", menu_table[FENCE_BSSID_TABLE], bssid_info->bssid, fence_id);
1536 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1537 if (ret != SQLITE_OK) {
1538 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1539 sqlite3_free(query);
1540 return FENCE_ERR_PREPARE;
1543 ret = sqlite3_step(state);
1544 if (ret != SQLITE_DONE) {
1545 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1546 sqlite3_finalize(state);
1547 sqlite3_free(query);
1548 return FENCE_ERR_SQLITE_FAIL;
1551 sqlite3_finalize(state);
1552 sqlite3_free(query);
1553 LOGI_GEOFENCE("Fence_id: %d has been successfully updated.", fence_id);
1554 return FENCE_ERR_NONE;
1558 * This function insert bssid information in DB.
1560 * @param[in] fence_id
1561 * @param[in] bssid_info which contained bssid of wifi or bluetooth for geofence.
1562 * @return FENCE_ERR_NONE on success, negative values for errors
1564 int geofence_manager_set_bssid_info(int fence_id, bssid_info_s *bssid_info)
1566 FUNC_ENTRANCE_SERVER
1567 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1568 g_return_val_if_fail(bssid_info, FENCE_ERR_INVALID_PARAMETER);
1569 int ret = FENCE_ERR_NONE;
1572 ret = __geofence_manager_db_get_count_of_fence_id(fence_id, FENCE_BSSID_TABLE, &count);
1573 if (ret != FENCE_ERR_NONE) {
1574 LOGI_GEOFENCE("Fail to get geofence_manager_db_get_count_of_fence_id [%d]", ret);
1577 if (count) { /* fence id has been in FenceBssid table */
1578 LOGI_GEOFENCE("count is [%d]", count);
1579 return FENCE_ERR_FENCE_ID;
1583 ret = __geofence_manager_db_insert_bssid_info(fence_id, bssid_info->bssid, bssid_info->ssid);
1584 if (ret != FENCE_ERR_NONE) {
1585 LOGI_GEOFENCE("Fail to insert the bssid info");
1588 return FENCE_ERR_NONE;
1592 * This function get enable status from DB.
1594 * @param[in] fence_id
1595 * @param[in] status: 1 enbale, 0 disable.
1596 * @return FENCE_ERR_NONE on success, negative values for errors
1598 int geofence_manager_get_enable_status(const int fence_id, int *status)
1600 FUNC_ENTRANCE_SERVER;
1601 sqlite3_stmt *state = NULL;
1602 int ret = SQLITE_OK;
1603 const char *tail = NULL;
1605 char *query = sqlite3_mprintf("SELECT enable FROM GeoFence where fence_id = %d;", fence_id);
1607 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1608 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1609 if (ret != SQLITE_OK) {
1610 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1611 sqlite3_free(query);
1612 return FENCE_ERR_PREPARE;
1615 ret = sqlite3_step(state);
1616 if (ret != SQLITE_ROW) {
1617 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1618 sqlite3_finalize(state);
1619 sqlite3_free(query);
1620 return FENCE_ERR_SQLITE_FAIL;
1623 *status = sqlite3_column_int(state, 0);
1625 sqlite3_finalize(state);
1626 sqlite3_free(query);
1627 return FENCE_ERR_NONE;
1631 * This function set enable on DB.
1633 * @param[in] fence_id
1634 * @param[in] status: 1 enbale, 0 disable.
1635 * @return FENCE_ERR_NONE on success, negative values for errors
1637 int geofence_manager_set_enable_status(int fence_id, int status)
1639 FUNC_ENTRANCE_SERVER;
1640 sqlite3_stmt *state;
1641 int ret = SQLITE_OK;
1644 char *query = sqlite3_mprintf("UPDATE GeoFence SET enable = %d where fence_id = %d;", status, fence_id);
1646 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1647 if (ret != SQLITE_OK) {
1648 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1649 sqlite3_free(query);
1650 return FENCE_ERR_PREPARE;
1653 ret = sqlite3_step(state);
1654 if (ret != SQLITE_DONE) {
1655 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1656 sqlite3_finalize(state);
1657 sqlite3_free(query);
1658 return FENCE_ERR_SQLITE_FAIL;
1661 sqlite3_finalize(state);
1662 sqlite3_free(query);
1663 return FENCE_ERR_NONE;
1667 * This function get name from DB.
1669 * @param[in] fence_id
1671 * @return FENCE_ERR_NONE on success, negative values for errors
1673 int geofence_manager_get_place_name(int place_id, char **name)
1675 FUNC_ENTRANCE_SERVER;
1676 sqlite3_stmt *state = NULL;
1677 int ret = SQLITE_OK;
1678 const char *tail = NULL;
1681 char *query = sqlite3_mprintf("SELECT place_name FROM Places where place_id = %d;", place_id);
1683 LOGD_GEOFENCE("current place id is [%d]", place_id);
1684 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1685 if (ret != SQLITE_OK) {
1686 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1687 sqlite3_free(query);
1688 return FENCE_ERR_PREPARE;
1691 ret = sqlite3_step(state);
1692 if (ret != SQLITE_ROW) {
1693 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1694 sqlite3_finalize(state);
1695 sqlite3_free(query);
1696 return FENCE_ERR_SQLITE_FAIL;
1699 tmp = (char *) sqlite3_column_text(state, 0);
1700 if (!tmp || !strlen(tmp)) {
1701 LOGI_GEOFENCE("ERROR: name is NULL!!!");
1703 *name = g_strdup(tmp);
1706 sqlite3_finalize(state);
1707 sqlite3_free(query);
1708 return FENCE_ERR_NONE;
1712 * This function set name on DB.
1714 * @param[in] fence_id
1716 * @return FENCE_ERR_NONE on success, negative values for errors
1718 int geofence_manager_set_place_name(int place_id, const char *name)
1720 FUNC_ENTRANCE_SERVER;
1721 sqlite3_stmt *state;
1722 int ret = SQLITE_OK;
1725 char *query = sqlite3_mprintf("UPDATE Places SET place_name = %Q where place_id = %d;", name, place_id);
1727 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1728 if (ret != SQLITE_OK) {
1729 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1730 sqlite3_free(query);
1731 return FENCE_ERR_PREPARE;
1734 ret = sqlite3_step(state);
1735 if (ret != SQLITE_DONE) {
1736 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1737 sqlite3_finalize(state);
1738 sqlite3_free(query);
1739 return FENCE_ERR_SQLITE_FAIL;
1742 sqlite3_finalize(state);
1743 sqlite3_free(query);
1744 return FENCE_ERR_NONE;
1748 * This function get appid from DB.
1750 * @param[in] place_id
1752 * @return FENCE_ERR_NONE on success, negative values for errors
1754 int geofence_manager_get_appid_from_places(int place_id, char **appid)
1756 FUNC_ENTRANCE_SERVER;
1757 sqlite3_stmt *state = NULL;
1758 int ret = SQLITE_OK;
1759 const char *tail = NULL;
1762 char *query = sqlite3_mprintf("SELECT app_id FROM Places where place_id = %d;", place_id);
1764 LOGD_GEOFENCE("current place id is [%d]", place_id);
1765 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1766 if (ret != SQLITE_OK) {
1767 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1768 sqlite3_free(query);
1769 return FENCE_ERR_PREPARE;
1772 ret = sqlite3_step(state);
1773 if (ret != SQLITE_ROW) {
1774 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1775 sqlite3_finalize(state);
1776 sqlite3_free(query);
1777 return FENCE_ERR_SQLITE_FAIL;
1780 id = (char *) sqlite3_column_text(state, 0);
1781 if (!id || !strlen(id)) {
1782 LOGI_GEOFENCE("ERROR: appid is NULL!!!");
1784 *appid = g_strdup(id);
1787 sqlite3_finalize(state);
1788 sqlite3_free(query);
1789 return FENCE_ERR_NONE;
1793 * This function set appid on DB.
1795 * @param[in] place_id
1797 * @return FENCE_ERR_NONE on success, negative values for errors
1799 int geofence_manager_set_appid_to_places(int place_id, char *appid)
1801 FUNC_ENTRANCE_SERVER;
1802 sqlite3_stmt *state;
1803 int ret = SQLITE_OK;
1806 char *query = sqlite3_mprintf("UPDATE Places SET app_id = %Q where place_id = %d;", appid, place_id);
1807 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1808 if (ret != SQLITE_OK) {
1809 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1810 sqlite3_free(query);
1811 return FENCE_ERR_PREPARE;
1814 ret = sqlite3_step(state);
1815 if (ret != SQLITE_DONE) {
1816 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1817 sqlite3_finalize(state);
1818 sqlite3_free(query);
1819 return FENCE_ERR_SQLITE_FAIL;
1822 sqlite3_finalize(state);
1823 sqlite3_free(query);
1824 return FENCE_ERR_NONE;
1828 * This function get appid from DB.
1830 * @param[in] fence_id
1832 * @return FENCE_ERR_NONE on success, negative values for errors
1834 int geofence_manager_get_appid_from_geofence(int fence_id, char **appid)
1836 FUNC_ENTRANCE_SERVER;
1837 sqlite3_stmt *state = NULL;
1838 int ret = SQLITE_OK;
1839 const char *tail = NULL;
1842 char *query = sqlite3_mprintf("SELECT app_id FROM GeoFence where fence_id = %d;", fence_id);
1843 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1844 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1845 if (ret != SQLITE_OK) {
1846 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1847 sqlite3_free(query);
1848 return FENCE_ERR_PREPARE;
1851 ret = sqlite3_step(state);
1852 if (ret != SQLITE_ROW) {
1853 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1854 sqlite3_finalize(state);
1855 sqlite3_free(query);
1856 return FENCE_ERR_SQLITE_FAIL;
1859 id = (char *) sqlite3_column_text(state, 0);
1860 if (!id || !strlen(id)) {
1861 LOGI_GEOFENCE("ERROR: appid is NULL!!!");
1863 *appid = g_strdup(id);
1866 sqlite3_finalize(state);
1867 sqlite3_free(query);
1868 return FENCE_ERR_NONE;
1872 * This function set appid on DB.
1874 * @param[in] fence_id
1876 * @return FENCE_ERR_NONE on success, negative values for errors
1878 int geofence_manager_set_appid_to_geofence(int fence_id, char *appid)
1880 FUNC_ENTRANCE_SERVER;
1881 sqlite3_stmt *state;
1882 int ret = SQLITE_OK;
1885 char *query = sqlite3_mprintf("UPDATE GeoFence SET app_id = %Q where fence_id = %d;", appid, fence_id);
1887 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1888 if (ret != SQLITE_OK) {
1889 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1890 sqlite3_free(query);
1891 return FENCE_ERR_PREPARE;
1894 ret = sqlite3_step(state);
1895 if (ret != SQLITE_DONE) {
1896 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1897 sqlite3_finalize(state);
1898 sqlite3_free(query);
1899 return FENCE_ERR_SQLITE_FAIL;
1902 sqlite3_finalize(state);
1903 sqlite3_free(query);
1904 return FENCE_ERR_NONE;
1908 * This function get geofence type from DB.
1910 * @param[in] fence_id
1911 * @param[in] geofence_type_e.
1912 * @return FENCE_ERR_NONE on success, negative values for errors
1914 int geofence_manager_get_geofence_type(int fence_id, geofence_type_e *fence_type)
1916 FUNC_ENTRANCE_SERVER;
1917 sqlite3_stmt *state = NULL;
1918 int ret = SQLITE_OK;
1919 const char *tail = NULL;
1921 char *query = sqlite3_mprintf("SELECT geofence_type FROM GeoFence where fence_id = %d;", fence_id);
1923 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1924 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1925 if (ret != SQLITE_OK) {
1926 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1927 sqlite3_free(query);
1928 return FENCE_ERR_PREPARE;
1931 ret = sqlite3_step(state);
1932 if (ret != SQLITE_ROW) {
1933 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1934 sqlite3_finalize(state);
1935 sqlite3_free(query);
1936 return FENCE_ERR_SQLITE_FAIL;
1939 *fence_type = sqlite3_column_int(state, 0);
1941 sqlite3_reset(state);
1942 sqlite3_finalize(state);
1943 sqlite3_free(query);
1945 return FENCE_ERR_NONE;
1948 int geofence_manager_get_place_id(int fence_id, int *place_id)
1950 FUNC_ENTRANCE_SERVER;
1951 sqlite3_stmt *state = NULL;
1952 int ret = SQLITE_OK;
1953 const char *tail = NULL;
1955 char *query = sqlite3_mprintf("SELECT place_id FROM GeoFence where fence_id = %d;", fence_id);
1957 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1958 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1959 if (ret != SQLITE_OK) {
1960 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1961 sqlite3_free(query);
1962 return FENCE_ERR_PREPARE;
1965 ret = sqlite3_step(state);
1966 if (ret != SQLITE_ROW) {
1967 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1968 sqlite3_finalize(state);
1969 sqlite3_free(query);
1970 return FENCE_ERR_SQLITE_FAIL;
1973 *place_id = sqlite3_column_int(state, 0);
1975 sqlite3_reset(state);
1976 sqlite3_finalize(state);
1977 sqlite3_free(query);
1979 return FENCE_ERR_NONE;
1983 * This function get geofence/place access type from DB.
1985 * @param[in] fence_id/place_id
1986 * @param[in] access_type_e.
1987 * @return FENCE_ERR_NONE on success, negative values for errors
1989 int geofence_manager_get_access_type(int fence_id, int place_id, access_type_e *fence_type)
1991 FUNC_ENTRANCE_SERVER;
1992 sqlite3_stmt *state = NULL;
1993 int ret = SQLITE_OK;
1994 const char *tail = NULL;
1998 query = sqlite3_mprintf("SELECT access_type FROM GeoFence WHERE fence_id = %d;", fence_id);
1999 else if (fence_id == -1)
2000 query = sqlite3_mprintf("SELECT access_type FROM Places WHERE place_id = %d", place_id);
2002 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2003 LOGD_GEOFENCE("current place id is [%d]", place_id);
2004 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2005 if (ret != SQLITE_OK) {
2006 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2007 sqlite3_free(query);
2008 return FENCE_ERR_PREPARE;
2011 ret = sqlite3_step(state);
2012 if (ret != SQLITE_ROW) {
2013 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2014 sqlite3_finalize(state);
2015 sqlite3_free(query);
2016 return FENCE_ERR_SQLITE_FAIL;
2019 *fence_type = sqlite3_column_int(state, 0);
2021 sqlite3_reset(state);
2022 sqlite3_finalize(state);
2023 sqlite3_free(query);
2025 return FENCE_ERR_NONE;
2029 * This function set geofence type on DB.
2031 * @param[in] fence_id
2032 * @param[in] fence_type.
2033 * @return FENCE_ERR_NONE on success, negative values for errors
2035 int geofence_manager_set_geofence_type(int fence_id, geofence_type_e fence_type)
2037 FUNC_ENTRANCE_SERVER;
2038 sqlite3_stmt *state;
2039 int ret = SQLITE_OK;
2042 char *query = sqlite3_mprintf("UPDATE GeoFence SET geofence_type = %d where fence_id = %d;", fence_type, fence_id);
2044 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2045 if (ret != SQLITE_OK) {
2046 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2047 sqlite3_free(query);
2048 return FENCE_ERR_PREPARE;
2051 ret = sqlite3_step(state);
2052 if (ret != SQLITE_DONE) {
2053 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2054 sqlite3_finalize(state);
2055 sqlite3_free(query);
2056 return FENCE_ERR_SQLITE_FAIL;
2059 sqlite3_finalize(state);
2060 sqlite3_free(query);
2061 return FENCE_ERR_NONE;
2065 * This function get geofence place_id from DB.
2067 * @param[in] fence_id
2068 * @param[in] place_id
2069 * @return FENCE_ERR_NONE on success, negative values for errors
2071 int geofence_manager_get_placeid_from_geofence(int fence_id, int *place_id)
2073 FUNC_ENTRANCE_SERVER;
2074 sqlite3_stmt *state = NULL;
2075 int ret = SQLITE_OK;
2076 const char *tail = NULL;
2078 char *query = sqlite3_mprintf("SELECT place_id FROM GeoFence where fence_id = %d;", fence_id);
2079 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2080 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2081 if (ret != SQLITE_OK) {
2082 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2083 sqlite3_free(query);
2084 return FENCE_ERR_PREPARE;
2087 ret = sqlite3_step(state);
2088 if (ret != SQLITE_ROW) {
2089 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2090 sqlite3_finalize(state);
2091 sqlite3_free(query);
2092 return FENCE_ERR_SQLITE_FAIL;
2095 *place_id = sqlite3_column_int(state, 0);
2097 sqlite3_reset(state);
2098 sqlite3_finalize(state);
2099 sqlite3_free(query);
2101 return FENCE_ERR_NONE;
2105 * This function get running status from DB.
2107 * @param[in] fence_id
2109 * @return FENCE_ERR_NONE on success, negative values for errors
2111 int geofence_manager_get_running_status(int fence_id, int *running_status)
2113 FUNC_ENTRANCE_SERVER;
2114 sqlite3_stmt *state = NULL;
2115 int ret = SQLITE_OK;
2116 const char *tail = NULL;
2118 char *query = sqlite3_mprintf("SELECT running_status FROM GeoFence where fence_id = %d;", fence_id);
2120 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2121 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2122 if (ret != SQLITE_OK) {
2123 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2124 sqlite3_free(query);
2125 return FENCE_ERR_PREPARE;
2128 ret = sqlite3_step(state);
2129 if (ret != SQLITE_ROW) {
2130 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2131 sqlite3_finalize(state);
2132 sqlite3_free(query);
2133 return FENCE_ERR_SQLITE_FAIL;
2136 *running_status = sqlite3_column_int(state, 0);
2138 sqlite3_reset(state);
2139 sqlite3_finalize(state);
2140 sqlite3_free(query);
2142 return FENCE_ERR_NONE;
2146 * This function set running state on DB.
2148 * @param[in] fence_id
2150 * @return FENCE_ERR_NONE on success, negative values for errors
2152 int geofence_manager_set_running_status(int fence_id, int running_status)
2154 FUNC_ENTRANCE_SERVER;
2155 sqlite3_stmt *state;
2156 int ret = SQLITE_OK;
2159 char *query = sqlite3_mprintf("UPDATE GeoFence SET running_status = %d where fence_id = %d;", running_status, fence_id);
2161 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2162 if (ret != SQLITE_OK) {
2163 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2164 sqlite3_free(query);
2165 return FENCE_ERR_PREPARE;
2168 ret = sqlite3_step(state);
2169 if (ret != SQLITE_DONE) {
2170 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2171 sqlite3_finalize(state);
2172 sqlite3_free(query);
2173 return FENCE_ERR_SQLITE_FAIL;
2176 sqlite3_finalize(state);
2177 sqlite3_free(query);
2178 return FENCE_ERR_NONE;
2182 * This function get direction type from DB.
2184 * @param[in] fence_id
2185 * @param[in] direction
2186 * @return FENCE_ERR_NONE on success, negative values for errors
2188 int geofence_manager_get_direction(int fence_id, geofence_direction_e *direction)
2190 FUNC_ENTRANCE_SERVER;
2191 sqlite3_stmt *state = NULL;
2192 int ret = SQLITE_OK;
2193 const char *tail = NULL;
2195 char *query = sqlite3_mprintf("SELECT direction FROM GeoFence where fence_id = %d;", fence_id);
2196 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2197 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2198 if (ret != SQLITE_OK) {
2199 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2200 sqlite3_free(query);
2201 return FENCE_ERR_PREPARE;
2204 ret = sqlite3_step(state);
2205 if (ret != SQLITE_ROW) {
2206 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2207 sqlite3_finalize(state);
2208 sqlite3_free(query);
2209 return FENCE_ERR_SQLITE_FAIL;
2212 *direction = sqlite3_column_int(state, 0);
2214 sqlite3_finalize(state);
2215 sqlite3_free(query);
2217 return FENCE_ERR_NONE;
2221 * This function set direction type on DB.
2223 * @param[in] fence_id
2224 * @param[in] direction
2225 * @return FENCE_ERR_NONE on success, negative values for errors
2227 int geofence_manager_set_direction(int fence_id, geofence_direction_e direction)
2229 FUNC_ENTRANCE_SERVER;
2230 sqlite3_stmt *state;
2231 int ret = SQLITE_OK;
2234 char *query = sqlite3_mprintf("UPDATE GeoFence SET direction = %d where fence_id = %d;", direction, fence_id);
2236 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2237 if (ret != SQLITE_OK) {
2238 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2239 sqlite3_free(query);
2240 return FENCE_ERR_PREPARE;
2243 ret = sqlite3_step(state);
2244 if (ret != SQLITE_DONE) {
2245 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2246 sqlite3_finalize(state);
2247 sqlite3_free(query);
2248 return FENCE_ERR_SQLITE_FAIL;
2251 sqlite3_finalize(state);
2252 sqlite3_free(query);
2254 return FENCE_ERR_NONE;
2258 * This function remove fence from DB.
2260 * @param[in] fence_id
2261 * @return FENCE_ERR_NONE on success, negative values for errors
2263 int geofence_manager_delete_fence_info(int fence_id)
2265 FUNC_ENTRANCE_SERVER;
2266 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
2267 int ret = FENCE_ERR_NONE;
2268 geofence_type_e fence_type = GEOFENCE_INVALID;
2270 ret = geofence_manager_get_geofence_type(fence_id, &fence_type);
2271 if (FENCE_ERR_NONE != ret) {
2272 LOGI_GEOFENCE("Fail to geofence_manager_delete_fence_point_info");
2276 ret = __geofence_manager_db_enable_foreign_keys();
2277 if (FENCE_ERR_NONE != ret) {
2278 LOGI_GEOFENCE("Fail to geofence_manager_db_enable_foreign_keys");
2282 ret = __geofence_manager_delete_table(fence_id, FENCE_MAIN_TABLE);
2283 if (FENCE_ERR_NONE != ret) {
2284 LOGI_GEOFENCE("Fail to geofence_manager_delete_fence_point_info");
2292 * This function remove place from DB.
2294 * @param[in] place_id
2295 * @return FENCE_ERR_NONE on success, negative values for errors
2297 int geofence_manager_delete_place_info(int place_id)
2299 FUNC_ENTRANCE_SERVER;
2300 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
2301 int ret = FENCE_ERR_NONE;
2303 ret = __geofence_manager_db_enable_foreign_keys();
2304 if (FENCE_ERR_NONE != ret) {
2305 LOGI_GEOFENCE("Fail to geofence_manager_db_enable_foreign_keys");
2309 ret = __geofence_manager_delete_place_table(place_id);
2310 if (FENCE_ERR_NONE != ret) {
2311 LOGI_GEOFENCE("Fail to geofence_manager_delete_place_info");
2319 * This function close DB handle.
2321 * @param[in] fence_id
2322 * @return FENCE_ERR_NONE on success, negative values for errors
2324 int geofence_manager_close_db(void)
2326 FUNC_ENTRANCE_SERVER;
2327 int ret = SQLITE_OK;
2329 if (db_info_s.handle == NULL) {
2330 return FENCE_ERR_NONE;
2333 ret = db_util_close(db_info_s.handle);
2334 if (ret != SQLITE_OK) {
2335 LOGI_GEOFENCE("Close DB ERROR!!!");
2336 return FENCE_ERR_SQLITE_FAIL;
2339 return FENCE_ERR_NONE;
2343 * This function deletes all data on db.
2345 * @return FENCE_ERR_NONE on success, negative values for errors
2347 int geofence_manager_reset(void)
2349 FUNC_ENTRANCE_SERVER;
2350 sqlite3_stmt *state = NULL;
2351 int ret = SQLITE_OK;
2353 ret = __geofence_manager_db_enable_foreign_keys();
2354 if (FENCE_ERR_NONE != ret) {
2355 LOGI_GEOFENCE("Fail to geofence_manager_db_enable_foreign_keys");
2359 char *query_two = sqlite3_mprintf("DELETE from %Q;", menu_table[FENCE_MAIN_TABLE]);
2361 ret = sqlite3_prepare_v2(db_info_s.handle, query_two, -1, &state, NULL);
2362 if (SQLITE_OK != ret) {
2363 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
2364 sqlite3_free(query_two);
2365 return FENCE_ERR_SQLITE_FAIL;
2368 ret = sqlite3_step(state);
2369 if (SQLITE_DONE != ret) {
2370 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
2371 sqlite3_finalize(state);
2372 sqlite3_free(query_two);
2373 return FENCE_ERR_SQLITE_FAIL;
2375 sqlite3_reset(state);
2376 sqlite3_free(query_two);
2378 char *query_three = sqlite3_mprintf("UPDATE sqlite_sequence SET seq = 0 where name = %Q;", menu_table[FENCE_MAIN_TABLE]);
2380 ret = sqlite3_prepare_v2(db_info_s.handle, query_three, -1, &state, NULL);
2381 if (SQLITE_OK != ret) {
2382 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
2383 sqlite3_free(query_three);
2384 return FENCE_ERR_SQLITE_FAIL;
2387 ret = sqlite3_step(state);
2388 if (SQLITE_DONE != ret) {
2389 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
2390 sqlite3_finalize(state);
2391 sqlite3_free(query_three);
2392 return FENCE_ERR_SQLITE_FAIL;
2395 sqlite3_reset(state);
2396 sqlite3_finalize(state);
2397 sqlite3_free(query_three);
2398 return FENCE_ERR_NONE;
2402 * This function copy source wifi info to dest wifi info.
2404 * @param[in] src_wifi
2405 * @param[out] dest_wifi
2406 * @return FENCE_ERR_NONE on success, negative values for errors
2408 int geofence_manager_copy_wifi_info(wifi_info_s *src_wifi, wifi_info_s **dest_wifi)
2410 FUNC_ENTRANCE_SERVER;
2411 g_return_val_if_fail(src_wifi, FENCE_ERR_INVALID_PARAMETER);
2413 *dest_wifi = (wifi_info_s *)g_malloc0(sizeof(wifi_info_s));
2414 g_return_val_if_fail(*dest_wifi, -1);
2416 g_strlcpy((*dest_wifi)->bssid, src_wifi->bssid, WLAN_BSSID_LEN);
2418 return FENCE_ERR_NONE;
2422 * This function create a wifi infor .
2424 * @param[in] fence_id
2426 * @param[out] wifi info
2427 * @return FENCE_ERR_NONE on success, negative values for errors
2429 int geofence_manager_create_wifi_info(int fence_id, char *bssid, wifi_info_s **new_wifi)
2431 FUNC_ENTRANCE_SERVER;
2432 g_return_val_if_fail(fence_id >= 0, FENCE_ERR_INVALID_PARAMETER);
2433 g_return_val_if_fail(bssid, FENCE_ERR_INVALID_PARAMETER);
2435 *new_wifi = (wifi_info_s *)g_malloc0(sizeof(wifi_info_s));
2436 g_strlcpy((*new_wifi)->bssid, bssid, WLAN_BSSID_LEN);
2438 return FENCE_ERR_NONE;
2442 * This function get fence id count by params such as app id and fence type and enable status .
2444 * @param[in] app_id : if app_id == NULL: ALL
2445 * @param[in] fence_type:if GEOFENCE_TYPE_INVALID == NULL: ALL fence type
2446 * @param[in] enable_status
2447 * @param[out] fence id count
2448 * @return FENCE_ERR_NONE on success, negative values for errors
2450 int geofence_manager_get_count_by_params(const char *app_id, geofence_type_e fence_type, int *count)
2452 FUNC_ENTRANCE_SERVER;
2453 sqlite3_stmt *state = NULL;
2454 int ret = SQLITE_OK;
2455 const char *tail = NULL;
2458 if (NULL == app_id) {
2459 if (GEOFENCE_INVALID != fence_type) { /* app_id == NULL : All and GEOFENCE_TYPE_INVALID != fence_type */
2460 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence where geofence_type = %d ;", fence_type);
2462 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence ;");
2464 } else { /*app_id not NULL */
2465 if (GEOFENCE_INVALID != fence_type) { /* app_id not NULL and GEOFENCE_TYPE_INVALID != fence_type */
2466 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence where app_id = %Q AND geofence_type = %d ;", app_id, fence_type);
2468 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence where app_id = %Q ;", app_id);
2472 LOGI_GEOFENCE("app_id[%s] fence_type[%d] ", app_id, fence_type);
2473 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2474 if (ret != SQLITE_OK) {
2475 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2476 sqlite3_free(query);
2477 return FENCE_ERR_PREPARE;
2480 ret = sqlite3_step(state);
2481 if (ret != SQLITE_ROW) {
2482 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2483 sqlite3_finalize(state);
2484 sqlite3_free(query);
2485 return FENCE_ERR_SQLITE_FAIL;
2488 *count = sqlite3_column_int(state, 0);
2491 LOGI_GEOFENCE("ERROR: count = %d", *count);
2492 return FENCE_ERR_COUNT;
2494 LOGI_GEOFENCE("count[%d]", *count);
2497 sqlite3_reset(state);
2498 sqlite3_finalize(state);
2499 sqlite3_free(query);
2500 return FENCE_ERR_NONE;
2504 app_id == NULL : All, geofence_type_e : INVALID - all, IN enable_status : enable, disable or both. Output : a list of geofence_id
2506 int geofence_manager_get_fences(const char *app_id, geofence_type_e fence_type, GList **fences)
2508 FUNC_ENTRANCE_SERVER;
2509 sqlite3_stmt *state = NULL;
2510 int ret = SQLITE_OK;
2511 const char *tail = NULL;
2517 ret = geofence_manager_get_count_by_params(app_id, fence_type, &count);
2518 if (ret != FENCE_ERR_NONE) {
2519 LOGI_GEOFENCE("ERROR: geofence_manager_get_count_of_fences_by_app.");
2523 if (NULL == app_id) {
2524 if (GEOFENCE_INVALID != fence_type) { /* app_id == NULL : All and GEOFENCE_TYPE_INVALID != fence_type */
2525 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence where geofence_type = %d;", fence_type);
2527 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence;");
2529 } else { /*app_id not NULL */
2530 if (GEOFENCE_INVALID != fence_type) { /* app_id not NULL and GEOFENCE_TYPE_INVALID != fence_type */
2531 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence where app_id = %Q AND geofence_type = %d ;", app_id, fence_type);
2533 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence where app_id = %Q;", app_id);
2537 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2538 if (ret != SQLITE_OK) {
2539 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2540 sqlite3_free(query);
2541 return FENCE_ERR_PREPARE;
2544 for (i = 0; i < count; i++) {
2545 ret = sqlite3_step(state);
2546 if (ret != SQLITE_ROW) {
2547 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2550 fence_id = sqlite3_column_int(state, 0);
2551 LOGI_GEOFENCE("fence id is [%d]", fence_id);
2552 *fences = g_list_append(*fences, (gpointer) GINT_TO_POINTER(fence_id));
2555 sqlite3_reset(state);
2556 sqlite3_finalize(state);
2557 sqlite3_free(query);
2558 return FENCE_ERR_NONE;
2561 int geofence_manager_get_count_of_fences(int *count)
2563 FUNC_ENTRANCE_SERVER;
2564 sqlite3_stmt *state = NULL;
2565 int ret = SQLITE_OK;
2566 const char *tail = NULL;
2567 char *query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence;");
2569 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2570 if (ret != SQLITE_OK) {
2571 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2572 sqlite3_free(query);
2573 return FENCE_ERR_PREPARE;
2576 ret = sqlite3_step(state);
2577 if (ret != SQLITE_ROW) {
2578 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2579 sqlite3_finalize(state);
2580 sqlite3_free(query);
2581 return FENCE_ERR_SQLITE_FAIL;
2584 *count = sqlite3_column_int(state, 0);
2587 LOGI_GEOFENCE("ERROR: count = %d", *count);
2588 return FENCE_ERR_COUNT;
2590 LOGI_GEOFENCE("count[%d]", *count);
2593 sqlite3_reset(state);
2594 sqlite3_finalize(state);
2595 sqlite3_free(query);
2596 return FENCE_ERR_NONE;
2599 int geofence_manager_get_place_count_by_placeid(int place_id, int *count)
2601 FUNC_ENTRANCE_SERVER;
2602 sqlite3_stmt *state = NULL;
2603 int ret = SQLITE_OK;
2604 const char *tail = NULL;
2605 char *query = sqlite3_mprintf("SELECT COUNT(place_id) FROM Places WHERE place_id=%d;", place_id);
2607 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2608 if (ret != SQLITE_OK) {
2609 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2610 sqlite3_free(query);
2611 return FENCE_ERR_PREPARE;
2614 ret = sqlite3_step(state);
2615 if (ret != SQLITE_ROW) {
2616 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2617 sqlite3_finalize(state);
2618 sqlite3_free(query);
2619 return FENCE_ERR_SQLITE_FAIL;
2622 *count = sqlite3_column_int(state, 0);
2625 LOGI_GEOFENCE("ERROR: place count = %d", *count);
2626 return FENCE_ERR_COUNT;
2628 LOGI_GEOFENCE("place count[%d]", *count);
2631 sqlite3_reset(state);
2632 sqlite3_finalize(state);
2633 sqlite3_free(query);
2634 return FENCE_ERR_NONE;