gint64 qof_book_get_counter (QofBook *book, const char *counter_name) { QofBackend *be; KvpFrame *kvp; KvpValue *value; gint64 counter; if (!book) { PWARN ("No book!!!"); return -1; } if (!counter_name || *counter_name == '\0') { PWARN ("Invalid counter name."); return -1; } /* If we've got a backend with a counter method, call it */ be = book->backend; if (be && be->counter) return ((be->counter)(be, counter_name)); /* If not, then use the KVP in the book */ kvp = qof_book_get_slots (book); if (!kvp) { PWARN ("Book has no KVP_Frame"); return -1; } value = kvp_frame_get_slot_path (kvp, "counters", counter_name, NULL); if (value) { /* found it */ counter = kvp_value_get_gint64 (value); } else { /* New counter */ counter = 0; } /* Counter is now valid; increment it */ counter++; /* Save off the new counter */ qof_book_begin_edit(book); value = kvp_value_new_gint64 (counter); kvp_frame_set_slot_path (kvp, value, "counters", counter_name, NULL); kvp_value_delete (value); qof_book_mark_dirty(book); qof_book_commit_edit(book); /* and return the value */ return counter; }
void kvp_frame_add_frame_nc(KvpFrame * frame, const char * path, KvpFrame *fr) { KvpValue *value; value = kvp_value_new_frame_nc (fr); frame = kvp_frame_add_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
void kvp_frame_set_timespec(KvpFrame * frame, const char * path, Timespec ts) { KvpValue *value; value = kvp_value_new_timespec (ts); frame = kvp_frame_set_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
void kvp_frame_set_guid(KvpFrame * frame, const char * path, const GncGUID *guid) { KvpValue *value; value = kvp_value_new_guid (guid); frame = kvp_frame_set_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
void kvp_frame_set_string(KvpFrame * frame, const char * path, const char* str) { KvpValue *value; value = kvp_value_new_string (str); frame = kvp_frame_set_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
void kvp_frame_set_numeric(KvpFrame * frame, const char * path, gnc_numeric nval) { KvpValue *value; value = kvp_value_new_gnc_numeric (nval); frame = kvp_frame_set_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
void kvp_frame_set_double(KvpFrame * frame, const char * path, double dval) { KvpValue *value; value = kvp_value_new_double (dval); frame = kvp_frame_set_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
void kvp_frame_set_gint64(KvpFrame * frame, const char * path, gint64 ival) { KvpValue *value; value = kvp_value_new_gint64 (ival); frame = kvp_frame_set_value_nc (frame, path, value); if (!frame) kvp_value_delete (value); }
/* Passing in a null value into this routine has the effect * of deleting the old value stored at this slot. */ static inline void kvp_frame_set_slot_destructively(KvpFrame * frame, const char * slot, KvpValue * new_value) { KvpValue * old_value; old_value = kvp_frame_replace_slot_nc (frame, slot, new_value); kvp_value_delete (old_value); }
void kvp_glist_delete(GList * list) { GList *node; if (!list) return; /* Delete the data in the list */ for (node = list; node; node = node->next) { KvpValue *val = static_cast<KvpValue*>(node->data); kvp_value_delete(val); } /* Free the backbone */ g_list_free(list); }
static void kvp_frame_delete_worker(gpointer key, gpointer value, G_GNUC_UNUSED gpointer user_data) { qof_string_cache_remove(key); kvp_value_delete((KvpValue *)value); }
static void save_slot( const gchar* key, KvpValue* value, gpointer data ) { slot_info_t* pSlot_info = (slot_info_t*)data; gsize curlen; g_return_if_fail( key != NULL ); g_return_if_fail( value != NULL ); g_return_if_fail( data != NULL ); // Ignore if we've already run into a failure if ( !pSlot_info->is_ok ) { return; } curlen = pSlot_info->path->len; pSlot_info->pKvpValue = value; if ( curlen != 0 ) { (void)g_string_append( pSlot_info->path, "/" ); } (void)g_string_append( pSlot_info->path, key ); pSlot_info->value_type = kvp_value_get_type( value ); switch ( pSlot_info->value_type ) { case KVP_TYPE_FRAME: { KvpFrame* pKvpFrame = kvp_value_get_frame( value ); GncGUID guid = guid_new_return(); slot_info_t *pNewInfo = slot_info_copy( pSlot_info, &guid ); KvpValue *oldValue = pSlot_info->pKvpValue; pSlot_info->pKvpValue = kvp_value_new_guid( &guid ); pSlot_info->is_ok = gnc_sql_do_db_operation( pSlot_info->be, OP_DB_INSERT, TABLE_NAME, TABLE_NAME, pSlot_info, col_table ); g_return_if_fail( pSlot_info->is_ok ); kvp_frame_for_each_slot( pKvpFrame, save_slot, pNewInfo ); kvp_value_delete( pSlot_info->pKvpValue ); pSlot_info->pKvpValue = oldValue; g_string_free( pNewInfo->path, TRUE ); g_slice_free( slot_info_t, pNewInfo ); } break; case KVP_TYPE_GLIST: { GList *cursor; GncGUID guid = guid_new_return(); slot_info_t *pNewInfo = slot_info_copy( pSlot_info, &guid ); KvpValue *oldValue = pSlot_info->pKvpValue; pSlot_info->pKvpValue = kvp_value_new_guid( &guid ); pSlot_info->is_ok = gnc_sql_do_db_operation( pSlot_info->be, OP_DB_INSERT, TABLE_NAME, TABLE_NAME, pSlot_info, col_table ); g_return_if_fail( pSlot_info->is_ok ); for (cursor = kvp_value_get_glist(value); cursor; cursor = cursor->next) { kvp_value *val = (kvp_value*)cursor->data; save_slot("", val, pNewInfo); } kvp_value_delete( pSlot_info->pKvpValue ); pSlot_info->pKvpValue = oldValue; g_string_free( pNewInfo->path, TRUE ); g_slice_free( slot_info_t, pNewInfo ); } break; default: { pSlot_info->is_ok = gnc_sql_do_db_operation( pSlot_info->be, OP_DB_INSERT, TABLE_NAME, TABLE_NAME, pSlot_info, col_table ); } break; } (void)g_string_truncate( pSlot_info->path, curlen ); }