gint kvp_frame_compare(const KvpFrame *fa, const KvpFrame *fb) { kvp_frame_cmp_status status; if (fa == fb) return 0; /* nothing is always less than something */ if (!fa && fb) return -1; if (fa && !fb) return 1; /* nothing is always less than something */ if (!fa->hash && fb->hash) return -1; if (fa->hash && !fb->hash) return 1; status.compare = 0; status.other_frame = (KvpFrame *) fb; kvp_frame_for_each_slot((KvpFrame *) fa, kvp_frame_compare_helper, &status); if (status.compare != 0) return status.compare; status.other_frame = (KvpFrame *) fa; kvp_frame_for_each_slot((KvpFrame *) fb, kvp_frame_compare_helper, &status); return(-status.compare); }
void qof_backend_option_foreach(KvpFrame *config, QofBackendOptionCB cb, gpointer data) { struct config_iterate helper; if (!config || !cb) { return; } ENTER (" "); helper.fcn = cb; helper.count = 1; helper.data = data; helper.recursive = config; kvp_frame_for_each_slot(config, config_foreach_cb, &helper); LEAVE (" "); }
/* Check if the session requires features unknown to this version of GnuCash. * * Returns a message to display if we found unknown features, NULL if we're okay. */ gchar *gnc_features_test_unknown (QofBook *book) { KvpFrame *frame = qof_book_get_slots (book); KvpValue *value; /* Setup the known_features hash table */ gnc_features_init(); g_assert(frame); value = kvp_frame_get_value(frame, "features"); if (value) { GList* features_list = NULL; frame = kvp_value_get_frame(value); g_assert(frame); /* Iterate over the members of this frame for unknown features */ kvp_frame_for_each_slot(frame, &gnc_features_test_one, &features_list); if (features_list) { GList *i; char* msg = g_strdup( _("This Dataset contains features not supported by this " "version of GnuCash. You must use a newer version of " "GnuCash in order to support the following features:" )); for (i = features_list; i; i = i->next) { char *tmp = g_strconcat(msg, "\n* ", i->data, NULL); g_free (msg); msg = tmp; } g_list_free(features_list); return msg; } } return NULL; }
gboolean gnc_sql_slots_save( GncSqlBackend* be, const GncGUID* guid, gboolean is_infant, KvpFrame* pFrame ) { slot_info_t slot_info = { NULL, NULL, TRUE, NULL, 0, NULL, FRAME, NULL, g_string_new('\0') }; g_return_val_if_fail( be != NULL, FALSE ); g_return_val_if_fail( guid != NULL, FALSE ); g_return_val_if_fail( pFrame != NULL, FALSE ); // If this is not saving into a new db, clear out the old saved slots first if ( !be->is_pristine_db && !is_infant ) { (void)gnc_sql_slots_delete( be, guid ); } slot_info.be = be; slot_info.guid = guid; kvp_frame_for_each_slot( pFrame, save_slot, &slot_info ); (void)g_string_free( slot_info.path, TRUE ); return slot_info.is_ok; }
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 ); }