[libgda] GdaDataSelect: don't try to execute delayed SELECT more than once on error
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] GdaDataSelect: don't try to execute delayed SELECT more than once on error
- Date: Sat, 24 Sep 2011 19:49:38 +0000 (UTC)
commit 85b85fbbff77daadb54798b7d28996d23c7a61b3
Author: Vivien Malerba <malerba gnome-db org>
Date: Sat Sep 24 21:20:31 2011 +0200
GdaDataSelect: don't try to execute delayed SELECT more than once on error
libgda/gda-data-select.c | 52 ++++++++++++++++++++++++++++++++++++++--------
1 files changed, 43 insertions(+), 9 deletions(-)
---
diff --git a/libgda/gda-data-select.c b/libgda/gda-data-select.c
index ebe78ce..1eb485c 100644
--- a/libgda/gda-data-select.c
+++ b/libgda/gda-data-select.c
@@ -46,6 +46,7 @@ typedef struct {
GdaStatement *select;
GdaSet *params;
GdaRow *row; /* non NULL once @select has been executed */
+ GError *exec_error; /* NULL if an execution error occurred */
} DelayedSelectStmt;
static void delayed_select_stmt_free (DelayedSelectStmt *dstmt);
@@ -1799,11 +1800,18 @@ external_to_internal_row (GdaDataSelect *model, gint ext_row, GError **error)
static void foreach_func_dump (gpointer key, gpointer value, gpointer dummy)
{
g_print (" row %d => %p\n", *(const gint*) key, value);
+ DelayedSelectStmt *dstmt;
+ dstmt = (DelayedSelectStmt *) value;
+ gchar *sql;
+ sql = gda_statement_to_sql_extended (dstmt->select, NULL, dstmt->params,
+ GDA_STATEMENT_SQL_PARAMS_AS_VALUES, NULL, NULL);
+ g_print ("\tSQL: [%s]\n", sql);
+ g_free (sql);
}
static void dump_d (GdaDataSelect *model)
{
if (model->priv->sh->upd_rows) {
- g_print ("Delayed SELECT for %p:\n", model);
+ g_print ("Delayed SELECT for data model %p:\n", model);
g_hash_table_foreach (model->priv->sh->upd_rows, foreach_func_dump, NULL);
}
}
@@ -1854,10 +1862,18 @@ gda_data_select_get_value_at (GdaDataModel *model, gint col, gint row, GError **
dstmt = g_hash_table_lookup (imodel->priv->sh->upd_rows, &int_row);
if (dstmt) {
if (! dstmt->row) {
+ if (dstmt->exec_error) {
+ if (error)
+ g_propagate_error (error, g_error_copy (dstmt->exec_error));
+ return NULL;
+ }
GdaDataModel *tmpmodel;
if (!dstmt->select || !dstmt->params) {
- g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
- "%s", _("Unable to retrieve data after modifications"));
+ g_set_error (&(dstmt->exec_error),
+ GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
+ "%s", _("Unable to retrieve data after modifications"));
+ if (error)
+ g_propagate_error (error, g_error_copy (dstmt->exec_error));
return NULL;
}
GType *types = NULL;
@@ -1867,6 +1883,7 @@ gda_data_select_get_value_at (GdaDataModel *model, gint col, gint row, GError **
sizeof (GType) * imodel->prep_stmt->ncols);
types [imodel->prep_stmt->ncols] = G_TYPE_NONE;
}
+ /*g_print ("*** Executing DelayedSelectStmt %p\n", dstmt);*/
tmpmodel = gda_connection_statement_execute_select_full (imodel->priv->cnc,
dstmt->select,
dstmt->params,
@@ -1876,16 +1893,22 @@ gda_data_select_get_value_at (GdaDataModel *model, gint col, gint row, GError **
g_free (types);
if (!tmpmodel) {
- g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
+ g_set_error (&(dstmt->exec_error),
+ GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
"%s", _("Unable to retrieve data after modifications, no further modification will be allowed"));
+ if (error)
+ g_propagate_error (error, g_error_copy (dstmt->exec_error));
imodel->priv->sh->modif_internals->safely_locked = TRUE;
return NULL;
}
if (gda_data_model_get_n_rows (tmpmodel) != 1) {
g_object_unref (tmpmodel);
- g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
+ g_set_error (&(dstmt->exec_error),
+ GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
"%s", _("Unable to retrieve data after modifications, no further modification will be allowed"));
+ if (error)
+ g_propagate_error (error, g_error_copy (dstmt->exec_error));
imodel->priv->sh->modif_internals->safely_locked = TRUE;
return NULL;
}
@@ -1897,17 +1920,26 @@ gda_data_select_get_value_at (GdaDataModel *model, gint col, gint row, GError **
GValue *value;
const GValue *cvalue;
value = gda_row_get_value (prow, i);
- cvalue = gda_data_model_get_value_at (tmpmodel, i, 0, error);
- if (!cvalue)
+ cvalue = gda_data_model_get_value_at (tmpmodel, i, 0,
+ &(dstmt->exec_error));
+ if (!cvalue) {
+ if (error)
+ g_propagate_error (error,
+ g_error_copy (dstmt->exec_error));
return NULL;
+ }
if (!gda_value_is_null (cvalue)) {
gda_value_reset_with_type (value, G_VALUE_TYPE (cvalue));
if (! gda_value_set_from_value (value, cvalue)) {
g_object_unref (tmpmodel);
g_object_unref (prow);
- g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
- "%s", _("Unable to retrieve data after modifications, no further modification will be allowed"));
+ g_set_error (&(dstmt->exec_error),
+ GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
+ "%s", _("Unable to retrieve data after modifications, no further modification will be allowed"));
+ if (error)
+ g_propagate_error (error,
+ g_error_copy (dstmt->exec_error));
imodel->priv->sh->modif_internals->safely_locked = TRUE;
return NULL;
}
@@ -2853,6 +2885,8 @@ delayed_select_stmt_free (DelayedSelectStmt *dstmt)
g_object_unref (dstmt->params);
if (dstmt->row)
g_object_unref (dstmt->row);
+ if (dstmt->exec_error)
+ g_error_free (dstmt->exec_error);
g_free (dstmt);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]