[libgda] Honor the GDA_STATEMENT_MODEL_OFFLINE flag from the worker thread



commit a30b84c795e2d6349f6aeff97a641c3b120f8ed1
Author: Vivien Malerba <malerba gnome-db org>
Date:   Mon May 19 22:30:19 2014 +0200

    Honor the GDA_STATEMENT_MODEL_OFFLINE flag from the worker thread

 libgda/gda-connection.c                         |   49 ++++++-----------------
 libgda/gda-data-select.c                        |   20 ++++++---
 libgda/gda-server-provider.c                    |   18 +++++++-
 libgda/providers-support/gda-data-select-priv.h |    1 +
 4 files changed, 42 insertions(+), 46 deletions(-)
---
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index 9260b2e..c0cedee 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -2998,11 +2998,6 @@ gda_connection_statement_execute_v (GdaConnection *cnc, GdaStatement *stmt, GdaS
                if (timer)
                        add_exec_time_to_object (obj, timer);
                update_meta_store_after_statement_exec (cnc, stmt, params);
-               if (GDA_IS_DATA_SELECT (obj) && (model_usage & GDA_STATEMENT_MODEL_OFFLINE) &&
-                   ! gda_data_select_prepare_for_offline ((GdaDataSelect*) obj, error)) {
-                       g_object_unref (obj);
-                       obj = NULL;
-               }
        }
 
        g_object_unref ((GObject*) cnc);
@@ -3361,19 +3356,12 @@ gda_connection_statement_execute_select_fullv (GdaConnection *cnc, GdaStatement
                add_exec_time_to_object ((GObject*) model, timer);
        if (timer)
                g_timer_destroy (timer);
-       if (model) {
-               if (GDA_IS_DATA_SELECT (model) && (model_usage & GDA_STATEMENT_MODEL_OFFLINE) &&
-                   ! gda_data_select_prepare_for_offline ((GdaDataSelect*) model, error)) {
-                       g_object_unref (model);
-                       model = NULL;
-               }
-               else if (!GDA_IS_DATA_MODEL (model)) {
-                       g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_STATEMENT_TYPE_ERROR,
-                                    "%s", _("Statement is not a selection statement"));
-                       g_object_unref (model);
-                       model = NULL;
-                       update_meta_store_after_statement_exec (cnc, stmt, params);
-               }
+       if (model && !GDA_IS_DATA_MODEL (model)) {
+               g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_STATEMENT_TYPE_ERROR,
+                            "%s", _("Statement is not a selection statement"));
+               g_object_unref (model);
+               model = NULL;
+               update_meta_store_after_statement_exec (cnc, stmt, params);
        }
        return model;
 }
@@ -3450,19 +3438,12 @@ gda_connection_statement_execute_select_full (GdaConnection *cnc, GdaStatement *
 
        if (model && timer)
                add_exec_time_to_object ((GObject*) model, timer);
-       if (model) {
-               if (GDA_IS_DATA_SELECT (model) && (model_usage & GDA_STATEMENT_MODEL_OFFLINE) &&
-                   ! gda_data_select_prepare_for_offline ((GdaDataSelect*) model, error)) {
-                       g_object_unref (model);
-                       model = NULL;
-               }
-               else if (!GDA_IS_DATA_MODEL (model)) {
-                       g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_STATEMENT_TYPE_ERROR,
-                                    "%s", _("Statement is not a selection statement"));
-                       g_object_unref (model);
-                       model = NULL;
-                       update_meta_store_after_statement_exec (cnc, stmt, params);
-               }
+       if (model && !GDA_IS_DATA_MODEL (model)) {
+               g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_STATEMENT_TYPE_ERROR,
+                            "%s", _("Statement is not a selection statement"));
+               g_object_unref (model);
+               model = NULL;
+               update_meta_store_after_statement_exec (cnc, stmt, params);
        }
        if (timer)
                g_timer_destroy (timer);
@@ -3561,12 +3542,6 @@ gda_connection_repetitive_statement_execute (GdaConnection *cnc, GdaRepetitiveSt
                                add_exec_time_to_object (obj, timer);
                        update_meta_store_after_statement_exec (cnc, stmt, (GdaSet*) list->data);
 
-                       if (GDA_IS_DATA_SELECT (obj) && (model_usage & GDA_STATEMENT_MODEL_OFFLINE) &&
-                           ! gda_data_select_prepare_for_offline ((GdaDataSelect*) obj, error)) {
-                               g_object_unref (obj);
-                               obj = NULL;
-                       }
-
                        if (obj)
                                retlist = g_slist_prepend (retlist, obj);
                }
diff --git a/libgda/gda-data-select.c b/libgda/gda-data-select.c
index 47d1c8d..e9e4d0c 100644
--- a/libgda/gda-data-select.c
+++ b/libgda/gda-data-select.c
@@ -543,6 +543,19 @@ _gda_data_select_share_private_data (GdaDataSelect *master, GdaDataSelect *slave
        slave->priv->sh = master->priv->sh;
 }
 
+/*
+ * Allows the #GdaServerProvider object to adjust the "model-usage" property for extra flags as OFFLINE and
+ * ALLOW_NOPARAM. Only these flags are taken from @flags and added to the current "model-usage" flags of 
@model.
+ */
+void
+_gda_data_select_update_usage_flags (GdaDataSelect *model, GdaDataModelAccessFlags flags)
+{
+       GdaDataModelAccessFlags eflags;
+       eflags = model->priv->sh->usage_flags;
+       eflags |= flags & (GDA_STATEMENT_MODEL_OFFLINE | GDA_STATEMENT_MODEL_ALLOW_NOPARAM);
+       model->priv->sh->usage_flags = eflags;
+}
+
 void
 _gda_data_select_internals_free (GdaDataSelectInternals *inter)
 {
@@ -3695,13 +3708,6 @@ gda_data_select_rerun (GdaDataSelect *model, GError **error)
                                                                                   error);
        g_free (types);
 
-       /* post treatment */
-       if (new_model && (model->priv->sh->usage_flags & GDA_STATEMENT_MODEL_OFFLINE) &&
-           ! gda_data_select_prepare_for_offline (new_model, error)) {
-               g_object_unref (new_model);
-               return FALSE;
-       }
-
        if (!new_model) {
                /* FIXME: clear all the rows in @model, and emit the "reset" signal */
                return FALSE;
diff --git a/libgda/gda-server-provider.c b/libgda/gda-server-provider.c
index 471ca06..e1d4273 100644
--- a/libgda/gda-server-provider.c
+++ b/libgda/gda-server-provider.c
@@ -48,6 +48,7 @@
 #include <libgda/gda-connection-private.h>
 #include <libgda/gda-connection-internal.h>
 #include <libgda/gda-debug-macros.h>
+#include "providers-support/gda-data-select-priv.h"
 
 #define CLASS(provider) (GDA_SERVER_PROVIDER_CLASS (G_OBJECT_GET_CLASS (provider)))
 #define GDA_DEBUG_VIRTUAL
@@ -2462,7 +2463,6 @@ typedef struct {
        GdaSet               **last_inserted_row;
 } WorkerExecuteStatementData;
 
-
 static gpointer
 worker_statement_execute (WorkerExecuteStatementData *data, GError **error)
 {
@@ -2477,7 +2477,21 @@ worker_statement_execute (WorkerExecuteStatementData *data, GError **error)
        }
 
        GObject *result;
-       result = fset->statement_execute (data->provider, data->cnc, data->stmt, data->params, 
data->model_usage, data->col_types, data->last_inserted_row, error);
+       result = fset->statement_execute (data->provider, data->cnc, data->stmt, data->params, 
data->model_usage,
+                                         data->col_types, data->last_inserted_row, error);
+
+       if (GDA_IS_DATA_SELECT (result)) {
+               /* adjust flags because the providers don't necessarily do it: make sure extra flags as 
OFFLINE and
+                * ALLOW_NOPARAM are included */
+               _gda_data_select_update_usage_flags ((GdaDataSelect*) result, data->model_usage);
+
+               /* if necessary honor the OFFLINE flag */
+               if ((data->model_usage & GDA_STATEMENT_MODEL_OFFLINE) &&
+                   ! gda_data_select_prepare_for_offline ((GdaDataSelect*) result, error)) {
+                       g_object_unref (result);
+                       result = NULL;
+               }
+       }
 
        return (gpointer) result;
 }
diff --git a/libgda/providers-support/gda-data-select-priv.h b/libgda/providers-support/gda-data-select-priv.h
index ce0c5e1..be79abc 100644
--- a/libgda/providers-support/gda-data-select-priv.h
+++ b/libgda/providers-support/gda-data-select-priv.h
@@ -65,6 +65,7 @@ void           gda_data_select_set_columns                  (GdaDataSelect *mode
 void           gda_data_select_add_exception                (GdaDataSelect *model, GError *error);
 
 /* internal API */
+void           _gda_data_select_update_usage_flags (GdaDataSelect *model, GdaDataModelAccessFlags flags);
 void           _gda_data_select_share_private_data (GdaDataSelect *master, GdaDataSelect *slave);
 
 G_END_DECLS


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