[libgda] Sealed most GdaSet and GdauiSet structures



commit 50e5f57545e2749f858e652c5495ec4172a1d797
Author: Daniel Espinosa <esodan gmail com>
Date:   Tue Mar 26 13:57:34 2013 -0600

    Sealed most GdaSet and GdauiSet structures

 .../data-entries/gdaui-data-cell-renderer-combo.c  |   31 +-
 .../data-entries/gdaui-data-cell-renderer-info.c   |   11 +-
 libgda-ui/data-entries/gdaui-entry-combo.c         |   35 +-
 libgda-ui/gdaui-basic-form.c                       |   57 ++-
 libgda-ui/gdaui-data-entry.c                       |    2 +-
 libgda-ui/gdaui-raw-grid.c                         |   86 ++--
 libgda-ui/gdaui-set.c                              |  130 +++++-
 libgda-ui/gdaui-set.h                              |  112 ++---
 libgda-ui/internal/utility.c                       |   28 +-
 libgda-ui/libgda-ui.symbols                        |   23 +
 libgda/gda-set.c                                   |  543 +++++++++++++++++---
 libgda/gda-set.h                                   |   90 ++--
 libgda/gda-value.h                                 |   14 -
 libgda/libgda-5.0.vapi                             |   33 +-
 libgda/libgda.symbols                              |   28 +
 15 files changed, 904 insertions(+), 319 deletions(-)
---
diff --git a/libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c 
b/libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c
index ba6152e..c86f1a0 100644
--- a/libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c
+++ b/libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c
@@ -292,7 +292,7 @@ gdaui_data_cell_renderer_combo_set_property (GObject *object,
                                        gvalues = g_list_next (gvalues);
                                }
 
-                               g_return_if_fail (length == datacell->priv->source->ref_n_cols);
+                               g_return_if_fail (length == gdaui_set_source_get_ref_n_cols 
(datacell->priv->source));
                                
                                if (allnull) 
                                        g_object_set (G_OBJECT (object), "text", "", NULL);
@@ -301,20 +301,21 @@ gdaui_data_cell_renderer_combo_set_property (GObject *object,
                                        /* if (gdaui_data_model_get_status (datacell->priv->data_model) &  */
                                        /*                                          
GDAUI_DATA_MODEL_NEEDS_INIT_REFRESH) */
                                        /*                                              
gdaui_data_model_refresh (datacell->priv->data_model, NULL); */
-                                       row = gda_data_model_get_row_from_values 
(datacell->priv->source->source->data_model,
+                                       GdaDataModel *source_model;
+                                       source_model = gda_set_source_get_data_model 
(gdaui_set_source_get_source (datacell->priv->source));
+                                       row = gda_data_model_get_row_from_values (source_model,
                                                                                  values,
-                                                                                 
datacell->priv->source->ref_cols_index);
+                                                                                 
gdaui_set_source_get_ref_columns (datacell->priv->source));
                                        if (row >= 0) {
                                                GList *dsplay_values = NULL;
                                                gint i;
                                                gchar *str;
                                                
-                                               for (i = 0; i < datacell->priv->source->shown_n_cols; i++) {
+                                               for (i = 0; i < gdaui_set_source_get_shown_n_cols 
(datacell->priv->source); i++) {
                                                        const GValue *value;
-                                                       
-                                                       value = gda_data_model_get_value_at 
(datacell->priv->source->source->data_model,
-                                                                                            
datacell->priv->source->shown_cols_index [i],
-                                                                                            row, NULL);
+                                                       gint* cols;
+                                                       cols = gdaui_set_source_get_shown_columns 
(datacell->priv->source);
+                                                       value = gda_data_model_get_value_at (source_model, 
cols [i], row, NULL);
                                                        dsplay_values = g_list_append (dsplay_values, (GValue 
*) value);
                                                }
                                                str = render_text_to_display_from_values (dsplay_values);
@@ -349,7 +350,7 @@ gdaui_data_cell_renderer_combo_set_property (GObject *object,
                        GList *gvalues = g_value_get_pointer (value);
                        gchar *str;
 
-                       g_assert (g_list_length (gvalues) == (guint)datacell->priv->source->shown_n_cols);
+                       g_assert (g_list_length (gvalues) == (guint) gdaui_set_source_get_shown_n_cols 
(datacell->priv->source));
                        str = render_text_to_display_from_values (gvalues);
                        g_object_set (G_OBJECT (object), "text", str, NULL);
                        g_free (str);
@@ -551,15 +552,17 @@ gdaui_data_cell_renderer_combo_start_editing (GtkCellRenderer     *cell,
        GdauiDataCellRendererCombo *datacell;
        GtkWidget *combo;
        gboolean editable;
+       GdaDataModel *source_model;
 
        g_object_get ((GObject*) cell, "editable", &editable, NULL);
        if (editable == FALSE)
                return NULL;
 
        datacell = GDAUI_DATA_CELL_RENDERER_COMBO (cell);
-       combo = gdaui_combo_new_with_model (GDA_DATA_MODEL (datacell->priv->source->source->data_model),
-                                           datacell->priv->source->shown_n_cols, 
-                                           datacell->priv->source->shown_cols_index);
+       source_model = gda_set_source_get_data_model (gdaui_set_source_get_source (datacell->priv->source));
+       combo = gdaui_combo_new_with_model (source_model,
+                                           gdaui_set_source_get_shown_n_cols (datacell->priv->source), 
+                                           gdaui_set_source_get_shown_columns (datacell->priv->source));
        
        g_object_set (combo, "has-frame", FALSE, NULL);
        g_object_set_data_full (G_OBJECT (combo),
@@ -598,8 +601,8 @@ gdaui_data_cell_renderer_combo_editing_done (GtkCellEditable *combo, GdauiDataCe
                return;
        
        list = _gdaui_combo_get_selected_ext (GDAUI_COMBO (combo), 
-                                             datacell->priv->source->ref_n_cols, 
-                                             datacell->priv->source->ref_cols_index);
+                                             gdaui_set_source_get_ref_n_cols (datacell->priv->source), 
+                                             gdaui_set_source_get_ref_columns (datacell->priv->source));
        list_all = _gdaui_combo_get_selected_ext (GDAUI_COMBO (combo), 0, NULL);
 
        path = g_object_get_data (G_OBJECT (combo), GDAUI_DATA_CELL_RENDERER_COMBO_PATH);
diff --git a/libgda-ui/data-entries/gdaui-data-cell-renderer-info.c 
b/libgda-ui/data-entries/gdaui-data-cell-renderer-info.c
index a734013..931ef04 100644
--- a/libgda-ui/data-entries/gdaui-data-cell-renderer-info.c
+++ b/libgda-ui/data-entries/gdaui-data-cell-renderer-info.c
@@ -456,17 +456,18 @@ gdaui_data_cell_renderer_info_activate (GtkCellRenderer      *cell,
                gtk_tree_path_free (treepath);
 
                /* we want the attributes */
-               if (! cellinfo->priv->group->group->nodes_source) {
+               if (! gda_set_group_get_source (gdaui_set_group_get_group (cellinfo->priv->group))) {
                        gint col;
                        GdaDataModel *proxied_model;
                        GdaDataProxy *proxy;
-
+                       GdaSetGroup *sg;
+                       
                        proxy = gdaui_data_store_get_proxy (cellinfo->priv->store);
                        proxied_model = gda_data_proxy_get_proxied_model (proxy);
-
-                       g_assert (g_slist_length (cellinfo->priv->group->group->nodes) == 1);
+                       sg = gdaui_set_group_get_group (cellinfo->priv->group);
+                       g_assert (gda_set_group_get_n_nodes (sg) == 1);
                        col = g_slist_index (GDA_SET (cellinfo->priv->iter)->holders,
-                                            GDA_SET_NODE 
(cellinfo->priv->group->group->nodes->data)->holder);
+                                            gda_set_node_get_holder (  gda_set_group_get_node (sg)));
 
                        gtk_tree_model_get (GTK_TREE_MODEL (cellinfo->priv->store), &iter, 
                                            gda_data_model_get_n_columns (proxied_model) + col, 
diff --git a/libgda-ui/data-entries/gdaui-entry-combo.c b/libgda-ui/data-entries/gdaui-entry-combo.c
index 2713005..e9d4018 100644
--- a/libgda-ui/data-entries/gdaui-entry-combo.c
+++ b/libgda-ui/data-entries/gdaui-entry-combo.c
@@ -241,15 +241,17 @@ uiset_source_model_changed_cb (G_GNUC_UNUSED GdauiSet *paramlist, GdauiSetSource
 {
        if (source == combo->priv->source) {
                GSList *list, *values = NULL;
-               for (list = source->source->nodes; list; list = list->next) {
+               GdaSetSource *s;
+               s = gdaui_set_source_get_source (source);
+               for (list = gda_set_source_get_nodes (s); list; list = list->next) {
                        const GValue *cvalue;
-                       cvalue = gda_holder_get_value (GDA_SET_NODE (list->data)->holder);
+                       cvalue = gda_holder_get_value (gda_set_node_get_holder (GDA_SET_NODE (list->data)));
                        values = g_slist_append (values, (GValue *) cvalue);
                }
                gdaui_combo_set_model (GDAUI_COMBO (combo->priv->combo_entry),
-                                      source->source->data_model,
-                                      combo->priv->source->shown_n_cols, 
-                                      combo->priv->source->shown_cols_index);
+                                      gda_set_source_get_data_model (s),
+                                      gdaui_set_source_get_shown_n_cols (combo->priv->source), 
+                                      gdaui_set_source_get_shown_columns (combo->priv->source));
                _gdaui_combo_set_selected_ext (GDAUI_COMBO (combo->priv->combo_entry), values, NULL);
                g_slist_free (values);
                gdaui_combo_add_null (GDAUI_COMBO (combo->priv->combo_entry), combo->priv->null_possible);
@@ -287,23 +289,23 @@ void _gdaui_entry_combo_construct (GdauiEntryCombo* combo, GdauiSet *paramlist,
         * and use the values provided by the parameters to display the correct row */
        null_possible = TRUE;
        values = NULL;
-       for (list = source->source->nodes; list; list = list->next) {
+       for (list = gda_set_source_get_nodes (gdaui_set_source_get_source (source)); list; list = list->next) 
{
                ComboNode *cnode = g_new0 (ComboNode, 1);
                
                cnode->node = GDA_SET_NODE (list->data);
                cnode->value = NULL;
                combo->priv->combo_nodes = g_slist_append (combo->priv->combo_nodes, cnode);
 
-               values = g_slist_append (values, (GValue *) gda_holder_get_value (cnode->node->holder));
-               if (gda_holder_get_not_null (cnode->node->holder))
+               values = g_slist_append (values, (GValue *) gda_holder_get_value (gda_set_node_get_holder 
(cnode->node)));
+               if (gda_holder_get_not_null (gda_set_node_get_holder (cnode->node)))
                        null_possible = FALSE;
        }
        combo->priv->null_possible = null_possible;
 
        /* create the combo box itself */
-       entry = gdaui_combo_new_with_model (GDA_DATA_MODEL (source->source->data_model), 
-                                           combo->priv->source->shown_n_cols, 
-                                           combo->priv->source->shown_cols_index);
+       entry = gdaui_combo_new_with_model (gda_set_source_get_data_model (gdaui_set_source_get_source 
(source)), 
+                                           gdaui_set_source_get_shown_n_cols (combo->priv->source), 
+                                           gdaui_set_source_get_shown_columns (combo->priv->source));
        g_object_set (G_OBJECT (entry), "as-list", TRUE, NULL);
 
        gdaui_entry_shell_pack_entry (GDAUI_ENTRY_SHELL (combo), entry);
@@ -445,7 +447,7 @@ combo_contents_changed_cb (G_GNUC_UNUSED GdauiCombo *entry, GdauiEntryCombo *com
                        ComboNode *node = COMBO_NODE (list->data);
 
                        gda_value_free (node->value);
-                       gtk_tree_model_get (model, &iter, node->node->source_column, &(node->value), -1);
+                       gtk_tree_model_get (model, &iter, gda_set_node_get_source_column (node->node), 
&(node->value), -1);
                        if (node->value)
                                node->value = gda_value_copy (node->value);
                        /*g_print ("%s (%p): Set Combo Node value to %s (%p)\n", __FUNCTION__, combo, 
@@ -503,7 +505,7 @@ gdaui_entry_combo_set_values (GdauiEntryCombo *combo, GSList *values)
                
                model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo->priv->combo_entry));
                if (gdaui_data_store_get_iter_from_values (GDAUI_DATA_STORE (model), &iter, 
-                                                          values, combo->priv->source->ref_cols_index)) {
+                                                          values, gdaui_set_source_get_ref_columns 
(combo->priv->source))) {
                        ComboNode *node;
 
                        real_combo_block_signals (combo);
@@ -514,7 +516,7 @@ gdaui_entry_combo_set_values (GdauiEntryCombo *combo, GSList *values)
                        for (list = combo->priv->combo_nodes; list; list = list->next) {
                                node = COMBO_NODE (list->data);
                                gda_value_free (node->value);
-                               gtk_tree_model_get (model, &iter, node->node->source_column,
+                               gtk_tree_model_get (model, &iter, gda_set_node_get_source_column (node->node),
                                                    &(node->value), -1);
                                if (node->value)
                                        node->value = gda_value_copy (node->value);
@@ -644,8 +646,9 @@ gdaui_entry_combo_set_reference_values (GdauiEntryCombo *combo, GSList *values)
                        GdaColumn *attrs;
                        GType type = GDA_TYPE_NULL;
                        
-                       attrs = gda_data_model_describe_column (combo->priv->source->source->data_model, 
-                                                               COMBO_NODE 
(nodes->data)->node->source_column);
+                       attrs = gda_data_model_describe_column (
+                                           gda_set_source_get_data_model (gdaui_set_source_get_source 
(combo->priv->source)),
+                                                               gda_set_node_get_source_column (COMBO_NODE 
(nodes->data)->node));
                        arg_value = (GValue*) (argptr->data);
                        
                        if (arg_value)
diff --git a/libgda-ui/gdaui-basic-form.c b/libgda-ui/gdaui-basic-form.c
index df83568..442e033 100644
--- a/libgda-ui/gdaui-basic-form.c
+++ b/libgda-ui/gdaui-basic-form.c
@@ -575,20 +575,21 @@ paramlist_param_attr_changed_cb (G_GNUC_UNUSED GdaSet *paramlist, GdaHolder *par
                 !strcmp (att_name, GDA_ATTRIBUTE_DESCRIPTION)) {
                if (sentry) {
                        gchar *str, *title;
+                       GdaSetSource *ss;
                        str = create_text_label_for_sentry (sentry, &title);
                        gtk_label_set_text (GTK_LABEL (sentry->label), str);
                        g_free (str);
                        g_free (sentry->label_title);
                        sentry->label_title = title;
-                       
-                       if (! sentry->group->group->nodes_source) {
+                       ss =  gda_set_group_get_source (gdaui_set_group_get_group (sentry->group));
+                       if (!ss) {
                                g_object_get (G_OBJECT (param), "description", &title, NULL);
                                if (title && *title)
                                        gtk_widget_set_tooltip_text (sentry->label, title);
                                g_free (title);
                        }
                        else {
-                               title = g_object_get_data (G_OBJECT 
(sentry->group->group->nodes_source->data_model),
+                               title = g_object_get_data (G_OBJECT (gda_set_source_get_data_model (ss)),
                                                           "descr");
                                if (title && *title)
                                        gtk_widget_set_tooltip_text (sentry->label, title);
@@ -823,8 +824,10 @@ static gchar *
 create_text_label_for_sentry (SingleEntry *sentry, gchar **out_title)
 {
        gchar *label = NULL;
+       GdaSetSource *ss;
        g_assert (out_title);
-       if (! sentry->group->group->nodes_source) {
+       ss = gda_set_group_get_source (gdaui_set_group_get_group (sentry->group));
+       if (!ss) {
                g_object_get (G_OBJECT (sentry->single_param), "name", out_title, NULL);
                if (!*out_title)
                        *out_title = g_strdup (_("Value"));
@@ -841,13 +844,14 @@ create_text_label_for_sentry (SingleEntry *sentry, gchar **out_title)
                GSList *params;
                gchar *title = NULL;
 
-               label = g_object_get_data (G_OBJECT (sentry->group->group->nodes_source->data_model), "name");
+               label = g_object_get_data (G_OBJECT (gda_set_source_get_data_model (ss)), "name");
                if (label)
                        title = g_strdup (label);
                else {
                        GString *tstring = NULL;
-                       for (params = sentry->group->group->nodes; params; params = params->next) {
-                               g_object_get (G_OBJECT (GDA_SET_NODE (params->data)->holder),
+                       for (params = gda_set_group_get_nodes (gdaui_set_group_get_group (sentry->group));
+                                        params; params = params->next) {
+                               g_object_get (gda_set_node_get_holder (GDA_SET_NODE (params->data)),
                                              "name", &title, NULL);
                                if (title) {
                                        if (tstring) 
@@ -875,6 +879,7 @@ static void
 create_entry_widget (SingleEntry *sentry)
 {
        GdauiSetGroup *group;
+       GdaSetGroup *sg;
        GtkWidget *entry;
        gboolean editable = TRUE;
        GValue *ref_value = NULL;
@@ -916,7 +921,8 @@ create_entry_widget (SingleEntry *sentry)
        }
 
        group = sentry->group;
-       if (! group->group->nodes_source) {
+       sg = gdaui_set_group_get_group (group);
+       if (! gda_set_group_get_source (sg)) {
                /* there is only one non-constrained parameter */
                GdaHolder *param;
                GType type;
@@ -925,9 +931,9 @@ create_entry_widget (SingleEntry *sentry)
                const gchar *plugin = NULL;
                const GValue *plugin_val;
 
-               g_assert (! group->group->nodes->next); /* only 1 item in the list */
+               g_assert (gda_set_group_get_n_nodes (sg) == 1); /* only 1 item in the list */
 
-               param = GDA_HOLDER (GDA_SET_NODE (group->group->nodes->data)->holder);
+               param = GDA_HOLDER (gda_set_node_get_holder (gda_set_group_get_node (sg)));
                sentry->single_param = param;
                
                val = gda_holder_get_value (param);
@@ -1010,14 +1016,14 @@ create_entry_widget (SingleEntry *sentry)
                GSList *plist;
                gboolean nullok = TRUE;
                        
-               entry = gdaui_entry_combo_new (sentry->form->priv->set_info, group->source);
+               entry = gdaui_entry_combo_new (sentry->form->priv->set_info, gdaui_set_group_get_source 
(group));
 
                /* connect to the parameter's changes */
                sentry->group_signals = g_array_new (FALSE, FALSE, sizeof (SignalData));
-               for (plist = group->group->nodes; plist; plist = plist->next) {
+               for (plist = gda_set_group_get_nodes (gdaui_set_group_get_group (group)); plist; plist = 
plist->next) {
                        GdaHolder *param;
 
-                       param = GDA_SET_NODE (plist->data)->holder;
+                       param = gda_set_node_get_holder (GDA_SET_NODE (plist->data));
                        if (gda_holder_get_not_null (param))
                                nullok = FALSE;
 
@@ -1036,6 +1042,7 @@ create_entry_widget (SingleEntry *sentry)
                /* label */
                gchar *title = NULL;
                gchar *str;
+               GdaSetSource *ss;
 
                str = create_text_label_for_sentry (sentry, &title);
                sentry->label = gtk_label_new (str);
@@ -1044,9 +1051,8 @@ create_entry_widget (SingleEntry *sentry)
                sentry->label_title = title;
                gtk_misc_set_alignment (GTK_MISC (sentry->label), 0., 0.);
                gtk_widget_show (sentry->label);
-                       
-               title = g_object_get_data (G_OBJECT (group->group->nodes_source->data_model),
-                                          "descr");
+               ss = gda_set_group_get_source (gdaui_set_group_get_group (group));
+               title = g_object_get_data (G_OBJECT (gda_set_source_get_data_model (ss)), "descr");
                if (title && *title)
                        gtk_widget_set_tooltip_text (sentry->label, title);
 
@@ -1498,7 +1504,7 @@ entry_contents_modified (GdauiDataEntry *entry, SingleEntry *sentry)
                GdauiSetGroup *group;
 
                group = sentry->group;
-               params = group->group->nodes;
+               params = gda_set_group_get_nodes (gdaui_set_group_get_group (group));
                values = gdaui_entry_combo_get_values (GDAUI_ENTRY_COMBO (entry));
                g_assert (g_slist_length (params) == g_slist_length (values));
 
@@ -1516,7 +1522,7 @@ entry_contents_modified (GdauiDataEntry *entry, SingleEntry *sentry)
                        sentry->forward_param_updates = FALSE;
 
                        /* parameter's value */
-                       param = GDA_SET_NODE (params->data)->holder;
+                       param = gda_set_node_get_holder (GDA_SET_NODE (params->data));
                        gda_holder_set_value (param, (GValue *)(list->data), NULL);
                        g_signal_emit (G_OBJECT (sentry->form), gdaui_basic_form_signals[HOLDER_CHANGED],
                                       0, param, TRUE);
@@ -1596,9 +1602,10 @@ parameter_changed_cb (GdaHolder *param, SingleEntry *sentry)
                        GSList *list;
                        gboolean allnull = TRUE;
 
-                       for (list = sentry->group->group->nodes; list; list = list->next) {
+                       for (list = gda_set_group_get_nodes (gdaui_set_group_get_group (sentry->group));
+                            list; list = list->next) {
                                const GValue *pvalue;
-                               pvalue = gda_holder_get_value (GDA_SET_NODE (list->data)->holder);
+                               pvalue = gda_holder_get_value (gda_set_node_get_holder (GDA_SET_NODE 
(list->data)));
                                values = g_slist_append (values, (GValue *) pvalue);
                                if (allnull && pvalue &&
                                    (G_VALUE_TYPE ((GValue *) pvalue) != GDA_TYPE_NULL))
@@ -1679,9 +1686,10 @@ gdaui_basic_form_set_as_reference (GdauiBasicForm *form)
                        GSList *params;
                        gboolean allnull = TRUE;
 
-                       for (params = sentry->group->group->nodes; params; params = params->next) {
+                       for (params = gda_set_group_get_nodes (gdaui_set_group_get_group (sentry->group));
+                            params; params = params->next) {
                                const GValue *pvalue;
-                               pvalue = gda_holder_get_value (GDA_SET_NODE (params->data)->holder);
+                               pvalue = gda_holder_get_value (gda_set_node_get_holder (GDA_SET_NODE 
(params->data)));
                                values = g_slist_append (values, (GValue *) pvalue);
                                if (allnull && pvalue &&
                                    (G_VALUE_TYPE ((GValue *) pvalue) != GDA_TYPE_NULL))
@@ -2033,8 +2041,9 @@ get_single_entry_for_holder (GdauiBasicForm *form, GdaHolder *param)
                        /* multiple parameters */
                        GSList *params;
 
-                       for (params = sentry->group->group->nodes; params; params = params->next) {
-                               if (GDA_SET_NODE (params->data)->holder == (gpointer) param)
+                       for (params = gda_set_group_get_nodes (gdaui_set_group_get_group (sentry->group)); 
params;
+                            params = params->next) {
+                               if (gda_set_node_get_holder (GDA_SET_NODE (params->data)) == (gpointer) param)
                                        return sentry;
                        }
                }
diff --git a/libgda-ui/gdaui-data-entry.c b/libgda-ui/gdaui-data-entry.c
index 4981111..5425693 100644
--- a/libgda-ui/gdaui-data-entry.c
+++ b/libgda-ui/gdaui-data-entry.c
@@ -289,7 +289,7 @@ gdaui_data_entry_validate (GdauiDataEntry *de, GError **error)
        g_return_val_if_fail (GDAUI_IS_DATA_ENTRY (de), FALSE);
 
        if (GDAUI_DATA_ENTRY_GET_IFACE (de)->validate)
-               (GDAUI_DATA_ENTRY_GET_IFACE (de)->validate) (de, error);
+               return (GDAUI_DATA_ENTRY_GET_IFACE (de)->validate) (de, error);
        else
                return TRUE;
 }
diff --git a/libgda-ui/gdaui-raw-grid.c b/libgda-ui/gdaui-raw-grid.c
index 919b0d2..50d918f 100644
--- a/libgda-ui/gdaui-raw-grid.c
+++ b/libgda-ui/gdaui-raw-grid.c
@@ -739,9 +739,10 @@ create_columns_data (GdauiRawGrid *grid)
                GdauiSetGroup *group;
                GtkCellRenderer *renderer;
                ColumnData *cdata;
+               GdaSetGroup *sg;
 
                group = GDAUI_SET_GROUP (list->data);
-
+               sg = gdaui_set_group_get_group (group);
                /* update the list of columns data */
                cdata = get_column_data_for_group (grid, group);
                if (!cdata) {
@@ -754,9 +755,9 @@ create_columns_data (GdauiRawGrid *grid)
                }
 
                /* create renderers */
-               if (group->source) {
+               if (gdaui_set_group_get_source (group)) {
                        /* parameters depending on a GdaDataModel */
-                       gchar *title;
+                       gchar *title;                   
                        /*
                        GSList *nodes;
 
@@ -769,11 +770,11 @@ create_columns_data (GdauiRawGrid *grid)
                        */
 
                        /* determine title */
-                       if (g_slist_length (group->group->nodes) == 1)
-                               title = (gchar *) g_object_get_data (G_OBJECT (GDA_SET_NODE 
(group->group->nodes->data)->holder),
+                       if (gda_set_group_get_n_nodes (sg) == 1)
+                               title = (gchar *) g_object_get_data (G_OBJECT (gda_set_node_get_holder 
(gda_set_group_get_node (sg))),
                                                                     "name");
                        else
-                               title = (gchar *) g_object_get_data (G_OBJECT 
(group->group->nodes_source->data_model),
+                               title = (gchar *) g_object_get_data (G_OBJECT (gda_set_source_get_data_model 
(gda_set_group_get_source (sg))),
                                                                     "name");
 
                        if (title)
@@ -784,7 +785,7 @@ create_columns_data (GdauiRawGrid *grid)
 
                        /* FIXME: if nullok is FALSE, then set the column title in bold */
                        cdata->tooltip_text = g_strdup (_("Can't be NULL"));
-                       renderer = gdaui_data_cell_renderer_combo_new (grid->priv->iter_info, group->source);
+                       renderer = gdaui_data_cell_renderer_combo_new (grid->priv->iter_info, 
gdaui_set_group_get_source (group));
                        cdata->data_cell = g_object_ref_sink ((GObject*) renderer);
                        g_hash_table_insert (grid->priv->columns_hash, renderer, cdata);
                        g_free (cdata->title);
@@ -801,7 +802,7 @@ create_columns_data (GdauiRawGrid *grid)
                        gchar *title;
                        gint model_col;
 
-                       param = GDA_HOLDER (GDA_SET_NODE (group->group->nodes->data)->holder);
+                       param = gda_set_node_get_holder (gda_set_group_get_node (sg));
                        cdata->single_param = param;
                        g_type = gda_holder_get_g_type (param);
 
@@ -1084,7 +1085,8 @@ cell_value_set_attributes (G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
                           GtkTreeIter *iter, GdauiRawGrid *grid)
 {
        GdauiSetGroup *group;
-       guint attributes;
+       GdaSetGroup *sg;
+               guint attributes;
        gboolean to_be_deleted = FALSE;
        ColumnData *cdata;
 
@@ -1094,8 +1096,9 @@ cell_value_set_attributes (G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
                return;
        }
        group = cdata->group;
+       sg = gdaui_set_group_get_group (group);
 
-       if (group->group->nodes_source) {
+       if (gda_set_group_get_source (sg)) {
                /* parameters depending on a GdaDataModel */
                GList *values = NULL;
 
@@ -1166,9 +1169,9 @@ cell_value_set_attributes (G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
 
                offset = gda_data_model_get_n_columns (gda_data_proxy_get_proxied_model (grid->priv->proxy));
 
-               g_assert (g_slist_length (group->group->nodes) == 1);
+               g_assert (gda_set_group_get_n_nodes (sg) == 1);
                col = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                    GDA_SET_NODE (group->group->nodes->data)->holder);
+                                    gda_set_node_get_holder (gda_set_group_get_node (sg)));
                gtk_tree_model_get (GTK_TREE_MODEL (grid->priv->store), iter,
                                    GDAUI_DATA_STORE_COL_TO_DELETE, &to_be_deleted,
                                    col, &value,
@@ -1211,6 +1214,7 @@ cell_info_set_attributes (GtkTreeViewColumn *tree_column,
                          GtkTreeIter *iter, GdauiRawGrid *grid)
 {
        GdauiSetGroup *group;
+       GdaSetGroup *sg;
        guint attributes;
        gboolean to_be_deleted = FALSE;
        ColumnData *cdata;
@@ -1221,8 +1225,9 @@ cell_info_set_attributes (GtkTreeViewColumn *tree_column,
                return;
        }
        group = cdata->group;
+       sg = gdaui_set_group_get_group (group);
 
-       if (group->group->nodes_source) {
+       if (gda_set_group_get_source (sg)) {
                /* parameters depending on a GdaDataModel */
                attributes = _gdaui_utility_proxy_compute_attributes_for_group (group, grid->priv->store,
                                                                                grid->priv->iter,
@@ -1244,9 +1249,9 @@ cell_info_set_attributes (GtkTreeViewColumn *tree_column,
 
                offset = gda_data_model_get_n_columns (gda_data_proxy_get_proxied_model (grid->priv->proxy));
 
-               g_assert (g_slist_length (group->group->nodes) == 1);
+               g_assert (gda_set_group_get_n_nodes (sg) == 1);
                col = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                    GDA_SET_NODE (group->group->nodes->data)->holder);
+                                    gda_set_node_get_holder (gda_set_group_get_node (sg)));
                gtk_tree_model_get (GTK_TREE_MODEL (grid->priv->store), iter,
                                    GDAUI_DATA_STORE_COL_TO_DELETE, &to_be_deleted,
                                    GDAUI_DATA_STORE_COL_MODEL_ROW, &row,
@@ -1273,18 +1278,18 @@ static void
 data_cell_value_changed (GtkCellRenderer *renderer, const gchar *path, const GValue *new_value, GdauiRawGrid 
*grid)
 {
        GtkTreeIter iter;
-       GdauiSetGroup *group;
+       GdaSetGroup *sg;
        ColumnData *cdata;
 
        cdata = g_hash_table_lookup (grid->priv->columns_hash, renderer);
        g_assert (cdata);
-       group = cdata->group;
-       g_assert (g_slist_length (group->group->nodes) == 1);
+       sg = gdaui_set_group_get_group (cdata->group);
+       g_assert (gda_set_group_get_n_nodes (sg) == 1);
 
        if (set_iter_from_path (grid, path, &iter)) {
                gint col;
                col = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                    GDA_SET_NODE (group->group->nodes->data)->holder);
+                                    gda_set_node_get_holder (gda_set_group_get_node (sg)));
                gdaui_data_store_set_value (grid->priv->store, &iter, col, new_value);
        }
 }
@@ -1301,15 +1306,17 @@ data_cell_values_changed (GtkCellRenderer *renderer, const gchar *path,
 {
        GtkTreeIter iter;
        GdauiSetGroup *group;
+       GdaSetGroup *sg;
        ColumnData *cdata;
 
        cdata = g_hash_table_lookup (grid->priv->columns_hash, renderer);
        g_assert (cdata);
        group = cdata->group;
-       g_assert (group->group->nodes_source);
+       sg = gdaui_set_group_get_group (group);
+       g_assert (gda_set_group_get_source (sg));
 
        if (new_values)
-               g_return_if_fail (g_slist_length (group->group->nodes) == g_slist_length (new_values));
+               g_return_if_fail (gda_set_group_get_n_nodes (sg) == g_slist_length (new_values));
        else
                /* the reason for not having any value is that the GdauiDataCellRendererCombo had no selected 
item */
                return;
@@ -1319,11 +1326,11 @@ data_cell_values_changed (GtkCellRenderer *renderer, const gchar *path,
                gint col;
 
                /* update the GdauiDataStore */
-               for (params = group->group->nodes, list = new_values;
+               for (params = gda_set_group_get_nodes (sg), list = new_values;
                     list;
                     params = params->next, list = list->next) {
                        col = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                            GDA_SET_NODE (params->data)->holder);
+                                            gda_set_node_get_holder (GDA_SET_NODE (params->data)));
                        gdaui_data_store_set_value (grid->priv->store, &iter, col, (GValue *)(list->data));
                }
 
@@ -1333,13 +1340,13 @@ data_cell_values_changed (GtkCellRenderer *renderer, const gchar *path,
                proxy_row = gdaui_data_store_get_row_from_iter (grid->priv->store, &iter);
 
                gint i;
-               for (i = 0; i < group->source->shown_n_cols; i++) {
+               for (i = 0; i < gdaui_set_source_get_shown_n_cols (gdaui_set_group_get_source (group)); i++) {
                        GValue *value;
 
                        col = group->nodes_source->shown_cols_index[i];
                        value = (GValue *) g_slist_nth_data (all_new_values, col);
                        gda_data_proxy_set_model_row_value (grid->priv->proxy,
-                                                           group->group->nodes_source->data_model,
+                                                           gda_set_source_get_data_model 
(gda_set_group_get_source (sg)),
                                                            proxy_row, col, value);
                }
 #endif
@@ -1368,13 +1375,15 @@ static void
 treeview_column_clicked_cb (GtkTreeViewColumn *tree_column, GdauiRawGrid *grid)
 {
        GdauiSetGroup *group;
+       GdaSetGroup *sg;
        GSList *nodes;
 
        group = g_object_get_data (G_OBJECT (tree_column), "__gdaui_group");
        g_assert (group);
+       sg = gdaui_set_group_get_group (group);
 
-       for (nodes = group->group->nodes; nodes; nodes = nodes->next) {
-               GdaHolder *param = ((GdaSetNode*) nodes->data)->holder;
+       for (nodes = gda_set_group_get_nodes (sg); nodes; nodes = nodes->next) {
+               GdaHolder *param = gda_set_node_get_holder (GDA_SET_NODE (nodes->data));
                gint pos;
                g_assert (param);
 
@@ -1396,6 +1405,7 @@ data_cell_status_changed (GtkCellRenderer *renderer, const gchar *path, GdaValue
        GtkTreePath *treepath;
        GtkTreeIter iter;
        GdauiSetGroup *group;
+       GdaSetGroup *sg;
        GtkTreeModel *tree_model;
        gint col;
        gint offset;
@@ -1405,6 +1415,7 @@ data_cell_status_changed (GtkCellRenderer *renderer, const gchar *path, GdaValue
        cdata = g_hash_table_lookup (grid->priv->columns_hash, renderer);
        g_assert (cdata);
        group = cdata->group;
+       sg = gdaui_set_group_get_group (group);
 
        offset = gda_data_model_get_n_columns (gda_data_proxy_get_proxied_model (grid->priv->proxy));
 
@@ -1419,13 +1430,13 @@ data_cell_status_changed (GtkCellRenderer *renderer, const gchar *path, GdaValue
        gtk_tree_path_free (treepath);
 
        g_value_set_uint (attribute = gda_value_new (G_TYPE_UINT), requested_action);
-       if (group->group->nodes_source) {
+       if (gda_set_group_get_source (sg)) {
                /* parameters depending on a GdaDataModel */
                GSList *list;
 
-               for (list = group->group->nodes; list; list = list->next) {
+               for (list = gda_set_group_get_nodes (sg); list; list = list->next) {
                        col = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                            GDA_SET_NODE (list->data)->holder);
+                                            gda_set_node_get_holder (GDA_SET_NODE (list->data)));
                        gdaui_data_store_set_value (grid->priv->store, &iter, offset + col, attribute);
                }
 
@@ -1435,8 +1446,10 @@ data_cell_status_changed (GtkCellRenderer *renderer, const gchar *path, GdaValue
 
                /* call gda_data_proxy_set_model_row_value() */
                gint i;
-               for (i = 0; i < group->nodes_source->shown_n_cols; i++) {
-                       col = group->nodes_source->shown_cols_index[i];
+               GdauiSetSource gs;
+               gs = gdaui_set_group_get_source (group);
+               for (i = 0; i < gdaui_set_source_get_shown_n_cols (gs); i++) {
+                       col = (gdaui_set_source_get_shown_columns (gs))[i];
 
                        if (requested_action & GDA_VALUE_ATTR_IS_NULL)
                                gda_data_proxy_set_model_row_value (grid->priv->proxy,
@@ -1462,9 +1475,9 @@ data_cell_status_changed (GtkCellRenderer *renderer, const gchar *path, GdaValue
                /* single direct parameter */
                gint col;
 
-               g_assert (g_slist_length (group->group->nodes) == 1);
+               g_assert (gda_set_group_get_n_nodes (sg) == 1);
                col = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                    GDA_SET_NODE (group->group->nodes->data)->holder);
+                                    gda_set_node_get_holder (gda_set_group_get_node (sg)));
                gdaui_data_store_set_value (grid->priv->store, &iter, offset + col, attribute);
        }
        gda_value_free (attribute);
@@ -2347,9 +2360,10 @@ save_as_response_cb (GtkDialog *dialog, gint response_id, GdauiRawGrid *grid)
                                GSList *params;
 
                                group = g_object_get_data (G_OBJECT (list->data), "__gdaui_group");
-                               for (params = group->group->nodes; params; nb_cols ++, params = params->next)
+                               for (params = gda_set_group_get_nodes (gdaui_set_group_get_group (group))
+                                    ; params; nb_cols ++, params = params->next)
                                        cols [nb_cols] = g_slist_index (((GdaSet *)grid->priv->iter)->holders,
-                                                                       GDA_SET_NODE (params->data)->holder);
+                                                                       gda_set_node_get_holder (GDA_SET_NODE 
(params->data)));
                        }
                }
                g_list_free (columns);
diff --git a/libgda-ui/gdaui-set.c b/libgda-ui/gdaui-set.c
index b4a5abb..453ee5e 100644
--- a/libgda-ui/gdaui-set.c
+++ b/libgda-ui/gdaui-set.c
@@ -25,6 +25,33 @@
 #include "gdaui-set.h"
 #include "marshallers/gdaui-marshal.h"
 
+#ifdef GSEAL_ENABLE
+/**
+ * GdauiSetGroup:
+ * @group: 
+ * @source: 
+ *
+ * The <structname>GdauiSetGroup</structname>.
+ *
+ * To create a new #GdauiSetGroup use #gdaiu_set_group_new. 
+ * 
+ * To free a #GdauiSetGroup, created by #gdaui_set_group_new, use #gda_set_group_free.
+ *
+ * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
+ * Don't try to use #gdaui_set_group_free on a struct that was created manually.
+ */
+struct _GdauiSetGroup {
+        GdaSetGroup      *group;
+        GdauiSetSource   *source; /* if NULL, then @group->nodes contains exactly one entry */
+
+       /*< private >*/
+        /* Padding for future expansion */
+        gpointer      _gda_reserved1;
+        gpointer      _gda_reserved2;
+};
+#else
+#endif
+
 /*
    Register GdauiSetGroup type
 */
@@ -165,6 +192,45 @@ gdaui_set_group_get_group (GdauiSetGroup *sg)
        return sg->group;
 }
 
+#ifdef GSEAL_ENABLE
+/**
+ * GdauiSetSource:
+ * @source: a #GdaSetSource
+ * @shown_cols_index: (array length=shown_n_cols): Array with the column number to be shown from 
#GdaSetSource
+ * @shown_n_cols: number of elements of @shown_cols_index
+ * @ref_cols_index: (array length=ref_n_cols): Array with the number of columns as PRIMARY KEY in 
#GdaSetSource
+ * @ref_n_cols: number of elements of @ref_cols_index
+ *
+ * The <structname>GdauiSetSource</structname> is a ...
+ *
+ * To create a new #GdauiSetSource use #gdaui_set_source_new.
+ * 
+ * To free a #GdauiSetSource, created by #gdaui_set_source_new, use #gdaui_set_source_free.
+ *
+ * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
+ * Don't try to use #gdaui_set_source_free on a struct that was created manually.
+ */
+struct _GdauiSetSource {
+        GdaSetSource   *source;
+
+       /* displayed columns in 'source->data_model' */
+       gint shown_n_cols;
+       gint *shown_cols_index;
+
+       /* columns used as a reference (corresponding to PK values) in 'source->data_model' */
+       gint ref_n_cols;
+       gint *ref_cols_index; 
+
+       /*< private >*/
+        /* Padding for future expansion */
+        gpointer        _gda_reserved1;
+        gpointer        _gda_reserved2;
+        gpointer        _gda_reserved3;
+        gpointer        _gda_reserved4;
+};
+#else
+#endif
+
 /*
    Register GdauiSetSource type
 */
@@ -289,8 +355,38 @@ gdaui_set_source_get_source (GdauiSetSource *s)
 }
 
 /**
+ * gdaui_set_source_get_shown_n_cols:
+ * @s: a #GdauiSetSource
+ * 
+ * Returns: number of columns to be shown.
+ *
+ * Since: 5.2
+ */
+gint
+gdaui_set_source_get_shown_n_cols   (GdauiSetSource *s)
+{
+       g_return_val_if_fail (s, -1);
+       return s->shown_n_cols;
+}
+
+/**
+ * gdaui_set_source_get_shown_columns:
+ * @s: a #GdauiSetSource
+ * 
+ * Returns: (array zero-terminated=1) (transfer none): array of of columns to be shown.
+ *
+ * Since: 5.2
+ */
+gint*
+gdaui_set_source_get_shown_columns  (GdauiSetSource *s)
+{
+       g_return_val_if_fail (s, NULL);
+       return s->shown_cols_index;
+}
+
+/**
  * gdaui_set_source_set_shown_columns:
- * @s: a #GdauiSetSource struct to free
+ * @s: a #GdauiSetSource
  * @columns: (array length=n_columns): an array of with columns numbers to be shown from a #GdaSetSource
  * @n_columns: number of columns of the array
  * 
@@ -307,12 +403,43 @@ gdaui_set_source_set_shown_columns (GdauiSetSource *s, gint *columns, gint n_col
        if (s->shown_cols_index)
                g_free (s->shown_cols_index);
        s->shown_n_cols = n_columns;
+       s->shown_cols_index = g_new0 (gint, s->shown_n_cols+1); /* This adds a null terminated array */
        for (i = 0; i < n_columns; i++) {
                s->shown_cols_index[i] = columns[i];
        }
 }
 
 /**
+ * gdaui_set_source_get_ref_n_cols:
+ * @s: a #GdauiSetSource
+ * 
+ * Returns: number of columns to referenced.
+ *
+ * Since: 5.2
+ */
+gint
+gdaui_set_source_get_ref_n_cols   (GdauiSetSource *s)
+{
+       g_return_val_if_fail (s, -1);
+       return s->ref_n_cols;
+}
+
+/**
+ * gdaui_set_source_get_ref_columns:
+ * @s: a #GdauiSetSource
+ * 
+ * Returns: (array zero-terminated=1) (transfer none): array of of columns to be shown.
+ *
+ * Since: 5.2
+ */
+gint*
+gdaui_set_source_get_ref_columns  (GdauiSetSource *s)
+{
+       g_return_val_if_fail (s, NULL);
+       return s->shown_cols_index;
+}
+
+/**
  * gdaui_set_source_set_ref_columns:
  * @s: a #GdauiSetSource struct to free
  * @columns: (array length=n_columns): an array of with columns numbers of referen (Primary Key) at 
#GdaSetSource
@@ -331,6 +458,7 @@ gdaui_set_source_set_ref_columns (GdauiSetSource *s, gint *columns, gint n_colum
        if (s->ref_cols_index)
                g_free (s->ref_cols_index);
        s->ref_n_cols = n_columns;
+       s->ref_cols_index = g_new0 (gint, s->ref_n_cols+1); /* This creates a null terminated array */
        for (i = 0; i < n_columns; i++) {
                s->ref_cols_index[i] = columns[i];
        }
diff --git a/libgda-ui/gdaui-set.h b/libgda-ui/gdaui-set.h
index 3d81647..8f2f1dc 100644
--- a/libgda-ui/gdaui-set.h
+++ b/libgda-ui/gdaui-set.h
@@ -39,69 +39,71 @@ typedef struct _GdauiSetPriv  GdauiSetPriv;
 typedef struct _GdauiSetGroup GdauiSetGroup;
 typedef struct _GdauiSetSource GdauiSetSource;
 
-/**
- * GdauiSetGroup:
- * @group: 
- * @source: 
- *
- * The <structname>GdauiSetGroup</structname>.
- *
- * To create a new #GdauiSetGroup use #gdaiu_set_group_new. 
- * 
- * To free a #GdauiSetGroup, created by #gdaui_set_group_new, use #gda_set_group_free.
- *
- * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
- * Don't try to use #gdaui_set_group_free on a struct that was created manually.
- */
+#ifdef GSEAL_ENABLE
+#else
 struct _GdauiSetGroup {
-        GdaSetGroup      *group;
-        GdauiSetSource   *source; /* if NULL, then @group->nodes contains exactly one entry */
+        GdaSetGroup*      GSEAL(group);
+        GdauiSetSource*   GSEAL(source); /* if NULL, then @group->nodes contains exactly one entry */
 
        /*< private >*/
         /* Padding for future expansion */
-        gpointer      _gda_reserved1;
-        gpointer      _gda_reserved2;
+        gpointer      GSEAL(_gda_reserved1);
+        gpointer      GSEAL(_gda_reserved2);
 };
+#endif
 
-/**
- * GdauiSetSource:
- * @source: a #GdaSetSource
- * @shown_cols_index: (array length=shown_n_cols): Array with the column number to be shown from 
#GdaSetSource
- * @shown_n_cols: number of elements of @shown_cols_index
- * @ref_cols_index: (array length=ref_n_cols): Array with the number of columns as PRIMARY KEY in 
#GdaSetSource
- * @ref_n_cols: number of elements of @ref_cols_index
- *
- * The <structname>GdauiSetSource</structname> is a ...
- *
- * To create a new #GdauiSetSource use #gdaui_set_source_new.
- * 
- * To free a #GdauiSetSource, created by #gdaui_set_source_new, use #gdaui_set_source_free.
- *
- * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
- * Don't try to use #gdaui_set_source_free on a struct that was created manually.
- */
+#define GDAUI_TYPE_SET_GROUP (gdaui_set_group_get_type ())
+#define GDAUI_SET_GROUP(x) ((GdauiSetGroup*)(x))
+
+GType             gdaui_set_group_get_type           (void) G_GNUC_CONST;
+GdauiSetGroup    *gdaui_set_group_new                (void);
+void              gdaui_set_group_free               (GdauiSetGroup *sg);
+GdauiSetGroup    *gdaui_set_group_copy               (GdauiSetGroup *sg);
+void              gdaui_set_group_set_source         (GdauiSetGroup *sg, GdauiSetSource *source);
+GdauiSetSource   *gdaui_set_group_get_source         (GdauiSetGroup *sg);
+void              gdaui_set_group_set_group          (GdauiSetGroup *sg, GdaSetGroup *group);
+GdaSetGroup      *gdaui_set_group_get_group          (GdauiSetGroup *sg);
+
+#ifdef GSEAL_ENABLE
+#else
 struct _GdauiSetSource {
-        GdaSetSource   *source;
+        GdaSetSource*   GSEAL(source);
 
        /* displayed columns in 'source->data_model' */
-       gint shown_n_cols;
-       gint *shown_cols_index;
+       gint  GSEAL(shown_n_cols);
+       gint* GSEAL(shown_cols_index);
 
        /* columns used as a reference (corresponding to PK values) in 'source->data_model' */
-       gint ref_n_cols;
-       gint *ref_cols_index; 
+       gint  GSEAL(ref_n_cols);
+       gint* GSEAL(ref_cols_index); 
 
        /*< private >*/
         /* Padding for future expansion */
-        gpointer        _gda_reserved1;
-        gpointer        _gda_reserved2;
-        gpointer        _gda_reserved3;
-        gpointer        _gda_reserved4;
+        gpointer        GSEAL(_gda_reserved1);
+        gpointer        GSEAL(_gda_reserved2);
+        gpointer        GSEAL(_gda_reserved3);
+        gpointer        GSEAL(_gda_reserved4);
 };
+#endif
 
+#define GDAUI_TYPE_SET_SOURCE (gdaui_set_source_get_type ())
+#define GDAUI_SET_SOURCE(x) ((GdauiSetSource*)(x))
+GType             gdaui_set_source_get_type           (void) G_GNUC_CONST;
+GdauiSetSource   *gdaui_set_source_new                (void);
+void              gdaui_set_source_free               (GdauiSetSource *s);
+GdauiSetSource   *gdaui_set_source_copy               (GdauiSetSource *s);
+void              gdaui_set_source_set_source         (GdauiSetSource *s, GdaSetSource *source);
+GdaSetSource     *gdaui_set_source_get_source         (GdauiSetSource*s);
+gint              gdaui_set_source_get_shown_n_cols   (GdauiSetSource *s);
+gint*             gdaui_set_source_get_shown_columns  (GdauiSetSource *s);
+void              gdaui_set_source_set_shown_columns  (GdauiSetSource *s, gint *columns, gint n_columns);
+gint              gdaui_set_source_get_ref_n_cols     (GdauiSetSource *s);
+gint*             gdaui_set_source_get_ref_columns    (GdauiSetSource *s);
+void              gdaui_set_source_set_ref_columns    (GdauiSetSource *s, gint *columns, gint n_columns);
 
 
 /* struct for the object's data */
+/* FIXME: public members of GdauiSet must be SEALED! */
 /**
  * GdauiSet:
  * @sources_list: (element-type Gdaui.SetSource): list of #GdauiSetSource
@@ -132,28 +134,6 @@ GType             gdaui_set_get_type            (void) G_GNUC_CONST;
 GdauiSet         *gdaui_set_new                 (GdaSet *set);
 GdauiSetGroup    *gdaui_set_get_group           (GdauiSet *dbset, GdaHolder *holder);
 
-#define GDAUI_TYPE_SET_GROUP (gdaui_set_group_get_type ())
-#define GDAUI_SET_GROUP(x) ((GdauiSetGroup*)(x))
-GType             gdaui_set_group_get_type           (void) G_GNUC_CONST;
-GdauiSetGroup    *gdaui_set_group_new                (void);
-void              gdaui_set_group_free               (GdauiSetGroup *sg);
-GdauiSetGroup    *gdaui_set_group_copy               (GdauiSetGroup *sg);
-void              gdaui_set_group_set_source         (GdauiSetGroup *sg, GdauiSetSource *source);
-GdauiSetSource   *gdaui_set_group_get_source         (GdauiSetGroup *sg);
-void              gdaui_set_group_set_group          (GdauiSetGroup *sg, GdaSetGroup *group);
-GdaSetGroup      *gdaui_set_group_get_group          (GdauiSetGroup *sg);
-
-#define GDAUI_TYPE_SET_SOURCE (gdaui_set_source_get_type ())
-#define GDAUI_SET_SOURCE(x) ((GdauiSetSource*)(x))
-GType             gdaui_set_source_get_type           (void) G_GNUC_CONST;
-GdauiSetSource   *gdaui_set_source_new                (void);
-void              gdaui_set_source_free               (GdauiSetSource *s);
-GdauiSetSource   *gdaui_set_source_copy               (GdauiSetSource *s);
-void              gdaui_set_source_set_source         (GdauiSetSource *s, GdaSetSource *source);
-GdaSetSource     *gdaui_set_source_get_source         (GdauiSetSource*s);
-void              gdaui_set_source_set_shown_columns  (GdauiSetSource *s, gint *columns, gint n_columns);
-void              gdaui_set_source_set_ref_columns    (GdauiSetSource *s, gint *columns, gint n_columns);
-
 /* Deprecated functions */
 GType             _gdaui_set_get_type            (void);
 GdauiSet         *_gdaui_set_new                 (GdaSet *set);
diff --git a/libgda-ui/internal/utility.c b/libgda-ui/internal/utility.c
index d030339..e527362 100644
--- a/libgda-ui/internal/utility.c
+++ b/libgda-ui/internal/utility.c
@@ -213,12 +213,12 @@ _gdaui_utility_proxy_compute_attributes_for_group (GdauiSetGroup *group, GdauiDa
 
         /* list the values in proxy_model for each param in GDA_SET_NODE (group->group->nodes->data)->params 
*/
        attributes = 0;
-        for (list = group->group->nodes; list; list = list->next) {
-               col = g_slist_index (((GdaSet*)model_iter)->holders, GDA_SET_NODE (list->data)->holder);
+        for (list = gda_set_group_get_nodes (gdaui_set_group_get_group (group)); list; list = list->next) {
+               col = g_slist_index (((GdaSet*)model_iter)->holders, gda_set_node_get_holder (GDA_SET_NODE 
(list->data)));
                 gtk_tree_model_get (GTK_TREE_MODEL (store), tree_iter,
                                     GDAUI_DATA_STORE_COL_TO_DELETE, &local_to_del,
                                     offset + col, &localattr, -1);
-               if (list == group->group->nodes)
+               if (list == gda_set_group_get_nodes (gdaui_set_group_get_group (group)))
                        attributes = localattr;
                else
                        attributes &= localattr;
@@ -260,10 +260,10 @@ _gdaui_utility_proxy_compute_values_for_group (GdauiSetGroup *group, GdauiDataSt
                GSList *list;
                GValue *value;
 
-               for (list = group->group->nodes; list; list = list->next) {
+               for (list = gda_set_group_get_nodes (gdaui_set_group_get_group (group)); list; list = 
list->next) {
                        gint col;
 
-                       col = g_slist_index (((GdaSet*)model_iter)->holders, GDA_SET_NODE 
(list->data)->holder);
+                       col = g_slist_index (((GdaSet*)model_iter)->holders, gda_set_node_get_holder 
(GDA_SET_NODE (list->data)));
                        gtk_tree_model_get (GTK_TREE_MODEL (store), tree_iter, col, &value, -1);
                        retval = g_list_append (retval, value);
                }
@@ -280,9 +280,9 @@ _gdaui_utility_proxy_compute_values_for_group (GdauiSetGroup *group, GdauiDataSt
 #ifdef PROXY_STORE_EXTRA_VALUES
                proxy_row = gdaui_data_store_get_row_from_iter (store, tree_iter);
 #endif
-               source = group->source;
-               for (i = 0 ; (i < source->shown_n_cols)  && !ret_null; i++) {
-                       col = source->shown_cols_index[i];
+               source = gdaui_set_group_get_source (group);
+               for (i = 0 ; (i < gdaui_set_source_get_shown_n_cols (source))  && !ret_null; i++) {
+                       col = (gdaui_set_source_get_shown_columns (source))[i];
 #ifdef PROXY_STORE_EXTRA_VALUES
                        if (!slow_way) {
                                value = gda_data_proxy_get_model_row_value (proxy, source->data_model, 
proxy_row, col);
@@ -306,21 +306,21 @@ _gdaui_utility_proxy_compute_values_for_group (GdauiSetGroup *group, GdauiDataSt
                                GSList *list;
                                gint j;
                                
-                               cols_index = g_new0 (gint, g_slist_length (group->group->nodes));
-                               for (list = group->group->nodes, j = 0; list; list = list->next, j++) {
+                               cols_index = g_new0 (gint, gda_set_group_get_n_nodes 
(gdaui_set_group_get_group (group)));
+                               for (list = gda_set_group_get_nodes (gdaui_set_group_get_group (group)), j = 
0; list; list = list->next, j++) {
                                        gint colno;
                                        colno = g_slist_index (((GdaSet*)model_iter)->holders, 
-                                                              GDA_SET_NODE (list->data)->holder);
-                                       cols_index [j] = GDA_SET_NODE (list->data)->source_column;
+                                                              gda_set_node_get_holder (GDA_SET_NODE 
(list->data)));
+                                       cols_index [j] = gda_set_node_get_source_column (GDA_SET_NODE 
(list->data));
                                        gtk_tree_model_get (GTK_TREE_MODEL (store), tree_iter,
                                                            colno, &value, -1);
                                        key_values = g_slist_append (key_values, (GValue *) value);
                                }
                                
-                               row = gda_data_model_get_row_from_values (GDA_DATA_MODEL 
(source->source->data_model), 
+                               row = gda_data_model_get_row_from_values (gda_set_source_get_data_model 
(gdaui_set_source_get_source (source)), 
                                                                          key_values, cols_index);
                                if (row >= 0) {
-                                       value = gda_data_model_get_value_at (GDA_DATA_MODEL 
(source->source->data_model),
+                                       value = gda_data_model_get_value_at (gda_set_source_get_data_model 
(gdaui_set_source_get_source (source)),
                                                                             col, row, NULL);
                                        retval = g_list_append (retval, (GValue *) value);
                                }
diff --git a/libgda-ui/libgda-ui.symbols b/libgda-ui/libgda-ui.symbols
index 81d93ad..46f7f42 100644
--- a/libgda-ui/libgda-ui.symbols
+++ b/libgda-ui/libgda-ui.symbols
@@ -177,7 +177,30 @@
        gdaui_server_operation_get_type
        gdaui_server_operation_new
        gdaui_server_operation_new_in_dialog
+       gdaui_set_get_type
+       gdaui_set_new
+       gdaui_set_get_group
        gdaui_set_default_path
+       gdaui_set_group_get_type
+       gdaui_set_group_new
+       gdaui_set_group_free
+       gdaui_set_group_copy
+       gdaui_set_group_set_source
+       gdaui_set_group_get_source
+       gdaui_set_group_set_group
+       gdaui_set_group_get_group
+       gdaui_set_source_get_type
+       gdaui_set_source_new
+       gdaui_set_source_free
+       gdaui_set_source_copy
+       gdaui_set_source_set_source
+       gdaui_set_source_get_source
+       gdaui_set_source_get_shown_n_cols
+       gdaui_set_source_get_shown_columns
+       gdaui_set_source_set_shown_columns
+       gdaui_set_source_get_ref_n_cols
+       gdaui_set_source_get_ref_columns
+       gdaui_set_source_set_ref_columns
        gdaui_tree_store_get_iter
        gdaui_tree_store_get_node
        gdaui_tree_store_get_type
diff --git a/libgda/gda-set.c b/libgda/gda-set.c
index f16a08d..375e2a9 100644
--- a/libgda/gda-set.c
+++ b/libgda/gda-set.c
@@ -44,6 +44,26 @@
 extern xmlDtdPtr gda_paramlist_dtd;
 extern gchar *gda_lang_locale;
 
+#ifdef GSEAL_ENABLE
+/**
+ * GdaSetGroup:
+ * @nodes: (element-type Gda.SetNode): list of GdaSetNode, at least one entry
+ * @nodes_source: (allow-none):  if NULL, then @nodes contains exactly one entry 
+ *
+ * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
+ * Don't try to use #gda_set_group_free on a struct that was created manually.
+ */
+struct _GdaSetGroup {
+       GSList       *nodes;       /* list of GdaSetNode, at least one entry */
+       GdaSetSource *nodes_source; /* if NULL, then @nodes contains exactly one entry */
+
+       /*< private >*/
+       /* Padding for future expansion */
+       gpointer      _gda_reserved1;
+       gpointer      _gda_reserved2;
+};
+#else
+#endif
 /*
    Register GdaSetGroup type
 */
@@ -132,19 +152,110 @@ void gda_set_group_set_source (GdaSetGroup *sg, GdaSetSource *source)
 }
 
 /**
+ * gda_set_group_get_source:
+ * @sg: a #GdaSetGroup
+ * 
+ * Returns: a #GdaSetSource. If %NULL then @sg contains just one element.
+ * 
+ * Since: 5.2
+ */
+GdaSetSource*
+gda_set_group_get_source      (GdaSetGroup *sg)
+{
+       g_return_val_if_fail (sg, NULL);
+       return sg->nodes_source;
+}
+
+/**
  * gda_set_group_add_node:
  * @sg: a #GdaSetGroup
- * @source: a #GdaSetNode to set
+ * @node: a #GdaSetNode to set
  * 
  * Since: 5.2
  */
-void gda_set_group_add_node (GdaSetGroup *sg, GdaSetNode *node)
+void 
+gda_set_group_add_node (GdaSetGroup *sg, GdaSetNode *node)
 {
        g_return_if_fail (sg);
        g_return_if_fail (node);
        sg->nodes = g_slist_append (sg->nodes, node);
 }
 
+/**
+ * gda_set_group_get_node:
+ * @sg: a #GdaSetGroup
+ * 
+ * This method always return first #GdaSetNode in @sg.
+ * 
+ * Returns: first #GdaSetNode in @sg.
+ * 
+ * Since: 5.2
+ */
+GdaSetNode* 
+gda_set_group_get_node (GdaSetGroup *sg)
+{
+       g_return_val_if_fail (sg, NULL);
+       g_return_val_if_fail (sg->nodes, NULL);
+       return (GdaSetNode*) sg->nodes->data;
+}
+
+/**
+ * gda_set_group_get_nodes:
+ * @sg: a #GdaSetGroup
+ * 
+ * Returns a #GSList with the #GdaSetNode grouped by @sg. You must use
+ * #g_slist_free on returned list.
+ * 
+ * Returns: (transfer none) (element-type Gda.SetNode): a #GSList with all nodes in @sg. 
+ * 
+ * Since: 5.2
+ */
+GSList* 
+gda_set_group_get_nodes (GdaSetGroup *sg)
+{
+       g_return_val_if_fail (sg, NULL);
+       g_return_val_if_fail (sg->nodes, NULL);
+       return sg->nodes;
+}
+
+/**
+ * gda_set_group_get_n_nodes:
+ * @sg: a #GdaSetGroup
+ * 
+ * Returns: number of nodes in @sg. 
+ * 
+ * Since: 5.2
+ */
+gint
+gda_set_group_get_n_nodes (GdaSetGroup *sg)
+{
+       g_return_val_if_fail (sg, -1);
+       return g_slist_length (sg->nodes);
+}
+
+#ifdef GSEAL_ENABLE
+/**
+ * GdaSetSource:
+ * @data_model: Can't be NULL
+ * @nodes: (element-type Gda.SetNode): list of #GdaSetNode for which source_model == @data_model
+ * 
+ * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
+ * Don't try to use #gda_set_source_free on a struct that was created manually.
+ **/
+struct _GdaSetSource {
+       GdaDataModel   *data_model;   /* Can't be NULL */
+       GSList         *nodes;        /* list of #GdaSetNode for which source_model == @data_model */
+
+       /*< private >*/
+       /* Padding for future expansion */
+       gpointer        _gda_reserved1;
+       gpointer        _gda_reserved2;
+       gpointer        _gda_reserved3;
+       gpointer        _gda_reserved4;
+};
+#else
+#endif
+
 /*
    Register GdaSetSource type
 */
@@ -165,6 +276,7 @@ gda_set_source_get_type (void)
 
 /**
  * gda_set_source_new:
+ * @model: a #GdaDataModel
  * 
  * Creates a new #GdaSetSource struct.
  *
@@ -173,12 +285,12 @@ gda_set_source_get_type (void)
  * Since: 5.2
  */
 GdaSetSource*
-gda_set_source_new (void)
+gda_set_source_new (GdaDataModel *model)
 {
        GdaSetSource *s = g_new0 (GdaSetSource, 1);
        s->nodes = NULL;
-       s->data_model = NULL;
-       
+       s->data_model = g_object_ref (model);
+
        return s;
 }
 
@@ -197,9 +309,8 @@ gda_set_source_copy (GdaSetSource *s)
 {
        GdaSetSource *n;
        g_return_val_if_fail (s, NULL); 
-       n = gda_set_source_new ();
+       n = gda_set_source_new (gda_set_source_get_data_model (s));
        n->nodes = g_slist_copy (s->nodes);
-       n->data_model = g_object_ref (s->data_model);
        return n;
 }
        
@@ -216,13 +327,30 @@ gda_set_source_free (GdaSetSource *s)
 {
        g_return_if_fail(s);
        g_object_unref (s->data_model);
-       g_slist_free (s->nodes);
+       g_slist_free (s->nodes); /* FIXME: A source must own its nodes, then they must be freed here
+                                                                               this leaves to others 
responsability free nodes BEFORE
+                                                                               to free this source */
        g_free (s);
 }
 
 /**
+ * gda_set_source_get_data_model:
+ * @s: a #GdaSetSource
+ * 
+ * Returns: (transfer none): a #GdaDataModel used by @s
+ * 
+ * Since: 5.2
+ */
+GdaDataModel*
+gda_set_source_get_data_model (GdaSetSource *s)
+{
+       g_return_val_if_fail (s, NULL);
+       return s->data_model;
+}
+
+/**
  * gda_set_source_set_data_model:
- * @s: (allow-none): a #GdaSetSource struct to free
+ * @s: a #GdaSetSource struct to free
  * @model: a #GdaDataModel
  * 
  * Set a #GdaDataModel
@@ -239,8 +367,8 @@ gda_set_source_set_data_model (GdaSetSource *s, GdaDataModel *model)
 
 /**
  * gda_set_source_add_node:
- * @s: (allow-none): a #GdaSetSource struct to free
- * @model: a #GdaDataModel
+ * @s: a #GdaSetSource
+ * @node: a #GdaSetNode to add
  * 
  * Set a #GdaDataModel
  *
@@ -254,6 +382,234 @@ gda_set_source_add_node (GdaSetSource *s, GdaSetNode *node)
        s->nodes = g_slist_append (s->nodes, node);
 }
 
+/**
+ * gda_set_source_get_nodes:
+ * @s: a #GdaSetSource
+ * 
+ * Returns: (transfer none) (element-type Gda.SetNode): a list of #GdaSetNode structs
+ *
+ * Since: 5.2
+ */
+GSList*
+gda_set_source_get_nodes (GdaSetSource *s)
+{
+       g_return_val_if_fail (s, NULL);
+       g_return_val_if_fail (s->nodes, NULL);
+       return s->nodes;
+}
+
+#ifdef GSEAL_ENABLE
+/**
+ * GdaSetNode:
+ * @holder: a #GdaHolder. It can't be NULL
+ * @source_model: a #GdaDataModel. It could be NULL
+ * @source_column: a #gint with the number of column in @source_model
+ * 
+ * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
+ * Don't try to use #gda_set_node_free on a struct that was created manually.
+ */
+struct _GdaSetNode {
+       GdaHolder    *holder;        /* Can't be NULL */
+       GdaDataModel *source_model;  /* may be NULL */
+       gint          source_column; /* unused if @source_model is NULL */
+
+       /*< private >*/
+       /* Padding for future expansion */
+       gpointer      _gda_reserved1;
+       gpointer      _gda_reserved2;
+};
+#endif
+/*
+   Register GdaSetNode type
+*/
+GType
+gda_set_node_get_type (void)
+{
+       static GType type = 0;
+
+       if (G_UNLIKELY (type == 0)) {
+        if (type == 0)
+                       type = g_boxed_type_register_static ("GdaSetNode",
+                                                            (GBoxedCopyFunc) gda_set_node_copy,
+                                                            (GBoxedFreeFunc) gda_set_node_free);
+       }
+
+       return type;
+}
+
+/**
+ * gda_set_node_new:
+ * @holder: a #GdaHolder to used by new #GdaSetNode
+ * @model: a #GdaDataModel used to get values from
+ * 
+ * Creates a new #GdaSetNode struct.
+ *
+ * Return: (transfer full): a new #GdaSetNode struct.
+ *
+ * Since: 5.2
+ */
+GdaSetNode*
+gda_set_node_new (GdaHolder *holder, GdaDataModel *model)
+{
+       g_return_val_if_fail (GDA_IS_HOLDER (holder), NULL);
+       GdaSetNode *n = g_new0 (GdaSetNode, 1);
+       n->holder = holder;
+       if (GDA_IS_DATA_MODEL (model)) {
+               n->source_model = model;
+               n->source_column = 0;
+       }
+       else {
+               n->source_model = NULL;
+               n->source_column = -1;
+       }
+       return n;
+}
+
+/**
+ * gda_set_node_copy:
+ * @node: a #GdaSetNode to copy from
+ *
+ * Copy constructor.
+ *
+ * Returns: a new #GdaSetNode
+ *
+ * Since: 5.2
+ */
+GdaSetNode *
+gda_set_node_copy (GdaSetNode *node)
+{
+       g_return_val_if_fail (node, NULL);
+
+       GdaSetNode *n;
+       n = gda_set_node_new (gda_set_node_get_holder (node), gda_set_node_get_data_model (node));
+       gda_set_node_set_source_column (n, gda_set_node_get_source_column (node));
+       return n;
+}
+
+/**
+ * gda_set_node_free:
+ * @node: (allow-none): a #GdaSetNode struct to free
+ * 
+ * Frees any resources taken by @node struct. If @node is %NULL, then nothing happens.
+ *
+ * Since: 5.2
+ */
+void
+gda_set_node_free (GdaSetNode *node)
+{
+       if (node == NULL)
+               return;
+       if (GDA_IS_HOLDER (node->holder))
+               g_object_unref (node->holder);
+       if (GDA_IS_DATA_MODEL (node->source_model))
+               g_object_unref (node->source_model);
+       g_free (node);
+}
+
+/**
+ * gda_set_node_get_holder:
+ * @node: a #GdaSetNode struct to get holder from
+ * 
+ * Returns: (transfer none): the #GdaHolder used by @node
+ *
+ * Since: 5.2
+ */
+GdaHolder*
+gda_set_node_get_holder (GdaSetNode *node)
+{
+       g_return_val_if_fail (node, NULL);
+       return node->holder;
+}
+
+/**
+ * gda_set_node_set_holder:
+ * @node: a #GdaSetNode struct to set holder to
+ * 
+ * Set a #GdaHolder to @node. @holder increment its referen counting when assigned.
+ *
+ * Since: 5.2
+ */
+void
+gda_set_node_set_holder (GdaSetNode *node, GdaHolder *holder)
+{
+       g_return_if_fail (GDA_IS_HOLDER (holder));
+       if (GDA_IS_HOLDER (node->holder))
+               g_object_unref (node->holder);
+       node->holder = g_object_ref (holder);
+}
+
+/**
+ * gda_set_node_get_data_model:
+ * @node: a #GdaSetNode struct to get holder from
+ * 
+ * Returns: (transfer none): the #GdaDataModel used by @node
+ *
+ * Since: 5.2
+ */
+GdaDataModel*
+gda_set_node_get_data_model (GdaSetNode *node)
+{
+       g_return_val_if_fail (node, NULL);
+       return node->source_model;
+}
+
+/**
+ * gda_set_node_set_data_model:
+ * @node: a #GdaSetNode struct to set data model to
+ * @model: a #GdaDataModel to be used by @node
+ * 
+ * Set a #GdaDataModel to be used by @node. @model increment its reference
+ * counting when set. Internally referenced column number is set to first column
+ * in @model.
+ *
+ * Since: 5.2
+ */
+void
+gda_set_node_set_data_model (GdaSetNode *node, GdaDataModel *model)
+{
+       g_return_if_fail (node);
+       g_return_if_fail (GDA_IS_DATA_MODEL (model));
+       if (GDA_IS_DATA_MODEL (node->source_model))
+               g_object_unref (node->source_model);
+       node->source_model = g_object_ref (model);
+       node->source_column = 0;
+}
+
+/**
+ * gda_set_node_get_source_column:
+ * @node: a #GdaSetNode struct to get column source from 
+ * 
+ * Returns: the number of column referenced in a given #GdaDataModel. If negative
+ * no column is referenced or no #GdaDataModel is used by @node.
+ *
+ * Since: 5.2
+ */
+gint
+gda_set_node_get_source_column (GdaSetNode *node)
+{
+       g_return_val_if_fail (node, -1);
+       return node->source_column;
+}
+
+/**
+ * gda_set_node_set_source_column:
+ * @node: a #GdaSetNode struct to set column source to, from an used data model 
+ * 
+ * Set column number in the #GdaDataModel used @node. If no #GdaDataModel is set
+ * then column is set to invalid (-1);
+ *
+ * Since: 5.2
+ */
+void
+gda_set_node_set_source_column (GdaSetNode *node, gint column)
+{
+       g_return_if_fail (column >= 0);
+       if (GDA_IS_DATA_MODEL (node->source_model)) {
+               if (column < gda_data_model_get_n_columns (node->source_model))
+                       node->source_column = column;
+       }
+}
+
 /* 
  * Main static functions 
  */
@@ -1234,6 +1590,7 @@ void
 gda_set_remove_holder (GdaSet *set, GdaHolder *holder)
 {
        GdaSetNode *node;
+       GdaDataModel *model;
 
        g_return_if_fail (GDA_IS_SET (set));
        g_return_if_fail (set->priv);
@@ -1256,13 +1613,16 @@ gda_set_remove_holder (GdaSet *set, GdaHolder *holder)
        /* now destroy the GdaSetNode and the GdaSetSource if necessary */
        node = gda_set_get_node (set, holder);
        g_assert (node);
-       if (node->source_model) {
+       model = gda_set_node_get_data_model (node);
+       if (GDA_IS_DATA_MODEL (model)) {
                GdaSetSource *source;
+               GSList *nodes;
 
-               source = gda_set_get_source_for_model (set, node->source_model);
+               source = gda_set_get_source_for_model (set, model);
                g_assert (source);
-               g_assert (source->nodes);
-               if (! source->nodes->next)
+               nodes = gda_set_source_get_nodes (source);
+               g_assert (nodes);
+               if (! nodes->next)
                        set_remove_source (set, source);
        }
        set_remove_node (set, node);
@@ -1415,6 +1775,8 @@ compute_public_data (GdaSet *set)
        GdaSetSource *source;
        GdaSetGroup *group;
        GHashTable *groups = NULL;
+       GdaHolder *holder;
+       GdaDataModel *node_model;
 
        /*
         * Get rid of all the previous structures
@@ -1432,14 +1794,14 @@ compute_public_data (GdaSet *set)
         * Creation of the GdaSetNode structures
         */
        for (list = set->holders; list; list = list->next) {
-               node = g_new0 (GdaSetNode, 1);
-               node->holder = GDA_HOLDER (list->data);
-               node->source_model = gda_holder_get_source_model (node->holder,
-                                                                 &(node->source_column));
-               if (node->source_model)
-                       g_object_ref (node->source_model);
-               
-               set->nodes_list = g_slist_prepend (set->nodes_list, node);
+               holder = GDA_HOLDER (list->data);
+               if (GDA_IS_HOLDER (holder)) {
+                       gint col;
+                       node = gda_set_node_new (holder, gda_holder_get_source_model (holder, &col));
+                       gda_set_node_set_source_column (node, col);
+                       if (node)
+                               set->nodes_list = g_slist_prepend (set->nodes_list, node);
+               }
        }
        set->nodes_list = g_slist_reverse (set->nodes_list);
 
@@ -1451,13 +1813,13 @@ compute_public_data (GdaSet *set)
                
                /* source */
                source = NULL;
-               if (node->source_model) {
-                       source = gda_set_get_source_for_model (set, node->source_model);
+               node_model = gda_set_node_get_data_model (node);
+               if (GDA_IS_DATA_MODEL (node_model)) {
+                       source = gda_set_get_source_for_model (set, node_model);
                        if (source)
                                gda_set_source_add_node (source, node);
                        else {
-                               source = gda_set_source_new ();
-                               gda_set_source_set_data_model (source, node->source_model);
+                               source = gda_set_source_new (node_model);
                                gda_set_source_add_node (source, node);
                                set->sources_list = g_slist_prepend (set->sources_list, source);
                        }
@@ -1465,8 +1827,8 @@ compute_public_data (GdaSet *set)
 
                /* group */
                group = NULL;
-               if (node->source_model && groups)
-                       group = g_hash_table_lookup (groups, node->source_model);
+               if (GDA_IS_DATA_MODEL (node_model) && groups)
+                       group = g_hash_table_lookup (groups, node_model);
                if (group) 
                        gda_set_group_add_node (group, node);
                else {
@@ -1474,11 +1836,11 @@ compute_public_data (GdaSet *set)
                        gda_set_group_add_node (group, node);
                        gda_set_group_set_source (group, source);
                        set->groups_list = g_slist_prepend (set->groups_list, group);
-                       if (node->source_model) {
+                       if (GDA_IS_DATA_MODEL (node_model)) {
                                if (!groups)
                                        groups = g_hash_table_new (NULL, NULL); /* key = source model, 
                                                                                   value = GdaSetGroup */
-                               g_hash_table_insert (groups, node->source_model, group);
+                               g_hash_table_insert (groups, node_model, group);
                        }
                }               
        }
@@ -1570,7 +1932,7 @@ gda_set_real_add_holder (GdaSet *set, GdaHolder *holder)
        }
 
        similar = (GdaHolder*) g_hash_table_lookup (set->priv->holders_hash, hid);
-       if (!similar) {
+       if (GDA_IS_HOLDER (similar)) {
                /* really add @holder to the set */
                set->holders = g_slist_append (set->holders, holder);
                g_hash_table_insert (set->priv->holders_hash, (gchar*) hid, holder);
@@ -1635,24 +1997,16 @@ static void
 set_remove_node (GdaSet *set, GdaSetNode *node)
 {
        g_return_if_fail (g_slist_find (set->nodes_list, node));
-
-       if (node->source_model)
-               g_object_unref (G_OBJECT (node->source_model));
-
+       gda_set_node_free (node);
        set->nodes_list = g_slist_remove (set->nodes_list, node);
-       g_free (node);
 }
 
 static void
 set_remove_source (GdaSet *set, GdaSetSource *source)
 {
        g_return_if_fail (g_slist_find (set->sources_list, source));
-
-       if (source->nodes)
-               g_slist_free (source->nodes);
-
+       gda_set_source_free (source);
        set->sources_list = g_slist_remove (set->sources_list, source);
-       g_free (source);
 }
 
 /**
@@ -1773,13 +2127,18 @@ gda_set_get_node (GdaSet *set, GdaHolder *holder)
        g_return_val_if_fail (GDA_IS_SET (set), NULL);
        g_return_val_if_fail (set->priv, NULL);
        g_return_val_if_fail (GDA_IS_HOLDER (holder), NULL);
+       /* FIXME: May is better to use holder's hash for better performance */
        g_return_val_if_fail (g_slist_find (set->holders, holder), NULL);
 
        for (list = set->nodes_list; list && !retval; list = list->next) {
-               if (GDA_SET_NODE (list->data)->holder == holder)
-                       retval = GDA_SET_NODE (list->data);
+               GdaHolder *node_holder;
+               retval = GDA_SET_NODE (list->data);
+               node_holder = gda_set_node_get_holder (retval);
+               if (node_holder == holder) /* FIXME: May is better to compare holders ID */
+                       break;
+               else
+                       retval = NULL;
        }
-
        return retval;
 }
 
@@ -1797,10 +2156,12 @@ GdaSetSource *
 gda_set_get_source (GdaSet *set, GdaHolder *holder)
 {
        GdaSetNode *node;
-       
+       GdaDataModel *node_model;
+
        node = gda_set_get_node (set, holder);
-       if (node && node->source_model)
-               return gda_set_get_source_for_model (set, node->source_model);
+       node_model = gda_set_node_get_data_model (node);
+       if (node && GDA_IS_DATA_MODEL (node_model))
+               return gda_set_get_source_for_model (set, node_model);
        else
                return NULL;
 }
@@ -1818,24 +2179,34 @@ gda_set_get_source (GdaSet *set, GdaHolder *holder)
 GdaSetGroup *
 gda_set_get_group (GdaSet *set, GdaHolder *holder)
 {
+       GdaSetNode *node;
        GdaSetGroup *retval = NULL;
        GSList *list, *sublist;
+       GdaHolder *node_holder;
 
        g_return_val_if_fail (GDA_IS_SET (set), NULL);
        g_return_val_if_fail (set->priv, NULL);
        g_return_val_if_fail (GDA_IS_HOLDER (holder), NULL);
+       /* FIXME: May is better to use holder's hash for better performance */
        g_return_val_if_fail (g_slist_find (set->holders, holder), NULL);
 
        for (list = set->groups_list; list && !retval; list = list->next) {
-               sublist = GDA_SET_GROUP (list->data)->nodes;
+               GSList *l;
+               retval = GDA_SET_GROUP (list->data);
+               sublist = gda_set_group_get_nodes (retval);
                while (sublist && !retval) {
-                       if (GDA_SET_NODE (sublist->data)->holder == holder)
-                               retval = GDA_SET_GROUP (list->data);
-                       else
-                               sublist = g_slist_next (sublist);       
+                       node = GDA_SET_NODE (sublist->data);
+                       if (node) {
+                               node_holder = gda_set_node_get_holder (node);
+                               if (node_holder == holder) /* FIXME: May is better to compare holders ID */
+                                       break;
+                               else {
+                                       sublist = g_slist_next (sublist);
+                                       retval = NULL;
+                               }
+                       }
                }
        }
-
        return retval;
 }
 
@@ -1854,6 +2225,7 @@ GdaSetSource *
 gda_set_get_source_for_model (GdaSet *set, GdaDataModel *model)
 {
        GdaSetSource *retval = NULL;
+       GdaDataModel *source_model;
        GSList *list;
 
        g_return_val_if_fail (GDA_IS_SET (set), NULL);
@@ -1862,9 +2234,14 @@ gda_set_get_source_for_model (GdaSet *set, GdaDataModel *model)
 
        list = set->sources_list;
        while (list && !retval) {
-               if (GDA_SET_SOURCE (list->data)->data_model == model)
-                       retval = GDA_SET_SOURCE (list->data);
-
+               retval = GDA_SET_SOURCE (list->data);
+               source_model = gda_set_source_get_data_model (retval);
+               if (GDA_IS_DATA_MODEL (source_model)) {
+                       if (source_model == model)
+                               break;
+                       else 
+                               retval = NULL;
+               }
                list = g_slist_next (list);
        }
 
@@ -1889,6 +2266,8 @@ gda_set_get_source_for_model (GdaSet *set, GdaDataModel *model)
 void
 gda_set_replace_source_model (GdaSet *set, GdaSetSource *source, GdaDataModel *model)
 {
+       GdaDataModel *source_model;
+       
        g_return_if_fail (GDA_IS_SET (set));
        g_return_if_fail (source);
        g_return_if_fail (g_slist_find (set->sources_list, source));
@@ -1896,34 +2275,40 @@ gda_set_replace_source_model (GdaSet *set, GdaSetSource *source, GdaDataModel *m
        
        /* compare models */
        gint ncols, i;
-       ncols = gda_data_model_get_n_columns (source->data_model);
-       if (ncols != gda_data_model_get_n_columns (model)) {
-               g_warning (_("Replacing data model must have the same characteristics as the "
-                            "data model it replaces"));
-               return;
-       }
-       for (i = 0; i < ncols; i++) {
-               GdaColumn *c1, *c2;
-               GType t1, t2;
-               c1 = gda_data_model_describe_column (source->data_model, i);
-               c2 = gda_data_model_describe_column (model, i);
-               t1 = gda_column_get_g_type (c1);
-               t2 = gda_column_get_g_type (c2);
-
-               if ((t1 != GDA_TYPE_NULL) && (t2 != GDA_TYPE_NULL) && (t1 != t2)) {
+
+       source_model = gda_set_source_get_data_model (source);
+       if (GDA_IS_DATA_MODEL (source_model)) {
+               ncols = gda_data_model_get_n_columns (source_model);
+               /* FIXME: This way to compare two Data Models could be useful as a function
+                * gda_data_model_compare (GdaDataModel)
+                **/
+               if (ncols != gda_data_model_get_n_columns (model)) {
                        g_warning (_("Replacing data model must have the same characteristics as the "
-                                    "data model it replaces"));
+                                        "data model it replaces"));
                        return;
                }
+               for (i = 0; i < ncols; i++) {
+                       GdaColumn *c1, *c2;
+                       GType t1, t2;
+                       c1 = gda_data_model_describe_column (source->data_model, i);
+                       c2 = gda_data_model_describe_column (model, i);
+                       t1 = gda_column_get_g_type (c1);
+                       t2 = gda_column_get_g_type (c2);
+
+                       if ((t1 != GDA_TYPE_NULL) && (t2 != GDA_TYPE_NULL) && (t1 != t2)) {
+                               g_warning (_("Replacing data model must have the same characteristics as the "
+                                                "data model it replaces"));
+                               return;
+                       }
+               }
        }
 
        /* actually swap the models */
        GSList *list;
-       source->data_model = model;
-       for (list = source->nodes; list; list = list->next) {
-               GdaSetNode *node = (GdaSetNode*) list->data;
-               g_object_unref (node->source_model);
-               node->source_model = g_object_ref (model);
+       gda_set_source_set_data_model (source, model);
+       for (list = gda_set_source_get_nodes (source); list; list = list->next) {
+               GdaSetNode *node = GDA_SET_NODE (list->data);
+               gda_set_node_set_data_model (node, model);
                g_signal_handlers_block_by_func (G_OBJECT (node->holder),
                                                 G_CALLBACK (source_changed_holder_cb), set);
                gda_holder_set_source_model (GDA_HOLDER (node->holder), model, node->source_column,
@@ -1971,7 +2356,7 @@ set_group_dump (GdaSetGroup *group)
        g_print ("  GdaSetGroup %p\n", group);
        if (group) {
                GSList *list;
-               for (list = group->nodes; list; list = list->next)
+               for (list = gda_set_group_get_nodes (group); list; list = list->next)
                        g_print ("    - node: %p\n", list->data);
                g_print ("    - GdaSetSource: %p\n", group->nodes_source);
        }
diff --git a/libgda/gda-set.h b/libgda/gda-set.h
index fe8ed8b..a6ff349 100644
--- a/libgda/gda-set.h
+++ b/libgda/gda-set.h
@@ -27,12 +27,6 @@
 
 G_BEGIN_DECLS
 
-#define GDA_TYPE_SET          (gda_set_get_type())
-#define GDA_SET(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, gda_set_get_type(), GdaSet)
-#define GDA_SET_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, gda_set_get_type (), GdaSetClass)
-#define GDA_IS_SET(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, gda_set_get_type ())
-
-
 /* error reporting */
 extern GQuark gda_set_error_quark (void);
 #define GDA_SET_ERROR gda_set_error_quark ()
@@ -46,37 +40,45 @@ typedef enum
        GDA_SET_IMPLEMENTATION_ERROR
 } GdaSetError;
 
+#ifdef GSEAL_ENABLE
+#else
 struct _GdaSetNode {
-       GdaHolder    *holder;        /* Can't be NULL */
-       GdaDataModel *source_model;  /* may be NULL */
-       gint          source_column; /* unused if @source_model is NULL */
+       GdaHolder*    GSEAL(holder);
+       GdaDataModel* GSEAL(source_model);
+       gint          GSEAL(source_column);
 
        /*< private >*/
        /* Padding for future expansion */
-       gpointer      _gda_reserved1;
-       gpointer      _gda_reserved2;
+       gpointer      GSEAL(_gda_reserved1);
+       gpointer      GSEAL(_gda_reserved2);
 };
+#endif
 
+#define GDA_TYPE_SET_NODE (gda_set_node_get_type ())
 #define GDA_SET_NODE(x) ((GdaSetNode *)(x))
-
-
-/**
- * GdaSetGroup:
- * @nodes: (element-type Gda.SetNode): list of GdaSetNode, at least one entry
- * @nodes_source: (allow-none):  if NULL, then @nodes contains exactly one entry 
- *
- * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
- * Don't try to use #gda_meta_context_free on a struct that was created manually.
- */
+GType         gda_set_node_get_type          (void) G_GNUC_CONST;
+GdaSetNode   *gda_set_node_new               (GdaHolder *holder, GdaDataModel *model);
+void          gda_set_node_free              (GdaSetNode *node);
+GdaSetNode   *gda_set_node_copy              (GdaSetNode *node);
+GdaHolder    *gda_set_node_get_holder        (GdaSetNode *node);
+void          gda_set_node_set_holder        (GdaSetNode *node, GdaHolder *holder);
+GdaDataModel *gda_set_node_get_data_model    (GdaSetNode *node);
+void          gda_set_node_set_data_model    (GdaSetNode *node, GdaDataModel *model);
+gint          gda_set_node_get_source_column (GdaSetNode *node);
+void          gda_set_node_set_source_column (GdaSetNode *node, gint column);
+
+#ifdef GSEAL_ENABLE
+#else
 struct _GdaSetGroup {
-       GSList       *nodes;       /* list of GdaSetNode, at least one entry */
-       GdaSetSource *nodes_source; /* if NULL, then @nodes contains exactly one entry */
+       GSList*       GSEAL(nodes);       /* list of GdaSetNode, at least one entry */
+       GdaSetSource* GSEAL(nodes_source); /* if NULL, then @nodes contains exactly one entry */
 
        /*< private >*/
        /* Padding for future expansion */
-       gpointer      _gda_reserved1;
-       gpointer      _gda_reserved2;
+       gpointer      GSEAL(_gda_reserved1);
+       gpointer      GSEAL(_gda_reserved2);
 };
+#endif
 
 #define GDA_TYPE_SET_GROUP (gda_set_group_get_type ())
 #define GDA_SET_GROUP(x) ((GdaSetGroup *)(x))
@@ -85,40 +87,46 @@ GdaSetGroup  *gda_set_group_new             (void);
 void          gda_set_group_free            (GdaSetGroup *sg);
 GdaSetGroup  *gda_set_group_copy            (GdaSetGroup *sg);
 void          gda_set_group_add_node        (GdaSetGroup *sg, GdaSetNode *node);
+GdaSetNode   *gda_set_group_get_node        (GdaSetGroup *sg);
+GSList       *gda_set_group_get_nodes       (GdaSetGroup *sg);
+gint          gda_set_group_get_n_nodes     (GdaSetGroup *sg);
 void          gda_set_group_set_source      (GdaSetGroup *sg, GdaSetSource *source);
+GdaSetSource *gda_set_group_get_source      (GdaSetGroup *sg);
 
-
-/**
- * GdaSetSource:
- * @data_model: Can't be NULL
- * @nodes: (element-type Gda.SetNode): list of #GdaSetNode for which source_model == @data_model
- * 
- * Since 5.2, you must consider this struct as opaque. Any access to its internal must use public API.
- * Don't try to use #gda_meta_context_free on a struct that was created manually.
- **/
+#ifdef GSEAL_ENABLE
+#else
 struct _GdaSetSource {
-       GdaDataModel   *data_model;   /* Can't be NULL */
-       GSList         *nodes;        /* list of #GdaSetNode for which source_model == @data_model */
+       GdaDataModel*   GSEAL(data_model);   /* Can't be NULL */
+       GSList*         GSEAL(nodes);        /* list of #GdaSetNode for which source_model == @data_model */
 
        /*< private >*/
        /* Padding for future expansion */
-       gpointer        _gda_reserved1;
-       gpointer        _gda_reserved2;
-       gpointer        _gda_reserved3;
-       gpointer        _gda_reserved4;
+       gpointer        GSEAL(_gda_reserved1);
+       gpointer        GSEAL(_gda_reserved2);
+       gpointer        GSEAL(_gda_reserved3);
+       gpointer        GSEAL(_gda_reserved4);
 };
+#endif
 
 #define GDA_TYPE_SET_SOURCE (gda_set_source_get_type ())
 #define GDA_SET_SOURCE(x) ((GdaSetSource *)(x))
 GType         gda_set_source_get_type       (void) G_GNUC_CONST;
-GdaSetSource *gda_set_source_new            (void);
+GdaSetSource *gda_set_source_new            (GdaDataModel *model);
 void          gda_set_source_free           (GdaSetSource *s);
 GdaSetSource *gda_set_source_copy           (GdaSetSource *s);
 void          gda_set_source_add_node       (GdaSetSource *s, GdaSetNode *node);
+GSList       *gda_set_source_get_nodes      (GdaSetSource *s);
+GdaDataModel *gda_set_source_get_data_model (GdaSetSource *s);
 void          gda_set_source_set_data_model (GdaSetSource *s, GdaDataModel *model);
 
 /* struct for the object's data */
 
+#define GDA_TYPE_SET          (gda_set_get_type())
+#define GDA_SET(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, gda_set_get_type(), GdaSet)
+#define GDA_SET_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, gda_set_get_type (), GdaSetClass)
+#define GDA_IS_SET(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, gda_set_get_type ())
+
+/* FIXME: public members of GdaSet must be SEALED! */
 /**
  * GdaSet:
  * @holders: (element-type Gda.Holder): list of GdaHolder objects
diff --git a/libgda/gda-value.h b/libgda/gda-value.h
index bf29b72..2d280fa 100644
--- a/libgda/gda-value.h
+++ b/libgda/gda-value.h
@@ -79,20 +79,6 @@ typedef struct {
 typedef struct _GdaNumeric GdaNumeric;
 # ifdef GSEAL_ENABLE
 # else
-/**
- * GdaNumeric:
- * @number: a string representing a number
- * @precision: precision to use when @number is converted (not implemented jet)
- * @width: not implemented jet
- *
- * Holds numbers represented as strings.
- *
- * This struct must be considered as opaque. Any access to its members must use its
- * accessors added since version 5.0.2.
- *
- * Set value func: gda_value_set_numeric
- * Get value func: gda_value_get_numeric
- */
 struct _GdaNumeric {
        gchar*   GSEAL(number);
        glong    GSEAL(precision);
diff --git a/libgda/libgda-5.0.vapi b/libgda/libgda-5.0.vapi
index ed55d9a..2caa362 100644
--- a/libgda/libgda-5.0.vapi
+++ b/libgda/libgda-5.0.vapi
@@ -834,7 +834,7 @@ namespace Gda {
                public unowned Gda.SetGroup get_group (Gda.Holder holder);
                public unowned Gda.Holder get_holder (string holder_id);
                public unowned GLib.Value? get_holder_value (string holder_id);
-               public Gda.SetNode get_node (Gda.Holder holder);
+               public unowned Gda.SetNode get_node (Gda.Holder holder);
                public unowned Gda.Holder get_nth_holder (int pos);
                public unowned Gda.SetSource get_source (Gda.Holder holder);
                public unowned Gda.SetSource get_source_for_model (Gda.DataModel model);
@@ -871,18 +871,41 @@ namespace Gda {
                public void add_node (Gda.SetNode node);
                public Gda.SetGroup copy ();
                public void free ();
+               public int get_n_nodes ();
+               public Gda.SetNode get_node ();
+               public unowned GLib.SList<Gda.SetNode> get_nodes ();
+               public Gda.SetSource get_source ();
                public void set_source (Gda.SetSource source);
        }
+       [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = 
"g_boxed_free", type_id = "gda_set_node_get_type ()")]
+       [Compact]
+       public class SetNode {
+               public weak Gda.Holder holder;
+               public int source_column;
+               public weak Gda.DataModel source_model;
+               [CCode (has_construct_function = false)]
+               public SetNode (Gda.Holder holder, Gda.DataModel model);
+               public Gda.SetNode copy ();
+               public void free ();
+               public unowned Gda.DataModel get_data_model ();
+               public unowned Gda.Holder get_holder ();
+               public int get_source_column ();
+               public void set_data_model (Gda.DataModel model);
+               public void set_holder (Gda.Holder holder);
+               public void set_source_column (int column);
+       }
        [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = 
"g_boxed_free", type_id = "gda_set_source_get_type ()")]
        [Compact]
        public class SetSource {
                public weak Gda.DataModel data_model;
                public GLib.List<Gda.SetNode> nodes;
                [CCode (has_construct_function = false)]
-               public SetSource ();
+               public SetSource (Gda.DataModel model);
                public void add_node (Gda.SetNode node);
                public Gda.SetSource copy ();
                public void free ();
+               public unowned Gda.DataModel get_data_model ();
+               public unowned GLib.SList<Gda.SetNode> get_nodes ();
                public void set_data_model (Gda.DataModel model);
        }
        [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_short_get_type ()")]
@@ -1399,12 +1422,6 @@ namespace Gda {
                public GLib.Type g_type;
                public weak string dbms_type;
        }
-       [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
-       public struct SetNode {
-               public weak Gda.Holder holder;
-               public weak Gda.DataModel source_model;
-               public int source_column;
-       }
        [CCode (cheader_filename = "libgda/libgda.h")]
        [SimpleType]
        public struct SqlBuilderId : uint {
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index 47c686a..7bac4d3 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -635,6 +635,16 @@
        gda_set_get_source
        gda_set_get_source_for_model
        gda_set_get_type
+       gda_set_group_get_type
+       gda_set_group_new
+       gda_set_group_free
+       gda_set_group_copy
+       gda_set_group_add_node
+       gda_set_group_get_node
+       gda_set_group_get_nodes
+       gda_set_group_get_n_nodes
+       gda_set_group_set_source
+       gda_set_group_get_source
        gda_set_is_valid
        gda_set_merge_with_set
        gda_set_new
@@ -642,9 +652,27 @@
        gda_set_new_from_spec_node
        gda_set_new_from_spec_string
        gda_set_new_inline
+       gda_set_node_get_type
+       gda_set_node_new
+       gda_set_node_free
+       gda_set_node_copy
+       gda_set_node_get_holder
+       gda_set_node_set_holder
+       gda_set_node_get_data_model
+       gda_set_node_set_data_model
+       gda_set_node_get_source_column
+       gda_set_node_set_source_column
        gda_set_remove_holder
        gda_set_replace_source_model
        gda_set_set_holder_value
+       gda_set_source_get_type
+       gda_set_source_new
+       gda_set_source_free
+       gda_set_source_copy
+       gda_set_source_add_node
+       gda_set_source_get_nodes
+       gda_set_source_get_data_model
+       gda_set_source_set_data_model
        gda_short_get_type
        gda_sql_any_part_check_structure
        gda_sql_any_part_foreach


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]