28 #include <glib/gstdio.h>
34 #define _(String) dgettext (GETTEXT_PACKAGE, String)
35 #define ACCESS_METHOD "sqlite"
43 #define PRIORITY_HIGH 9
45 #define PRIORITY_STANDARD 5
47 #define PRIORITY_LOW 0
51 #define QSQL_KVP_TABLE "sqlite_kvp"
53 #define END_DB_VERSION " dbversion int );"
56 static gboolean loading = FALSE;
90 const gchar *fullpath;
94 GHashTable *kvp_table;
100 QofErrorId err_delete, err_insert, err_update, err_create;
112 QSQLiteBackend *qsql_be;
129 static inline gchar *
130 add_to_sql (gchar * sql_str,
const gchar * add)
133 old = g_strdup (sql_str);
135 sql_str = g_strconcat (old, add, NULL);
151 return QOF_TYPE_INT64;
156 return QOF_TYPE_DOUBLE;
161 return QOF_TYPE_NUMERIC;
166 return QOF_TYPE_STRING;
171 return QOF_TYPE_GUID;
174 #ifndef QOF_DISABLE_DEPRECATED
183 return QOF_TYPE_BOOLEAN;
188 return QOF_TYPE_TIME;
202 if (0 ==
safe_strcmp (QOF_TYPE_INT64, type_string))
204 if (0 ==
safe_strcmp (QOF_TYPE_DOUBLE, type_string))
206 if (0 ==
safe_strcmp (QOF_TYPE_NUMERIC, type_string))
208 if (0 ==
safe_strcmp (QOF_TYPE_STRING, type_string))
212 #ifndef QOF_DISABLE_DEPRECATED
230 #ifndef QOF_DISABLE_DEPRECATED
241 cm_i64 = strtoll (content, &tail, 0);
244 return kvp_value_new_gint64 (cm_i64);
251 cm_double = strtod (content, &tail);
253 return kvp_value_new_double (cm_double);
259 return kvp_value_new_numeric (cm_numeric);
264 return kvp_value_new_string (content);
269 cm_guid = g_new0 (
GUID, 1);
271 return kvp_value_new_guid (cm_guid);
284 retval = kvp_value_new_time (qt);
290 PERR (
" failed to parse date");
292 #ifndef QOF_DISABLE_DEPRECATED
296 kvp_time_t = mktime (&kvp_time);
297 timespecFromTime_t (&cm_date, kvp_time_t);
298 return kvp_value_new_timespec (cm_date);
318 QSQLiteBackend *qsql_be;
319 struct QsqlBuilder *qb;
325 qb = (
struct QsqlBuilder *) builder;
326 qsql_be = qb->qsql_be;
327 g_return_if_fail (key && val && qsql_be);
328 n = kvp_value_get_type (val);
338 #ifndef QOF_DISABLE_DEPRECATED
346 g_strdup_printf (
" kvp key=%s val=%s type=%s", key,
349 DEBUG (
" %s", qb->sql_str);
350 qb->has_slots = TRUE;
361 PERR (
" unsupported value = %d", kvp_value_get_type (val));
365 LEAVE (
" %s", qb->sql_str);
369 string_param_to_sql (
QofParam * param)
373 if ((0 ==
safe_strcmp (param->param_type, QOF_TYPE_GUID)) &&
374 (0 ==
safe_strcmp (param->param_name, QOF_PARAM_GUID)))
375 return g_strdup_printf (
" %s char(32) primary key not null",
377 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_GUID))
378 return g_strdup_printf (
" %s char(32)", param->param_name);
380 if (!param->param_setfcn)
382 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_STRING))
383 return g_strdup_printf (
" %s mediumtext", param->param_name);
384 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_BOOLEAN))
385 return g_strdup_printf (
" %s int", param->param_name);
386 if ((0 ==
safe_strcmp (param->param_type, QOF_TYPE_NUMERIC))
387 || (0 ==
safe_strcmp (param->param_type, QOF_TYPE_DOUBLE))
388 || (0 ==
safe_strcmp (param->param_type, QOF_TYPE_DEBCRED)))
390 return g_strdup_printf (
" %s text", param->param_name);
392 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_INT32))
393 return g_strdup_printf (
" %s int", param->param_name);
394 #ifndef QOF_DISABLE_DEPRECATED
396 (0 ==
safe_strcmp (param->param_type, QOF_TYPE_TIME)))
398 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_TIME))
400 return g_strdup_printf (
" %s datetime", param->param_name);
401 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_CHAR))
402 return g_strdup_printf (
" %s char(1)", param->param_name);
405 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_KVP))
406 return g_strdup (
"");
408 return g_strdup_printf (
" %s char(32)", param->param_name);
410 return g_strdup_printf (
" %s char(32)", param->param_name);
421 struct QsqlBuilder *qb;
422 qb = (
struct QsqlBuilder *) builder;
425 if (!param->param_setfcn)
429 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_KVP))
431 PINFO (
" kvp support tag");
434 if (!g_str_has_suffix (qb->sql_str,
"("))
437 add = g_strconcat (
", ", param->param_name, NULL);
438 qb->sql_str = add_to_sql (qb->sql_str, add);
442 qb->sql_str = add_to_sql (qb->sql_str, param->param_name);
450 struct QsqlBuilder *qb;
451 qb = (
struct QsqlBuilder *) builder;
455 if (!param->param_setfcn)
459 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_KVP))
462 if (g_list_find (references, param))
467 e = param->param_getfcn (qb->ent, param);
470 PINFO (
" ref=%p GUID=%s", e, value);
475 g_strescape (value, NULL);
477 value = g_strdup (
"");
478 if (!g_str_has_suffix (qb->sql_str,
"("))
481 val = g_strconcat (
", \"", value,
"\"", NULL);
482 qb->sql_str = add_to_sql (qb->sql_str, val);
488 val = g_strconcat (
"\"", value,
"\"", NULL);
489 qb->sql_str = add_to_sql (qb->sql_str, val);
500 gpointer handler_data, gpointer event_data)
503 QSQLiteBackend *qsql_be;
504 gchar *gstr, *sql_str;
506 qsql_be = (QSQLiteBackend *) handler_data;
519 ENTER (
" %s do_free=%d", ent->e_type,
523 sql_str = g_strconcat (
"DELETE from ", ent->e_type,
" WHERE ",
524 QOF_TYPE_GUID,
"='", gstr,
"';", NULL);
525 DEBUG (
" sql_str=%s", sql_str);
526 if (sqlite_exec (qsql_be->sqliteh, sql_str,
527 NULL, qsql_be, &qsql_be->err) != SQLITE_OK)
529 qof_error_set_be (be, qsql_be->err_delete);
530 qsql_be->error = TRUE;
531 LEAVE (
" error on delete:%s", qsql_be->err);
536 LEAVE (
" %d", event_type);
537 qsql_be->error = FALSE;
549 gpointer handler_data, gpointer event_data)
552 struct QsqlBuilder qb;
553 QSQLiteBackend *qsql_be;
557 qsql_be = (QSQLiteBackend *) handler_data;
570 ENTER (
" create:%s", ent->e_type);
574 DEBUG (
" guid=%s", gstr);
577 g_strdup_printf (
"INSERT into %s (guid ", ent->e_type);
579 tmp = g_strconcat (
") VALUES (\"", gstr,
"\" ", NULL);
580 qb.sql_str = add_to_sql (qb.sql_str, tmp);
583 qb.sql_str = add_to_sql (qb.sql_str,
");");
584 DEBUG (
" sql_str=%s", qb.sql_str);
585 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
586 NULL, &qb, &qsql_be->err) != SQLITE_OK)
588 qof_error_set_be (be, qsql_be->err_insert);
589 qsql_be->error = TRUE;
590 PERR (
" error on create_event:%s", qsql_be->err);
595 qsql_be->error = FALSE;
607 " (kvp_id \"", gstr,
"\", ", NULL);
609 qb.sql_str = add_to_sql (qb.sql_str, END_DB_VERSION);
610 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
611 NULL, &qb, &qsql_be->err) != SQLITE_OK)
613 qof_error_set_be (be, qsql_be->err_insert);
614 qsql_be->error = TRUE;
615 PERR (
" error on KVP create_event:%s", qsql_be->err);
620 qsql_be->error = FALSE;
640 struct QsqlBuilder qb;
641 QSQLiteBackend *qsql_be;
642 gchar *gstr, *param_str;
645 qsql_be = (QSQLiteBackend *) be;
646 qb.qsql_be = qsql_be;
653 if (!inst->
param->param_setfcn)
656 inst->
param->param_name);
662 g_strescape (param_str, NULL);
663 qb.sql_str = g_strconcat (
"UPDATE ", qb.ent->e_type,
" SET ",
664 inst->
param->param_name,
" = \"", param_str,
665 "\" WHERE ", QOF_TYPE_GUID,
"='", gstr,
"';", NULL);
666 DEBUG (
" sql_str=%s param_Str=%s", qb.sql_str, param_str);
667 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
668 NULL, &qb, &qsql_be->err) != SQLITE_OK)
670 qof_error_set_be (be, qsql_be->err_update);
671 qsql_be->error = TRUE;
672 PERR (
" error on modify:%s", qsql_be->err);
679 qsql_be->error = FALSE;
690 " SET (kvp_id \"", gstr,
"\", ", NULL);
692 qb.sql_str = add_to_sql (qb.sql_str, END_DB_VERSION);
693 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
694 NULL, &qb, &qsql_be->err) != SQLITE_OK)
696 qof_error_set_be (be, qsql_be->err_insert);
697 qsql_be->error = TRUE;
698 PERR (
" error on KVP create_event:%s", qsql_be->err);
703 qsql_be->error = FALSE;
714 gchar ** columnNames)
716 QSQLiteBackend *qsql_be;
717 struct QsqlBuilder *qb;
724 qb = (
struct QsqlBuilder *) builder;
725 qsql_be = qb->qsql_be;
729 for (i = 0; i < col_num; i++)
737 if (0 ==
safe_strcmp (columnNames[i], QOF_TYPE_GUID))
743 DEBUG (
" set guid failed:%s", strings[i]);
757 string_param_foreach (
QofParam * param, gpointer builder)
759 struct QsqlBuilder *qb;
760 QSQLiteBackend *qsql_be;
763 qb = (
struct QsqlBuilder *) builder;
764 qsql_be = qb->qsql_be;
765 if (0 ==
safe_strcmp (param->param_type, QOF_TYPE_KVP))
767 p_str = string_param_to_sql (param);
771 old = g_strconcat (p_str,
",", NULL);
772 qb->sql_str = add_to_sql (qb->sql_str, old);
778 update_param_foreach (
QofParam * param, gpointer builder)
780 struct QsqlBuilder *qb;
783 qb = (
struct QsqlBuilder *) builder;
784 if (param != qb->dirty)
789 g_strescape (value, NULL);
791 value = g_strdup (
"");
792 if (g_str_has_suffix (qb->sql_str,
" "))
794 add = g_strconcat (param->param_name,
"=\"", value,
"\"", NULL);
795 qb->sql_str = add_to_sql (qb->sql_str, add);
801 g_strconcat (
",", param->param_name,
"=\"", value,
"\"", NULL);
802 qb->sql_str = add_to_sql (qb->sql_str, add);
808 update_dirty (gpointer value, gpointer builder)
812 struct QsqlBuilder *qb;
813 QSQLiteBackend *qsql_be;
815 gchar *gstr, *param_str;
817 qb = (
struct QsqlBuilder *) builder;
818 qsql_be = qb->qsql_be;
828 qb->sql_str = g_strdup_printf (
"UPDATE %s SET ", ent->e_type);
830 param_str = g_strdup_printf (
"WHERE %s=\"%s\";", QOF_TYPE_GUID, gstr);
831 qb->sql_str = add_to_sql (qb->sql_str, param_str);
833 DEBUG (
" update=%s", qb->sql_str);
834 if (sqlite_exec (qsql_be->sqliteh, qb->sql_str,
835 NULL, qb, &qsql_be->err) != SQLITE_OK)
837 qof_error_set_be (be, qsql_be->err_update);
838 qsql_be->error = TRUE;
839 PERR (
" error on update_dirty:%s", qsql_be->err);
844 qsql_be->error = FALSE;
853 create_dirty_list (gpointer builder, gint col_num, gchar ** strings,
854 gchar ** columnNames)
856 struct QsqlBuilder *qb;
859 gchar *value, *columnName, *tmp;
862 qb = (
struct QsqlBuilder *) builder;
868 columnName = columnNames[col_num];
869 tmp = strings[col_num];
875 qb->dirty_list = g_list_prepend (qb->dirty_list, qb->ent);
876 DEBUG (
" dirty_list=%d", g_list_length (qb->dirty_list));
881 mark_entity (gpointer builder, gint col_num, gchar ** strings,
882 gchar ** columnNames)
884 struct QsqlBuilder *qb;
886 qb = (
struct QsqlBuilder *) builder;
895 QSQLiteBackend *qsql_be;
896 struct QsqlBuilder qb;
900 qsql_be = (QSQLiteBackend *) be;
907 qb.has_slots = FALSE;
908 ENTER (
" %s", ent->e_type);
912 g_strdup_printf (
"SELECT * FROM %s where guid = \"%s\";",
914 PINFO (
" check exists: %s", qb.sql_str);
916 qb.dirty_list = NULL;
918 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
919 mark_entity, &qb, &qsql_be->err) != SQLITE_OK)
921 qof_error_set_be (be, qsql_be->err_update);
922 qsql_be->error = TRUE;
923 PERR (
" error on select :%s", qsql_be->err);
930 g_strdup_printf (
"INSERT into %s (guid ", ent->e_type);
932 add = g_strconcat (
") VALUES (\"", gstr,
"\"", NULL);
933 qb.sql_str = add_to_sql (qb.sql_str, add);
936 qb.sql_str = add_to_sql (qb.sql_str,
");");
937 DEBUG (
" sql_str= %s", qb.sql_str);
938 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
939 NULL, qsql_be, &qsql_be->err) != SQLITE_OK)
941 qof_error_set_be (be, qsql_be->err_insert);
942 qsql_be->error = TRUE;
943 PERR (
" error creating new entity:%s", qsql_be->err);
951 " (kvp_id, \"", gstr,
"\", ", NULL);
953 qb.sql_str = add_to_sql (qb.sql_str,
");");
957 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
958 NULL, &qb, &qsql_be->err) != SQLITE_OK)
960 qof_error_set_be (be, qsql_be->err_insert);
961 qsql_be->error = TRUE;
962 PERR (
" error on KVP create_event:%s:%s", qsql_be->err,
968 qsql_be->error = FALSE;
979 check_state (
QofEntity * ent, gpointer builder)
982 QSQLiteBackend *qsql_be;
983 struct QsqlBuilder *qb;
988 qb = (
struct QsqlBuilder *) builder;
989 qsql_be = qb->qsql_be;
998 g_strdup_printf (
"SELECT * FROM %s where guid = \"%s\";",
1001 qb->dirty_list = NULL;
1005 qb->qsql_be = qsql_be;
1010 if (sqlite_exec (qsql_be->sqliteh, qb->sql_str,
1011 create_dirty_list, qb, &qsql_be->err) != SQLITE_OK)
1013 qof_error_set_be (be, qsql_be->err_update);
1014 qsql_be->error = TRUE;
1015 PERR (
" error on check_state:%s", qsql_be->err);
1022 g_strdup_printf (
"INSERT into %s (guid ", ent->e_type);
1024 add = g_strconcat (
") VALUES (\"", gstr,
"\" ", NULL);
1025 qb->sql_str = add_to_sql (qb->sql_str, add);
1028 qb->sql_str = add_to_sql (qb->sql_str,
");");
1029 DEBUG (
" sql_str= %s", qb->sql_str);
1030 if (sqlite_exec (qsql_be->sqliteh, qb->sql_str,
1031 NULL, qb, &qsql_be->err) != SQLITE_OK)
1033 qof_error_set_be (be, qsql_be->err_insert);
1034 qsql_be->error = TRUE;
1035 PERR (
" error on check_state create_new:%s", qsql_be->err);
1037 g_free (qb->sql_str);
1044 " (kvp_id \"", gstr,
"\", ", NULL);
1046 qb->sql_str = add_to_sql (qb->sql_str, END_DB_VERSION);
1047 if (sqlite_exec (qsql_be->sqliteh, qb->sql_str,
1048 NULL, &qb, &qsql_be->err) != SQLITE_OK)
1050 qof_error_set_be (be, qsql_be->err_insert);
1051 qsql_be->error = TRUE;
1052 PERR (
" error on KVP create_event:%s", qsql_be->err);
1057 qsql_be->error = FALSE;
1062 g_list_foreach (qb->dirty_list, update_dirty, &qb);
1063 g_free (qb->sql_str);
1077 gchar ** columnNames)
1079 QSQLiteBackend *qsql_be;
1080 struct QsqlBuilder *qb;
1088 qb = (
struct QsqlBuilder *) builder;
1090 qsql_be = qb->qsql_be;
1091 g_return_val_if_fail ((col_num < 4),
QSQL_ERROR);
1092 g_return_val_if_fail (strings[2],
QSQL_ERROR);
1100 PERR (
" invalid type returned from kvp table");
1104 value = string_to_kvp_value (strings[4], type);
1107 PERR (
" invalid KvpValue for type: %d", type);
1113 g_hash_table_insert (qsql_be->kvp_table, strings[1], frame);
1115 g_hash_table_insert (qsql_be->kvp_id, strings[0], strings[1]);
1117 max = strtol (strings[0], &tail, 0);
1120 qsql_be->index = (max > qsql_be->index) ? max : qsql_be->index;
1129 struct QsqlBuilder qb;
1133 g_return_if_fail (qsql_be);
1134 sq_code = SQLITE_OK;
1139 &qb, &qsql_be->err);
1141 if (sq_code == SQLITE_ERROR)
1143 g_free (qb.sql_str);
1145 g_strdup_printf (
"CREATE TABLE %s (%s, %s, %s, %s, %s, %s",
1147 "guid char(32)",
"path mediumtext",
"type mediumtext",
1148 "value text", END_DB_VERSION);
1149 PINFO (
" creating kvp table. sql=%s", qb.sql_str);
1150 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
1153 qsql_be->error = TRUE;
1154 PERR (
" unable to create kvp table:%s", qsql_be->err);
1157 else if (sq_code != SQLITE_OK)
1159 qof_error_set_be (be, qsql_be->err_create);
1160 qsql_be->error = TRUE;
1161 PERR (
" error on KVP select:%s:%s:%d", qb.sql_str, qsql_be->err, sq_code);
1163 g_free (qb.sql_str);
1170 struct QsqlBuilder qb;
1171 QSQLiteBackend *qsql_be;
1174 qsql_be = (QSQLiteBackend *) data;
1176 qb.qsql_be = qsql_be;
1177 qb.e_type = obj->e_type;
1178 ENTER (
" obj_type=%s", qb.e_type);
1179 switch (qsql_be->stm_type)
1192 g_strdup_printf (
"CREATE TABLE %s (", obj->e_type);
1195 qb.sql_str = add_to_sql (qb.sql_str, END_DB_VERSION);
1196 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
1197 NULL, NULL, &qsql_be->err) != SQLITE_OK)
1199 qof_error_set_be (be, qsql_be->err_create);
1200 qsql_be->error = TRUE;
1201 PERR (
" error on SQL_CREATE:%s", qsql_be->err);
1203 g_free (qb.sql_str);
1209 g_strdup_printf (
"SELECT * FROM %s;", obj->e_type);
1210 PINFO (
" sql=%s", qb.sql_str);
1211 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
1214 qsql_be->error = TRUE;
1215 PERR (
" error on SQL_LOAD:%s", qsql_be->err);
1235 QSQLiteBackend *qsql_be;
1236 struct QsqlBuilder qb;
1238 g_return_if_fail (be || session);
1240 qsql_be = (QSQLiteBackend *) be;
1242 qb.qsql_be = qsql_be;
1243 qsql_be->book = qof_session_get_book (session);
1244 DEBUG (
" create_file %s", qsql_be->fullpath);
1245 f = fopen (qsql_be->fullpath,
"a+");
1251 (_(
"Unable to open the output file '%s' - do you have "
1252 "permission to create this file?"), TRUE));
1253 qsql_be->error = TRUE;
1254 LEAVE (
" unable to create new file '%s'", qsql_be->fullpath);
1258 sqlite_open (qsql_be->fullpath, 0644, &qsql_be->err);
1259 if (!qsql_be->sqliteh)
1261 qof_error_set_be (be, qsql_be->err_create);
1262 qsql_be->error = TRUE;
1263 LEAVE (
" unable to open sqlite:%s", qsql_be->err);
1271 g_strdup_printf (
"CREATE TABLE %s (%s, %s, %s, %s, %s, %s",
1273 "guid char(32)",
"path mediumtext",
"type mediumtext",
1274 "value text", END_DB_VERSION);
1275 PINFO (
" sql=%s", qb.sql_str);
1276 if (sqlite_exec (qsql_be->sqliteh, qb.sql_str,
1279 qsql_be->error = TRUE;
1280 PERR (
" unable to create kvp table:%s", qsql_be->err);
1282 g_free (qb.sql_str);
1289 QSQLiteBackend *qsql_be;
1291 g_return_if_fail (be || session);
1293 qsql_be = (QSQLiteBackend *) be;
1295 sqlite_open (qsql_be->fullpath, 0666, &qsql_be->err);
1296 if (!qsql_be->sqliteh)
1299 (_(
"Unable to open the sqlite database '%s'."), TRUE));
1300 qsql_be->error = TRUE;
1301 PERR (
" %s", qsql_be->err);
1303 LEAVE (
" %s", qsql_be->fullpath);
1308 const gchar * book_path, gboolean ignore_lock,
1309 gboolean create_if_nonexistent)
1311 QSQLiteBackend *qsql_be;
1313 struct stat statinfo;
1316 g_return_if_fail (be);
1317 ENTER (
" book_path=%s", book_path);
1318 qsql_be = (QSQLiteBackend *) be;
1320 if (book_path == NULL)
1323 (_(
"Please provide a filename for sqlite."), FALSE));
1324 qsql_be->error = TRUE;
1329 pp = g_strsplit (book_path,
":", 2);
1332 qsql_be->fullpath = g_strdup (pp[1]);
1336 qsql_be->fullpath = g_strdup (book_path);
1337 be->
fullpath = g_strdup (qsql_be->fullpath);
1338 PINFO (
" final path = %s", qsql_be->fullpath);
1339 stat_val = g_stat (qsql_be->fullpath, &statinfo);
1340 if (!S_ISREG (statinfo.st_mode) || statinfo.st_size == 0)
1341 qsql_backend_createdb (be, session);
1342 if (!qsql_be->error)
1343 qsql_backend_opendb (be, session);
1346 LEAVE (
" open failed");
1349 qsql_be->create_handler =
1351 qsql_be->delete_handler =
1353 LEAVE (
" db=%s", qsql_be->fullpath);
1359 QSQLiteBackend *qsql_be;
1361 g_return_if_fail (be);
1364 qsql_be = (QSQLiteBackend *) be;
1366 qsql_be->book = book;
1377 QSQLiteBackend *qsql_be;
1379 g_return_if_fail (be);
1380 qsql_be = (QSQLiteBackend *) be;
1382 qsql_be->book = book;
1389 qsql_determine_file_type (
const gchar * path)
1399 QSQLiteBackend *qsql_be;
1401 g_return_if_fail (be);
1402 qsql_be = (QSQLiteBackend *) be;
1403 if (qsql_be->sqliteh)
1404 sqlite_close (qsql_be->sqliteh);
1410 QSQLiteBackend *qsql_be;
1412 g_return_if_fail (be);
1413 qsql_be = (QSQLiteBackend *) be;
1414 g_hash_table_destroy (qsql_be->kvp_table);
1415 g_hash_table_destroy (qsql_be->kvp_id);
1448 QSQLiteBackend *qsql_be;
1452 qsql_be = g_new0 (QSQLiteBackend, 1);
1455 qsql_be->kvp_table = g_hash_table_new (g_str_hash, g_str_equal);
1456 qsql_be->kvp_id = g_hash_table_new (g_str_hash, g_str_equal);
1459 qsql_be->err_delete =
1461 qsql_be->err_create =
1463 qsql_be->err_insert =
1465 qsql_be->err_update =
1467 be->session_begin = qsqlite_session_begin;
1469 be->session_end = qsqlite_session_end;
1470 be->destroy_backend = qsqlite_destroy_backend;
1471 be->load = qsqlite_db_load;
1475 be->begin = qsql_create;
1477 be->commit = qsql_modify;
1478 be->rollback = NULL;
1480 be->compile_query = NULL;
1482 be->free_query = NULL;
1483 be->run_query = NULL;
1486 be->events_pending = NULL;
1487 be->process_events = NULL;
1489 be->sync = qsqlite_write_db;
1490 be->load_config = NULL;
1491 be->get_config = NULL;
1502 bindtextdomain (PACKAGE, LOCALE_DIR);