/** * gda_data_model_array_copy_model: * @src: a #GdaDataModel to copy data from * @error: a place to store errors, or %NULL * * Makes a copy of @src into a new #GdaDataModelArray object * * Returns: (transfer full) (allow-none): a new data model, or %NULL if an error occurred */ GdaDataModelArray * gda_data_model_array_copy_model (GdaDataModel *src, GError **error) { GdaDataModel *model; gint nbfields, i; g_return_val_if_fail (GDA_IS_DATA_MODEL (src), NULL); nbfields = gda_data_model_get_n_columns (src); model = gda_data_model_array_new (nbfields); 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); for (i = 0; i < nbfields; i++) { GdaColumn *copycol, *srccol; gchar *colid; srccol = gda_data_model_describe_column (src, 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, NULL, error)) { g_object_unref (model); model = NULL; } /*else gda_data_model_dump (model, stdout);*/ return (GdaDataModelArray*) model; }
/** * 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; }
static void extract_named_parameters (GdaServerOperation *op, const gchar *root_path, GtkTextBuffer *tbuffer) { GdaServerOperationNode *node; GtkTextIter iter; gchar *str; node = gda_server_operation_get_node_info (op, root_path); g_return_if_fail (node); gtk_text_buffer_get_end_iter (tbuffer, &iter); gtk_text_buffer_insert (tbuffer, &iter, " * ", -1); if (node->status == GDA_SERVER_OPERATION_STATUS_REQUIRED) gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter, root_path, -1, "req_pathname", NULL); else gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter, root_path, -1, "opt_pathname", NULL); gtk_text_buffer_insert (tbuffer, &iter, " (", -1); switch (node->type) { case GDA_SERVER_OPERATION_NODE_PARAMLIST: { GSList *params; str = g_strdup_printf ("GdaSet @%p)\n", node->plist); gtk_text_buffer_insert (tbuffer, &iter, str, -1); g_free (str); for (params = node->plist->holders; params; params = params->next) { gchar *npath; npath = g_strdup_printf ("%s/%s", root_path, gda_holder_get_id (GDA_HOLDER (params->data))); extract_named_parameters (op, npath, tbuffer); g_free (npath); } break; } case GDA_SERVER_OPERATION_NODE_DATA_MODEL: { gint i, ncols; str = g_strdup_printf ("GdaDataModel @%p)\n", node->model); gtk_text_buffer_insert (tbuffer, &iter, str, -1); g_free (str); ncols = gda_data_model_get_n_columns (node->model); for (i = 0; i < ncols; i++) { GdaColumn *col = gda_data_model_describe_column (node->model, i); gchar *npath, *str; g_object_get (G_OBJECT (col), "id", &str, NULL); npath = g_strdup_printf ("%s/@%s", root_path, str); g_free (str); extract_named_parameters (op, npath, tbuffer); g_free (npath); } break; } case GDA_SERVER_OPERATION_NODE_PARAM: { gchar *str; const GValue *value; gtk_text_buffer_insert (tbuffer, &iter, "GdaHolder) = ", -1); value = gda_holder_get_value (node->param); str = gda_value_stringify (value); gtk_text_buffer_insert (tbuffer, &iter, str, -1); gtk_text_buffer_insert (tbuffer, &iter, "\n", -1); g_free (str); break; } case GDA_SERVER_OPERATION_NODE_SEQUENCE: { gtk_text_buffer_insert (tbuffer, &iter, "Sequence)\n", -1); guint i, size = gda_server_operation_get_sequence_size (op, root_path); for (i = 0; i < size; i++) { gchar **names; names = gda_server_operation_get_sequence_item_names (op, root_path); guint n; for (n = 0; names [n]; n++) { gchar *npath; npath = g_strdup_printf ("%s/%u%s", root_path, i, names [n]); extract_named_parameters (op, npath, tbuffer); g_free (npath); } g_strfreev (names); } break; } case GDA_SERVER_OPERATION_NODE_SEQUENCE_ITEM: gtk_text_buffer_insert (tbuffer, &iter, "Sequence item)\n", -1); break; case GDA_SERVER_OPERATION_NODE_DATA_MODEL_COLUMN: { gint j, nrows; gtk_text_buffer_insert (tbuffer, &iter, "Model column)\n", -1); nrows = gda_data_model_get_n_rows (node->model); for (j = 0; j < nrows; j++) { gchar *npath, *str; const GValue *value; npath = g_strdup_printf ("%s/%d", root_path, j); value = gda_data_model_get_value_at (node->model, gda_column_get_position (node->column), j, NULL); if (value) str = gda_value_stringify (value); else str = g_strdup ("Error: could not read data model's value"); gtk_text_buffer_insert (tbuffer, &iter, " * ", -1); gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter, npath, -1, "opt_pathname", NULL); g_free (npath); gtk_text_buffer_insert (tbuffer, &iter, " (GValue) = ", -1); gtk_text_buffer_insert (tbuffer, &iter, str, -1); gtk_text_buffer_insert (tbuffer, &iter, "\n", -1); g_free (str); } break; } default: gtk_text_buffer_insert (tbuffer, &iter, "???", -1); break; } }