[libgda/LIBGDA_4.2] Improved connections binding handling of strange cases
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda/LIBGDA_4.2] Improved connections binding handling of strange cases
- Date: Wed, 18 Jan 2012 17:45:50 +0000 (UTC)
commit 354f3c0974926415327c4232de87eb0164f6fb4c
Author: Vivien Malerba <malerba gnome-db org>
Date: Wed Jan 18 16:00:23 2012 +0100
Improved connections binding handling of strange cases
libgda/sqlite/virtual/gda-vconnection-data-model.c | 92 +++++++++++---------
libgda/sqlite/virtual/gda-vconnection-hub.c | 5 +-
libgda/sqlite/virtual/gda-vprovider-data-model.c | 8 ++-
3 files changed, 60 insertions(+), 45 deletions(-)
---
diff --git a/libgda/sqlite/virtual/gda-vconnection-data-model.c b/libgda/sqlite/virtual/gda-vconnection-data-model.c
index b399d49..f9ce827 100644
--- a/libgda/sqlite/virtual/gda-vconnection-data-model.c
+++ b/libgda/sqlite/virtual/gda-vconnection-data-model.c
@@ -37,6 +37,8 @@ static void gda_vconnection_data_model_class_init (GdaVconnectionDataModelClass
static void gda_vconnection_data_model_init (GdaVconnectionDataModel *cnc, GdaVconnectionDataModelClass *klass);
static void gda_vconnection_data_model_dispose (GObject *object);
+static gboolean get_rid_of_vtable (GdaVconnectionDataModel *cnc, GdaVConnectionTableData *td, gboolean force, GError **error);
+
enum {
VTABLE_CREATED,
VTABLE_DROPPED,
@@ -147,8 +149,12 @@ gda_vconnection_data_model_dispose (GObject *object)
/* free memory */
if (cnc->priv) {
+ while (cnc->priv->table_data_list) {
+ GdaVConnectionTableData *td;
+ td = (GdaVConnectionTableData *) cnc->priv->table_data_list->data;
+ get_rid_of_vtable (cnc, td, TRUE, NULL);
+ }
gda_connection_close_no_warning ((GdaConnection *) cnc);
- g_assert (!cnc->priv->table_data_list);
g_free (cnc->priv);
cnc->priv = NULL;
@@ -337,6 +343,44 @@ gda_vconnection_data_model_add (GdaVconnectionDataModel *cnc, GdaVconnectionData
return retval;
}
+static gboolean
+get_rid_of_vtable (GdaVconnectionDataModel *cnc, GdaVConnectionTableData *td, gboolean force, GError **error)
+{
+ gchar *str;
+ int rc;
+ char *zErrMsg = NULL;
+ gboolean allok = TRUE;
+
+ SqliteConnectionData *scnc;
+ scnc = (SqliteConnectionData*) gda_connection_internal_get_provider_data ((GdaConnection *) cnc);
+ if (!scnc && !force)
+ return FALSE;
+
+ if (scnc) {
+ str = g_strdup_printf ("DROP TABLE %s", td->table_name);
+ rc = SQLITE3_CALL (sqlite3_exec) (scnc->connection, str, NULL, 0, &zErrMsg);
+ g_free (str);
+
+ if (rc != SQLITE_OK) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
+ GDA_SERVER_PROVIDER_INTERNAL_ERROR,
+ "%s", zErrMsg);
+ SQLITE3_CALL (sqlite3_free) (zErrMsg);
+ allok = FALSE;
+ if (!force)
+ return FALSE;
+ }
+ }
+
+ /* clean the cnc->priv->table_data_list list */
+ cnc->priv->table_data_list = g_slist_remove (cnc->priv->table_data_list, td);
+ g_signal_emit (G_OBJECT (cnc), gda_vconnection_data_model_signals[VTABLE_DROPPED], 0,
+ td->table_name);
+ /*g_print ("Virtual connection: removed table %s (%p)\n", td->table_name, td->spec->data_model);*/
+ gda_vconnection_data_model_table_data_free (td);
+
+ return allok;
+}
/**
* gda_vconnection_data_model_remove:
@@ -354,20 +398,9 @@ gda_vconnection_data_model_remove (GdaVconnectionDataModel *cnc, const gchar *ta
{
GdaVConnectionTableData *td;
- GdaVirtualProvider *prov;
- gchar *str;
- int rc;
- char *zErrMsg = NULL;
- gboolean retval = TRUE;
- SqliteConnectionData *scnc;
-
g_return_val_if_fail (GDA_IS_VCONNECTION_DATA_MODEL (cnc), FALSE);
g_return_val_if_fail (table_name && *table_name, FALSE);
- scnc = (SqliteConnectionData*) gda_connection_internal_get_provider_data ((GdaConnection *) cnc);
- if (!scnc)
- return FALSE;
-
td = gda_vconnection_get_table_data_by_name (cnc, table_name);
if (!td) {
g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
@@ -375,30 +408,8 @@ gda_vconnection_data_model_remove (GdaVconnectionDataModel *cnc, const gchar *ta
"%s", _("Table to remove not found"));
return FALSE;
}
-
- prov = (GdaVirtualProvider *) gda_connection_get_provider (GDA_CONNECTION (cnc));
- str = g_strdup_printf ("DROP TABLE %s", td->table_name);
- rc = SQLITE3_CALL (sqlite3_exec) (scnc->connection, str, NULL, 0, &zErrMsg);
- g_free (str);
-
- if (rc != SQLITE_OK) {
- g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
- GDA_SERVER_PROVIDER_INTERNAL_ERROR,
- "%s", zErrMsg);
- SQLITE3_CALL (sqlite3_free) (zErrMsg);
- return FALSE;
- }
- else {
- /* clean the cnc->priv->table_data_list list */
- cnc->priv->table_data_list = g_slist_remove (cnc->priv->table_data_list, td);
- g_signal_emit (G_OBJECT (cnc), gda_vconnection_data_model_signals[VTABLE_DROPPED], 0,
- td->table_name);
- /*g_print ("Virtual connection: removed table %s (%p)\n", td->table_name, td->spec->data_model);*/
- gda_vconnection_data_model_table_data_free (td);
- return TRUE;
- }
- return retval;
+ return get_rid_of_vtable (cnc, td, FALSE, error);
}
/**
@@ -496,20 +507,19 @@ void
gda_vconnection_data_model_foreach (GdaVconnectionDataModel *cnc,
GdaVconnectionDataModelFunc func, gpointer data)
{
- GSList *list, *next;
+ GSList *copy, *list;
g_return_if_fail (GDA_IS_VCONNECTION_DATA_MODEL (cnc));
g_return_if_fail (cnc->priv);
- if (!func)
+ if (!func || !cnc->priv->table_data_list)
return;
- list = cnc->priv->table_data_list;
- while (list) {
+ copy = g_slist_copy (cnc->priv->table_data_list);
+ for (list = copy; list; list = list->next) {
GdaVConnectionTableData *td = (GdaVConnectionTableData*) list->data;
- next = list->next;
func (td->spec->data_model, td->table_name, data);
- list = next;
}
+ g_slist_free (copy);
}
/*
diff --git a/libgda/sqlite/virtual/gda-vconnection-hub.c b/libgda/sqlite/virtual/gda-vconnection-hub.c
index e571403..704646b 100644
--- a/libgda/sqlite/virtual/gda-vconnection-hub.c
+++ b/libgda/sqlite/virtual/gda-vconnection-hub.c
@@ -880,7 +880,6 @@ meta_changed_cb (G_GNUC_UNUSED GdaMetaStore *store, GSList *changes, HubConnecti
for (list = changes; list; list = list->next) {
GdaMetaStoreChange *ch = (GdaMetaStoreChange*) list->data;
GValue *tsn, *tn;
-
/* we are only intsrested in changes occurring in the "_tables" table */
if (!strcmp (ch->table_name, "_tables")) {
switch (ch->c_type) {
@@ -935,7 +934,8 @@ table_add (HubConnection *hc, const GValue *table_name, GError **error)
lspec->table_name = gda_value_copy (table_name);
lspec->hc = hc;
tmp = get_complete_table_name (hc, lspec->table_name);
- if (!gda_vconnection_data_model_add (GDA_VCONNECTION_DATA_MODEL (hc->hub), (GdaVconnectionDataModelSpec*) lspec,
+ /*g_print ("%s (HC=%p, table_name=%s) name=%s\n", __FUNCTION__, hc, g_value_get_string (table_name), tmp);*/
+ if (!gda_vconnection_data_model_add (GDA_VCONNECTION_DATA_MODEL (hc->hub), (GdaVconnectionDataModelSpec*) lspec,
(GDestroyNotify) local_spec_free, tmp, error)) {
g_free (tmp);
return FALSE;
@@ -950,6 +950,7 @@ table_remove (HubConnection *hc, const GValue *table_name)
gchar *name;
name = get_complete_table_name (hc, table_name);
+ /*g_print ("%s (HC=%p, table_name=%s) name=%s\n", __FUNCTION__, hc, g_value_get_string (table_name), name);*/
gda_vconnection_data_model_remove (GDA_VCONNECTION_DATA_MODEL (hc->hub), name, NULL);
g_free (name);
}
diff --git a/libgda/sqlite/virtual/gda-vprovider-data-model.c b/libgda/sqlite/virtual/gda-vprovider-data-model.c
index 39bb5b8..a7ab104 100644
--- a/libgda/sqlite/virtual/gda-vprovider-data-model.c
+++ b/libgda/sqlite/virtual/gda-vprovider-data-model.c
@@ -349,8 +349,12 @@ static void
cnc_close_foreach_func (G_GNUC_UNUSED GdaDataModel *model, const gchar *table_name, GdaVconnectionDataModel *cnc)
{
/*g_print ("---- FOREACH: Removing virtual table '%s'\n", table_name);*/
- if (! gda_vconnection_data_model_remove (cnc, table_name, NULL))
- g_warning ("Internal GdaVproviderDataModel error");
+ GError *lerror = NULL;
+ if (! gda_vconnection_data_model_remove (cnc, table_name, &lerror)) {
+ g_warning ("Internal GdaVproviderDataModel error: %s",
+ lerror && lerror->message ? lerror->message : _("No detail"));
+ g_clear_error (&lerror);
+ }
}
static gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]