13 #include <glib/gstdio.h>
16 #include <gconf/gconf-client.h>
17 #include <libxml/parser.h>
28 #include "mapper-types.h"
33 gchar *_poi_db = NULL;
35 sqlite3_stmt *_stmt_select_poi = NULL;
36 sqlite3_stmt *_stmt_select_nearest_poi = NULL;
37 sqlite3_stmt *_stmt_insert_poi = NULL;
38 sqlite3_stmt *_stmt_update_poi = NULL;
39 sqlite3_stmt *_stmt_delete_poi = NULL;
40 sqlite3_stmt *_stmt_delete_poi_by_catid = NULL;
41 sqlite3_stmt *_stmt_nextlabel_poi = NULL;
43 sqlite3_stmt *_stmt_select_cat = NULL;
44 sqlite3_stmt *_stmt_insert_cat = NULL;
45 sqlite3_stmt *_stmt_update_cat = NULL;
46 sqlite3_stmt *_stmt_delete_cat = NULL;
47 sqlite3_stmt *_stmt_toggle_cat = NULL;
48 sqlite3_stmt *_stmt_selall_cat = NULL;
51 poi_db_create(sqlite3 *db)
55 if (SQLITE_OK != sqlite3_get_table(db, "select label from poi limit 1",
56 &pszResult, &nRow, &nColumn, NULL)) {
59 g_printf("Creating initial tables\n");
63 ("create table poi (poi_id integer PRIMARY KEY, "
71 "create table category (cat_id integer PRIMARY KEY,"
77 /* Add some default categories... */
78 "insert into category (label, desc, enabled) "
79 "values ('%q', '%q', 1); "
80 "insert into category (label, desc, enabled) "
81 "values ('%q', '%q', 1); "
82 "insert into category (label, desc, enabled) "
83 "values ('%q', '%q', 1); "
84 "insert into category (label, desc, enabled) "
85 "values ('%q', '%q', 1); "
86 "insert into category (label, desc, enabled) "
87 "values ('%q', '%q', 1); "
88 "insert into category (label, desc, enabled) "
89 "values ('%q', '%q', 1); "
90 "insert into category (label, desc, enabled) "
91 "values ('%q', '%q', 1); "
92 "insert into category (label, desc, enabled) "
93 "values ('%q', '%q', 1); "
94 "insert into category (label, desc, enabled) "
95 "values ('%q', '%q', 1); "
96 "insert into category (label, desc, enabled) "
97 "values ('%q', '%q', 1); "
98 "insert into category (label, desc, enabled) "
99 "values ('%q', '%q', 1); ",
101 _("Stations for purchasing fuel for vehicles."),
103 _("Houses, apartments, or other residences of import."),
105 _("Places to eat or drink."),
106 _("Shopping/Services"),
107 _("Places to shop or acquire services."),
109 _("Indoor or Outdoor places to have fun."),
111 _("Bus stops, airports, train stations, etc."),
113 _("Places to stay temporarily or for the night."),
115 _("Elementary schools, college campuses, etc."),
117 _("General places of business."),
119 _("General landmarks."),
121 _("Miscellaneous category for everything else."));
124 sqlite3_exec(&db, create_sql, NULL, NULL, &perror)
126 sqlite3_get_table(db, "select label from poi limit 1",
127 &pszResult, &nRow, &nColumn, NULL))) {
128 g_printf("%s:\n%s",_("Failed to open or create database"),sqlite3_errmsg(db));
134 sqlite3_free_table(pszResult);
140 poi_db_prepare(sqlite3 *db)
142 /* select from poi */
144 "select p.lat, p.lon, p.poi_id, p.label, p.desc,"
145 " p.cat_id, c.label, c.desc, c.icon, c.color"
146 " from poi p, category c "
147 " where p.lat between ? and ? "
148 " and p.lon between ? and ? "
149 " and c.enabled = 1 and p.cat_id = c.cat_id",
150 -1, &_stmt_select_poi, NULL);
152 /* select nearest pois */
154 "select p.lat, p.lon, p.label, c.label"
155 " from poi p, category c "
156 " where c.enabled = 1 and p.cat_id = c.cat_id "
157 " and p.lat between $LAT-0.15 and $LAT+0.15 "
158 " and p.lon between $LON-0.15 and $LAT+0.15 "
159 " order by (($LAT - p.lat) * ($LAT - p.lat) "
160 "+ ($LON - p.lon) * ($LON - p.lon)) limit 1",
161 -1, &_stmt_select_nearest_poi, NULL);
165 "insert into poi (lat, lon, label, desc, cat_id, public)"
166 " values (?, ?, ?, ?, ?, 1)", -1, &_stmt_insert_poi, NULL);
169 "update poi set label = ?, desc = ?, "
170 "cat_id = ? where poi_id = ?",
171 -1, &_stmt_update_poi, NULL);
172 /* delete from poi */
174 " delete from poi where poi_id = ?",
175 -1, &_stmt_delete_poi, NULL);
176 /* delete from poi by cat_id */
178 "delete from poi where cat_id = ?",
179 -1, &_stmt_delete_poi_by_catid, NULL);
180 /* get next poilabel */
182 "select ifnull(max(poi_id) + 1,1) from poi",
183 -1, &_stmt_nextlabel_poi, NULL);
185 /* select from category */
187 "select c.label, c.desc, c.enabled"
188 " from category c where c.cat_id = ?",
189 -1, &_stmt_select_cat, NULL);
190 /* insert into category */
192 "insert into category (label, desc, enabled)"
193 " values (?, ?, ?)", -1, &_stmt_insert_cat, NULL);
194 /* update category */
196 "update category set label = ?, desc = ?,"
197 " enabled = ? where poi_id = ?",
198 -1, &_stmt_update_cat, NULL);
199 /* delete from category */
201 "delete from category where cat_id = ?",
202 -1, &_stmt_delete_cat, NULL);
203 /* enable category */
205 "update category set enabled = ?"
206 " where cat_id = ?", -1, &_stmt_toggle_cat, NULL);
207 /* select all category */
209 "select c.cat_id, c.label, c.desc, c.enabled,"
212 " left outer join poi p on c.cat_id = p.cat_id"
213 " group by c.cat_id, c.label, c.desc, c.enabled "
214 " order by c.label", -1, &_stmt_selall_cat, NULL);
220 poi_db_disconnect(sqlite3 **db)
223 /* XXX: Handle prepared statements */
231 poi_db_connect(sqlite3 **db, const gchar *poi_db)
233 if (db_connect(db, poi_db)) {
242 poi_category_update(gint cat_id, gchar * cat_label, gchar * cat_desc,
245 gboolean results=TRUE;
250 sqlite3_bind_text(_stmt_update_cat, 1, cat_label, -1,
252 || SQLITE_OK != sqlite3_bind_text(_stmt_update_cat, 2,
253 cat_desc, -1, g_free)
254 || SQLITE_OK != sqlite3_bind_int(_stmt_update_cat, 3,
256 || SQLITE_OK != sqlite3_bind_int(_stmt_update_cat, 4,
258 || SQLITE_DONE != sqlite3_step(_stmt_update_cat)) {
261 sqlite3_reset(_stmt_update_cat);
265 sqlite3_bind_text(_stmt_insert_cat, 1, cat_label, -1,
267 || SQLITE_OK != sqlite3_bind_text(_stmt_insert_cat, 2,
268 cat_desc, -1, g_free)
269 || SQLITE_OK != sqlite3_bind_int(_stmt_insert_cat, 3,
271 || SQLITE_DONE != sqlite3_step(_stmt_insert_cat)) {
274 sqlite3_reset(_stmt_insert_cat);
280 poi_category_delete(DeletePOI * dpoi)
282 if (SQLITE_OK != sqlite3_bind_int(_stmt_delete_poi_by_catid, 1, dpoi->id)
283 || SQLITE_DONE != sqlite3_step(_stmt_delete_poi_by_catid)) {
284 sqlite3_reset(_stmt_delete_poi_by_catid);
287 sqlite3_reset(_stmt_delete_poi_by_catid);
289 if (SQLITE_OK != sqlite3_bind_int(_stmt_delete_cat, 1, dpoi->id) ||
290 SQLITE_DONE != sqlite3_step(_stmt_delete_cat)) {
291 sqlite3_reset(_stmt_delete_cat);
294 sqlite3_reset(_stmt_delete_cat);
300 poi_delete(DeletePOI * dpoi)
302 if (SQLITE_OK != sqlite3_bind_int(_stmt_delete_poi, 1, dpoi->id) ||
303 SQLITE_DONE != sqlite3_step(_stmt_delete_poi)) {
304 sqlite3_reset(_stmt_delete_poi);
307 sqlite3_reset(_stmt_delete_poi);