[libgda] Added gda_data_model_array_copy_model_ext()
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Added gda_data_model_array_copy_model_ext()
- Date: Thu, 1 Mar 2012 19:55:05 +0000 (UTC)
commit b688dfdcd2740d1836b96d61a5f63e6e9acae87e
Author: Vivien Malerba <malerba gnome-db org>
Date: Thu Mar 1 20:51:46 2012 +0100
Added gda_data_model_array_copy_model_ext()
doc/C/libgda-sections.txt | 1 +
libgda/gda-data-model-array.c | 81 +++++++++++++++++++++++++++++++++++++++++
libgda/gda-data-model-array.h | 2 +
libgda/libgda.symbols | 1 +
4 files changed, 85 insertions(+), 0 deletions(-)
---
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index 3b1e3a7..6bbce14 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -190,6 +190,7 @@ 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_copy_model_ext
gda_data_model_array_get_row
gda_data_model_array_set_n_columns
gda_data_model_array_clear
diff --git a/libgda/gda-data-model-array.c b/libgda/gda-data-model-array.c
index 4db79e8..4f8bb79 100644
--- a/libgda/gda-data-model-array.c
+++ b/libgda/gda-data-model-array.c
@@ -407,6 +407,87 @@ gda_data_model_array_copy_model (GdaDataModel *src, GError **error)
}
/**
+ * gda_data_model_array_copy_model_ext:
+ * @src: a #GdaDataModel to copy data from
+ * @ncols: size of @cols
+ * @cols: (array length=ncols): array of @src's columns to copy into the new array, not %NULL
+ * @error: a place to store errors, or %NULL
+ *
+ * Like gda_data_model_array_copy_model(), makes a copy of @src, but copies only some
+ * columns.
+ *
+ * Returns: (transfer full) (allow-none): a new data model, or %NULL if an error occurred
+ *
+ * Since: 5.2.0
+ */
+GdaDataModelArray *
+gda_data_model_array_copy_model_ext (GdaDataModel *src, gint ncols, gint *cols, GError **error)
+{
+ GdaDataModel *model;
+ gint nbfields, i;
+
+ g_return_val_if_fail (GDA_IS_DATA_MODEL (src), NULL);
+ g_return_val_if_fail (cols, NULL);
+ g_return_val_if_fail (ncols > 0, NULL);
+
+ /* check columns' validity */
+ nbfields = gda_data_model_get_n_columns (src);
+ for (i = 0; i < ncols; i++) {
+ if ((cols[i] < 0) || (cols[i] >= nbfields)) {
+ g_set_error (error, GDA_DATA_MODEL_ERROR,
+ GDA_DATA_MODEL_COLUMN_OUT_OF_RANGE_ERROR,
+ _("Column %d out of range (0-%d)"), cols[i], nbfields - 1);
+ return NULL;
+ }
+ }
+
+ /* initialize new model */
+ model = gda_data_model_array_new (ncols);
+ if (g_object_get_data (G_OBJECT (src), "name"))
+ g_object_set_data_full (G_OBJECT (model), "name", g_strdup (g_object_get_data (G_OBJECT (src), "name")), g_free);
+ if (g_object_get_data (G_OBJECT (src), "descr"))
+ g_object_set_data_full (G_OBJECT (model), "descr", g_strdup (g_object_get_data (G_OBJECT (src), "descr")), g_free);
+
+
+ /* map new columns */
+ GHashTable *hash;
+ hash = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, NULL);
+ for (i = 0; i < ncols; i++) {
+ gint *ptr;
+ ptr = g_new (gint, 1);
+ *ptr = i;
+ g_hash_table_insert (hash, ptr, GINT_TO_POINTER (cols[i]));
+
+ GdaColumn *copycol, *srccol;
+ gchar *colid;
+
+ srccol = gda_data_model_describe_column (src, cols[i]);
+ copycol = gda_data_model_describe_column (model, i);
+
+ g_object_get (G_OBJECT (srccol), "id", &colid, NULL);
+ g_object_set (G_OBJECT (copycol), "id", colid, NULL);
+ g_free (colid);
+ gda_column_set_description (copycol, gda_column_get_description (srccol));
+ gda_column_set_name (copycol, gda_column_get_name (srccol));
+ gda_column_set_dbms_type (copycol, gda_column_get_dbms_type (srccol));
+ gda_column_set_g_type (copycol, gda_column_get_g_type (srccol));
+ gda_column_set_position (copycol, gda_column_get_position (srccol));
+ gda_column_set_allow_null (copycol, gda_column_get_allow_null (srccol));
+ }
+
+ if (! gda_data_model_import_from_model (model, src, FALSE, hash, error)) {
+ g_hash_table_destroy (hash);
+ g_object_unref (model);
+ model = NULL;
+ }
+ /*else
+ gda_data_model_dump (model, stdout);*/
+
+ g_hash_table_destroy (hash);
+ return (GdaDataModelArray*) model;
+}
+
+/**
* gda_data_model_array_get_row:
* @model: a #GdaDataModelArray object
* @row: row number (starting from 0)
diff --git a/libgda/gda-data-model-array.h b/libgda/gda-data-model-array.h
index 271032a..e273c58 100644
--- a/libgda/gda-data-model-array.h
+++ b/libgda/gda-data-model-array.h
@@ -73,6 +73,8 @@ 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);
+GdaDataModelArray *gda_data_model_array_copy_model_ext (GdaDataModel *src,
+ gint ncols, gint *cols, GError **error);
GdaRow *gda_data_model_array_get_row (GdaDataModelArray *model, gint row, GError **error);
void gda_data_model_array_set_n_columns (GdaDataModelArray *model, gint cols);
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index d4d7452..e83074b 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -205,6 +205,7 @@
gda_data_model_append_values
gda_data_model_array_clear
gda_data_model_array_copy_model
+ gda_data_model_array_copy_model_ext
gda_data_model_array_get_row
gda_data_model_array_get_type
gda_data_model_array_new
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]