[libgda] GObject introspection: added non vararg functions and skip vararg ones, for bug #639472
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] GObject introspection: added non vararg functions and skip vararg ones, for bug #639472
- Date: Wed, 20 Apr 2011 14:52:19 +0000 (UTC)
commit bb57e3e7436a9324ee0753eced086db45b7b2067
Author: Vivien Malerba <malerba gnome-db org>
Date: Wed Apr 20 16:51:04 2011 +0200
GObject introspection: added non vararg functions and skip vararg ones, for bug #639472
doc/C/libgda-sections.txt | 6 ++
libgda/gda-data-model-array.c | 33 ++++++++-
libgda/gda-data-model-array.h | 1 +
libgda/gda-meta-store.c | 163 +++++++++++++++++++++++++++++++++++++----
libgda/gda-meta-store.h | 12 +++-
libgda/gda-server-operation.c | 149 ++++++++++++++++++++++++++++++--------
libgda/gda-server-operation.h | 9 ++-
libgda/gda-util.c | 101 +++++++++++++++++++-------
libgda/gda-util.h | 2 +
libgda/libgda.symbols | 7 ++
10 files changed, 409 insertions(+), 74 deletions(-)
---
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index 935c387..a01dad4 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -185,6 +185,7 @@ GdaDataModelArrayClass
GdaDataModelArrayPrivate
gda_data_model_array_new
gda_data_model_array_new_with_g_types
+gda_data_model_array_new_with_g_types_v
gda_data_model_array_copy_model
gda_data_model_array_get_row
gda_data_model_array_set_n_columns
@@ -454,8 +455,11 @@ gda_server_operation_op_type_to_string
gda_server_operation_string_to_op_type
<SUBSECTION>
gda_server_operation_get_value_at
+gda_server_operation_get_value_at_path
gda_server_operation_get_sql_identifier_at
+gda_server_operation_get_sql_identifier_at_path
gda_server_operation_set_value_at
+gda_server_operation_set_value_at_path
gda_server_operation_save_data_to_xml
gda_server_operation_load_data_from_xml
gda_server_operation_is_valid
@@ -1318,6 +1322,7 @@ gda_meta_store_new_with_file
gda_meta_store_get_version
gda_meta_store_sql_identifier_quote
gda_meta_store_extract
+gda_meta_store_extract_v
gda_meta_store_schema_get_structure
gda_meta_store_get_attribute_value
gda_meta_store_set_attribute_value
@@ -1487,6 +1492,7 @@ gda_connection_internal_reset_transaction_status
gda_connection_open_sqlite
<SUBSECTION>
gda_meta_store_modify
+gda_meta_store_modify_v
gda_meta_store_modify_with_context
GdaSqlIdentifierStyle
gda_meta_store_set_identifiers_style
diff --git a/libgda/gda-data-model-array.c b/libgda/gda-data-model-array.c
index b0a2df8..278d89a 100644
--- a/libgda/gda-data-model-array.c
+++ b/libgda/gda-data-model-array.c
@@ -1,9 +1,10 @@
-/* GDA library
- * Copyright (C) 1998 - 2010 The GNOME Foundation.
+/*
+ * Copyright (C) 1998 - 2011 The GNOME Foundation.
*
* AUTHORS:
* Rodrigo Moya <rodrigo gnome-db org>
* Vivien Malerba <malerba gnome-db org>
+ * Daniel Espinosa <esodan gmail com>
*
* This Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
@@ -317,6 +318,34 @@ gda_data_model_array_new_with_g_types (gint cols, ...)
}
/**
+ * gda_data_model_array_new_with_g_types_v:
+ * @cols: number of columns for rows in this data model.
+ * @types: array of types of the columns of the model to create as #GType, as many as indicated by @cols
+ *
+ * Creates a new #GdaDataModel object with the column types as
+ * specified.
+ *
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
+ *
+ * Since: 4.2.6
+ */
+GdaDataModel *
+gda_data_model_array_new_with_g_types_v (gint cols, GType *types)
+{
+ GdaDataModel *model;
+ gint i;
+
+ model = gda_data_model_array_new (cols);
+ i = 0;
+ while (i < cols) {
+ GType type = types [i];
+ gda_column_set_g_type (gda_data_model_describe_column (model, i), type);
+ i++;
+ }
+ return model;
+}
+
+/**
* gda_data_model_array_copy_model:
* @src: a #GdaDataModel to copy data from
* @error: a place to store errors, or %NULL
diff --git a/libgda/gda-data-model-array.h b/libgda/gda-data-model-array.h
index c57839f..243e486 100644
--- a/libgda/gda-data-model-array.h
+++ b/libgda/gda-data-model-array.h
@@ -71,6 +71,7 @@ struct _GdaDataModelArrayClass {
GType gda_data_model_array_get_type (void) G_GNUC_CONST;
GdaDataModel *gda_data_model_array_new_with_g_types (gint cols, ...);
+GdaDataModel *gda_data_model_array_new_with_g_types_v (gint cols, GType *types);
GdaDataModel *gda_data_model_array_new (gint cols);
GdaDataModelArray *gda_data_model_array_copy_model (GdaDataModel *src, GError **error);
diff --git a/libgda/gda-meta-store.c b/libgda/gda-meta-store.c
index c39d146..9bc2552 100644
--- a/libgda/gda-meta-store.c
+++ b/libgda/gda-meta-store.c
@@ -1,5 +1,9 @@
/*
- * Copyright (C) 2008 - 2011 Vivien Malerba
+ * Copyright (C) 2008 - 2011 The GNOME Foundation.
+ *
+ * AUTHORS:
+ * Vivien Malerba <malerba gnome-db org>
+ * Daniel Espinosa <esodan gmail com>
*
* This Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
@@ -2416,16 +2420,127 @@ gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **e
return model;
}
+/**
+ * gda_meta_store_extract_v: (Rename to: gda_meta_store_extract)
+ * @store: a #GdaMetaStore object
+ * @select_sql: a SELECT statement
+ * @vars: (allow-none): a hash table with all variables names as keys and GValue* as value, representing values for all the
+ * variables mentioned in @select_sql. If there is no variable then this part can be omitted.
+ * @error: (allow-none): a place to store errors, or %NULL
+ *
+ * Extracts some data stored in @store using a custom SELECT query. If the @select_sql filter involves
+ * SQL identifiers (such as table or column names), then the values should have been adapted using
+ * gda_meta_store_sql_identifier_quote().
+ *
+ * For more information about
+ * SQL identifiers are represented in @store, see the
+ * <link linkend="information_schema:sql_identifiers">meta data section about SQL identifiers</link>.
+ *
+ * Returns: (transfer full): a new #GdaDataModel, or %NULL if an error occurred
+ *
+ * Since: 4.2.6
+ */
+GdaDataModel *
+gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTable *vars, GError **error)
+{
+ GdaStatement *stmt = NULL;
+ GdaDataModel *model;
+ GdaSet *params = NULL;
+
+ g_return_val_if_fail (GDA_IS_META_STORE (store), NULL);
+ g_return_val_if_fail (select_sql, NULL);
+
+ if (store->priv->init_error) {
+ g_propagate_error (error, g_error_copy (store->priv->init_error));
+ return NULL;
+ }
+
+ gda_mutex_lock (store->priv->mutex);
+
+ if ((store->priv->max_extract_stmt > 0) && !store->priv->extract_stmt_hash)
+ store->priv->extract_stmt_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+
+ /* statement creation */
+ if (store->priv->extract_stmt_hash)
+ stmt = g_hash_table_lookup (store->priv->extract_stmt_hash, select_sql);
+ if (stmt)
+ g_object_ref (stmt);
+ else {
+ GdaMetaStoreClass *klass;
+ const gchar *remain;
+
+ klass = (GdaMetaStoreClass *) G_OBJECT_GET_CLASS (store);
+ stmt = gda_sql_parser_parse_string (klass->cpriv->parser, select_sql, &remain, error);
+ if (!stmt) {
+ gda_mutex_unlock (store->priv->mutex);
+ return NULL;
+ }
+ if (remain) {
+ g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_EXTRACT_SQL_ERROR,
+ "%s", _("More than one SQL statement"));
+ g_object_unref (stmt);
+ gda_mutex_unlock (store->priv->mutex);
+ return NULL;
+ }
+
+ if (store->priv->current_extract_stmt < store->priv->max_extract_stmt) {
+ g_hash_table_insert (store->priv->extract_stmt_hash, g_strdup (select_sql), g_object_ref (stmt));
+ store->priv->current_extract_stmt++;
+ }
+ }
+
+ /* parameters */
+ if (!gda_statement_get_parameters (stmt, ¶ms, error)) {
+ g_object_unref (stmt);
+ gda_mutex_unlock (store->priv->mutex);
+ return NULL;
+ }
+ if (params) {
+ GSList *list, *params_set = NULL;
+ gchar *pname;
+ GValue *value;
+ GHashTableIter iter;
+ g_hash_table_iter_init (&iter, vars);
+ while (g_hash_table_iter_next (&iter, &pname, &value)) {
+ GdaHolder *h;
+ h = gda_set_get_holder (params, pname);
+ if (!h)
+ g_warning (_("Parameter '%s' is not present in statement"), pname);
+ else {
+ if (!gda_holder_set_value (h, value, error)) {
+ g_object_unref (stmt);
+ g_object_unref (params);
+ gda_mutex_unlock (store->priv->mutex);
+ return NULL;
+ }
+ params_set = g_slist_prepend (params_set, h);
+ }
+ }
+
+ for (list = params->holders; list; list = list->next) {
+ if (!g_slist_find (params_set, list->data))
+ g_warning (_("No value set for parameter '%s'"),
+ gda_holder_get_id (GDA_HOLDER (list->data)));
+ }
+ g_slist_free (params_set);
+ }
+
+ /* execution */
+ model = gda_connection_statement_execute_select (store->priv->cnc, stmt, params, error);
+ g_object_unref (stmt);
+ if (params)
+ g_object_unref (params);
+
+ gda_mutex_unlock (store->priv->mutex);
+ return model;
+}
+
static gboolean prepare_tables_infos (GdaMetaStore *store, TableInfo **out_table_infos,
TableConditionInfo **out_cond_infos, gboolean *out_with_key,
const gchar *table_name, const gchar *condition, GError **error,
gint nvalues, const gchar **value_names, const GValue **values);
static gint find_row_in_model (GdaDataModel *find_in, GdaDataModel *data, gint row,
gint *pk_cols, gint pk_cols_nb, gboolean *out_has_changed, GError **error);
-static gboolean gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
- GdaDataModel *new_data, const gchar *condition, GError **error,
- gint nvalues, const gchar **value_names, const GValue **values);
-
/**
* gda_meta_store_modify: (skip)
* @store: a #GdaMetaStore object
@@ -2486,8 +2601,8 @@ gda_meta_store_modify (GdaMetaStore *store, const gchar *table_name,
values [n_values] = v;
}
va_end (ap);
- retval = gda_meta_store_modify_v (store, table_name, new_data, condition, error,
- n_values, value_names, values);
+ retval = gda_meta_store_modify_v (store, table_name, new_data, condition,
+ n_values, value_names, values, error);
g_free (value_names);
g_free (values);
return retval;
@@ -2531,20 +2646,40 @@ gda_meta_store_modify_with_context (GdaMetaStore *store, GdaMetaContext *context
return FALSE;
}
- retval = gda_meta_store_modify_v (store, context->table_name, new_data, cond ? cond->str : NULL, error,
+ retval = gda_meta_store_modify_v (store, context->table_name, new_data, cond ? cond->str : NULL,
context->size,
(const gchar **) context->column_names,
- (const GValue **)context->column_values);
+ (const GValue **)context->column_values, error);
if (cond)
g_string_free (cond, TRUE);
return retval;
}
/*#define DEBUG_STORE_MODIFY*/
-static gboolean
+/**
+ * gda_meta_store_modify_v:
+ * @store: a #GdaMetaStore object
+ * @table_name: the name of the table to modify within @store
+ * @new_data: (allow-none): a #GdaDataModel containing the new data to set in @table_name, or %NULL (treated as a data model
+ * with no row at all)
+ * @condition: (allow-none): SQL expression (which may contain variables) defining the rows which are being obsoleted by @new_data, or %NULL
+ * @nvalues: number of values in @value_names and @values
+ * @value_names: (array length=nvalues): names of values
+ * @values: (array length=nvalues): values
+ * @error: (allow-none): a place to store errors, or %NULL
+ *
+ * Propagates an update to @store, the update's contents is represented by @new_data, this function is
+ * primarily reserved to database providers.
+ *
+ * Returns: %TRUE if no error occurred
+ *
+ * Since: 4.2.6
+ */
+gboolean
gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
- GdaDataModel *new_data, const gchar *condition, GError **error,
- gint nvalues, const gchar **value_names, const GValue **values)
+ GdaDataModel *new_data, const gchar *condition,
+ gint nvalues, const gchar **value_names, const GValue **values,
+ GError **error)
{
TableInfo *schema_set;
TableConditionInfo *custom_set;
@@ -2880,8 +3015,8 @@ gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
}
}
if (!gda_meta_store_modify_v (store, tfk->table_info->obj_name, NULL,
- tfk->fk_fields_cond, error,
- tfk->cols_nb, (const gchar **) tfk->fk_names_array, values)) {
+ tfk->fk_fields_cond,
+ tfk->cols_nb, (const gchar **) tfk->fk_names_array, values, error)) {
retval = FALSE;
g_free (values);
goto out;
diff --git a/libgda/gda-meta-store.h b/libgda/gda-meta-store.h
index 816d9a4..e64d930 100644
--- a/libgda/gda-meta-store.h
+++ b/libgda/gda-meta-store.h
@@ -1,5 +1,9 @@
/*
- * Copyright (C) 2008 - 2011 Vivien Malerba
+ * Copyright (C) 1998 - 2011 The GNOME Foundation.
+ *
+ * AUTHORS:
+ * Vivien Malerba <malerba gnome-db org>
+ * Daniel Espinosa <esodan gmail com>
*
* This Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
@@ -141,8 +145,14 @@ gint gda_meta_store_get_version (GdaMetaStore *store);
GdaConnection *gda_meta_store_get_internal_connection (GdaMetaStore *store);
gchar *gda_meta_store_sql_identifier_quote (const gchar *id, GdaConnection *cnc);
GdaDataModel *gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **error, ...);
+GdaDataModel *gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTable *vars,
+ GError **error);
gboolean gda_meta_store_modify (GdaMetaStore *store, const gchar *table_name,
GdaDataModel *new_data, const gchar *condition, GError **error, ...);
+gboolean gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
+ GdaDataModel *new_data, const gchar *condition,
+ gint nvalues, const gchar **value_names,
+ const GValue **values, GError **error);
gboolean gda_meta_store_modify_with_context (GdaMetaStore *store, GdaMetaContext *context,
GdaDataModel *new_data, GError **error);
GdaDataModel *gda_meta_store_create_modify_data_model (GdaMetaStore *store, const gchar *table_name);
diff --git a/libgda/gda-server-operation.c b/libgda/gda-server-operation.c
index f9f62d0..dba80dc 100644
--- a/libgda/gda-server-operation.c
+++ b/libgda/gda-server-operation.c
@@ -3,6 +3,7 @@
*
* AUTHORS:
* Vivien Malerba <malerba gnome-db org>
+ * Daniel Espinosa <esodan gmail com>
*
* This Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
@@ -907,9 +908,12 @@ load_xml_spec (GdaServerOperation *op, xmlNodePtr specnode, const gchar *root, G
prop = xmlGetProp(node, (xmlChar*)"minitems");
if (prop) {
- opnode->d.seq.min_items = atoi ((gchar*)prop); /* Flawfinder: ignore */
- if (opnode->d.seq.min_items < 0)
+ gint tmp;
+ tmp = atoi ((gchar*)prop); /* Flawfinder: ignore */
+ if (i < 0)
opnode->d.seq.min_items = 0;
+ else
+ opnode->d.seq.min_items = tmp;
xmlFree (prop);
}
@@ -1973,18 +1977,19 @@ gda_server_operation_del_item_from_sequence (GdaServerOperation *op, const gchar
return FALSE;
}
-/*
- * real_gda_server_operation_get_value_at
+/**
+ * gda_server_operation_get_value_at_path:
* @op: a #GdaServerOperation object
* @path: a complete path to a node (starting with "/")
*
* Get the value for the node at the @path path
*
- * Returns: a constant #GValue if a value has been defined, or %NULL if the value is undefined or
- * if the @path is not defined or @path does not hold any value.
+ * Returns: (transfer none): a constant #GValue if a value has been defined, or %NULL if the value is undefined or if the @path is not defined or @path does not hold any value.
+ *
+ * Since: 4.2.6
*/
-static const GValue *
-real_gda_server_operation_get_value_at (GdaServerOperation *op, const gchar *path)
+const GValue *
+gda_server_operation_get_value_at_path (GdaServerOperation *op, const gchar *path)
{
const GValue *value = NULL;
GdaServerOperationNode *node_info;
@@ -2064,7 +2069,7 @@ gda_server_operation_get_value_at (GdaServerOperation *op, const gchar *path_for
path = g_strdup_vprintf (path_format, args);
va_end (args);
- value = real_gda_server_operation_get_value_at (op, path);
+ value = gda_server_operation_get_value_at_path (op, path);
g_free (path);
return value;
@@ -2087,17 +2092,15 @@ gda_server_operation_get_value_at (GdaServerOperation *op, const gchar *path_for
* if the @path is not defined or @path does not hold any value, or if the value held is not a string
* (in that last case a warning is shown).
*
- * Since: 5.0.3
+ * Since: 4.0.3
*/
gchar *
gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnection *cnc, GdaServerProvider *prov,
const gchar *path_format, ...)
{
- const GValue *value = NULL;
- gchar *path;
+ gchar *path, *ret;
va_list args;
- GdaConnectionOptions cncoptions = 0;
-
+
g_return_val_if_fail (GDA_IS_SERVER_OPERATION (op), NULL);
/* build path */
@@ -2105,9 +2108,41 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
path = g_strdup_vprintf (path_format, args);
va_end (args);
- value = real_gda_server_operation_get_value_at (op, path);
+ ret = gda_server_operation_get_sql_identifier_at_path (op, cnc, prov, path);
g_free (path);
+ return ret;
+}
+
+/**
+ * gda_server_operation_get_sql_identifier_at_path:
+ * @op: a #GdaServerOperation object
+ * @cnc: a #GdaConnection, or %NULL
+ * @prov: a #GdaServerProvider, or %NULL
+ * @path: a complete path to a node (starting with "/")
+ *
+ * This method is similar to gda_server_operation_get_value_at(), but for SQL identifiers: a new string
+ * is returned instead of a #GValue. Also the returned string is assumed to represents an SQL identifier
+ * and will correctly be quoted to be used with @cnc, or @prov if @cnc is %NULL (a generic quoting rule
+ * will be applied if both are %NULL).
+ *
+ * Returns: (transfer full): a new string, or %NULL if the value is undefined or
+ * if the @path is not defined or @path does not hold any value, or if the value held is not a string
+ * (in that last case a warning is shown).
+ *
+ * Since: 4.2.6
+ */
+gchar *
+gda_server_operation_get_sql_identifier_at_path (GdaServerOperation *op, GdaConnection *cnc, GdaServerProvider *prov,
+ const gchar *path)
+{
+ const GValue *value = NULL;
+ GdaConnectionOptions cncoptions = 0;
+
+ g_return_val_if_fail (GDA_IS_SERVER_OPERATION (op), NULL);
+
+ value = gda_server_operation_get_value_at_path (op, path);
+
if (!value || (G_VALUE_TYPE (value) == GDA_TYPE_NULL))
return NULL;
g_return_val_if_fail (G_VALUE_TYPE (value) == G_TYPE_STRING, NULL);
@@ -2119,12 +2154,11 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
}
/**
- * gda_server_operation_set_value_at: (skip)
+ * gda_server_operation_set_value_at_path:
* @op: a #GdaServerOperation object
* @value: a string
* @error: a place to store errors or %NULL
- * @path_format: a complete path to a node (starting with "/")
- * @...: arguments to use with @path_format to make a complete path
+ * @path: a complete path to a node (starting with "/")
*
* Set the value for the node at the path formed using @path_format and the ... ellipse (the rules are the same as
* for g_strdup_printf()).
@@ -2157,14 +2191,13 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
* </itemizedlist>
*
* Returns: %TRUE if no error occurred
+ *
+ * Since: 4.2.6
*/
gboolean
-gda_server_operation_set_value_at (GdaServerOperation *op, const gchar *value, GError **error,
- const gchar *path_format, ...)
+gda_server_operation_set_value_at_path (GdaServerOperation *op, const gchar *value,
+ const gchar *path, GError **error)
{
- gchar *path;
- va_list args;
-
Node *opnode;
gchar *extension = NULL;
gchar *colname = NULL;
@@ -2173,11 +2206,6 @@ gda_server_operation_set_value_at (GdaServerOperation *op, const gchar *value, G
g_return_val_if_fail (GDA_IS_SERVER_OPERATION (op), FALSE);
g_return_val_if_fail (op->priv, FALSE);
- /* build path */
- va_start (args, path_format);
- path = g_strdup_vprintf (path_format, args);
- va_end (args);
-
/* set the value */
opnode = node_find_or_create (op, path);
if (!opnode) {
@@ -2302,11 +2330,72 @@ gda_server_operation_set_value_at (GdaServerOperation *op, const gchar *value, G
g_free (extension);
g_free (colname);
- g_free (path);
return allok;
}
/**
+ * gda_server_operation_set_value_at: (skip)
+ * @op: a #GdaServerOperation object
+ * @value: a string
+ * @error: a place to store errors or %NULL
+ * @path_format: a complete path to a node (starting with "/")
+ * @...: arguments to use with @path_format to make a complete path
+ *
+ * Set the value for the node at the path formed using @path_format and the ... ellipse (the rules are the same as
+ * for g_strdup_printf()).
+ *
+ * Note that trying to set a value for a path which is not used by the current
+ * provider, such as "/TABLE_OPTIONS_P/TABLE_ENGINE" for a PostgreSQL connection (this option is only supported for MySQL),
+ * will <emphasis>not</emphasis> generate
+ * any error; this allows one to give values to a superset of the parameters and thus use the same code for several providers.
+ *
+ * Here are the possible formats of @path_format:
+ * <itemizedlist>
+ * <listitem><para>If the path corresponds to a #GdaHolder, then the parameter is set to <![CDATA["@value"]]></para></listitem>
+ * <listitem><para>If the path corresponds to a sequence item like for example "/SEQUENCE_NAME/5/NAME" for
+ * the "NAME" value of the 6th item of the "SEQUENCE_NAME" sequence then:
+ * <itemizedlist>
+ * <listitem><para>if the sequence already has 6 or more items, then the value is just set to the corresponding
+ * value in the 6th item of the sequence</para></listitem>
+ * <listitem><para>if the sequence has less then 6 items, then items are added up to the 6th one before setting
+ * the value to the corresponding in the 6th item of the sequence</para></listitem>
+ * </itemizedlist>
+ * </para></listitem>
+ * <listitem><para>If the path corresponds to a #GdaDataModel, like for example "/ARRAY/@@COLUMN/5" for the value at the
+ * 6th row of the "COLUMN" column of the "ARRAY" data model, then:
+ * <itemizedlist>
+ * <listitem><para>if the data model already contains 6 or more rows, then the value is just set</para></listitem>
+ * <listitem><para>if the data model has less than 6 rows, then rows are added up to the 6th one before setting
+ * the value</para></listitem>
+ * </itemizedlist>
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * Returns: %TRUE if no error occurred
+ */
+gboolean
+gda_server_operation_set_value_at (GdaServerOperation *op, const gchar *value, GError **error,
+ const gchar *path_format, ...)
+{
+ gchar *path;
+ va_list args;
+ gboolean ret;
+
+ g_return_val_if_fail (GDA_IS_SERVER_OPERATION (op), FALSE);
+ g_return_val_if_fail (op->priv, FALSE);
+
+ /* build path */
+ va_start (args, path_format);
+ path = g_strdup_vprintf (path_format, args);
+ va_end (args);
+
+ ret = gda_server_operation_set_value_at_path (op, value, path, error);
+ g_free (path);
+
+ return ret;
+}
+
+/**
* gda_server_operation_is_valid:
* @op: a #GdaServerOperation widget
* @xml_file: an XML specification file (see gda_server_operation_new())
@@ -2526,7 +2615,7 @@ gda_server_operation_perform_drop_database (GdaServerOperation *op, const gchar
}
/**
- * gda_server_operation_prepare_create_table: (skip)
+ * gda_server_operation_prepare_create_table:
* @cnc: an opened connection
* @table_name: name of the table to create
* @error: a place to store errors, or %NULL
diff --git a/libgda/gda-server-operation.h b/libgda/gda-server-operation.h
index 86c0f94..80be85a 100644
--- a/libgda/gda-server-operation.h
+++ b/libgda/gda-server-operation.h
@@ -3,6 +3,7 @@
*
* AUTHORS:
* Vivien Malerba <malerba gnome-db org>
+ * Daniel Espinosa <esodan gmail com>
*
* This Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
@@ -204,11 +205,17 @@ GdaServerOperationType gda_server_operation_string_to_op_type (const g
GdaServerOperationNode *gda_server_operation_get_node_info (GdaServerOperation *op, const gchar *path_format, ...);
const GValue *gda_server_operation_get_value_at (GdaServerOperation *op, const gchar *path_format, ...);
+const GValue *gda_server_operation_get_value_at_path (GdaServerOperation *op, const gchar *path);
gchar *gda_server_operation_get_sql_identifier_at (GdaServerOperation *op,
GdaConnection *cnc, GdaServerProvider *prov,
- const gchar *path_format, ...);
+ const gchar *path_format, ...);
+gchar *gda_server_operation_get_sql_identifier_at_path (GdaServerOperation *op,
+ GdaConnection *cnc, GdaServerProvider *prov,
+ const gchar *path);
gboolean gda_server_operation_set_value_at (GdaServerOperation *op, const gchar *value,
GError **error, const gchar *path_format, ...);
+gboolean gda_server_operation_set_value_at_path (GdaServerOperation *op, const gchar *value,
+ const gchar *path, GError **error);
xmlNodePtr gda_server_operation_save_data_to_xml (GdaServerOperation *op, GError **error);
gboolean gda_server_operation_load_data_from_xml (GdaServerOperation *op,
diff --git a/libgda/gda-util.c b/libgda/gda-util.c
index 3e2a668..e1ec1e3 100644
--- a/libgda/gda-util.c
+++ b/libgda/gda-util.c
@@ -55,7 +55,7 @@ extern GdaAttributesManager *gda_holder_attributes_manager;
#define PROV_CLASS(provider) (GDA_SERVER_PROVIDER_CLASS (G_OBJECT_GET_CLASS (provider)))
/**
- * gda_g_type_to_string
+ * gda_g_type_to_string:
* @type: Type to convert from.
*
* Converts a GType to its string representation (use gda_g_type_from_string() for the
@@ -94,7 +94,7 @@ gda_g_type_to_string (GType type)
}
/**
- * gda_g_type_from_string
+ * gda_g_type_from_string:
* @str: the name of a #GType, as returned by gda_g_type_to_string().
*
* Converts a named type to ts GType type (also see the gda_g_type_to_string() function).
@@ -150,7 +150,7 @@ gda_g_type_from_string (const gchar *str)
}
/**
- * gda_default_escape_string
+ * gda_default_escape_string:
* @string: string to escape
*
* Escapes @string to make it understandable by a DBMS. The escape method is very common and replaces any
@@ -204,7 +204,7 @@ gda_default_escape_string (const gchar *string)
}
/**
- * gda_default_unescape_string
+ * gda_default_unescape_string:
* @string: string to unescape
*
* Do the reverse of gda_default_escape_string(): transforms any "''" into "'", any
@@ -265,6 +265,55 @@ gda_default_unescape_string (const gchar *string)
}
/**
+ * gda_utility_check_data_model_v:
+ * @model: a #GdaDataModel object
+ * @nbcols: the minimum requested number of columns
+ * @types: (array length=nbcols): array with @nbcols length of type GType or null (if any data type is accepted)
+ *
+ * Check the column types of a GdaDataModel.
+ *
+ * Returns: %TRUE if the data model's columns match the provided data types and number
+ *
+ * Since: 4.2.6
+ */
+gboolean
+gda_utility_check_data_model_v (GdaDataModel *model, gint nbcols, GType* types)
+{
+ gboolean retval = TRUE;
+ gint i;
+
+ g_return_val_if_fail (model && GDA_IS_DATA_MODEL (model), FALSE);
+
+ /* number of columns */
+ if (gda_data_model_get_n_columns (model) < nbcols)
+ return FALSE;
+
+ /* type of each column */
+ if (nbcols > 0) {
+ GdaColumn *att;
+ GType mtype, rtype;
+ i = 0;
+ while ((i<nbcols) && retval) {
+ att = gda_data_model_describe_column (model, i);
+ mtype = gda_column_get_g_type (att);
+
+ rtype = types [i];
+ if (mtype != rtype) {
+ retval = FALSE;
+#ifdef GDA_DEBUG_NO
+ g_print ("Column %d: Expected %s, got %s\n",
+ i, gda_g_type_to_string (rtype), gda_g_type_to_string (mtype));
+#endif
+ }
+ i++;
+ }
+ }
+
+ return retval;
+}
+
+
+/**
* gda_utility_check_data_model: (skip)
* @model: a #GdaDataModel object
* @nbcols: the minimum requested number of columns
@@ -272,7 +321,7 @@ gda_default_unescape_string (const gchar *string)
*
* Check the column types of a GdaDataModel.
*
- * Returns: TRUE if the data model's columns match the provided data types and number
+ * Returns: %TRUE if the data model's columns match the provided data types and number
*/
gboolean
gda_utility_check_data_model (GdaDataModel *model, gint nbcols, ...)
@@ -321,7 +370,7 @@ gda_utility_check_data_model (GdaDataModel *model, gint nbcols, ...)
}
/**
- * gda_utility_data_model_dump_data_to_xml
+ * gda_utility_data_model_dump_data_to_xml:
* @model: a #GdaDataModel
* @parent: the parent XML node
* @cols: an array containing which columns of @model will be exported, or %NULL for all columns
@@ -337,7 +386,7 @@ gda_utility_check_data_model (GdaDataModel *model, gint nbcols, ...)
* to access data in @model previously to calling this method, and this iterator will be moved (point to
* another row).
*
- * Returns: TRUE if no error occurred
+ * Returns: %TRUE if no error occurred
*/
gboolean
gda_utility_data_model_dump_data_to_xml (GdaDataModel *model, xmlNodePtr parent,
@@ -477,7 +526,7 @@ gda_utility_data_model_dump_data_to_xml (GdaDataModel *model, xmlNodePtr parent,
/**
- * gda_utility_data_model_find_column_description
+ * gda_utility_data_model_find_column_description:
* @model: a #GdaDataSelect data model
* @field_name: field name
*
@@ -531,7 +580,7 @@ gda_utility_data_model_find_column_description (GdaDataSelect *model, const gcha
}
/**
- * gda_utility_holder_load_attributes
+ * gda_utility_holder_load_attributes:
* @holder: a #GdaHolder
* @node: an xmlNodePtr with a <parameter> tag
* @sources: a list of #GdaDataModel
@@ -705,7 +754,7 @@ gda_utility_holder_load_attributes (GdaHolder *holder, xmlNodePtr node, GSList *
#define GDA_PARAM_ENCODE_TOKEN "__gda"
/**
- * gda_text_to_alphanum
+ * gda_text_to_alphanum:
* @text: the text to convert
*
* The "encoding" consists in replacing non
@@ -740,7 +789,7 @@ gda_text_to_alphanum (const gchar *text)
}
/**
- * gda_alphanum_to_text
+ * gda_alphanum_to_text:
* @text: a string
*
* Does the opposite of gda_text_to_alphanum(), in the same string
@@ -830,7 +879,7 @@ dml_statements_check_select_structure (GdaConnection *cnc, GdaSqlStatement *sel_
}
/**
- * gda_compute_unique_table_row_condition_with_cnc
+ * gda_compute_unique_table_row_condition_with_cnc:
* @cnc: a #GdaConnection, or %NULL
* @stsel: a #GdaSqlSelectStatement
* @mtable: a #GdaMetaTable
@@ -944,7 +993,7 @@ gda_compute_unique_table_row_condition_with_cnc (GdaConnection *cnc, GdaSqlState
}
/**
- * gda_compute_unique_table_row_condition
+ * gda_compute_unique_table_row_condition:
* @stsel: a #GdaSqlSelectStatement
* @mtable: a #GdaMetaTable
* @require_pk: set to TRUE if a primary key ir required
@@ -962,7 +1011,7 @@ gda_compute_unique_table_row_condition (GdaSqlStatementSelect *stsel, GdaMetaTab
}
/**
- * gda_compute_dml_statements
+ * gda_compute_dml_statements:
* @cnc: a #GdaConnection
* @select_stmt: a SELECT #GdaStatement (compound statements not handled)
* @require_pk: TRUE if the created statement have to use a primary key
@@ -1175,7 +1224,7 @@ gda_compute_dml_statements (GdaConnection *cnc, GdaStatement *select_stmt, gbool
}
/**
- * gda_compute_select_statement_from_update
+ * gda_compute_select_statement_from_update:
* @update_stmt: an UPDATE statement
* @error: a place to store errors, or %NULL
*
@@ -1235,7 +1284,7 @@ static gboolean stmt_rewrite_update_default_keyword (GdaSqlStatementUpdate *upd,
/**
- * gda_statement_rewrite_for_default_values
+ * gda_statement_rewrite_for_default_values:
* @stmt: a #GdaStatement object
* @params: a #GdaSet containing the variable's values to be bound when executing @stmt
* @remove: set to %TRUE if DEFAULT fields are removed, of %FALSE if the "DEFAULT" keyword is used
@@ -1459,7 +1508,7 @@ stmt_rewrite_update_default_keyword (GdaSqlStatementUpdate *upd, GdaSet *params,
}
/**
- * gda_identifier_hash
+ * gda_identifier_hash:
* @id: an identifier string
*
* computes a hash string from @id, to be used in hash tables as a #GHashFunc
@@ -1491,7 +1540,7 @@ gda_identifier_hash (const gchar *id)
}
/**
- * gda_identifier_equal
+ * gda_identifier_equal:
* @id1: an identifier string
* @id2: an identifier string
*
@@ -1897,7 +1946,7 @@ gda_sql_identifier_split (const gchar *id)
static gboolean _sql_identifier_needs_quotes (const gchar *str);
/**
- * gda_sql_identifier_quote
+ * gda_sql_identifier_quote:
* @id: an SQL identifier
* @cnc: a #GdaConnection object, or %NULL
* @prov: a #GdaServerProvider object, or %NULL
@@ -2221,7 +2270,7 @@ static char rfc1738_reserved_chars[] =
};
/**
- * gda_rfc1738_encode
+ * gda_rfc1738_encode:
* @string: a string to encode
*
* Encodes @string using the RFC 1738 recommendations: the
@@ -2291,7 +2340,7 @@ gda_rfc1738_encode (const gchar *string)
}
/**
- * gda_rfc1738_decode
+ * gda_rfc1738_decode:
* @string: a string to decode
*
* Decodes @string using the RFC 1738 recommendations: the
@@ -2359,7 +2408,7 @@ gda_rfc1738_decode (gchar *string)
/**
- * gda_dsn_split
+ * gda_dsn_split:
* @string: a string in the "[<username>[:<password>] ]<DSN>" form
* @out_dsn: a place to store the new string containing the <DSN> part
* @out_username: a place to store the new string containing the <username> part
@@ -2407,7 +2456,7 @@ gda_dsn_split (const gchar *string, gchar **out_dsn, gchar **out_username, gchar
}
/**
- * gda_connection_string_split
+ * gda_connection_string_split:
* @string: a string in the "[<provider>://][<username>[:<password>] ]<connection_params>" form
* @out_cnc_params: a place to store the new string containing the <connection_params> part
* @out_provider: a place to store the new string containing the <provider> part
@@ -2593,7 +2642,7 @@ _parse_iso8601_date (GDate *gdate, const gchar *value, char **out_endptr)
}
/**
- * gda_parse_iso8601_date
+ * gda_parse_iso8601_date:
* @gdate: a pointer to a #GDate structure which will be filled
* @value: a string
*
@@ -2690,7 +2739,7 @@ _parse_iso8601_time (GdaTime *timegda, const gchar *value, char **out_endptr)
}
/**
- * gda_parse_iso8601_time
+ * gda_parse_iso8601_time:
* @timegda: a pointer to a #GdaTime structure which will be filled
* @value: a string
*
@@ -2717,7 +2766,7 @@ gda_parse_iso8601_time (GdaTime *timegda, const gchar *value)
}
/**
- * gda_parse_iso8601_timestamp
+ * gda_parse_iso8601_timestamp:
* @timestamp: a pointer to a #GdaTimeStamp structure which will be filled
* @value: a string
*
diff --git a/libgda/gda-util.h b/libgda/gda-util.h
index 1440896..91b9d39 100644
--- a/libgda/gda-util.h
+++ b/libgda/gda-util.h
@@ -4,6 +4,7 @@
* AUTHORS:
* Rodrigo Moya <rodrigo gnome-db org>
* Vivien Malerba <malerba gnome-db org>
+ * Daniel Espinosa <esodan gmail com>
*
* This Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
@@ -65,6 +66,7 @@ gchar *gda_sql_identifier_quote (const gchar *id, GdaConnection *cnc, GdaS
* Param & model utilities
*/
gboolean gda_utility_check_data_model (GdaDataModel *model, gint nbcols, ...);
+gboolean gda_utility_check_data_model_v (GdaDataModel *model, gint nbcols, GType* types);
gboolean gda_utility_data_model_dump_data_to_xml (GdaDataModel *model, xmlNodePtr parent,
const gint *cols, gint nb_cols, const gint *rows, gint nb_rows,
gboolean use_col_ids);
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index bf3a9a1..886fea1 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -206,6 +206,7 @@
gda_data_model_array_get_type
gda_data_model_array_new
gda_data_model_array_new_with_g_types
+ gda_data_model_array_new_with_g_types_v
gda_data_model_array_set_n_columns
#ifdef HAVE_BDB
gda_data_model_bdb_clean_errors
@@ -413,11 +414,13 @@
gda_meta_store_error_get_type
gda_meta_store_error_quark
gda_meta_store_extract
+ gda_meta_store_extract_v
gda_meta_store_get_attribute_value
gda_meta_store_get_internal_connection
gda_meta_store_get_type
gda_meta_store_get_version
gda_meta_store_modify
+ gda_meta_store_modify_v
gda_meta_store_modify_with_context
gda_meta_store_new
gda_meta_store_new_with_file
@@ -508,8 +511,10 @@
gda_server_operation_get_sequence_name
gda_server_operation_get_sequence_size
gda_server_operation_get_sql_identifier_at
+ gda_server_operation_get_sql_identifier_at_path
gda_server_operation_get_type
gda_server_operation_get_value_at
+ gda_server_operation_get_value_at_path
gda_server_operation_is_valid
gda_server_operation_load_data_from_xml
gda_server_operation_new
@@ -526,6 +531,7 @@
gda_server_operation_prepare_drop_table
gda_server_operation_save_data_to_xml
gda_server_operation_set_value_at
+ gda_server_operation_set_value_at_path
gda_server_operation_string_to_op_type
gda_server_operation_type_get_type
gda_server_provider_create_operation
@@ -856,6 +862,7 @@
gda_tree_update_part
gda_ushort_get_type
gda_utility_check_data_model
+ gda_utility_check_data_model_v
gda_utility_data_model_dump_data_to_xml
gda_utility_data_model_find_column_description
gda_utility_holder_load_attributes
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]