QOF 0.7.5
|
Public interface of qof-backend-sqlite. More...
#include "config.h"
#include <errno.h>
#include <stdlib.h>
#include <time.h>
#include <glib/gstdio.h>
#include <sqlite.h>
#include <glib.h>
#include <libintl.h>
#include "qof.h"
Go to the source code of this file.
Defines | |
#define | _(String) dgettext (GETTEXT_PACKAGE, String) |
#define | ACCESS_METHOD "sqlite" |
#define | PRIORITY_HIGH 9 |
#define | PRIORITY_STANDARD 5 |
#define | PRIORITY_LOW 0 |
#define | QSQL_ERROR -1 |
#define | QSQL_KVP_TABLE "sqlite_kvp" |
#define | END_DB_VERSION " dbversion int );" |
Enumerations | |
enum | QsqlStatementType { SQL_NONE = 0, SQL_CREATE, SQL_LOAD, SQL_WRITE, SQL_INSERT, SQL_DELETE, SQL_UPDATE } |
Functions | |
static gchar * | add_to_sql (gchar *sql_str, const gchar *add) |
static QofIdTypeConst | kvp_value_to_qof_type_helper (KvpValueType n) |
Map a KvpValue to a QofIdType. | |
static KvpValueType | sql_to_kvp_helper (const gchar *type_string) |
KvpValue * | string_to_kvp_value (const gchar *content, KvpValueType type) |
Convert a string value into KvpValue. | |
static void | kvpvalue_to_sql (const gchar *key, KvpValue *val, gpointer builder) |
static gchar * | string_param_to_sql (QofParam *param) |
static void | create_param_list (QofParam *param, gpointer builder) |
list just the parameter names | |
static void | create_each_param (QofParam *param, gpointer builder) |
static void | delete_event (QofEntity *ent, QofEventId event_type, gpointer handler_data, gpointer event_data) |
use the new-style event handlers for insert and update insert runs after QOF_EVENT_CREATE delete runs before QOF_EVENT_DESTROY | |
static void | create_event (QofEntity *ent, QofEventId event_type, gpointer handler_data, gpointer event_data) |
static void | qsql_modify (QofBackend *be, QofInstance *inst) |
static gint | record_foreach (gpointer builder, gint col_num, gchar **strings, gchar **columnNames) |
static void | string_param_foreach (QofParam *param, gpointer builder) |
static void | update_param_foreach (QofParam *param, gpointer builder) |
static void | update_dirty (gpointer value, gpointer builder) |
static gint | create_dirty_list (gpointer builder, gint col_num, gchar **strings, gchar **columnNames) |
static gint | mark_entity (gpointer builder, gint col_num, gchar **strings, gchar **columnNames) |
static void | qsql_create (QofBackend *be, QofInstance *inst) |
static void | check_state (QofEntity *ent, gpointer builder) |
static gint | build_kvp_table (gpointer builder, gint col_num, gchar **strings, gchar **columnNames) |
chekc kvp data once per record | |
static void | qsql_load_kvp (QSQLiteBackend *qsql_be) |
static void | qsql_class_foreach (QofObject *obj, gpointer data) |
static void | qsql_backend_createdb (QofBackend *be, QofSession *session) |
static void | qsql_backend_opendb (QofBackend *be, QofSession *session) |
static void | qsqlite_session_begin (QofBackend *be, QofSession *session, const gchar *book_path, gboolean ignore_lock, gboolean create_if_nonexistent) |
static void | qsqlite_db_load (QofBackend *be, QofBook *book) |
static void | qsqlite_write_db (QofBackend *be, QofBook *book) |
static gboolean | qsql_determine_file_type (const gchar *path) |
static void | qsqlite_session_end (QofBackend *be) |
static void | qsqlite_destroy_backend (QofBackend *be) |
static void | qsql_provider_free (QofBackendProvider *prov) |
static QofBackend * | qsql_backend_new (void) |
Starts the backend and creates the context. | |
void | qof_sqlite_provider_init (void) |
Initialises the SQLite backend. | |
Variables | |
static QofLogModule | log_module = QOF_MOD_SQLITE |
static gboolean | loading = FALSE |
Public interface of qof-backend-sqlite.
Definition in file qof-sqlite.c.
#define PRIORITY_HIGH 9 |
Indicates an item with high priority.
Definition at line 43 of file qof-sqlite.c.
#define PRIORITY_LOW 0 |
Indicates a low priority item.
Definition at line 47 of file qof-sqlite.c.
#define PRIORITY_STANDARD 5 |
Indicates an item with default priority.
Definition at line 45 of file qof-sqlite.c.
#define QSQL_ERROR -1 |
Indicate an error to sqlite
Definition at line 49 of file qof-sqlite.c.
#define QSQL_KVP_TABLE "sqlite_kvp" |
One KVP table per file for all instances.
Definition at line 51 of file qof-sqlite.c.
enum QsqlStatementType |
Definition at line 58 of file qof-sqlite.c.
{ SQL_NONE = 0, SQL_CREATE, SQL_LOAD, SQL_WRITE, SQL_INSERT, SQL_DELETE, SQL_UPDATE } QsqlStatementType;
static gint build_kvp_table | ( | gpointer | builder, |
gint | col_num, | ||
gchar ** | strings, | ||
gchar ** | columnNames | ||
) | [static] |
chekc kvp data once per record
creates a new KvpFrame as data for a GHashTable with the guid as key
Definition at line 1076 of file qof-sqlite.c.
{ QSQLiteBackend *qsql_be; struct QsqlBuilder *qb; KvpFrame *frame; KvpValueType type; KvpValue *value; glong max; gchar *tail; g_return_val_if_fail (builder, QSQL_ERROR); qb = (struct QsqlBuilder *) builder; max = 0; qsql_be = qb->qsql_be; g_return_val_if_fail ((col_num < 4), QSQL_ERROR); g_return_val_if_fail (strings[2], QSQL_ERROR); frame = kvp_frame_new (); /* columnNames = fields strings = values [0]=kvp_id, [1]=guid, [2]=path, [3]=type, [4]=value get type from type_string */ type = sql_to_kvp_helper (strings[3]); if (type == 0) { PERR (" invalid type returned from kvp table"); return QSQL_ERROR; } /* use the type to make a KvpValue from value */ value = string_to_kvp_value (strings[4], type); if (!value) { PERR (" invalid KvpValue for type: %d", type); return QSQL_ERROR; } /* add the KvpValue to the frame at path */ kvp_frame_set_value (frame, strings[2], value); /* index the frame under the entity GUID */ g_hash_table_insert (qsql_be->kvp_table, strings[1], frame); /* index the guid under the kvp_id */ g_hash_table_insert (qsql_be->kvp_id, strings[0], strings[1]); errno = 0; max = strtol (strings[0], &tail, 0); if (errno == 0) { qsql_be->index = (max > qsql_be->index) ? max : qsql_be->index; } return SQLITE_OK; }
static void create_each_param | ( | QofParam * | param, |
gpointer | builder | ||
) | [static] |
create the sql for each parameter
Definition at line 447 of file qof-sqlite.c.
{ gchar *value; struct QsqlBuilder *qb; qb = (struct QsqlBuilder *) builder; GList *references; /* avoid creating database fields for calculated values */ if (!param->param_setfcn) return; /* avoid setting KVP even if a param_setfcn has been set because a QofSetterFunc for KVP is quite pointless. */ if (0 == safe_strcmp (param->param_type, QOF_TYPE_KVP)) return; references = qof_class_get_referenceList (qb->ent->e_type); if (g_list_find (references, param)) { QofEntity *e; e = param->param_getfcn (qb->ent, param); value = g_strnfill (GUID_ENCODING_LENGTH + 1, ' '); guid_to_string_buff (qof_entity_get_guid (e), value); PINFO (" ref=%p GUID=%s", e, value); } else value = qof_util_param_to_string (qb->ent, param); if (value) g_strescape (value, NULL); if (!value) value = g_strdup (""); if (!g_str_has_suffix (qb->sql_str, "(")) { gchar *val; val = g_strconcat (", \"", value, "\"", NULL); qb->sql_str = add_to_sql (qb->sql_str, val); g_free (val); } else { gchar *val; val = g_strconcat ("\"", value, "\"", NULL); qb->sql_str = add_to_sql (qb->sql_str, val); g_free (val); } }
static void create_event | ( | QofEntity * | ent, |
QofEventId | event_type, | ||
gpointer | handler_data, | ||
gpointer | event_data | ||
) | [static] |
receives QSQLiteBackend, passes on QsqlBuilder
Definition at line 548 of file qof-sqlite.c.
{ QofBackend *be; struct QsqlBuilder qb; QSQLiteBackend *qsql_be; gchar *gstr; KvpFrame *slots; qsql_be = (QSQLiteBackend *) handler_data; be = (QofBackend *) qsql_be; if (!ent) return; if (0 == safe_strcmp (ent->e_type, QOF_ID_BOOK)) return; if (!qof_class_is_registered (ent->e_type)) return; switch (event_type) { case QOF_EVENT_CREATE: { gchar *tmp; ENTER (" create:%s", ent->e_type); gstr = g_strnfill (GUID_ENCODING_LENGTH + 1, ' '); guid_to_string_buff (qof_instance_get_guid ((QofInstance *) ent), gstr); DEBUG (" guid=%s", gstr); qb.ent = ent; qb.sql_str = g_strdup_printf ("INSERT into %s (guid ", ent->e_type); qof_class_param_foreach (ent->e_type, create_param_list, &qb); tmp = g_strconcat (") VALUES (\"", gstr, "\" ", NULL); qb.sql_str = add_to_sql (qb.sql_str, tmp); g_free (tmp); qof_class_param_foreach (ent->e_type, create_each_param, &qb); qb.sql_str = add_to_sql (qb.sql_str, ");"); DEBUG (" sql_str=%s", qb.sql_str); if (sqlite_exec (qsql_be->sqliteh, qb.sql_str, NULL, &qb, &qsql_be->err) != SQLITE_OK) { qof_error_set_be (be, qsql_be->err_insert); qsql_be->error = TRUE; PERR (" error on create_event:%s", qsql_be->err); } else { ((QofInstance *) ent)->dirty = FALSE; qsql_be->error = FALSE; g_free (qb.sql_str); g_free (gstr); LEAVE (" "); break; } /* insert sqlite_kvp data */ slots = qof_instance_get_slots ((QofInstance *) ent); if (slots) { /* id, guid, path, type, value */ qb.sql_str = g_strconcat ("INSERT into ", QSQL_KVP_TABLE, " (kvp_id \"", gstr, "\", ", NULL); kvp_frame_for_each_slot (slots, kvpvalue_to_sql, &qb); qb.sql_str = add_to_sql (qb.sql_str, END_DB_VERSION); if (sqlite_exec (qsql_be->sqliteh, qb.sql_str, NULL, &qb, &qsql_be->err) != SQLITE_OK) { qof_error_set_be (be, qsql_be->err_insert); qsql_be->error = TRUE; PERR (" error on KVP create_event:%s", qsql_be->err); } else { ((QofInstance *) ent)->dirty = FALSE; qsql_be->error = FALSE; g_free (qb.sql_str); g_free (gstr); LEAVE (" "); break; } } g_free (qb.sql_str); g_free (gstr); LEAVE (" "); break; } default: break; } }
static void create_param_list | ( | QofParam * | param, |
gpointer | builder | ||
) | [static] |
list just the parameter names
Definition at line 419 of file qof-sqlite.c.
{ struct QsqlBuilder *qb; qb = (struct QsqlBuilder *) builder; /* avoid creating database fields for calculated values */ if (!param->param_setfcn) return; /* avoid setting KVP even if a param_setfcn has been set because a QofSetterFunc for KVP is quite pointless. */ if (0 == safe_strcmp (param->param_type, QOF_TYPE_KVP)) { PINFO (" kvp support tag"); return; } if (!g_str_has_suffix (qb->sql_str, "(")) { gchar *add; add = g_strconcat (", ", param->param_name, NULL); qb->sql_str = add_to_sql (qb->sql_str, add); g_free (add); } else qb->sql_str = add_to_sql (qb->sql_str, param->param_name); }
static void delete_event | ( | QofEntity * | ent, |
QofEventId | event_type, | ||
gpointer | handler_data, | ||
gpointer | event_data | ||
) | [static] |
use the new-style event handlers for insert and update insert runs after QOF_EVENT_CREATE delete runs before QOF_EVENT_DESTROY
Definition at line 499 of file qof-sqlite.c.
{ QofBackend *be; QSQLiteBackend *qsql_be; gchar *gstr, *sql_str; qsql_be = (QSQLiteBackend *) handler_data; be = (QofBackend *) qsql_be; if (!ent) return; if (0 == safe_strcmp (ent->e_type, QOF_ID_BOOK)) return; /* do not try to delete if only a QofObject has been loaded. */ if (!qof_class_is_registered (ent->e_type)) return; switch (event_type) { case QOF_EVENT_DESTROY: { ENTER (" %s do_free=%d", ent->e_type, ((QofInstance *) ent)->do_free); gstr = g_strnfill (GUID_ENCODING_LENGTH + 1, ' '); guid_to_string_buff (qof_entity_get_guid (ent), gstr); sql_str = g_strconcat ("DELETE from ", ent->e_type, " WHERE ", QOF_TYPE_GUID, "='", gstr, "';", NULL); DEBUG (" sql_str=%s", sql_str); if (sqlite_exec (qsql_be->sqliteh, sql_str, NULL, qsql_be, &qsql_be->err) != SQLITE_OK) { qof_error_set_be (be, qsql_be->err_delete); qsql_be->error = TRUE; LEAVE (" error on delete:%s", qsql_be->err); break; } /* SELECT kvp_id from QSQL_KVP_TABLE where guid = gstr */ LEAVE (" %d", event_type); qsql_be->error = FALSE; g_free (gstr); break; } default: break; } }
static QofIdTypeConst kvp_value_to_qof_type_helper | ( | KvpValueType | n | ) | [static] |
Map a KvpValue to a QofIdType.
Definition at line 145 of file qof-sqlite.c.
{ switch (n) { case KVP_TYPE_GINT64: { return QOF_TYPE_INT64; break; } case KVP_TYPE_DOUBLE: { return QOF_TYPE_DOUBLE; break; } case KVP_TYPE_NUMERIC: { return QOF_TYPE_NUMERIC; break; } case KVP_TYPE_STRING: { return QOF_TYPE_STRING; break; } case KVP_TYPE_GUID: { return QOF_TYPE_GUID; break; } #ifndef QOF_DISABLE_DEPRECATED case KVP_TYPE_TIMESPEC: { return QOF_TYPE_DATE; break; } #endif case KVP_TYPE_BOOLEAN: { return QOF_TYPE_BOOLEAN; break; } case KVP_TYPE_TIME: { return QOF_TYPE_TIME; break; } default: { return NULL; } } }
static void kvpvalue_to_sql | ( | const gchar * | key, |
KvpValue * | val, | ||
gpointer | builder | ||
) | [static] |
returns the VALUES for INSERT in pre-defined order
Definition at line 316 of file qof-sqlite.c.
{ QSQLiteBackend *qsql_be; struct QsqlBuilder *qb; KvpValueType n; gchar *full_path; full_path = NULL; ENTER (" "); qb = (struct QsqlBuilder *) builder; qsql_be = qb->qsql_be; g_return_if_fail (key && val && qsql_be); n = kvp_value_get_type (val); switch (n) { case KVP_TYPE_GINT64: case KVP_TYPE_DOUBLE: case KVP_TYPE_NUMERIC: case KVP_TYPE_STRING: case KVP_TYPE_GUID: case KVP_TYPE_TIME: case KVP_TYPE_BOOLEAN: #ifndef QOF_DISABLE_DEPRECATED case KVP_TYPE_TIMESPEC: #endif { /* ("kvp_id int primary key not null", "guid char(32)", "path mediumtext", "type mediumtext", "value text", */ qb->sql_str = g_strdup_printf (" kvp key=%s val=%s type=%s", key, kvp_value_to_bare_string (val), kvp_value_to_qof_type_helper (n)); DEBUG (" %s", qb->sql_str); qb->has_slots = TRUE; break; } case KVP_TYPE_FRAME: { kvp_frame_for_each_slot (kvp_value_get_frame (val), kvpvalue_to_sql, qb); break; } default: { PERR (" unsupported value = %d", kvp_value_get_type (val)); break; } } LEAVE (" %s", qb->sql_str); }
static QofBackend* qsql_backend_new | ( | void | ) | [static] |
Starts the backend and creates the context.
Definition at line 1446 of file qof-sqlite.c.
{ QSQLiteBackend *qsql_be; QofBackend *be; ENTER (" "); qsql_be = g_new0 (QSQLiteBackend, 1); be = (QofBackend *) qsql_be; qof_backend_init (be); qsql_be->kvp_table = g_hash_table_new (g_str_hash, g_str_equal); qsql_be->kvp_id = g_hash_table_new (g_str_hash, g_str_equal); qsql_be->dbversion = QOF_OBJECT_VERSION; qsql_be->stm_type = SQL_NONE; qsql_be->err_delete = qof_error_register (_("Unable to delete record."), FALSE); qsql_be->err_create = qof_error_register (_("Unable to create record."), FALSE); qsql_be->err_insert = qof_error_register (_("Unable to insert a new record."), FALSE); qsql_be->err_update = qof_error_register (_("Unable to update existing record."), FALSE); be->session_begin = qsqlite_session_begin; be->session_end = qsqlite_session_end; be->destroy_backend = qsqlite_destroy_backend; be->load = qsqlite_db_load; be->save_may_clobber_data = NULL; /* begin: create an empty entity if none exists, even if events are suspended. */ be->begin = qsql_create; /* commit: write to sqlite, commit undo record. */ be->commit = qsql_modify; be->rollback = NULL; /* would need a QofQuery back to QofSqlQuery conversion. */ be->compile_query = NULL; /* unused */ be->free_query = NULL; be->run_query = NULL; be->counter = NULL; /* The QOF SQLite backend is not multi-user - all QOF users are the same. */ be->events_pending = NULL; be->process_events = NULL; be->sync = qsqlite_write_db; be->load_config = NULL; be->get_config = NULL; LEAVE (" "); return be; }
static void qsql_class_foreach | ( | QofObject * | obj, |
gpointer | data | ||
) | [static] |
receives QSQLiteBackend from QofBackend
Definition at line 1168 of file qof-sqlite.c.
{ struct QsqlBuilder qb; QSQLiteBackend *qsql_be; QofBackend *be; qsql_be = (QSQLiteBackend *) data; be = (QofBackend *) qsql_be; qb.qsql_be = qsql_be; qb.e_type = obj->e_type; ENTER (" obj_type=%s", qb.e_type); switch (qsql_be->stm_type) { case SQL_NONE: case SQL_INSERT: case SQL_DELETE: case SQL_UPDATE: { break; } case SQL_CREATE: { /* KVP is handled separately */ qb.sql_str = g_strdup_printf ("CREATE TABLE %s (", obj->e_type); qof_class_param_foreach (obj->e_type, string_param_foreach, &qb); qb.sql_str = add_to_sql (qb.sql_str, END_DB_VERSION); if (sqlite_exec (qsql_be->sqliteh, qb.sql_str, NULL, NULL, &qsql_be->err) != SQLITE_OK) { qof_error_set_be (be, qsql_be->err_create); qsql_be->error = TRUE; PERR (" error on SQL_CREATE:%s", qsql_be->err); } g_free (qb.sql_str); break; } case SQL_LOAD: { qb.sql_str = g_strdup_printf ("SELECT * FROM %s;", obj->e_type); PINFO (" sql=%s", qb.sql_str); if (sqlite_exec (qsql_be->sqliteh, qb.sql_str, record_foreach, &qb, &qsql_be->err) != SQLITE_OK) { qsql_be->error = TRUE; PERR (" error on SQL_LOAD:%s", qsql_be->err); } break; } case SQL_WRITE: { if (!qof_book_not_saved (qsql_be->book)) break; qof_object_foreach (obj->e_type, qsql_be->book, check_state, &qb); break; } } LEAVE (" "); }
static void qsql_load_kvp | ( | QSQLiteBackend * | qsql_be | ) | [static] |
only call once per book
Definition at line 1127 of file qof-sqlite.c.
{ struct QsqlBuilder qb; QofBackend *be; gint sq_code; g_return_if_fail (qsql_be); sq_code = SQLITE_OK; be = (QofBackend *) qsql_be; qb.sql_str = g_strdup_printf ("SELECT kvp_id from %s;", QSQL_KVP_TABLE); sq_code = sqlite_exec (qsql_be->sqliteh, qb.sql_str, build_kvp_table, &qb, &qsql_be->err); /* catch older files without a sqlite_kvp table */ if (sq_code == SQLITE_ERROR) { g_free (qb.sql_str); qb.sql_str = g_strdup_printf ("CREATE TABLE %s (%s, %s, %s, %s, %s, %s", QSQL_KVP_TABLE, "kvp_id int primary key not null", "guid char(32)", "path mediumtext", "type mediumtext", "value text", END_DB_VERSION); PINFO (" creating kvp table. sql=%s", qb.sql_str); if (sqlite_exec (qsql_be->sqliteh, qb.sql_str, record_foreach, &qb, &qsql_be->err) != SQLITE_OK) { qsql_be->error = TRUE; PERR (" unable to create kvp table:%s", qsql_be->err); } } else if (sq_code != SQLITE_OK) { qof_error_set_be (be, qsql_be->err_create); qsql_be->error = TRUE; PERR (" error on KVP select:%s:%s:%d", qb.sql_str, qsql_be->err, sq_code); } g_free (qb.sql_str); }
static gint record_foreach | ( | gpointer | builder, |
gint | col_num, | ||
gchar ** | strings, | ||
gchar ** | columnNames | ||
) | [static] |
Definition at line 713 of file qof-sqlite.c.
{ QSQLiteBackend *qsql_be; struct QsqlBuilder *qb; const QofParam *param; QofInstance *inst; QofEntity *ent; gint i; g_return_val_if_fail (builder, QSQL_ERROR); qb = (struct QsqlBuilder *) builder; qsql_be = qb->qsql_be; qof_event_suspend (); inst = (QofInstance *) qof_object_new_instance (qb->e_type, qsql_be->book); ent = &inst->entity; for (i = 0; i < col_num; i++) { /* get param and set as string */ param = qof_class_get_parameter (qb->e_type, columnNames[i]); if (!param) continue; /* set the inst->param entry */ inst->param = param; if (0 == safe_strcmp (columnNames[i], QOF_TYPE_GUID)) { GUID *guid; guid = guid_malloc (); if (!string_to_guid (strings[i], guid)) { DEBUG (" set guid failed:%s", strings[i]); return QSQL_ERROR; } qof_entity_set_guid (ent, guid); } if (strings[i]) qof_util_param_set_string (ent, param, strings[i]); } qof_event_resume (); return SQLITE_OK; }
static KvpValueType sql_to_kvp_helper | ( | const gchar * | type_string | ) | [static] |
Definition at line 200 of file qof-sqlite.c.
{ if (0 == safe_strcmp (QOF_TYPE_INT64, type_string)) return KVP_TYPE_GINT64; if (0 == safe_strcmp (QOF_TYPE_DOUBLE, type_string)) return KVP_TYPE_DOUBLE; if (0 == safe_strcmp (QOF_TYPE_NUMERIC, type_string)) return KVP_TYPE_NUMERIC; if (0 == safe_strcmp (QOF_TYPE_STRING, type_string)) return KVP_TYPE_STRING; if (0 == safe_strcmp (QOF_TYPE_GUID, type_string)) return KVP_TYPE_GUID; #ifndef QOF_DISABLE_DEPRECATED if (0 == safe_strcmp (QOF_TYPE_DATE, type_string)) return KVP_TYPE_TIMESPEC; #endif if (0 == safe_strcmp (QOF_TYPE_TIME, type_string)) return KVP_TYPE_TIME; return 0; }
KvpValue* string_to_kvp_value | ( | const gchar * | content, |
KvpValueType | type | ||
) |
Convert a string value into KvpValue.
Definition at line 223 of file qof-sqlite.c.
{ gchar *tail; gint64 cm_i64; gdouble cm_double; QofNumeric cm_numeric; GUID *cm_guid; #ifndef QOF_DISABLE_DEPRECATED struct tm kvp_time; time_t kvp_time_t; Timespec cm_date; #endif switch (type) { case KVP_TYPE_GINT64: { errno = 0; cm_i64 = strtoll (content, &tail, 0); if (errno == 0) { return kvp_value_new_gint64 (cm_i64); } break; } case KVP_TYPE_DOUBLE: { errno = 0; cm_double = strtod (content, &tail); if (errno == 0) return kvp_value_new_double (cm_double); break; } case KVP_TYPE_NUMERIC: { qof_numeric_from_string (content, &cm_numeric); return kvp_value_new_numeric (cm_numeric); break; } case KVP_TYPE_STRING: { return kvp_value_new_string (content); break; } case KVP_TYPE_GUID: { cm_guid = g_new0 (GUID, 1); if (TRUE == string_to_guid (content, cm_guid)) return kvp_value_new_guid (cm_guid); break; } case KVP_TYPE_TIME: { QofDate *qd; QofTime *qt; KvpValue *retval; qd = qof_date_parse (content, QOF_DATE_FORMAT_UTC); if (qd) { qt = qof_date_to_qtime (qd); retval = kvp_value_new_time (qt); qof_date_free (qd); qof_time_free (qt); return retval; } else PERR (" failed to parse date"); } #ifndef QOF_DISABLE_DEPRECATED case KVP_TYPE_TIMESPEC: { strptime (content, QOF_UTC_DATE_FORMAT, &kvp_time); kvp_time_t = mktime (&kvp_time); timespecFromTime_t (&cm_date, kvp_time_t); return kvp_value_new_timespec (cm_date); break; } #endif case KVP_TYPE_BOOLEAN: { gboolean val; val = qof_util_bool_to_int (content); return kvp_value_new_boolean (val); } default: break; } return NULL; }