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>
26 #include "debug_util.h"
27 #include "geofence_server.h"
28 #include "geofence_server_db.h"
29 #include "geofence_server_private.h"
31 #define GEOFENCE_SERVER_DB_FILE ".geofence-server.db"
32 #define GEOFENCE_SERVER_DB_PATH "/opt/dbspace/"GEOFENCE_SERVER_DB_FILE
34 #define FENCE_SQL_LEN_MAX 256
35 #define MAX_DATA_NAME 20
38 #define GEOFENCE_INVALID 0
40 char *menu_table[4] = { "GeoFence", "FenceGeocoordinate", "FenceGeopointWifi", "FenceBssid" };
42 const char *group_id = NULL;
43 static char *password = "k1s2c3w4k5a6";
44 const char *col_latitude = "la";
45 const char *col_longitude = "lo";
46 const char *col_radius = "r";
49 FENCE_MAIN_TABLE = 0, /*GeoFence */
50 FENCE_GEOCOORDINATE_TAB, /*FenceGeocoordinate */
51 FENCE_GEOPOINT_WIFI_TABLE, /*FenceCurrentLocation */
52 FENCE_BSSID_TABLE /*FenceBluetoothBssid */
61 #define SQLITE3_RETURN(ret, msg, state) \
62 if (ret != SQLITE_OK) { \
63 LOGI_GEOFENCE("sqlite3 Error[%d] : %s", ret, msg); \
64 sqlite3_reset(state); \
65 sqlite3_clear_bindings(state); \
66 sqlite3_finalize(state); \
67 return FENCE_ERR_SQLITE_FAIL; \
75 * +----------+-------+-------+------------+-------+-------+-----------+---------+
76 * | fence_id | name | app_id | geofence_type |direction |enable |smart_assist_id|time_stamp
77 * +-------+-------+-------+-------+
79 * +-------+-------+-------+-------+
80 * CREATE TABLE GeoFence ( fence_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, app_id TEXT NOT NULL, geofence_type INTEGER," \
81 "direction INTEGER, enable INTEGER, smart_assist_id INTEGER, time_stamp INTEGER)";
85 * +----------+---------+--------+------+
86 * | fence_id | latitude | longitude | radius
87 * +-------+---------+-----+---------+
88 * | - | - | - | - | - | - |
89 * +-------+---------+-----+---------+
90 * CREATE TABLE FenceGeocoordinate ( fence_id INTEGER , latitude DOUBLE, longitude DOUBLE, radius DOUBLE, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE)";
93 * FenceCurrentLocation
94 * +-----+-------+------
95 * |bssid 1|fence_id1 |...
96 * +-----+-------+------
97 * |bssid 2|fence_id1|...
98 * +-----+-------+------
99 * |bssid 3|fence_id1|...
100 * +-----+-------+------
101 * |bssid 1|fence_id2|...
102 * +-----+-------+------
103 * |bssid 2|fence_id2|...
104 * +-------+---------+-----+---------+
105 * | - | - | - | - | - | - |
106 * +-------+---------+-----+---------+
107 *CREATE TABLE FenceCurrentLocation ( fence_id INTEGER, bssid TEXT, FOREIGN KEY(fence_id) REFERENCES GeoFence(fence_id) ON DELETE CASCADE)";
110 static inline int begin_transaction(void)
112 FUNC_ENTRANCE_SERVER;
116 ret = sqlite3_prepare_v2(db_info_s.handle, "BEGIN TRANSACTION", -1, &stmt, NULL);
118 if (ret != SQLITE_OK) {
119 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
120 return FENCE_ERR_SQLITE_FAIL;
123 if (sqlite3_step(stmt) != SQLITE_DONE) {
124 LOGI_GEOFENCE("Failed to do update (%s)", sqlite3_errmsg(db_info_s.handle));
125 sqlite3_finalize(stmt);
126 return FENCE_ERR_SQLITE_FAIL;
129 sqlite3_finalize(stmt);
130 return FENCE_ERR_NONE;
133 static inline int rollback_transaction(void)
135 FUNC_ENTRANCE_SERVER;
139 ret = sqlite3_prepare_v2(db_info_s.handle, "ROLLBACK TRANSACTION", -1, &stmt, NULL);
140 if (ret != SQLITE_OK) {
141 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
142 return FENCE_ERR_SQLITE_FAIL;
145 if (sqlite3_step(stmt) != SQLITE_DONE) {
146 LOGI_GEOFENCE("Failed to do update (%s)", sqlite3_errmsg(db_info_s.handle));
147 sqlite3_finalize(stmt);
148 return FENCE_ERR_SQLITE_FAIL;
151 sqlite3_finalize(stmt);
152 return FENCE_ERR_NONE;
155 static inline int commit_transaction(void)
157 FUNC_ENTRANCE_SERVER;
161 ret = sqlite3_prepare_v2(db_info_s.handle, "COMMIT TRANSACTION", -1, &stmt, NULL);
162 if (ret != SQLITE_OK) {
163 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
164 return FENCE_ERR_SQLITE_FAIL;
167 if (sqlite3_step(stmt) != SQLITE_DONE) {
168 LOGI_GEOFENCE("Failed to do update (%s)", sqlite3_errmsg(db_info_s.handle));
169 sqlite3_finalize(stmt);
170 return FENCE_ERR_SQLITE_FAIL;
173 sqlite3_finalize(stmt);
174 return FENCE_ERR_NONE;
177 static inline int __geofence_manager_db_create_places_table(void)
179 FUNC_ENTRANCE_SERVER;
183 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)");
184 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
185 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
187 return FENCE_ERR_SQLITE_FAIL;
190 if (sqlite3_changes(db_info_s.handle) == 0) {
191 LOGI_GEOFENCE("No changes to DB");
194 return FENCE_ERR_NONE;
197 static inline int __geofence_manager_db_create_geofence_table(void)
199 FUNC_ENTRANCE_SERVER;
203 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)");
205 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
206 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
208 return FENCE_ERR_SQLITE_FAIL;
211 if (sqlite3_changes(db_info_s.handle) == 0) {
212 LOGI_GEOFENCE("No changes to DB");
215 return FENCE_ERR_NONE;
218 static inline int __geofence_manager_db_create_geocoordinate_table(void)
220 FUNC_ENTRANCE_SERVER;
224 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)");
226 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
227 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
229 return FENCE_ERR_SQLITE_FAIL;
232 if (sqlite3_changes(db_info_s.handle) == 0) {
233 LOGI_GEOFENCE("No changes to DB");
236 return FENCE_ERR_NONE;
239 static inline int __geofence_manager_db_create_wifi_data_table(void)
241 FUNC_ENTRANCE_SERVER;
245 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)");
247 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
248 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
250 return FENCE_ERR_SQLITE_FAIL;
253 if (sqlite3_changes(db_info_s.handle) == 0) {
254 LOGI_GEOFENCE("No changes to DB");
257 return FENCE_ERR_NONE;
260 /* DB table for save the pair of fence id and bluetooth bssid */
261 static inline int __geofence_manager_db_create_bssid_table(void)
267 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)");
269 if (sqlite3_exec(db_info_s.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
270 LOGI_GEOFENCE("Failed to execute the DDL (%s)", err);
272 return FENCE_ERR_SQLITE_FAIL;
275 if (sqlite3_changes(db_info_s.handle) == 0)
276 LOGI_GEOFENCE("No changes to DB");
278 return FENCE_ERR_NONE;
281 static int __geofence_manager_open_db_handle(void)
283 LOGI_GEOFENCE("enter");
286 ret = db_util_open_with_options(GEOFENCE_SERVER_DB_PATH, &db_info_s.handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, NULL);
287 if (ret != SQLITE_OK) {
288 LOGI_GEOFENCE("sqlite3_open_v2 Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
289 return FENCE_ERR_SQLITE_FAIL;
292 return FENCE_ERR_NONE;
295 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)
297 FUNC_ENTRANCE_SERVER;
298 g_return_val_if_fail(bssid, FENCE_ERR_INVALID_PARAMETER);
299 sqlite3_stmt *state = NULL;
301 const char *tail = NULL;
303 char *query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM %Q where fence_id = %d AND bssid = %Q;", menu_table[table_type], fence_id, bssid);
305 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
306 if (ret != SQLITE_OK) {
307 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
309 return FENCE_ERR_PREPARE;
312 ret = sqlite3_step(state);
313 if (ret != SQLITE_ROW) {
314 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
315 sqlite3_finalize(state);
317 return FENCE_ERR_SQLITE_FAIL;
319 *count = sqlite3_column_int(state, 0);
320 sqlite3_reset(state);
321 sqlite3_finalize(state);
324 return FENCE_ERR_NONE;
327 static int __geofence_manager_db_insert_bssid_info(const int fence_id, const char *bssid_info, const char *ssid)
329 FUNC_ENTRANCE_SERVER;
330 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
331 g_return_val_if_fail(bssid_info, FENCE_ERR_INVALID_PARAMETER);
332 sqlite3_stmt *state = NULL;
339 char *query = sqlite3_mprintf("INSERT INTO %Q(fence_id, bssid, ssid) VALUES (?, ?, ?)", menu_table[FENCE_BSSID_TABLE]);
340 bssid = (char *)g_malloc0(sizeof(char)*WLAN_BSSID_LEN);
341 g_strlcpy(bssid, bssid_info, WLAN_BSSID_LEN);
342 LOGI_GEOFENCE("fence_id[%d], bssid[%s], ssid[%s]", fence_id, bssid, ssid);
344 ret = __geofence_manager_db_get_count_by_fence_id_and_bssid(fence_id, bssid, FENCE_BSSID_TABLE, &count);
345 if (ret != FENCE_ERR_NONE) {
346 LOGI_GEOFENCE("__geofence_manager_db_get_count_by_fence_id_and_bssid() failed. ERROR(%d)", ret);
351 LOGI_GEOFENCE("count = %d", count);
352 return FENCE_ERR_NONE;
355 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
356 if (ret != SQLITE_OK) {
357 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
359 return FENCE_ERR_PREPARE;
362 ret = sqlite3_bind_int(state, ++index, fence_id);
363 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
365 ret = sqlite3_bind_text(state, ++index, bssid, -1, SQLITE_STATIC);
366 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
368 ret = sqlite3_bind_text(state, ++index, ssid, -1, SQLITE_STATIC);
369 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
371 ret = sqlite3_step(state);
372 if (ret != SQLITE_DONE) {
373 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
374 sqlite3_finalize(state);
377 return FENCE_ERR_SQLITE_FAIL;
380 sqlite3_reset(state);
381 sqlite3_clear_bindings(state);
382 sqlite3_finalize(state);
385 LOGI_GEOFENCE("fence_id[%d], bssid[%s], ssid[%s] inserted db table [%s] successfully.", fence_id, bssid_info, ssid, menu_table[FENCE_BSSID_TABLE]);
387 return FENCE_ERR_NONE;
390 static int __geofence_manager_db_insert_wifi_data_info(gpointer data, gpointer user_data)
392 FUNC_ENTRANCE_SERVER;
393 g_return_val_if_fail(data, FENCE_ERR_INVALID_PARAMETER);
394 g_return_val_if_fail(user_data, FENCE_ERR_INVALID_PARAMETER);
395 int *fence_id = (int *) user_data;
396 sqlite3_stmt *state = NULL;
397 wifi_info_s *wifi_info = NULL;
403 wifi_info = (wifi_info_s *) data;
404 bssid = (char *)g_malloc0(sizeof(char)*WLAN_BSSID_LEN);
405 g_strlcpy(bssid, wifi_info->bssid, WLAN_BSSID_LEN);
406 LOGI_GEOFENCE("fence_id[%d] bssid[%s]", *fence_id, wifi_info->bssid);
408 char *query = sqlite3_mprintf("INSERT INTO FenceGeopointWifi(fence_id, bssid) VALUES (?, ?)");
410 ret = __geofence_manager_db_get_count_by_fence_id_and_bssid(*fence_id, bssid, FENCE_GEOPOINT_WIFI_TABLE, &count);
412 LOGI_GEOFENCE("count = %d", count);
417 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
418 if (ret != SQLITE_OK) {
419 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
421 return FENCE_ERR_PREPARE;
424 ret = sqlite3_bind_int(state, ++index, *fence_id);
425 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
427 ret = sqlite3_bind_text(state, ++index, bssid, -1, SQLITE_STATIC);
428 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
430 ret = sqlite3_step(state);
431 if (ret != SQLITE_DONE) {
432 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
433 sqlite3_finalize(state);
436 return FENCE_ERR_SQLITE_FAIL;
439 sqlite3_reset(state);
440 sqlite3_clear_bindings(state);
441 sqlite3_finalize(state);
445 return FENCE_ERR_NONE;
448 static int __geofence_manager_delete_table(int fence_id, fence_table_type_e table_type)
450 FUNC_ENTRANCE_SERVER;
451 sqlite3_stmt *state = NULL;
454 char *query = sqlite3_mprintf("DELETE from %Q where fence_id = %d;", menu_table[table_type], fence_id);
455 LOGI_GEOFENCE("current fence id is [%d]", fence_id);
456 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
457 if (SQLITE_OK != ret) {
458 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
460 return FENCE_ERR_SQLITE_FAIL;
463 ret = sqlite3_step(state);
464 if (SQLITE_DONE != ret) {
465 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
466 sqlite3_finalize(state);
468 return FENCE_ERR_SQLITE_FAIL;
470 sqlite3_finalize(state);
471 LOGI_GEOFENCE("fence_id[%d], deleted from db table [%s] successfully.", fence_id, menu_table[table_type]);
473 return FENCE_ERR_NONE;
476 static int __geofence_manager_delete_place_table(int place_id)
478 FUNC_ENTRANCE_SERVER;
479 sqlite3_stmt *state = NULL;
482 char *query = sqlite3_mprintf("DELETE from Places where place_id = %d;", place_id);
484 LOGI_GEOFENCE("current place id is [%d]", place_id);
485 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
486 if (SQLITE_OK != ret) {
487 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
489 return FENCE_ERR_SQLITE_FAIL;
492 ret = sqlite3_step(state);
493 if (SQLITE_DONE != ret) {
494 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
495 sqlite3_finalize(state);
497 return FENCE_ERR_SQLITE_FAIL;
499 sqlite3_finalize(state);
500 LOGI_GEOFENCE("place_id[%d], deleted place from db table Places successfully.", place_id);
502 return FENCE_ERR_NONE;
505 static inline void __geofence_manager_db_create_table(void)
507 FUNC_ENTRANCE_SERVER;
511 ret = __geofence_manager_db_create_geofence_table();
513 rollback_transaction();
517 ret = __geofence_manager_db_create_geocoordinate_table();
519 rollback_transaction();
523 ret = __geofence_manager_db_create_wifi_data_table();
525 rollback_transaction();
529 ret = __geofence_manager_db_create_bssid_table();
531 rollback_transaction();
535 commit_transaction();
538 /* Get fence id count in certain table, such as GeoFence/FenceGeocoordinate/FenceCurrentLocation */
539 static int __geofence_manager_db_get_count_of_fence_id(int fence_id, fence_table_type_e table_type, int *count)
541 sqlite3_stmt *state = NULL;
543 const char *tail = NULL;
545 char *query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM %Q where fence_id = %d;", menu_table[table_type], fence_id);
547 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
548 if (ret != SQLITE_OK) {
549 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
551 return FENCE_ERR_PREPARE;
554 ret = sqlite3_step(state);
555 if (ret != SQLITE_ROW) {
556 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
557 sqlite3_finalize(state);
559 return FENCE_ERR_SQLITE_FAIL;
561 *count = sqlite3_column_int(state, 0);
562 sqlite3_reset(state);
563 sqlite3_finalize(state);
565 return FENCE_ERR_NONE;
568 static int __geofence_manager_db_enable_foreign_keys(void)
570 sqlite3_stmt *state = NULL;
571 int ret = FENCE_ERR_NONE;
572 char *query = sqlite3_mprintf("PRAGMA foreign_keys = ON;");
574 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
575 if (SQLITE_OK != ret) {
576 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
578 return FENCE_ERR_SQLITE_FAIL;
581 ret = sqlite3_step(state);
582 if (SQLITE_DONE != ret) {
583 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
584 sqlite3_finalize(state);
586 return FENCE_ERR_SQLITE_FAIL;
588 sqlite3_reset(state);
589 sqlite3_finalize(state);
591 return FENCE_ERR_NONE;
594 void replaceChar(char *src, char oldChar, char newChar)
603 void __geofence_manager_genarate_password(char *password)
605 char *bt_address = NULL;
606 char *wifi_address = NULL;
608 int bt_temp[6] = {0}, wifi_temp[6] = {0};
609 int i = 0, fkey[6], lkey[6];
610 char s1[100], s2[100], result[200];
611 char keyword[6] = { 'b', 'w', 'd', 's', 'j', 'f' };
613 bt_adapter_get_address(&bt_address);
614 wifi_get_mac_address(&wifi_address);
616 token = strtok(bt_address, ":");
619 bt_temp[i++] = atoi(token);
620 token = strtok(NULL, ":");
624 token = strtok(wifi_address, ":");
627 wifi_temp[i++] = atoi(token);
628 token = strtok(NULL, ":");
633 memset((void *) s1, 0, sizeof(s1));
634 memset((void *) s2, 0, sizeof(s2));
635 memset((void *) result, 0, sizeof(result));
637 for (i = 0; i < 6; i++) {
638 fkey[i] = bt_temp[i] * wifi_temp[i];
639 lkey[i] = bt_temp[i] + wifi_temp[i];
642 for (i = 0; i < 6; i++) {
643 sprintf(s1, "%s%x", s1, fkey[i]);
644 sprintf(s2, "%s%x", s2, lkey[i]);
645 replaceChar(s1, 0x30 + ((i * 2) % 10), keyword[i]);
646 replaceChar(s2, 0x30 + ((i * 2 + 1) % 10), keyword[i]);
647 LOGD_GEOFENCE("s1 %s", s1);
648 LOGD_GEOFENCE("s2 %s", s2);
651 sprintf(result, "%s%s", s1, s2);
654 LOGD_GEOFENCE("result : %s", result);
658 * This function in DB and create GeoFence/FenceGeocoordinate /FenceCurrentLocation four table on DB if necessary.
660 * @param[in] struct of fence_point_info_s
661 * @return FENCE_ERR_NONE on success, negative values for errors
663 int geofence_manager_db_init(void)
665 FUNC_ENTRANCE_SERVER;
668 if (__geofence_manager_open_db_handle() != FENCE_ERR_NONE) {
669 LOGI_GEOFENCE("Fail to location_geofence_open_db_handle");
670 return FENCE_ERR_SQLITE_FAIL;
673 if (lstat(GEOFENCE_SERVER_DB_PATH, &stat) < 0) {
674 LOGI_GEOFENCE("lstat is ERROR!!!");
675 db_util_close(db_info_s.handle);
676 db_info_s.handle = NULL;
677 return FENCE_ERR_SQLITE_FAIL;
680 if (!S_ISREG(stat.st_mode)) {
681 LOGI_GEOFENCE("Invalid file");
682 db_util_close(db_info_s.handle);
683 db_info_s.handle = NULL;
684 return FENCE_ERR_SQLITE_FAIL;
688 __geofence_manager_db_create_table();
690 return FENCE_ERR_NONE;
693 int geofence_manager_db_reset(void)
695 FUNC_ENTRANCE_SERVER;
696 sqlite3_stmt *state = NULL;
701 for (idx = 0; idx < 4; idx++) {
702 query = sqlite3_mprintf("DELETE from %Q;", menu_table[idx]);
704 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, NULL);
705 if (SQLITE_OK != ret) {
706 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
708 return FENCE_ERR_SQLITE_FAIL;
711 ret = sqlite3_step(state);
712 if (SQLITE_DONE != ret) {
713 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
714 sqlite3_finalize(state);
716 return FENCE_ERR_SQLITE_FAIL;
718 sqlite3_finalize(state);
721 return FENCE_ERR_NONE;
724 int geofence_manager_set_place_info(place_info_s *place_info, int *place_id)
726 FUNC_ENTRANCE_SERVER;
727 g_return_val_if_fail(place_info, FENCE_ERR_INVALID_PARAMETER);
728 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
729 sqlite3_stmt *state = NULL;
734 char *place_name = NULL;
735 char *query = sqlite3_mprintf("INSERT INTO Places (access_type, place_name, app_id) VALUES (?, ?, ?)");
737 place_name = (char *)g_malloc0(sizeof(char)*PLACE_NAME_LEN);
738 g_strlcpy(place_name, place_info->place_name, PLACE_NAME_LEN);
739 appid = (char *)g_malloc0(sizeof(char)*APP_ID_LEN);
740 g_strlcpy(appid, place_info->appid, APP_ID_LEN);
742 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
743 if (ret != SQLITE_OK) {
744 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
746 return FENCE_ERR_PREPARE;
748 LOGD_GEOFENCE("appid[%s] access_type[%d] place_name[%s]", appid, place_info->access_type, place_info->place_name);
750 ret = sqlite3_bind_int(state, ++index, place_info->access_type);
751 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
753 ret = sqlite3_bind_text(state, ++index, place_name, -1, SQLITE_STATIC);
754 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
756 ret = sqlite3_bind_text(state, ++index, appid, -1, SQLITE_STATIC);
757 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
759 ret = sqlite3_step(state);
760 if (ret != SQLITE_DONE) {
761 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
762 sqlite3_finalize(state);
766 return FENCE_ERR_SQLITE_FAIL;
768 *place_id = sqlite3_last_insert_rowid(db_info_s.handle);
769 LOGI_GEOFENCE(" auto-genarated place_id[%d]", *place_id);
770 sqlite3_reset(state);
771 sqlite3_clear_bindings(state);
772 sqlite3_finalize(state);
778 LOGI_GEOFENCE("TMP Invalid fence_id");
782 return FENCE_ERR_NONE;
785 int geofence_manager_set_common_info(fence_common_info_s *fence_info, int *fence_id)
787 FUNC_ENTRANCE_SERVER;
788 g_return_val_if_fail(fence_info, FENCE_ERR_INVALID_PARAMETER);
789 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
790 sqlite3_stmt *state = NULL;
795 char *query = sqlite3_mprintf("INSERT INTO GeoFence (place_id, enable, app_id, geofence_type, access_type, running_status) VALUES (?, ?, ?, ?, ?, ?)");
796 appid = (char *)g_malloc0(sizeof(char)*APP_ID_LEN);
797 g_strlcpy(appid, fence_info->appid, APP_ID_LEN);
799 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
800 if (ret != SQLITE_OK) {
801 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
803 return FENCE_ERR_PREPARE;
806 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);
808 ret = sqlite3_bind_int(state, ++index, fence_info->place_id);
809 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
811 ret = sqlite3_bind_int(state, ++index, fence_info->enable);
812 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
814 ret = sqlite3_bind_text(state, ++index, appid, -1, SQLITE_STATIC);
815 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
817 ret = sqlite3_bind_int(state, ++index, fence_info->type);
818 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
820 ret = sqlite3_bind_int(state, ++index, fence_info->access_type);
821 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
823 ret = sqlite3_bind_int(state, ++index, fence_info->running_status);
824 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
826 ret = sqlite3_step(state);
827 if (ret != SQLITE_DONE) {
828 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
829 sqlite3_finalize(state);
832 return FENCE_ERR_SQLITE_FAIL;
834 *fence_id = sqlite3_last_insert_rowid(db_info_s.handle);
835 LOGI_GEOFENCE(" auto-genarated fence_id[%d]", *fence_id);
836 sqlite3_reset(state);
837 sqlite3_clear_bindings(state);
838 sqlite3_finalize(state);
843 LOGI_GEOFENCE("TMP Invalid fence_id");
847 return FENCE_ERR_NONE;
850 int geofence_manager_get_place_list_from_db(int *number_of_places, GList **places)
852 FUNC_ENTRANCE_SERVER;
853 sqlite3_stmt *state = NULL;
855 const char *tail = NULL;
859 query = sqlite3_mprintf("SELECT place_id, place_name, access_type, app_id FROM Places");
861 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
862 if (ret != SQLITE_OK) {
863 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
865 return FENCE_ERR_PREPARE;
867 GList *place_list = NULL;
868 int column_index = 0;
870 ret = sqlite3_step(state);
872 if (ret != SQLITE_ROW) {
873 LOGI_GEOFENCE("DONE...!!! : %d", ret);
877 place_info_s *place = g_slice_new0(place_info_s);
882 place->place_id = sqlite3_column_int(state, column_index++);
883 g_strlcpy(place->place_name, (char *) sqlite3_column_text(state, column_index++), PLACE_NAME_LEN);
884 place->access_type = sqlite3_column_int(state, column_index++);
885 g_strlcpy(place->appid, (char *) sqlite3_column_text(state, column_index++), APP_ID_LEN);
886 place_list = g_list_append(place_list, place);
888 } while (ret != SQLITE_DONE);
890 *places = place_list;
891 *number_of_places = count;
893 sqlite3_reset(state);
894 sqlite3_finalize(state);
896 return FENCE_ERR_NONE;
899 int geofence_manager_get_fence_list_from_db(int *number_of_fences, GList **fences, int place_id)
901 FUNC_ENTRANCE_SERVER;
903 sqlite3_stmt *state = NULL;
905 const char *tail = NULL;
910 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");
912 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);
914 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
915 if (ret != SQLITE_OK) {
916 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
918 return FENCE_ERR_PREPARE;
920 GList *fence_list = NULL;
922 ret = sqlite3_step(state);
924 if (ret != SQLITE_ROW) {
925 LOGI_GEOFENCE("DONE...!!! : %d", ret);
928 int column_index = 0;
930 geofence_info_s *fence = g_slice_new0(geofence_info_s);
935 fence->fence_id = sqlite3_column_int(state, column_index++);
936 g_strlcpy(fence->app_id, (char *) sqlite3_column_text(state, column_index++), APP_ID_LEN);
937 fence->param.type = sqlite3_column_int(state, column_index++);
938 fence->access_type = sqlite3_column_int(state, column_index++);
939 fence->param.place_id = sqlite3_column_int(state, column_index++);
940 char *data_name = NULL;
942 data_name = (char *) sqlite3_column_text(state, column_index++);
943 if (!data_name || !strlen(data_name))
944 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
946 fence->param.latitude = atof(data_name);
948 data_name = (char *) sqlite3_column_text(state, column_index++);
949 if (!data_name || !strlen(data_name))
950 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
952 fence->param.longitude = atof(data_name);
954 data_name = (char *) sqlite3_column_text(state, column_index++);
955 if (!data_name || !strlen(data_name))
956 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
958 fence->param.radius = atof(data_name);
960 g_strlcpy(fence->param.address, (char *) sqlite3_column_text(state, column_index++), ADDRESS_LEN);
961 g_strlcpy(fence->param.bssid, (char *) sqlite3_column_text(state, column_index++), WLAN_BSSID_LEN);
962 g_strlcpy(fence->param.ssid, (char *) sqlite3_column_text(state, column_index++), WLAN_BSSID_LEN);
963 LOGI_GEOFENCE("radius = %d, bssid = %s", fence->param.radius, fence->param.bssid);
964 fence_list = g_list_append(fence_list, fence);
966 } while (ret != SQLITE_DONE);
968 *fences = fence_list;
969 *number_of_fences = count;
971 sqlite3_reset(state);
972 sqlite3_finalize(state);
974 return FENCE_ERR_NONE;
977 int geofence_manager_get_fenceid_list_from_db(int *number_of_fences, GList **fences, int place_id)
979 FUNC_ENTRANCE_SERVER;
980 sqlite3_stmt *state = NULL;
982 const char *tail = NULL;
985 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence WHERE place_id = %d", place_id);
987 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
988 if (ret != SQLITE_OK) {
989 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
991 return FENCE_ERR_PREPARE;
993 GList *fence_list = NULL;
994 int column_index = 0;
997 ret = sqlite3_step(state);
998 if (ret != SQLITE_ROW) {
999 LOGI_GEOFENCE("DONE...!!! : %d", ret);
1003 fence_id = sqlite3_column_int(state, column_index);
1004 fence_list = g_list_append(fence_list, GINT_TO_POINTER(fence_id));
1006 } while (ret != SQLITE_DONE);
1007 *fences = fence_list;
1008 *number_of_fences = count;
1010 sqlite3_reset(state);
1011 sqlite3_finalize(state);
1012 sqlite3_free(query);
1013 return FENCE_ERR_NONE;
1016 int geofence_manager_update_geocoordinate_info(int fence_id, geocoordinate_info_s *geocoordinate_info)
1018 FUNC_ENTRANCE_SERVER;
1019 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1020 g_return_val_if_fail(geocoordinate_info, FENCE_ERR_INVALID_PARAMETER);
1021 sqlite3_stmt *state = NULL;
1023 int ret = SQLITE_OK;
1025 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);
1027 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1028 if (ret != SQLITE_OK) {
1029 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1030 sqlite3_free(query);
1031 return FENCE_ERR_PREPARE;
1034 ret = sqlite3_step(state);
1035 if (ret != SQLITE_DONE) {
1036 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1037 sqlite3_finalize(state);
1038 sqlite3_free(query);
1039 return FENCE_ERR_SQLITE_FAIL;
1042 sqlite3_finalize(state);
1043 sqlite3_free(query);
1044 LOGI_GEOFENCE("fence_id: %d has been successfully updated.", fence_id);
1045 return FENCE_ERR_NONE;
1048 int geofence_manager_update_place_info(int place_id, const char *place_info_name)
1050 FUNC_ENTRANCE_SERVER;
1051 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
1052 sqlite3_stmt *state = NULL;
1054 int ret = SQLITE_OK;
1055 char *place_name = NULL;
1057 place_name = (char *)g_malloc0(sizeof(char)*PLACE_NAME_LEN);
1058 g_strlcpy(place_name, place_info_name, PLACE_NAME_LEN);
1060 char *query = sqlite3_mprintf("UPDATE Places SET place_name = %Q where place_id = %d", place_name, place_id);
1062 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1063 if (ret != SQLITE_OK) {
1064 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1065 sqlite3_free(query);
1067 return FENCE_ERR_PREPARE;
1070 ret = sqlite3_step(state);
1071 if (ret != SQLITE_DONE) {
1072 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1073 sqlite3_finalize(state);
1075 sqlite3_free(query);
1076 return FENCE_ERR_SQLITE_FAIL;
1079 sqlite3_finalize(state);
1081 sqlite3_free(query);
1082 LOGI_GEOFENCE("place_id: %d has been successfully updated.", place_id);
1083 return FENCE_ERR_NONE;
1087 * This function set geocoordinate info in DB.
1089 * @param[in] fence_id
1090 * @param[out] struct of geocoordinate_info_s
1091 * @return FENCE_ERR_NONE on success, negative values for errors
1093 int geofence_manager_set_geocoordinate_info(int fence_id, geocoordinate_info_s *geocoordinate_info)
1095 FUNC_ENTRANCE_SERVER;
1096 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1097 g_return_val_if_fail(geocoordinate_info, FENCE_ERR_INVALID_PARAMETER);
1098 sqlite3_stmt *state = NULL;
1099 int ret = SQLITE_OK;
1103 char data_name_lat[MAX_DATA_NAME] = { 0 };
1104 char data_name_lon[MAX_DATA_NAME] = { 0 };
1105 char data_name_rad[MAX_DATA_NAME] = { 0 };
1107 char ssa_data_lat[DATA_LEN] = { 0 };
1108 char ssa_data_lon[DATA_LEN] = { 0 };
1109 char ssa_data_rad[DATA_LEN] = { 0 };
1111 char *query = sqlite3_mprintf("INSERT INTO FenceGeocoordinate(fence_id, latitude, longitude, radius, address) VALUES (?, ?, ?, ?, ?)");
1113 ret = __geofence_manager_db_get_count_of_fence_id(fence_id, FENCE_GEOCOORDINATE_TAB, &count);
1114 if (ret != FENCE_ERR_NONE) {
1115 LOGI_GEOFENCE("Fail to get geofence_manager_db_get_count_of_fence_id [%d]", ret);
1116 sqlite3_free(query);
1118 } else if (count) { /* fence id has been in FenceGeocoordinate table */
1119 sqlite3_free(query);
1120 return FENCE_ERR_FENCE_ID;
1123 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1124 if (ret != SQLITE_OK) {
1125 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1126 sqlite3_free(query);
1127 return FENCE_ERR_PREPARE;
1130 ret = sqlite3_bind_int(state, ++index, fence_id);
1131 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1133 if (password == NULL)
1134 __geofence_manager_genarate_password(password);
1136 /* ssa_put : latitude*/
1137 ret = snprintf(data_name_lat, DATA_LEN, "%lf", geocoordinate_info->latitude);
1139 ret = sqlite3_bind_text(state, ++index, data_name_lat, -1, SQLITE_STATIC);
1141 /*ret = sqlite3_bind_double (state, ++index, geocoordinate_info->latitude);*/
1142 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1144 /* ssa_put : longitude*/
1145 ret = snprintf(data_name_lon, MAX_DATA_NAME, "%lf", geocoordinate_info->longitude);
1147 LOGD_GEOFENCE("ERROR: String will be truncated");
1148 return FENCE_ERR_STRING_TRUNCATED;
1151 ret = sqlite3_bind_text(state, ++index, data_name_lon, -1, SQLITE_STATIC);
1152 /*ret = sqlite3_bind_double (state, ++index, geocoordinate_info->longitude);*/
1153 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1155 /* ssa_put : radius*/
1156 ret = snprintf(data_name_rad, MAX_DATA_NAME, "%lf", geocoordinate_info->radius);
1158 LOGD_GEOFENCE("ERROR: String will be truncated");
1159 return FENCE_ERR_STRING_TRUNCATED;
1162 ret = sqlite3_bind_text(state, ++index, data_name_rad, -1, SQLITE_STATIC);
1163 /*ret = sqlite3_bind_double (state, ++index, geocoordinate_info->radius);*/
1164 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1166 ret = sqlite3_bind_text(state, ++index, geocoordinate_info->address, -1, SQLITE_STATIC);
1167 SQLITE3_RETURN(ret, sqlite3_errmsg(db_info_s.handle), state);
1169 ret = sqlite3_step(state);
1170 if (ret != SQLITE_DONE) {
1171 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1172 sqlite3_finalize(state);
1173 return FENCE_ERR_SQLITE_FAIL;
1176 sqlite3_reset(state);
1177 sqlite3_clear_bindings(state);
1178 sqlite3_finalize(state);
1179 sqlite3_free(query);
1181 return FENCE_ERR_NONE;
1185 * This function get geocoordinate info from DB.
1187 * @param[in] fence_id
1188 * @param[out] struct of geocoordinate_info_s
1189 * @return FENCE_ERR_NONE on success, negative values for errors
1191 int geofence_manager_get_geocoordinate_info(int fence_id, geocoordinate_info_s **geocoordinate_info)
1193 FUNC_ENTRANCE_SERVER;
1194 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1195 sqlite3_stmt *state = NULL;
1196 int ret = SQLITE_OK;
1197 const char *tail = NULL;
1199 char *data_name = NULL;
1201 char *ssa_data = NULL;
1204 char *query = sqlite3_mprintf("SELECT * FROM FenceGeocoordinate where fence_id = %d;", fence_id);
1206 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1207 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1208 if (ret != SQLITE_OK) {
1209 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1210 sqlite3_free(query);
1211 return FENCE_ERR_PREPARE;
1214 ret = sqlite3_step(state);
1215 if (ret != SQLITE_ROW) {
1216 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1217 sqlite3_finalize(state);
1218 sqlite3_free(query);
1219 return FENCE_ERR_SQLITE_FAIL;
1222 *geocoordinate_info = (geocoordinate_info_s *)g_malloc0(sizeof(geocoordinate_info_s));
1223 g_return_val_if_fail(*geocoordinate_info, FENCE_ERR_INVALID_PARAMETER);
1225 if (password == NULL)
1226 __geofence_manager_genarate_password(password);
1228 data_name = (char *) sqlite3_column_text(state, ++index);
1230 if (!data_name || !strlen(data_name)) {
1231 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1233 (*geocoordinate_info)->latitude = atof(data_name);
1236 data_name = (char *) sqlite3_column_text(state, ++index);
1237 if (!data_name || !strlen(data_name)) {
1238 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1240 (*geocoordinate_info)->longitude = atof(data_name);
1243 data_name = (char *) sqlite3_column_text(state, ++index);
1244 if (!data_name || !strlen(data_name)) {
1245 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1247 (*geocoordinate_info)->radius = atof(data_name);
1250 g_strlcpy((*geocoordinate_info)->address, (char *) sqlite3_column_text(state, ++index), ADDRESS_LEN);
1252 sqlite3_finalize(state);
1253 sqlite3_free(query);
1255 return FENCE_ERR_NONE;
1259 * This function get ap list from DB.
1261 * @param[in] fence_id
1262 * @param[out] ap_list
1263 * @return FENCE_ERR_NONE on success, negative values for errors
1265 int geofence_manager_get_ap_info(const int fence_id, GList **ap_list)
1267 FUNC_ENTRANCE_SERVER;
1268 sqlite3_stmt *state = NULL;
1269 int ret = SQLITE_OK;
1270 const char *tail = NULL;
1273 wifi_info_s *wifi_info = NULL;
1274 const char *bssid = NULL;
1276 char *query1 = sqlite3_mprintf("SELECT COUNT(bssid) FROM FenceGeopointWifi where fence_id = %d;", fence_id);
1278 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1279 ret = sqlite3_prepare_v2(db_info_s.handle, query1, -1, &state, &tail);
1280 if (ret != SQLITE_OK) {
1281 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1282 sqlite3_free(query1);
1283 return FENCE_ERR_PREPARE;
1286 ret = sqlite3_step(state);
1287 if (ret != SQLITE_ROW) {
1288 LOGD_GEOFENCE("Fail to get count sqlite3_step");
1289 sqlite3_finalize(state);
1290 sqlite3_free(query1);
1291 return FENCE_ERR_SQLITE_FAIL;
1294 count = sqlite3_column_int(state, 0);
1295 sqlite3_reset(state);
1296 sqlite3_finalize(state);
1297 sqlite3_free(query1);
1299 LOGI_GEOFENCE("ERROR: count = %d", count);
1300 return FENCE_ERR_COUNT;
1302 LOGD_GEOFENCE("count[%d]", count);
1305 char *query2 = sqlite3_mprintf("SELECT * FROM FenceGeopointWifi where fence_id = %d;", fence_id);
1307 ret = sqlite3_prepare_v2(db_info_s.handle, query2, -1, &state, &tail);
1308 if (ret != SQLITE_OK) {
1309 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1310 sqlite3_free(query2);
1311 return FENCE_ERR_PREPARE;
1314 for (i = 0; i < count; i++) {
1315 ret = sqlite3_step(state);
1316 if (ret != SQLITE_ROW) {
1317 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1320 wifi_info = g_slice_new0(wifi_info_s);
1321 g_return_val_if_fail(wifi_info, -1);
1323 bssid = (const char *) sqlite3_column_text(state, 1);
1324 g_strlcpy(wifi_info->bssid, bssid, WLAN_BSSID_LEN);
1325 *ap_list = g_list_append(*ap_list, (gpointer) wifi_info);
1329 sqlite3_finalize(state);
1330 sqlite3_free(query2);
1331 return FENCE_ERR_NONE;
1334 /*This function get place info from DB.
1336 * @param[in] place_id
1337 * @param[out] struct of place_info_s
1338 * @return FENCE_ERR_NONE on success, negative values for errors
1340 int geofence_manager_get_place_info(int place_id, place_info_s **place_info)
1342 FUNC_ENTRANCE_SERVER;
1343 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
1344 sqlite3_stmt *state = NULL;
1345 int ret = SQLITE_OK;
1346 const char *tail = NULL;
1348 char *data_name = NULL;
1350 char *ssa_data = NULL;
1352 char *query = sqlite3_mprintf("SELECT * FROM Places where place_id = %d;", place_id);
1353 LOGD_GEOFENCE("current place id is [%d]", place_id);
1354 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1355 if (ret != SQLITE_OK) {
1356 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1357 sqlite3_free(query);
1358 return FENCE_ERR_PREPARE;
1360 ret = sqlite3_step(state);
1361 if (ret != SQLITE_ROW) {
1362 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1363 sqlite3_finalize(state);
1364 sqlite3_free(query);
1365 return FENCE_ERR_SQLITE_FAIL;
1367 *place_info = (place_info_s *)g_malloc0(sizeof(place_info_s));
1368 g_return_val_if_fail(*place_info, FENCE_ERR_INVALID_PARAMETER);
1370 data_name = (char *)sqlite3_column_text(state, ++index);
1371 if (!data_name || !strlen(data_name)) {
1372 LOGI_GEOFENCE("ERROR: data_name is NULL!!!");
1374 (*place_info)->access_type = atof(data_name);
1377 g_strlcpy((*place_info)->place_name, (char *)sqlite3_column_text(state, ++index), PLACE_NAME_LEN);
1378 g_strlcpy((*place_info)->appid, (char *)sqlite3_column_text(state, ++index), APP_ID_LEN);
1379 sqlite3_finalize(state);
1380 sqlite3_free(query);
1382 return FENCE_ERR_NONE;
1386 * This function insert ap list in DB.
1388 * @param[in] fence_id
1389 * @param[out] ap_list
1390 * @return FENCE_ERR_NONE on success, negative values for errors
1392 int geofence_manager_set_ap_info(int fence_id, GList *ap_list)
1394 FUNC_ENTRANCE_SERVER;
1395 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1396 g_return_val_if_fail(ap_list, FENCE_ERR_INVALID_PARAMETER);
1397 int ret = FENCE_ERR_NONE;
1400 ret = __geofence_manager_db_get_count_of_fence_id(fence_id, FENCE_GEOPOINT_WIFI_TABLE, &count);
1401 if (ret != FENCE_ERR_NONE) {
1402 LOGI_GEOFENCE("Fail to get geofence_manager_db_get_count_of_fence_id [%d]", ret);
1405 if (count) { /* fence id has been in FenceCurrentLocation table */
1406 LOGI_GEOFENCE("count is [%d]", count);
1407 return FENCE_ERR_FENCE_ID;
1411 g_list_foreach(ap_list, (GFunc) __geofence_manager_db_insert_wifi_data_info, &fence_id);
1413 return FENCE_ERR_NONE;
1417 * This function get bluetooth info from DB.
1419 * @param[in] fence_id
1420 * @param[out] bt_info which contained bssid of bluetooth and correspond of fence_id.
1421 * @return FENCE_ERR_NONE on success, negative values for errors
1423 int geofence_manager_get_bssid_info(const int fence_id, bssid_info_s **bssid_info)
1425 FUNC_ENTRANCE_SERVER;
1426 sqlite3_stmt *state = NULL;
1427 int ret = SQLITE_OK;
1428 const char *tail = NULL;
1431 bssid_info_s *bssid_info_from_db = NULL;
1432 const char *bssid = NULL;
1433 const char *ssid = NULL;
1435 char *query1 = sqlite3_mprintf("SELECT COUNT(bssid) FROM %s where fence_id = %d;", menu_table[FENCE_BSSID_TABLE], fence_id);
1437 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1438 ret = sqlite3_prepare_v2(db_info_s.handle, query1, -1, &state, &tail);
1439 if (ret != SQLITE_OK) {
1440 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1441 sqlite3_free(query1);
1442 return FENCE_ERR_PREPARE;
1445 ret = sqlite3_step(state);
1446 if (ret != SQLITE_ROW) {
1447 LOGD_GEOFENCE("Fail to get count sqlite3_step");
1448 sqlite3_finalize(state);
1449 sqlite3_free(query1);
1450 return FENCE_ERR_SQLITE_FAIL;
1453 count = sqlite3_column_int(state, 0);
1454 sqlite3_reset(state);
1455 sqlite3_finalize(state);
1456 sqlite3_free(query1);
1458 LOGI_GEOFENCE("ERROR: count = %d", count);
1459 return FENCE_ERR_COUNT;
1461 LOGD_GEOFENCE("count[%d]", count);
1464 char *query2 = sqlite3_mprintf("SELECT * FROM %s where fence_id = %d;", menu_table[FENCE_BSSID_TABLE], fence_id);
1466 ret = sqlite3_prepare_v2(db_info_s.handle, query2, -1, &state, &tail);
1467 if (ret != SQLITE_OK) {
1468 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1469 sqlite3_free(query2);
1470 return FENCE_ERR_PREPARE;
1473 /*'count' should be 1. because bluetooth bssid and fence_id matched one by one.*/
1474 for (i = 0; i < count; i++) {
1475 ret = sqlite3_step(state);
1476 if (ret != SQLITE_ROW) {
1477 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1480 bssid_info_from_db = g_slice_new0(bssid_info_s);
1481 g_return_val_if_fail(bssid_info_from_db, -1);
1482 if (bssid_info_from_db) {
1483 bssid = (const char *)sqlite3_column_text(state, 1);
1484 ssid = (const char *)sqlite3_column_text(state, 2);
1485 g_strlcpy(bssid_info_from_db->bssid, bssid, WLAN_BSSID_LEN);
1486 g_strlcpy(bssid_info_from_db->ssid, ssid, WLAN_BSSID_LEN);
1487 *bssid_info = bssid_info_from_db;
1491 sqlite3_finalize(state);
1492 sqlite3_free(query2);
1493 return FENCE_ERR_NONE;
1496 int geofence_manager_update_bssid_info(const int fence_id, bssid_info_s *bssid_info)
1498 FUNC_ENTRANCE_SERVER
1499 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1500 g_return_val_if_fail(bssid_info, FENCE_ERR_INVALID_PARAMETER);
1501 sqlite3_stmt *state = NULL;
1502 int ret = SQLITE_OK;
1504 char *query = sqlite3_mprintf("UPDATE %Q SET bssid = %Q where fence_id = %d;", menu_table[FENCE_BSSID_TABLE], bssid_info->bssid, fence_id);
1506 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1507 if (ret != SQLITE_OK) {
1508 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1509 sqlite3_free(query);
1510 return FENCE_ERR_PREPARE;
1513 ret = sqlite3_step(state);
1514 if (ret != SQLITE_DONE) {
1515 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1516 sqlite3_finalize(state);
1517 sqlite3_free(query);
1518 return FENCE_ERR_SQLITE_FAIL;
1521 sqlite3_finalize(state);
1522 sqlite3_free(query);
1523 LOGI_GEOFENCE("Fence_id: %d has been successfully updated.", fence_id);
1524 return FENCE_ERR_NONE;
1528 * This function insert bssid information in DB.
1530 * @param[in] fence_id
1531 * @param[in] bssid_info which contained bssid of wifi or bluetooth for geofence.
1532 * @return FENCE_ERR_NONE on success, negative values for errors
1534 int geofence_manager_set_bssid_info(int fence_id, bssid_info_s *bssid_info)
1536 FUNC_ENTRANCE_SERVER
1537 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
1538 g_return_val_if_fail(bssid_info, FENCE_ERR_INVALID_PARAMETER);
1539 int ret = FENCE_ERR_NONE;
1542 ret = __geofence_manager_db_get_count_of_fence_id(fence_id, FENCE_BSSID_TABLE, &count);
1543 if (ret != FENCE_ERR_NONE) {
1544 LOGI_GEOFENCE("Fail to get geofence_manager_db_get_count_of_fence_id [%d]", ret);
1547 if (count) { /* fence id has been in FenceBssid table */
1548 LOGI_GEOFENCE("count is [%d]", count);
1549 return FENCE_ERR_FENCE_ID;
1553 ret = __geofence_manager_db_insert_bssid_info(fence_id, bssid_info->bssid, bssid_info->ssid);
1554 if (ret != FENCE_ERR_NONE) {
1555 LOGI_GEOFENCE("Fail to insert the bssid info");
1558 return FENCE_ERR_NONE;
1562 * This function get enable status from DB.
1564 * @param[in] fence_id
1565 * @param[in] status: 1 enbale, 0 disable.
1566 * @return FENCE_ERR_NONE on success, negative values for errors
1568 int geofence_manager_get_enable_status(const int fence_id, int *status)
1570 FUNC_ENTRANCE_SERVER;
1571 sqlite3_stmt *state = NULL;
1572 int ret = SQLITE_OK;
1573 const char *tail = NULL;
1575 char *query = sqlite3_mprintf("SELECT enable FROM GeoFence where fence_id = %d;", fence_id);
1577 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1578 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1579 if (ret != SQLITE_OK) {
1580 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1581 sqlite3_free(query);
1582 return FENCE_ERR_PREPARE;
1585 ret = sqlite3_step(state);
1586 if (ret != SQLITE_ROW) {
1587 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1588 sqlite3_finalize(state);
1589 sqlite3_free(query);
1590 return FENCE_ERR_SQLITE_FAIL;
1593 *status = sqlite3_column_int(state, 0);
1595 sqlite3_finalize(state);
1596 sqlite3_free(query);
1597 return FENCE_ERR_NONE;
1601 * This function set enable on DB.
1603 * @param[in] fence_id
1604 * @param[in] status: 1 enbale, 0 disable.
1605 * @return FENCE_ERR_NONE on success, negative values for errors
1607 int geofence_manager_set_enable_status(int fence_id, int status)
1609 FUNC_ENTRANCE_SERVER;
1610 sqlite3_stmt *state;
1611 int ret = SQLITE_OK;
1614 char *query = sqlite3_mprintf("UPDATE GeoFence SET enable = %d where fence_id = %d;", status, fence_id);
1616 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1617 if (ret != SQLITE_OK) {
1618 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1619 sqlite3_free(query);
1620 return FENCE_ERR_PREPARE;
1623 ret = sqlite3_step(state);
1624 if (ret != SQLITE_DONE) {
1625 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1626 sqlite3_finalize(state);
1627 sqlite3_free(query);
1628 return FENCE_ERR_SQLITE_FAIL;
1631 sqlite3_finalize(state);
1632 sqlite3_free(query);
1633 return FENCE_ERR_NONE;
1637 * This function get name from DB.
1639 * @param[in] fence_id
1641 * @return FENCE_ERR_NONE on success, negative values for errors
1643 int geofence_manager_get_place_name(int place_id, char **name)
1645 FUNC_ENTRANCE_SERVER;
1646 sqlite3_stmt *state = NULL;
1647 int ret = SQLITE_OK;
1648 const char *tail = NULL;
1651 char *query = sqlite3_mprintf("SELECT place_name FROM Places where place_id = %d;", place_id);
1653 LOGD_GEOFENCE("current place id is [%d]", place_id);
1654 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1655 if (ret != SQLITE_OK) {
1656 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1657 sqlite3_free(query);
1658 return FENCE_ERR_PREPARE;
1661 ret = sqlite3_step(state);
1662 if (ret != SQLITE_ROW) {
1663 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1664 sqlite3_finalize(state);
1665 sqlite3_free(query);
1666 return FENCE_ERR_SQLITE_FAIL;
1669 tmp = (char *) sqlite3_column_text(state, 0);
1670 if (!tmp || !strlen(tmp)) {
1671 LOGI_GEOFENCE("ERROR: name is NULL!!!");
1673 *name = g_strdup(tmp);
1676 sqlite3_finalize(state);
1677 sqlite3_free(query);
1678 return FENCE_ERR_NONE;
1682 * This function set name on DB.
1684 * @param[in] fence_id
1686 * @return FENCE_ERR_NONE on success, negative values for errors
1688 int geofence_manager_set_place_name(int place_id, const char *name)
1690 FUNC_ENTRANCE_SERVER;
1691 sqlite3_stmt *state;
1692 int ret = SQLITE_OK;
1695 char *query = sqlite3_mprintf("UPDATE Places SET place_name = %Q where place_id = %d;", name, place_id);
1697 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1698 if (ret != SQLITE_OK) {
1699 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1700 sqlite3_free(query);
1701 return FENCE_ERR_PREPARE;
1704 ret = sqlite3_step(state);
1705 if (ret != SQLITE_DONE) {
1706 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1707 sqlite3_finalize(state);
1708 sqlite3_free(query);
1709 return FENCE_ERR_SQLITE_FAIL;
1712 sqlite3_finalize(state);
1713 sqlite3_free(query);
1714 return FENCE_ERR_NONE;
1718 * This function get appid from DB.
1720 * @param[in] place_id
1722 * @return FENCE_ERR_NONE on success, negative values for errors
1724 int geofence_manager_get_appid_from_places(int place_id, char **appid)
1726 FUNC_ENTRANCE_SERVER;
1727 sqlite3_stmt *state = NULL;
1728 int ret = SQLITE_OK;
1729 const char *tail = NULL;
1732 char *query = sqlite3_mprintf("SELECT app_id FROM Places where place_id = %d;", place_id);
1734 LOGD_GEOFENCE("current place id is [%d]", place_id);
1735 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1736 if (ret != SQLITE_OK) {
1737 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1738 sqlite3_free(query);
1739 return FENCE_ERR_PREPARE;
1742 ret = sqlite3_step(state);
1743 if (ret != SQLITE_ROW) {
1744 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1745 sqlite3_finalize(state);
1746 sqlite3_free(query);
1747 return FENCE_ERR_SQLITE_FAIL;
1750 id = (char *) sqlite3_column_text(state, 0);
1751 if (!id || !strlen(id)) {
1752 LOGI_GEOFENCE("ERROR: appid is NULL!!!");
1754 *appid = g_strdup(id);
1757 sqlite3_finalize(state);
1758 sqlite3_free(query);
1759 return FENCE_ERR_NONE;
1763 * This function set appid on DB.
1765 * @param[in] place_id
1767 * @return FENCE_ERR_NONE on success, negative values for errors
1769 int geofence_manager_set_appid_to_places(int place_id, char *appid)
1771 FUNC_ENTRANCE_SERVER;
1772 sqlite3_stmt *state;
1773 int ret = SQLITE_OK;
1776 char *query = sqlite3_mprintf("UPDATE Places SET app_id = %Q where place_id = %d;", appid, place_id);
1777 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1778 if (ret != SQLITE_OK) {
1779 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1780 sqlite3_free(query);
1781 return FENCE_ERR_PREPARE;
1784 ret = sqlite3_step(state);
1785 if (ret != SQLITE_DONE) {
1786 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1787 sqlite3_finalize(state);
1788 sqlite3_free(query);
1789 return FENCE_ERR_SQLITE_FAIL;
1792 sqlite3_finalize(state);
1793 sqlite3_free(query);
1794 return FENCE_ERR_NONE;
1798 * This function get appid from DB.
1800 * @param[in] fence_id
1802 * @return FENCE_ERR_NONE on success, negative values for errors
1804 int geofence_manager_get_appid_from_geofence(int fence_id, char **appid)
1806 FUNC_ENTRANCE_SERVER;
1807 sqlite3_stmt *state = NULL;
1808 int ret = SQLITE_OK;
1809 const char *tail = NULL;
1812 char *query = sqlite3_mprintf("SELECT app_id FROM GeoFence where fence_id = %d;", fence_id);
1813 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1814 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1815 if (ret != SQLITE_OK) {
1816 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1817 sqlite3_free(query);
1818 return FENCE_ERR_PREPARE;
1821 ret = sqlite3_step(state);
1822 if (ret != SQLITE_ROW) {
1823 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1824 sqlite3_finalize(state);
1825 sqlite3_free(query);
1826 return FENCE_ERR_SQLITE_FAIL;
1829 id = (char *) sqlite3_column_text(state, 0);
1830 if (!id || !strlen(id)) {
1831 LOGI_GEOFENCE("ERROR: appid is NULL!!!");
1833 *appid = g_strdup(id);
1836 sqlite3_finalize(state);
1837 sqlite3_free(query);
1838 return FENCE_ERR_NONE;
1842 * This function set appid on DB.
1844 * @param[in] fence_id
1846 * @return FENCE_ERR_NONE on success, negative values for errors
1848 int geofence_manager_set_appid_to_geofence(int fence_id, char *appid)
1850 FUNC_ENTRANCE_SERVER;
1851 sqlite3_stmt *state;
1852 int ret = SQLITE_OK;
1855 char *query = sqlite3_mprintf("UPDATE GeoFence SET app_id = %Q where fence_id = %d;", appid, fence_id);
1857 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1858 if (ret != SQLITE_OK) {
1859 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1860 sqlite3_free(query);
1861 return FENCE_ERR_PREPARE;
1864 ret = sqlite3_step(state);
1865 if (ret != SQLITE_DONE) {
1866 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1867 sqlite3_finalize(state);
1868 sqlite3_free(query);
1869 return FENCE_ERR_SQLITE_FAIL;
1872 sqlite3_finalize(state);
1873 sqlite3_free(query);
1874 return FENCE_ERR_NONE;
1878 * This function get geofence type from DB.
1880 * @param[in] fence_id
1881 * @param[in] geofence_type_e.
1882 * @return FENCE_ERR_NONE on success, negative values for errors
1884 int geofence_manager_get_geofence_type(int fence_id, geofence_type_e *fence_type)
1886 FUNC_ENTRANCE_SERVER;
1887 sqlite3_stmt *state = NULL;
1888 int ret = SQLITE_OK;
1889 const char *tail = NULL;
1891 char *query = sqlite3_mprintf("SELECT geofence_type FROM GeoFence where fence_id = %d;", fence_id);
1893 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1894 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1895 if (ret != SQLITE_OK) {
1896 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1897 sqlite3_free(query);
1898 return FENCE_ERR_PREPARE;
1901 ret = sqlite3_step(state);
1902 if (ret != SQLITE_ROW) {
1903 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1904 sqlite3_finalize(state);
1905 sqlite3_free(query);
1906 return FENCE_ERR_SQLITE_FAIL;
1909 *fence_type = sqlite3_column_int(state, 0);
1911 sqlite3_reset(state);
1912 sqlite3_finalize(state);
1913 sqlite3_free(query);
1915 return FENCE_ERR_NONE;
1918 int geofence_manager_get_place_id(int fence_id, int *place_id)
1920 FUNC_ENTRANCE_SERVER;
1921 sqlite3_stmt *state = NULL;
1922 int ret = SQLITE_OK;
1923 const char *tail = NULL;
1925 char *query = sqlite3_mprintf("SELECT place_id FROM GeoFence where fence_id = %d;", fence_id);
1927 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1928 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1929 if (ret != SQLITE_OK) {
1930 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1931 sqlite3_free(query);
1932 return FENCE_ERR_PREPARE;
1935 ret = sqlite3_step(state);
1936 if (ret != SQLITE_ROW) {
1937 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1938 sqlite3_finalize(state);
1939 sqlite3_free(query);
1940 return FENCE_ERR_SQLITE_FAIL;
1943 *place_id = sqlite3_column_int(state, 0);
1945 sqlite3_reset(state);
1946 sqlite3_finalize(state);
1947 sqlite3_free(query);
1949 return FENCE_ERR_NONE;
1953 * This function get geofence/place access type from DB.
1955 * @param[in] fence_id/place_id
1956 * @param[in] access_type_e.
1957 * @return FENCE_ERR_NONE on success, negative values for errors
1959 int geofence_manager_get_access_type(int fence_id, int place_id, access_type_e *fence_type)
1961 FUNC_ENTRANCE_SERVER;
1962 sqlite3_stmt *state = NULL;
1963 int ret = SQLITE_OK;
1964 const char *tail = NULL;
1968 query = sqlite3_mprintf("SELECT access_type FROM GeoFence WHERE fence_id = %d;", fence_id);
1969 else if (fence_id == -1)
1970 query = sqlite3_mprintf("SELECT access_type FROM Places WHERE place_id = %d", place_id);
1972 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
1973 LOGD_GEOFENCE("current place id is [%d]", place_id);
1974 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
1975 if (ret != SQLITE_OK) {
1976 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
1977 sqlite3_free(query);
1978 return FENCE_ERR_PREPARE;
1981 ret = sqlite3_step(state);
1982 if (ret != SQLITE_ROW) {
1983 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
1984 sqlite3_finalize(state);
1985 sqlite3_free(query);
1986 return FENCE_ERR_SQLITE_FAIL;
1989 *fence_type = sqlite3_column_int(state, 0);
1991 sqlite3_reset(state);
1992 sqlite3_finalize(state);
1993 sqlite3_free(query);
1995 return FENCE_ERR_NONE;
1999 * This function set geofence type on DB.
2001 * @param[in] fence_id
2002 * @param[in] fence_type.
2003 * @return FENCE_ERR_NONE on success, negative values for errors
2005 int geofence_manager_set_geofence_type(int fence_id, geofence_type_e fence_type)
2007 FUNC_ENTRANCE_SERVER;
2008 sqlite3_stmt *state;
2009 int ret = SQLITE_OK;
2012 char *query = sqlite3_mprintf("UPDATE GeoFence SET geofence_type = %d where fence_id = %d;", fence_type, fence_id);
2014 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2015 if (ret != SQLITE_OK) {
2016 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2017 sqlite3_free(query);
2018 return FENCE_ERR_PREPARE;
2021 ret = sqlite3_step(state);
2022 if (ret != SQLITE_DONE) {
2023 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2024 sqlite3_finalize(state);
2025 sqlite3_free(query);
2026 return FENCE_ERR_SQLITE_FAIL;
2029 sqlite3_finalize(state);
2030 sqlite3_free(query);
2031 return FENCE_ERR_NONE;
2035 * This function get geofence place_id from DB.
2037 * @param[in] fence_id
2038 * @param[in] place_id
2039 * @return FENCE_ERR_NONE on success, negative values for errors
2041 int geofence_manager_get_placeid_from_geofence(int fence_id, int *place_id)
2043 FUNC_ENTRANCE_SERVER;
2044 sqlite3_stmt *state = NULL;
2045 int ret = SQLITE_OK;
2046 const char *tail = NULL;
2048 char *query = sqlite3_mprintf("SELECT place_id FROM GeoFence where fence_id = %d;", fence_id);
2049 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2050 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2051 if (ret != SQLITE_OK) {
2052 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2053 sqlite3_free(query);
2054 return FENCE_ERR_PREPARE;
2057 ret = sqlite3_step(state);
2058 if (ret != SQLITE_ROW) {
2059 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2060 sqlite3_finalize(state);
2061 sqlite3_free(query);
2062 return FENCE_ERR_SQLITE_FAIL;
2065 *place_id = sqlite3_column_int(state, 0);
2067 sqlite3_reset(state);
2068 sqlite3_finalize(state);
2069 sqlite3_free(query);
2071 return FENCE_ERR_NONE;
2075 * This function get running status from DB.
2077 * @param[in] fence_id
2079 * @return FENCE_ERR_NONE on success, negative values for errors
2081 int geofence_manager_get_running_status(int fence_id, int *running_status)
2083 FUNC_ENTRANCE_SERVER;
2084 sqlite3_stmt *state = NULL;
2085 int ret = SQLITE_OK;
2086 const char *tail = NULL;
2088 char *query = sqlite3_mprintf("SELECT running_status FROM GeoFence where fence_id = %d;", fence_id);
2090 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2091 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2092 if (ret != SQLITE_OK) {
2093 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2094 sqlite3_free(query);
2095 return FENCE_ERR_PREPARE;
2098 ret = sqlite3_step(state);
2099 if (ret != SQLITE_ROW) {
2100 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2101 sqlite3_finalize(state);
2102 sqlite3_free(query);
2103 return FENCE_ERR_SQLITE_FAIL;
2106 *running_status = sqlite3_column_int(state, 0);
2108 sqlite3_reset(state);
2109 sqlite3_finalize(state);
2110 sqlite3_free(query);
2112 return FENCE_ERR_NONE;
2116 * This function set running state on DB.
2118 * @param[in] fence_id
2120 * @return FENCE_ERR_NONE on success, negative values for errors
2122 int geofence_manager_set_running_status(int fence_id, int running_status)
2124 FUNC_ENTRANCE_SERVER;
2125 sqlite3_stmt *state;
2126 int ret = SQLITE_OK;
2129 char *query = sqlite3_mprintf("UPDATE GeoFence SET running_status = %d where fence_id = %d;", running_status, fence_id);
2131 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2132 if (ret != SQLITE_OK) {
2133 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2134 sqlite3_free(query);
2135 return FENCE_ERR_PREPARE;
2138 ret = sqlite3_step(state);
2139 if (ret != SQLITE_DONE) {
2140 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2141 sqlite3_finalize(state);
2142 sqlite3_free(query);
2143 return FENCE_ERR_SQLITE_FAIL;
2146 sqlite3_finalize(state);
2147 sqlite3_free(query);
2148 return FENCE_ERR_NONE;
2152 * This function get direction type from DB.
2154 * @param[in] fence_id
2155 * @param[in] direction
2156 * @return FENCE_ERR_NONE on success, negative values for errors
2158 int geofence_manager_get_direction(int fence_id, geofence_direction_e *direction)
2160 FUNC_ENTRANCE_SERVER;
2161 sqlite3_stmt *state = NULL;
2162 int ret = SQLITE_OK;
2163 const char *tail = NULL;
2165 char *query = sqlite3_mprintf("SELECT direction FROM GeoFence where fence_id = %d;", fence_id);
2166 LOGD_GEOFENCE("current fence id is [%d]", fence_id);
2167 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2168 if (ret != SQLITE_OK) {
2169 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2170 sqlite3_free(query);
2171 return FENCE_ERR_PREPARE;
2174 ret = sqlite3_step(state);
2175 if (ret != SQLITE_ROW) {
2176 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2177 sqlite3_finalize(state);
2178 sqlite3_free(query);
2179 return FENCE_ERR_SQLITE_FAIL;
2182 *direction = sqlite3_column_int(state, 0);
2184 sqlite3_finalize(state);
2185 sqlite3_free(query);
2187 return FENCE_ERR_NONE;
2191 * This function set direction type on DB.
2193 * @param[in] fence_id
2194 * @param[in] direction
2195 * @return FENCE_ERR_NONE on success, negative values for errors
2197 int geofence_manager_set_direction(int fence_id, geofence_direction_e direction)
2199 FUNC_ENTRANCE_SERVER;
2200 sqlite3_stmt *state;
2201 int ret = SQLITE_OK;
2204 char *query = sqlite3_mprintf("UPDATE GeoFence SET direction = %d where fence_id = %d;", direction, fence_id);
2206 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2207 if (ret != SQLITE_OK) {
2208 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2209 sqlite3_free(query);
2210 return FENCE_ERR_PREPARE;
2213 ret = sqlite3_step(state);
2214 if (ret != SQLITE_DONE) {
2215 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2216 sqlite3_finalize(state);
2217 sqlite3_free(query);
2218 return FENCE_ERR_SQLITE_FAIL;
2221 sqlite3_finalize(state);
2222 sqlite3_free(query);
2224 return FENCE_ERR_NONE;
2228 * This function remove fence from DB.
2230 * @param[in] fence_id
2231 * @return FENCE_ERR_NONE on success, negative values for errors
2233 int geofence_manager_delete_fence_info(int fence_id)
2235 FUNC_ENTRANCE_SERVER;
2236 g_return_val_if_fail(fence_id, FENCE_ERR_INVALID_PARAMETER);
2237 int ret = FENCE_ERR_NONE;
2238 geofence_type_e fence_type = GEOFENCE_INVALID;
2240 ret = geofence_manager_get_geofence_type(fence_id, &fence_type);
2241 if (FENCE_ERR_NONE != ret) {
2242 LOGI_GEOFENCE("Fail to geofence_manager_delete_fence_point_info");
2246 ret = __geofence_manager_db_enable_foreign_keys();
2247 if (FENCE_ERR_NONE != ret) {
2248 LOGI_GEOFENCE("Fail to geofence_manager_db_enable_foreign_keys");
2252 ret = __geofence_manager_delete_table(fence_id, FENCE_MAIN_TABLE);
2253 if (FENCE_ERR_NONE != ret) {
2254 LOGI_GEOFENCE("Fail to geofence_manager_delete_fence_point_info");
2262 * This function remove place from DB.
2264 * @param[in] place_id
2265 * @return FENCE_ERR_NONE on success, negative values for errors
2267 int geofence_manager_delete_place_info(int place_id)
2269 FUNC_ENTRANCE_SERVER;
2270 g_return_val_if_fail(place_id, FENCE_ERR_INVALID_PARAMETER);
2271 int ret = FENCE_ERR_NONE;
2273 ret = __geofence_manager_db_enable_foreign_keys();
2274 if (FENCE_ERR_NONE != ret) {
2275 LOGI_GEOFENCE("Fail to geofence_manager_db_enable_foreign_keys");
2279 ret = __geofence_manager_delete_place_table(place_id);
2280 if (FENCE_ERR_NONE != ret) {
2281 LOGI_GEOFENCE("Fail to geofence_manager_delete_place_info");
2289 * This function close DB handle.
2291 * @param[in] fence_id
2292 * @return FENCE_ERR_NONE on success, negative values for errors
2294 int geofence_manager_close_db(void)
2296 FUNC_ENTRANCE_SERVER;
2297 int ret = SQLITE_OK;
2299 if (db_info_s.handle == NULL) {
2300 return FENCE_ERR_NONE;
2303 ret = db_util_close(db_info_s.handle);
2304 if (ret != SQLITE_OK) {
2305 LOGI_GEOFENCE("Close DB ERROR!!!");
2306 return FENCE_ERR_SQLITE_FAIL;
2309 return FENCE_ERR_NONE;
2313 * This function deletes all data on db.
2315 * @return FENCE_ERR_NONE on success, negative values for errors
2317 int geofence_manager_reset(void)
2319 FUNC_ENTRANCE_SERVER;
2320 sqlite3_stmt *state = NULL;
2321 int ret = SQLITE_OK;
2323 ret = __geofence_manager_db_enable_foreign_keys();
2324 if (FENCE_ERR_NONE != ret) {
2325 LOGI_GEOFENCE("Fail to geofence_manager_db_enable_foreign_keys");
2329 char *query_two = sqlite3_mprintf("DELETE from %Q;", menu_table[FENCE_MAIN_TABLE]);
2331 ret = sqlite3_prepare_v2(db_info_s.handle, query_two, -1, &state, NULL);
2332 if (SQLITE_OK != ret) {
2333 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
2334 sqlite3_free(query_two);
2335 return FENCE_ERR_SQLITE_FAIL;
2338 ret = sqlite3_step(state);
2339 if (SQLITE_DONE != ret) {
2340 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
2341 sqlite3_finalize(state);
2342 sqlite3_free(query_two);
2343 return FENCE_ERR_SQLITE_FAIL;
2345 sqlite3_reset(state);
2346 sqlite3_free(query_two);
2348 char *query_three = sqlite3_mprintf("UPDATE sqlite_sequence SET seq = 0 where name = %Q;", menu_table[FENCE_MAIN_TABLE]);
2350 ret = sqlite3_prepare_v2(db_info_s.handle, query_three, -1, &state, NULL);
2351 if (SQLITE_OK != ret) {
2352 LOGI_GEOFENCE("Fail to connect to table. Error[%s]", sqlite3_errmsg(db_info_s.handle));
2353 sqlite3_free(query_three);
2354 return FENCE_ERR_SQLITE_FAIL;
2357 ret = sqlite3_step(state);
2358 if (SQLITE_DONE != ret) {
2359 LOGI_GEOFENCE("Fail to step. Error[%d]", ret);
2360 sqlite3_finalize(state);
2361 sqlite3_free(query_three);
2362 return FENCE_ERR_SQLITE_FAIL;
2365 sqlite3_reset(state);
2366 sqlite3_finalize(state);
2367 sqlite3_free(query_three);
2368 return FENCE_ERR_NONE;
2372 * This function copy source wifi info to dest wifi info.
2374 * @param[in] src_wifi
2375 * @param[out] dest_wifi
2376 * @return FENCE_ERR_NONE on success, negative values for errors
2378 int geofence_manager_copy_wifi_info(wifi_info_s *src_wifi, wifi_info_s **dest_wifi)
2380 FUNC_ENTRANCE_SERVER;
2381 g_return_val_if_fail(src_wifi, FENCE_ERR_INVALID_PARAMETER);
2383 *dest_wifi = (wifi_info_s *)g_malloc0(sizeof(wifi_info_s));
2384 g_return_val_if_fail(*dest_wifi, -1);
2386 g_strlcpy((*dest_wifi)->bssid, src_wifi->bssid, WLAN_BSSID_LEN);
2388 return FENCE_ERR_NONE;
2392 * This function create a wifi infor .
2394 * @param[in] fence_id
2396 * @param[out] wifi info
2397 * @return FENCE_ERR_NONE on success, negative values for errors
2399 int geofence_manager_create_wifi_info(int fence_id, char *bssid, wifi_info_s **new_wifi)
2401 FUNC_ENTRANCE_SERVER;
2402 g_return_val_if_fail(fence_id >= 0, FENCE_ERR_INVALID_PARAMETER);
2403 g_return_val_if_fail(bssid, FENCE_ERR_INVALID_PARAMETER);
2405 *new_wifi = (wifi_info_s *)g_malloc0(sizeof(wifi_info_s));
2406 g_strlcpy((*new_wifi)->bssid, bssid, WLAN_BSSID_LEN);
2408 return FENCE_ERR_NONE;
2412 * This function get fence id count by params such as app id and fence type and enable status .
2414 * @param[in] app_id : if app_id == NULL: ALL
2415 * @param[in] fence_type:if GEOFENCE_TYPE_INVALID == NULL: ALL fence type
2416 * @param[in] enable_status
2417 * @param[out] fence id count
2418 * @return FENCE_ERR_NONE on success, negative values for errors
2420 int geofence_manager_get_count_by_params(const char *app_id, geofence_type_e fence_type, int *count)
2422 FUNC_ENTRANCE_SERVER;
2423 sqlite3_stmt *state = NULL;
2424 int ret = SQLITE_OK;
2425 const char *tail = NULL;
2428 if (NULL == app_id) {
2429 if (GEOFENCE_INVALID != fence_type) { /* app_id == NULL : All and GEOFENCE_TYPE_INVALID != fence_type */
2430 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence where geofence_type = %d ;", fence_type);
2432 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence ;");
2434 } else { /*app_id not NULL */
2435 if (GEOFENCE_INVALID != fence_type) { /* app_id not NULL and GEOFENCE_TYPE_INVALID != fence_type */
2436 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence where app_id = %Q AND geofence_type = %d ;", app_id, fence_type);
2438 query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence where app_id = %Q ;", app_id);
2442 LOGI_GEOFENCE("app_id[%s] fence_type[%d] ", app_id, fence_type);
2443 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2444 if (ret != SQLITE_OK) {
2445 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2446 sqlite3_free(query);
2447 return FENCE_ERR_PREPARE;
2450 ret = sqlite3_step(state);
2451 if (ret != SQLITE_ROW) {
2452 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2453 sqlite3_finalize(state);
2454 sqlite3_free(query);
2455 return FENCE_ERR_SQLITE_FAIL;
2458 *count = sqlite3_column_int(state, 0);
2461 LOGI_GEOFENCE("ERROR: count = %d", *count);
2462 return FENCE_ERR_COUNT;
2464 LOGI_GEOFENCE("count[%d]", *count);
2467 sqlite3_reset(state);
2468 sqlite3_finalize(state);
2469 sqlite3_free(query);
2470 return FENCE_ERR_NONE;
2474 app_id == NULL : All, geofence_type_e : INVALID - all, IN enable_status : enable, disable or both. Output : a list of geofence_id
2476 int geofence_manager_get_fences(const char *app_id, geofence_type_e fence_type, GList **fences)
2478 FUNC_ENTRANCE_SERVER;
2479 sqlite3_stmt *state = NULL;
2480 int ret = SQLITE_OK;
2481 const char *tail = NULL;
2487 ret = geofence_manager_get_count_by_params(app_id, fence_type, &count);
2488 if (ret != FENCE_ERR_NONE) {
2489 LOGI_GEOFENCE("ERROR: geofence_manager_get_count_of_fences_by_app.");
2493 if (NULL == app_id) {
2494 if (GEOFENCE_INVALID != fence_type) { /* app_id == NULL : All and GEOFENCE_TYPE_INVALID != fence_type */
2495 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence where geofence_type = %d;", fence_type);
2497 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence;");
2499 } else { /*app_id not NULL */
2500 if (GEOFENCE_INVALID != fence_type) { /* app_id not NULL and GEOFENCE_TYPE_INVALID != fence_type */
2501 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence where app_id = %Q AND geofence_type = %d ;", app_id, fence_type);
2503 query = sqlite3_mprintf("SELECT fence_id FROM GeoFence where app_id = %Q;", app_id);
2507 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2508 if (ret != SQLITE_OK) {
2509 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2510 sqlite3_free(query);
2511 return FENCE_ERR_PREPARE;
2514 for (i = 0; i < count; i++) {
2515 ret = sqlite3_step(state);
2516 if (ret != SQLITE_ROW) {
2517 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2520 fence_id = sqlite3_column_int(state, 0);
2521 LOGI_GEOFENCE("fence id is [%d]", fence_id);
2522 *fences = g_list_append(*fences, (gpointer) GINT_TO_POINTER(fence_id));
2525 sqlite3_reset(state);
2526 sqlite3_finalize(state);
2527 sqlite3_free(query);
2528 return FENCE_ERR_NONE;
2531 int geofence_manager_get_count_of_fences(int *count)
2533 FUNC_ENTRANCE_SERVER;
2534 sqlite3_stmt *state = NULL;
2535 int ret = SQLITE_OK;
2536 const char *tail = NULL;
2537 char *query = sqlite3_mprintf("SELECT COUNT(fence_id) FROM GeoFence;");
2539 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2540 if (ret != SQLITE_OK) {
2541 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2542 sqlite3_free(query);
2543 return FENCE_ERR_PREPARE;
2546 ret = sqlite3_step(state);
2547 if (ret != SQLITE_ROW) {
2548 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2549 sqlite3_finalize(state);
2550 sqlite3_free(query);
2551 return FENCE_ERR_SQLITE_FAIL;
2554 *count = sqlite3_column_int(state, 0);
2557 LOGI_GEOFENCE("ERROR: count = %d", *count);
2558 return FENCE_ERR_COUNT;
2560 LOGI_GEOFENCE("count[%d]", *count);
2563 sqlite3_reset(state);
2564 sqlite3_finalize(state);
2565 sqlite3_free(query);
2566 return FENCE_ERR_NONE;
2569 int geofence_manager_get_place_count_by_placeid(int place_id, int *count)
2571 FUNC_ENTRANCE_SERVER;
2572 sqlite3_stmt *state = NULL;
2573 int ret = SQLITE_OK;
2574 const char *tail = NULL;
2575 char *query = sqlite3_mprintf("SELECT COUNT(place_id) FROM Places WHERE place_id=%d;", place_id);
2577 ret = sqlite3_prepare_v2(db_info_s.handle, query, -1, &state, &tail);
2578 if (ret != SQLITE_OK) {
2579 LOGI_GEOFENCE("Error: %s", sqlite3_errmsg(db_info_s.handle));
2580 sqlite3_free(query);
2581 return FENCE_ERR_PREPARE;
2584 ret = sqlite3_step(state);
2585 if (ret != SQLITE_ROW) {
2586 LOGI_GEOFENCE("sqlite3_step Error[%d] : %s", ret, sqlite3_errmsg(db_info_s.handle));
2587 sqlite3_finalize(state);
2588 sqlite3_free(query);
2589 return FENCE_ERR_SQLITE_FAIL;
2592 *count = sqlite3_column_int(state, 0);
2595 LOGI_GEOFENCE("ERROR: place count = %d", *count);
2596 return FENCE_ERR_COUNT;
2598 LOGI_GEOFENCE("place count[%d]", *count);
2601 sqlite3_reset(state);
2602 sqlite3_finalize(state);
2603 sqlite3_free(query);
2604 return FENCE_ERR_NONE;