[libgda] Added gda_data_select_rerun()



commit e8d5d7e9c1a79bbeec6154023bad7e1457a35f4f
Author: Vivien Malerba <malerba gnome-db org>
Date:   Tue Oct 6 20:30:43 2009 +0200

    Added gda_data_select_rerun()

 libgda/gda-data-select.c |  211 +++++++++++++++++++++++++---------------------
 libgda/gda-data-select.h |    2 +
 2 files changed, 117 insertions(+), 96 deletions(-)
---
diff --git a/libgda/gda-data-select.c b/libgda/gda-data-select.c
index 376d404..f787de3 100644
--- a/libgda/gda-data-select.c
+++ b/libgda/gda-data-select.c
@@ -352,106 +352,12 @@ static void
 ext_params_holder_changed_cb (GdaSet *paramlist, GdaHolder *param, GdaDataSelect *model)
 {
 	if (model->priv->sh->reset_with_ext_params_change) {
-		GdaDataSelect *new_model;
-		GdaStatement *select;
 		GError *error = NULL;
-
-		select = check_acceptable_statement (model, &error);
-		if (!select) {
-			g_warning (_("Could not re-run SELECT statement: %s"),
-				   error && error->message ? error->message : _("No detail"));
-			if (error)
-				g_error_free (error);
-			return;
-		}
-		g_assert (model->prep_stmt);
-		GType *types = NULL;
-		if (model->prep_stmt->types) {
-			types = g_new (GType, model->prep_stmt->ncols + 1);
-			memcpy (types, model->prep_stmt->types, sizeof (GType) * model->prep_stmt->ncols);
-			types [model->prep_stmt->ncols] = G_TYPE_NONE;
-		}
-		new_model = (GdaDataSelect*) gda_connection_statement_execute_select_full (model->priv->cnc, select, 
-											   model->priv->sh->ext_params, 
-											   model->priv->sh->usage_flags | GDA_STATEMENT_MODEL_ALLOW_NOPARAM,
-											   types, 
-											   &error);
-		g_free (types);
-		if (!new_model) {
+		if (! gda_data_select_rerun (model, &error)) {
 			g_warning (_("Could not re-run SELECT statement: %s"),
 				   error && error->message ? error->message : _("No detail"));
-			if (error)
-				g_error_free (error);
-			/* FIXME: clear all the rows in @model, and emit the "reset" signal */
-			return;
-		}
-
-		g_assert (G_OBJECT_TYPE (model) == G_OBJECT_TYPE (new_model));
-
-		/* Raw model and new_model contents swap (except for the GObject part) */
-		GTypeQuery tq;
-		gpointer copy;
-		gint offset = sizeof (GObject);
-		gint size;
-		g_type_query (G_OBJECT_TYPE (model), &tq);
-		size = tq.instance_size - offset;
-		copy = g_malloc (size);
-		memcpy (copy, (gint8*) new_model + offset, size);
-		memcpy ((gint8*) new_model + offset, (gint8*) model + offset, size);
-		memcpy ((gint8*) model + offset, copy, size);
-		
-		/* we need to keep some data from the old model */
-		GdaDataSelect *old_model = new_model; /* renamed for code's readability */
-		GdaDataSelectInternals *mi;
-	      
-		model->priv->sh->reset_with_ext_params_change = old_model->priv->sh->reset_with_ext_params_change;
-		mi = old_model->priv->sh->modif_internals;
-		old_model->priv->sh->modif_internals = model->priv->sh->modif_internals;
-		model->priv->sh->modif_internals = mi;
-
-		copy = old_model->priv->sh->sel_stmt;
-		old_model->priv->sh->sel_stmt = model->priv->sh->sel_stmt;
-		model->priv->sh->sel_stmt = (GdaStatement*) copy;
-
-		/* keep the same GdaColumn pointers */
-		GSList *l1, *l2;
-		l1 = old_model->priv->sh->columns;
-		old_model->priv->sh->columns = model->priv->sh->columns;
-		model->priv->sh->columns = l1;
-		for (l1 = model->priv->sh->columns, l2 = old_model->priv->sh->columns;
-		     l1 && l2;
-		     l1 = l1->next, l2 = l2->next) {
-			if ((gda_column_get_g_type ((GdaColumn*) l1->data) == GDA_TYPE_NULL) &&
-			    (gda_column_get_g_type ((GdaColumn*) l2->data) != GDA_TYPE_NULL))
-				gda_column_set_g_type ((GdaColumn*) l1->data, 
-						       gda_column_get_g_type ((GdaColumn*) l2->data));
-		}
-
-		g_object_unref (old_model);
-
-		/* copy all the param's holders' values from model->priv->sh->ext_params to 
-		   to model->priv->sh->modif_internals->exec_set */
-		GSList *list;
-		for (list = model->priv->sh->ext_params->holders; list; list = list->next) {
-			GdaHolder *h;
-			h = gda_set_get_holder (model->priv->sh->modif_internals->exec_set,
-						gda_holder_get_id (list->data));
-			if (h) {
-				if (!gda_holder_is_valid (GDA_HOLDER (list->data))) 
-					gda_holder_set_value (h, gda_holder_get_value (GDA_HOLDER (list->data)), NULL);
-				else if (! gda_holder_set_value (h, gda_holder_get_value (GDA_HOLDER (list->data)),
-								 &error)) {
-					g_warning (_("An error has occurred, the value returned by the \"exec-params\" "
-						     "property will be wrong: %s"),
-						   error && error->message ? error->message : _("No detail"));
-					if (error)
-						g_error_free (error);
-				}
-			}
+			g_clear_error (&error);
 		}
-
-		/* signal a reset */
-		gda_data_model_reset ((GdaDataModel*) model);
 	}
 }
 
@@ -3312,3 +3218,116 @@ gda_data_select_compute_columns_attributes (GdaDataSelect *model, GError **error
 
 	return TRUE;
 }
+
+/**
+ * gda_data_select_rerun
+ * @model: a #GdaDataSelect data model
+ * @error: a place to store errors, or %NULL
+ *
+ * Requests that @model be re-run to have an updated result. If an error occurs,
+ * then @model will not be changed.
+ *
+ * Returns: %TRUE if no error occurred
+ *
+ * Since: 4.2
+ */
+gboolean
+gda_data_select_rerun (GdaDataSelect *model, GError **error)
+{
+	g_return_val_if_fail (GDA_IS_DATA_SELECT (model), FALSE);
+
+	GdaDataSelect *new_model;
+	GdaStatement *select;
+
+	select = check_acceptable_statement (model, error);
+	if (!select)
+		return FALSE;
+	g_assert (model->prep_stmt);
+	GType *types = NULL;
+	if (model->prep_stmt->types) {
+		types = g_new (GType, model->prep_stmt->ncols + 1);
+		memcpy (types, model->prep_stmt->types, sizeof (GType) * model->prep_stmt->ncols);
+		types [model->prep_stmt->ncols] = G_TYPE_NONE;
+	}
+	new_model = (GdaDataSelect*) gda_connection_statement_execute_select_full (model->priv->cnc, select, 
+										   model->priv->sh->ext_params, 
+										   model->priv->sh->usage_flags | GDA_STATEMENT_MODEL_ALLOW_NOPARAM,
+										   types, 
+										   error);
+	g_free (types);
+	if (!new_model) {
+		/* FIXME: clear all the rows in @model, and emit the "reset" signal */
+		return FALSE;
+	}
+
+	g_assert (G_OBJECT_TYPE (model) == G_OBJECT_TYPE (new_model));
+
+	/* Raw model and new_model contents swap (except for the GObject part) */
+	GTypeQuery tq;
+	gpointer copy;
+	gint offset = sizeof (GObject);
+	gint size;
+	g_type_query (G_OBJECT_TYPE (model), &tq);
+	size = tq.instance_size - offset;
+	copy = g_malloc (size);
+	memcpy (copy, (gint8*) new_model + offset, size);
+	memcpy ((gint8*) new_model + offset, (gint8*) model + offset, size);
+	memcpy ((gint8*) model + offset, copy, size);
+		
+	/* we need to keep some data from the old model */
+	GdaDataSelect *old_model = new_model; /* renamed for code's readability */
+	GdaDataSelectInternals *mi;
+	      
+	model->priv->sh->reset_with_ext_params_change = old_model->priv->sh->reset_with_ext_params_change;
+	mi = old_model->priv->sh->modif_internals;
+	old_model->priv->sh->modif_internals = model->priv->sh->modif_internals;
+	model->priv->sh->modif_internals = mi;
+
+	copy = old_model->priv->sh->sel_stmt;
+	old_model->priv->sh->sel_stmt = model->priv->sh->sel_stmt;
+	model->priv->sh->sel_stmt = (GdaStatement*) copy;
+
+	/* keep the same GdaColumn pointers */
+	GSList *l1, *l2;
+	l1 = old_model->priv->sh->columns;
+	old_model->priv->sh->columns = model->priv->sh->columns;
+	model->priv->sh->columns = l1;
+	for (l1 = model->priv->sh->columns, l2 = old_model->priv->sh->columns;
+	     l1 && l2;
+	     l1 = l1->next, l2 = l2->next) {
+		if ((gda_column_get_g_type ((GdaColumn*) l1->data) == GDA_TYPE_NULL) &&
+		    (gda_column_get_g_type ((GdaColumn*) l2->data) != GDA_TYPE_NULL))
+			gda_column_set_g_type ((GdaColumn*) l1->data, 
+					       gda_column_get_g_type ((GdaColumn*) l2->data));
+	}
+
+	g_object_unref (old_model);
+
+	/* copy all the param's holders' values from model->priv->sh->ext_params to 
+	   to model->priv->sh->modif_internals->exec_set */
+	GSList *list;
+	if (model->priv->sh->ext_params) {
+		for (list = model->priv->sh->ext_params->holders; list; list = list->next) {
+			GdaHolder *h;
+			h = gda_set_get_holder (model->priv->sh->modif_internals->exec_set,
+						gda_holder_get_id (list->data));
+			if (h) {
+				GError *lerror = NULL;
+				if (!gda_holder_is_valid (GDA_HOLDER (list->data))) 
+					gda_holder_set_value (h, gda_holder_get_value (GDA_HOLDER (list->data)), NULL);
+				else if (! gda_holder_set_value (h, gda_holder_get_value (GDA_HOLDER (list->data)),
+								 &lerror)) {
+					g_warning (_("An error has occurred, the value returned by the \"exec-params\" "
+						     "property will be wrong: %s"),
+						   lerror && lerror->message ? lerror->message : _("No detail"));
+					g_clear_error (&lerror);
+				}
+			}
+		}
+	}
+
+	/* signal a reset */
+	gda_data_model_reset ((GdaDataModel*) model);
+
+	return TRUE;
+}
diff --git a/libgda/gda-data-select.h b/libgda/gda-data-select.h
index a812b89..85cb733 100644
--- a/libgda/gda-data-select.h
+++ b/libgda/gda-data-select.h
@@ -114,6 +114,8 @@ gboolean       gda_data_select_compute_modification_statements (GdaDataSelect *m
 gboolean       gda_data_select_compute_columns_attributes      (GdaDataSelect *model, GError **error);
 GdaConnection *gda_data_select_get_connection                  (GdaDataSelect *model);
 
+gboolean       gda_data_select_rerun                           (GdaDataSelect *model, GError **error);
+
 G_END_DECLS
 
 #endif



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