[libgda] Honor the GDA_STATEMENT_MODEL_OFFLINE flag from the worker thread
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Honor the GDA_STATEMENT_MODEL_OFFLINE flag from the worker thread
- Date: Tue, 20 May 2014 20:11:50 +0000 (UTC)
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]