示例#1
0
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;
}
示例#2
0
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);
}
示例#3
0
static void
set_int64_val( gpointer pObject, gint64 value )
{
    slot_info_t* pInfo = (slot_info_t*)pObject;
    KvpValue *pValue = NULL;

    g_return_if_fail( pObject != NULL );

    if ( pInfo->value_type != KVP_TYPE_GINT64 ) return;
    pValue = kvp_value_new_gint64( value );
    set_slot_from_value( pInfo, pValue );
}
示例#4
0
KvpValue *
kvp_value_copy(const KvpValue * value)
{
    if (!value) return NULL;

    switch (value->type)
    {
    case KVP_TYPE_GINT64:
        return kvp_value_new_gint64(value->value.int64);
        break;
    case KVP_TYPE_DOUBLE:
        return kvp_value_new_double(value->value.dbl);
        break;
    case KVP_TYPE_NUMERIC:
        return kvp_value_new_gnc_numeric(value->value.numeric);
        break;
    case KVP_TYPE_STRING:
        return kvp_value_new_string(value->value.str);
        break;
    case KVP_TYPE_GUID:
        return kvp_value_new_guid(value->value.guid);
        break;
    case KVP_TYPE_GDATE:
        return kvp_value_new_gdate(value->value.gdate);
        break;
    case KVP_TYPE_TIMESPEC:
        return kvp_value_new_timespec(value->value.timespec);
        break;
    case KVP_TYPE_BINARY:
        return kvp_value_new_binary(value->value.binary.data,
                                    value->value.binary.datasize);
        break;
    case KVP_TYPE_GLIST:
        return kvp_value_new_glist(value->value.list);
        break;
    case KVP_TYPE_FRAME:
        return kvp_value_new_frame(value->value.frame);
        break;
    default:
	break;
    }
    return NULL;
}
示例#5
0
KvpValue*
kvp_value_from_gvalue (const GValue *gval)
{
    KvpValue *val = NULL;
    GType type = G_VALUE_TYPE (gval);
    g_return_val_if_fail (G_VALUE_TYPE (gval), NULL);

    if (type == G_TYPE_INT64)
	val = kvp_value_new_gint64 (g_value_get_int64 (gval));
    else if (type == G_TYPE_DOUBLE)
	val = kvp_value_new_double (g_value_get_double (gval));
    else if (type == GNC_TYPE_NUMERIC)
	val = kvp_value_new_numeric (*(gnc_numeric*)g_value_get_boxed (gval));
    else if (type == G_TYPE_STRING)
	val = kvp_value_new_string (g_value_get_string (gval));
    else if (type == GNC_TYPE_GUID)
	val = kvp_value_new_guid ((GncGUID*)g_value_get_boxed (gval));
    else if (type == GNC_TYPE_TIMESPEC)
	val = kvp_value_new_timespec (*(Timespec*)g_value_get_boxed (gval));
    else if (type == G_TYPE_DATE)
	val = kvp_value_new_gdate (*(GDate*)g_value_get_boxed (gval));
    else if (type == GNC_TYPE_VALUE_LIST)
    {
	GList *gvalue_list = (GList*)g_value_get_boxed (gval);
	GList *kvp_list = NULL;
	g_list_foreach (gvalue_list, (GFunc)kvp_value_list_from_gvalue, &kvp_list);
	kvp_list = g_list_reverse (kvp_list);
	val = kvp_value_new_glist_nc (kvp_list);
//	g_list_free_full (gvalue_list, (GDestroyNotify)g_value_unset);
//	gvalue_list = NULL;
    }
    else
	PWARN ("Error! Don't know how to make a KvpValue from a %s",
	       G_VALUE_TYPE_NAME (gval));

    return val;
}
示例#6
0
void qof_backend_prepare_option(QofBackend *be, const QofBackendOption *option)
{
    KvpValue *value;
    gchar *temp;
    gint count;

    g_return_if_fail(be || option);
    count = be->config_count;
    count++;
    value = NULL;
    switch (option->type)
    {
    case KVP_TYPE_GINT64   :
    {
        value = kvp_value_new_gint64(*(gint64*)option->value);
        break;
    }
    case KVP_TYPE_DOUBLE   :
    {
        value = kvp_value_new_double(*(double*)option->value);
        break;
    }
    case KVP_TYPE_NUMERIC  :
    {
        value = kvp_value_new_numeric(*(gnc_numeric*)option->value);
        break;
    }
    case KVP_TYPE_STRING   :
    {
        value = kvp_value_new_string((const char*)option->value);
        break;
    }
    case KVP_TYPE_GUID     :
    {
        break;  /* unsupported */
    }
    case KVP_TYPE_TIMESPEC :
    {
        value = kvp_value_new_timespec(*(Timespec*)option->value);
        break;
    }
    case KVP_TYPE_BINARY   :
    {
        break;  /* unsupported */
    }
    case KVP_TYPE_GLIST    :
    {
        break;  /* unsupported */
    }
    case KVP_TYPE_FRAME    :
    {
        break;  /* unsupported */
    }
    case KVP_TYPE_GDATE    :
    {
        break;  /* unsupported */
    }
    }
    if (value)
    {
        temp = g_strdup_printf("/%s", option->option_name);
        kvp_frame_set_value(be->backend_configuration, temp, value);
        g_free(temp);
        temp = g_strdup_printf("/%s/%s", QOF_CONFIG_DESC, option->option_name);
        kvp_frame_set_string(be->backend_configuration, temp, option->description);
        g_free(temp);
        temp = g_strdup_printf("/%s/%s", QOF_CONFIG_TIP, option->option_name);
        kvp_frame_set_string(be->backend_configuration, temp, option->tooltip);
        g_free(temp);
        /* only increment the counter if successful */
        be->config_count = count;
    }
}