[libgda] Misc. optimizations



commit 39134b3d3a9f3c3e29e92f906b3719264ebacb47
Author: Vivien Malerba <malerba gnome-db org>
Date:   Sat Jul 10 21:58:50 2010 +0200

    Misc. optimizations

 libgda/Makefile.am                  |    1 +
 libgda/gda-connection-event.c       |   27 ++++----
 libgda/gda-connection.c             |    8 +--
 libgda/gda-data-select.c            |    7 +-
 libgda/gda-holder.c                 |   24 ++++---
 libgda/gda-set.c                    |  117 ++++++++++++++++++++++------------
 libgda/gda-set.h                    |    1 +
 libgda/gda-statement-priv.h         |   34 ++++++++++
 libgda/gda-statement.c              |    5 ++
 libgda/sqlite/gda-sqlite-provider.c |    6 +-
 10 files changed, 153 insertions(+), 77 deletions(-)
---
diff --git a/libgda/Makefile.am b/libgda/Makefile.am
index a3bb973..1563260 100644
--- a/libgda/Makefile.am
+++ b/libgda/Makefile.am
@@ -165,6 +165,7 @@ libgda_sources =  \
 	gda-marshal.c \
 	gda-meta-store-extra.h \
 	gda-meta-struct-private.h \
+	gda-statement-priv.h \
 	global.h \
 	md5.h \
 	md5c.c \
diff --git a/libgda/gda-connection-event.c b/libgda/gda-connection-event.c
index f13e4a4..90358ac 100644
--- a/libgda/gda-connection-event.c
+++ b/libgda/gda-connection-event.c
@@ -156,16 +156,9 @@ static void gda_connection_event_set_property (GObject *object, guint prop_id, c
 	g_return_if_fail (GDA_IS_CONNECTION_EVENT (object));
 	event = GDA_CONNECTION_EVENT (object);
 
-	switch(prop_id)
-	{
+	switch(prop_id)	{
 	case PROP_TYPE:
-		event->priv->type = g_value_get_int (value);
-		if (!event->priv->sqlstate && (event->priv->type == GDA_CONNECTION_EVENT_ERROR)) 
-			gda_connection_event_set_sqlstate (event, GDA_SQLSTATE_GENERAL_ERROR);
-		else if (((event->priv->type == GDA_CONNECTION_EVENT_NOTICE) || 
-			  (event->priv->type == GDA_CONNECTION_EVENT_COMMAND)) &&
-			 event->priv->sqlstate)
-			gda_connection_event_set_sqlstate (event, NULL);
+		gda_connection_event_set_event_type (event, g_value_get_int (value));
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -180,10 +173,9 @@ static void gda_connection_event_get_property (GObject *object, guint prop_id, G
 	g_return_if_fail (GDA_IS_CONNECTION_EVENT (object));
 	event = GDA_CONNECTION_EVENT (object);
 
-	switch(prop_id)
-	{
+	switch(prop_id) {
 	case PROP_TYPE:
-		g_value_set_int(value, event->priv->type);
+		g_value_set_int (value, event->priv->type);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -205,7 +197,16 @@ gda_connection_event_set_event_type (GdaConnectionEvent *event, GdaConnectionEve
 	g_return_if_fail (GDA_IS_CONNECTION_EVENT (event));
 	g_return_if_fail (event->priv);
 
-	g_object_set (G_OBJECT (event), "type", (int) type, NULL);
+	if (event->priv->type == type)
+		return;
+
+	event->priv->type = type;
+	if (!event->priv->sqlstate && (event->priv->type == GDA_CONNECTION_EVENT_ERROR)) 
+		gda_connection_event_set_sqlstate (event, GDA_SQLSTATE_GENERAL_ERROR);
+	else if (((event->priv->type == GDA_CONNECTION_EVENT_NOTICE) || 
+		  (event->priv->type == GDA_CONNECTION_EVENT_COMMAND)) &&
+		 event->priv->sqlstate)
+		gda_connection_event_set_sqlstate (event, NULL);
 }
 
 /**
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index 0b6b1ee..6ecf9c8 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -47,6 +47,7 @@
 #include <libgda/gda-lockable.h>
 #include <libgda/thread-wrapper/gda-thread-provider.h>
 #include <libgda/gda-repetitive-statement.h>
+#include <gda-statement-priv.h>
 
 #include <glib/gstdio.h>
 #include <fcntl.h>
@@ -5030,12 +5031,10 @@ gda_connection_internal_savepoint_removed (GdaConnection *cnc, const gchar *svp_
 void 
 gda_connection_internal_statement_executed (GdaConnection *cnc, GdaStatement *stmt, GdaSet *params, GdaConnectionEvent *error)
 {
-	g_return_if_fail (GDA_IS_CONNECTION (cnc));
-
 	if (!error || (error && (gda_connection_event_get_event_type (error) != GDA_CONNECTION_EVENT_ERROR))) {
-		GdaSqlStatement *sqlst;
+		const GdaSqlStatement *sqlst;
 		GdaSqlStatementTransaction *trans;
-		g_object_get (G_OBJECT (stmt), "structure", &sqlst, NULL);
+		sqlst = _gda_statement_get_internal_struct (stmt);
 		trans = (GdaSqlStatementTransaction*) sqlst->contents; /* warning: this may be inaccurate if stmt_type is not
 									  a transaction type, but the compiler does not care */
 
@@ -5093,7 +5092,6 @@ gda_connection_internal_statement_executed (GdaConnection *cnc, GdaStatement *st
 			break;
 		}
 		}
-		gda_sql_statement_free (sqlst);
 	}
 }
 
diff --git a/libgda/gda-data-select.c b/libgda/gda-data-select.c
index 263aebe..e69cd7d 100644
--- a/libgda/gda-data-select.c
+++ b/libgda/gda-data-select.c
@@ -37,6 +37,7 @@
 #include <libgda/gda-connection.h>
 #include <libgda/gda-util.h>
 #include <sql-parser/gda-sql-parser.h>
+#include <gda-statement-priv.h>
 
 #define CLASS(x) (GDA_DATA_SELECT_CLASS (G_OBJECT_GET_CLASS (x)))
 
@@ -1480,7 +1481,7 @@ gda_data_select_compute_row_selection_condition (GdaDataSelect *model, GError **
 	GdaSqlExpr *expr;
 	gboolean retval = FALSE;
 	GdaStatement *stmt;
-	GdaSqlStatement *sqlst = NULL;
+	const GdaSqlStatement *sqlst = NULL;
 	GdaSqlStatementSelect *select;
 	GdaSqlSelectTarget *target;
 	GdaMetaStruct *mstruct = NULL;
@@ -1500,7 +1501,7 @@ gda_data_select_compute_row_selection_condition (GdaDataSelect *model, GError **
 		return FALSE;
 	}
 
-	g_object_get (G_OBJECT (stmt), "structure", &sqlst, NULL);
+	sqlst = _gda_statement_get_internal_struct (stmt);
 	g_assert (sqlst->stmt_type == GDA_SQL_STATEMENT_SELECT);
 	select = (GdaSqlStatementSelect*) sqlst->contents;
 	if (!select->from || ! select->from->targets || ! select->from->targets->data) {
@@ -1529,8 +1530,6 @@ gda_data_select_compute_row_selection_condition (GdaDataSelect *model, GError **
 	retval = gda_data_select_set_row_selection_condition (model, expr, error);
 
  out:
-	if (sqlst)
-		gda_sql_statement_free (sqlst);
 	if (mstruct)
 		g_object_unref (mstruct);
 	if (nvalue)
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index fbf27fe..2d0f0e4 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -32,6 +32,8 @@
 #include <libgda/gda-custom-marshal.h>
 #include <libgda/gda-types.h>
 
+#define __gda_value_is_null(value) (!G_IS_VALUE (value))
+
 /* 
  * Main static functions 
  */
@@ -585,11 +587,11 @@ gda_holder_set_property (GObject *object,
 				
 				/* updating the holder's validity regarding the NULL value */
 				if (!not_null && 
-				    (!holder->priv->value || gda_value_is_null (holder->priv->value)))
+				    (!holder->priv->value || __gda_value_is_null (holder->priv->value)))
 					holder->priv->valid = TRUE;
 				
 				if (not_null && 
-				    (!holder->priv->value || gda_value_is_null (holder->priv->value)))
+				    (!holder->priv->value || __gda_value_is_null (holder->priv->value)))
 					holder->priv->valid = FALSE;
 				
 				g_signal_emit (holder, gda_holder_signals[CHANGED], 0);
@@ -756,7 +758,7 @@ gda_holder_get_value_str (GdaHolder *holder, GdaDataHandler *dh)
 	g_return_val_if_fail (holder->priv, NULL);
 
 	current_val = gda_holder_get_value (holder);
-        if (!current_val || gda_value_is_null (current_val))
+        if (!current_val || __gda_value_is_null (current_val))
                 return NULL;
         else {
                 if (!dh)
@@ -908,11 +910,11 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
 	}
 		
 	/* holder will be changed? */
-	newnull = !value || gda_value_is_null (value);
+	newnull = !value || __gda_value_is_null (value);
 	current_val = gda_holder_get_value (holder);
 	if (current_val == value)
 		changed = FALSE;
-	else if ((!current_val || gda_value_is_null ((GValue *)current_val)) && newnull)
+	else if ((!current_val || __gda_value_is_null ((GValue *)current_val)) && newnull)
 		changed = FALSE;
 	else if (value && current_val &&
 		 (G_VALUE_TYPE (value) == G_VALUE_TYPE ((GValue *)current_val)))
@@ -1042,11 +1044,11 @@ real_gda_holder_set_const_value (GdaHolder *holder, const GValue *value,
 #endif
 
 	/* holder will be changed? */
-	newnull = !value || gda_value_is_null (value);
+	newnull = !value || __gda_value_is_null (value);
 	current_val = gda_holder_get_value (holder);
 	if (current_val == value)
 		changed = FALSE;
-	else if ((!current_val || gda_value_is_null (current_val)) && newnull) 
+	else if ((!current_val || __gda_value_is_null (current_val)) && newnull) 
 		changed = FALSE;
 	else if (value && current_val &&
 		 (G_VALUE_TYPE (value) == G_VALUE_TYPE (current_val))) 
@@ -1371,8 +1373,8 @@ gda_holder_set_default_value (GdaHolder *holder, const GValue *value)
 		const GValue *current = gda_holder_get_value (holder);
 
 		/* check if default is equal to current value */
-		if (gda_value_is_null (value) &&
-		    (!current || gda_value_is_null (current)))
+		if (__gda_value_is_null (value) &&
+		    (!current || __gda_value_is_null (current)))
 			holder->priv->default_forced = TRUE;
 		else if ((G_VALUE_TYPE (value) == holder->priv->g_type) &&
 			 current && !gda_value_compare (value, current))
@@ -1633,12 +1635,12 @@ gda_holder_set_full_bind (GdaHolder *holder, GdaHolder *alias_of)
 		g_return_if_fail (alias_of->priv);
 		g_return_if_fail (holder->priv->g_type == alias_of->priv->g_type);
 		cvalue = gda_holder_get_value (alias_of);
-		if (cvalue && !gda_value_is_null ((GValue*)cvalue))
+		if (cvalue && !__gda_value_is_null ((GValue*)cvalue))
 			value2 = gda_value_copy ((GValue*)cvalue);
 	}
 
 	cvalue = gda_holder_get_value (holder);
-	if (cvalue && !gda_value_is_null ((GValue*)cvalue))
+	if (cvalue && !__gda_value_is_null ((GValue*)cvalue))
 		value1 = gda_value_copy ((GValue*)cvalue);
 		
 	
diff --git a/libgda/gda-set.c b/libgda/gda-set.c
index bf82967..58254d4 100644
--- a/libgda/gda-set.c
+++ b/libgda/gda-set.c
@@ -96,6 +96,7 @@ struct _GdaSetPrivate
 	gchar           *descr;
 	GHashTable      *holders_hash; /* key = GdaHoler ID, value = GdaHolder */
 	GArray          *holders_array;
+	gboolean         read_only;
 };
 
 static void 
@@ -347,6 +348,7 @@ gda_set_init (GdaSet *set)
 	set->groups_list = NULL;
 	set->priv->holders_hash = g_hash_table_new (g_str_hash, g_str_equal);
 	set->priv->holders_array = NULL;
+	set->priv->read_only = FALSE;
 }
 
 
@@ -365,11 +367,33 @@ gda_set_new (GSList *holders)
 {
 	GObject *obj;
 
-	obj = g_object_new (GDA_TYPE_SET, "holders", holders, NULL);
-	
-	return GDA_SET (obj);
+	obj = g_object_new (GDA_TYPE_SET, NULL);
+	for (; holders; holders = holders->next) 
+		gda_set_real_add_holder ((GdaSet*) obj, GDA_HOLDER (holders->data));
+	compute_public_data ((GdaSet*) obj);
+
+	return (GdaSet*) obj;
 }
 
+/*
+ * _gda_set_new_read_only
+ */
+GdaSet *
+_gda_set_new_read_only (GSList *holders)
+{
+	GObject *obj;
+
+	obj = g_object_new (GDA_TYPE_SET, NULL);
+	((GdaSet*) obj)->priv->read_only = TRUE;
+	for (; holders; holders = holders->next) 
+		gda_set_real_add_holder ((GdaSet*) obj, GDA_HOLDER (holders->data));
+	compute_public_data ((GdaSet*) obj);
+
+	return (GdaSet*) obj;
+}
+
+
+
 /**
  * gda_set_copy:
  * @set: a #GdaSet object
@@ -900,13 +924,15 @@ gda_set_remove_holder (GdaSet *set, GdaHolder *holder)
 	g_return_if_fail (g_slist_find (set->holders, holder));
 
 	g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
-					      G_CALLBACK (changed_holder_cb), set);
-	g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
 					      G_CALLBACK (validate_change_holder_cb), set);
-	g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
-					      G_CALLBACK (source_changed_holder_cb), set);
-	g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
-					      G_CALLBACK (att_holder_changed_cb), set);
+	if (! set->priv->read_only) {
+		g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
+						      G_CALLBACK (changed_holder_cb), set);
+		g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
+						      G_CALLBACK (source_changed_holder_cb), set);
+		g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
+						      G_CALLBACK (att_holder_changed_cb), set);
+	}
 
 	/* now destroy the GdaSetNode and the GdaSetSource if necessary */
 	node = gda_set_get_node (set, holder);
@@ -954,13 +980,17 @@ validate_change_holder_cb (GdaHolder *holder, const GValue *value, GdaSet *set)
 {
 	/* signal the holder validate-change */
 	GError *error = NULL;
+	if (set->priv->read_only)
+		g_set_error (&error, 0, 0, _("Data set does not allow mofifications"));
+	else {
 #ifdef GDA_DEBUG_signal
-	g_print (">> 'VALIDATE_HOLDER_CHANGE' from %s\n", __FUNCTION__);
+		g_print (">> 'VALIDATE_HOLDER_CHANGE' from %s\n", __FUNCTION__);
 #endif
-	g_signal_emit (G_OBJECT (set), gda_set_signals[VALIDATE_HOLDER_CHANGE], 0, holder, value, &error);
+		g_signal_emit (G_OBJECT (set), gda_set_signals[VALIDATE_HOLDER_CHANGE], 0, holder, value, &error);
 #ifdef GDA_DEBUG_signal
-	g_print ("<< 'VALIDATE_HOLDER_CHANGED' from %s\n", __FUNCTION__);
+		g_print ("<< 'VALIDATE_HOLDER_CHANGED' from %s\n", __FUNCTION__);
 #endif
+	}
 	return error;
 }
 
@@ -998,14 +1028,16 @@ gda_set_dispose (GObject *object)
 	if (set->holders) {
 		for (list = set->holders; list; list = list->next) {
 			g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
-							      G_CALLBACK (changed_holder_cb), set);
-			g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
 							      G_CALLBACK (validate_change_holder_cb), set);
-			g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
-							      G_CALLBACK (source_changed_holder_cb), set);
-			g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
-							      G_CALLBACK (att_holder_changed_cb), set);
-			g_object_unref (G_OBJECT (list->data));
+			if (! set->priv->read_only) {
+				g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
+								      G_CALLBACK (changed_holder_cb), set);
+				g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
+								      G_CALLBACK (source_changed_holder_cb), set);
+				g_signal_handlers_disconnect_by_func (G_OBJECT (list->data),
+								      G_CALLBACK (att_holder_changed_cb), set);
+			}
+			g_object_unref (list->data);
 		}
 		g_slist_free (set->holders);
 	}
@@ -1063,8 +1095,7 @@ compute_public_data (GdaSet *set)
 	GdaSetNode *node;
 	GdaSetSource *source;
 	GdaSetGroup *group;
-	GHashTable *groups = g_hash_table_new (NULL, NULL); /* key = source model, 
-							       value = GdaSetGroup */
+	GHashTable *groups = NULL;
 
 	/*
 	 * Get rid of all the previous structures
@@ -1089,14 +1120,14 @@ compute_public_data (GdaSet *set)
 		if (node->source_model)
 			g_object_ref (node->source_model);
 		
-		set->nodes_list = g_slist_append (set->nodes_list, node);
+		set->nodes_list = g_slist_prepend (set->nodes_list, node);
 	}
+	set->nodes_list = g_slist_reverse (set->nodes_list);
 
 	/*
 	 * Creation of the GdaSetSource and GdaSetGroup structures 
 	 */
-	list = set->nodes_list;
-	while (list) {
+	for (list = set->nodes_list; list;list = list->next) {
 		node = GDA_SET_NODE (list->data);
 		
 		/* source */
@@ -1115,7 +1146,7 @@ compute_public_data (GdaSet *set)
 
 		/* group */
 		group = NULL;
-		if (node->source_model)
+		if (node->source_model && groups)
 			group = g_hash_table_lookup (groups, node->source_model);
 		if (group) 
 			group->nodes = g_slist_append (group->nodes, node);
@@ -1123,15 +1154,18 @@ compute_public_data (GdaSet *set)
 			group = g_new0 (GdaSetGroup, 1);
 			group->nodes = g_slist_append (NULL, node);
 			group->nodes_source = source;
-			set->groups_list = g_slist_append (set->groups_list, group);
-			if (node->source_model)
+			set->groups_list = g_slist_prepend (set->groups_list, group);
+			if (node->source_model) {
+				if (!groups)
+					groups = g_hash_table_new (NULL, NULL); /* key = source model, 
+										   value = GdaSetGroup */
 				g_hash_table_insert (groups, node->source_model, group);
+			}
 		}		
-
-		list = g_slist_next (list);
 	}
-	
-	g_hash_table_destroy (groups);
+	set->groups_list = g_slist_reverse (set->groups_list);
+	if (groups)
+		g_hash_table_destroy (groups);
 
 #ifdef GDA_DEBUG_signal
         g_print (">> 'PUBLIC_DATA_CHANGED' from %p\n", set);
@@ -1175,9 +1209,6 @@ gda_set_real_add_holder (GdaSet *set, GdaHolder *holder)
 	GdaHolder *similar;
 	const gchar *hid;
 
-	if (g_slist_find (set->holders, holder))
-		return FALSE;
-
 	/* 
 	 * try to find a similar holder in the set->holders:
 	 * a holder B is similar to a holder A if it has the same ID
@@ -1187,7 +1218,7 @@ gda_set_real_add_holder (GdaSet *set, GdaHolder *holder)
 		g_warning (_("GdaHolder needs to have an ID"));
 		return FALSE;
 	}
-	g_return_val_if_fail (hid, FALSE);
+
 	similar = (GdaHolder*) g_hash_table_lookup (set->priv->holders_hash, hid);
 	if (!similar) {
 		/* really add @holder to the set */
@@ -1198,16 +1229,20 @@ gda_set_real_add_holder (GdaSet *set, GdaHolder *holder)
 			set->priv->holders_array = NULL;
 		}
 		g_object_ref (holder);
-		g_signal_connect (G_OBJECT (holder), "changed",
-				  G_CALLBACK (changed_holder_cb), set);
 		g_signal_connect (G_OBJECT (holder), "validate-change",
 				  G_CALLBACK (validate_change_holder_cb), set);
-		g_signal_connect (G_OBJECT (holder), "source-changed",
-				  G_CALLBACK (source_changed_holder_cb), set);
-		g_signal_connect (G_OBJECT (holder), "attribute-changed",
-				  G_CALLBACK (att_holder_changed_cb), set);
+		if (! set->priv->read_only) {
+			g_signal_connect (G_OBJECT (holder), "changed",
+					  G_CALLBACK (changed_holder_cb), set);
+			g_signal_connect (G_OBJECT (holder), "source-changed",
+					  G_CALLBACK (source_changed_holder_cb), set);
+			g_signal_connect (G_OBJECT (holder), "attribute-changed",
+					  G_CALLBACK (att_holder_changed_cb), set);
+		}
 		return TRUE;
 	}
+	else if (similar == holder)
+		return FALSE;
 	else {
 #ifdef GDA_DEBUG_NO
 		g_print ("In Set %p, Holder %p and %p are similar, keeping %p only\n", set, similar, holder, similar);
diff --git a/libgda/gda-set.h b/libgda/gda-set.h
index f158d6e..8dd10a0 100644
--- a/libgda/gda-set.h
+++ b/libgda/gda-set.h
@@ -136,6 +136,7 @@ GdaSetGroup  *gda_set_get_group                (GdaSet *set, GdaHolder *holder);
 
 /* private */
 gboolean      _gda_set_validate                (GdaSet *set, GError **error);
+GdaSet *      _gda_set_new_read_only           (GSList *holders);
 
 
 G_END_DECLS
diff --git a/libgda/gda-statement-priv.h b/libgda/gda-statement-priv.h
new file mode 100644
index 0000000..3ef9a58
--- /dev/null
+++ b/libgda/gda-statement-priv.h
@@ -0,0 +1,34 @@
+/* gda-statement-priv.h
+ *
+ * Copyright (C) 2010 Vivien Malerba
+ *
+ * This Library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This Library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this Library; see the file COPYING.LIB.  If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GDA_STATEMENT_PRIV__
+#define __GDA_STATEMENT_PRIV__
+
+
+G_BEGIN_DECLS
+
+const GdaSqlStatement *_gda_statement_get_internal_struct (GdaStatement *stmt);
+
+G_END_DECLS
+
+#endif
+
+
+
diff --git a/libgda/gda-statement.c b/libgda/gda-statement.c
index 063c66f..ffb62bb 100644
--- a/libgda/gda-statement.c
+++ b/libgda/gda-statement.c
@@ -192,6 +192,11 @@ gda_statement_new (void)
 	return GDA_STATEMENT (obj);
 }
 
+const GdaSqlStatement *
+_gda_statement_get_internal_struct (GdaStatement *stmt)
+{
+	return stmt->priv->internal_struct;
+}
 
 /**
  * gda_statement_copy:
diff --git a/libgda/sqlite/gda-sqlite-provider.c b/libgda/sqlite/gda-sqlite-provider.c
index 232b2b6..e7c373d 100644
--- a/libgda/sqlite/gda-sqlite-provider.c
+++ b/libgda/sqlite/gda-sqlite-provider.c
@@ -2121,7 +2121,7 @@ make_last_inserted_set (GdaConnection *cnc, GdaStatement *stmt, sqlite3_int64 la
 
 		if (holders) {
 			holders = g_slist_reverse (holders);
-			set = gda_set_new (holders);
+			set = _gda_set_new_read_only (holders);
 			g_slist_foreach (holders, (GFunc) g_object_unref, NULL);
 			g_slist_free (holders);
 		}
@@ -2731,12 +2731,12 @@ gda_sqlite_provider_statement_execute (GdaServerProvider *provider, GdaConnectio
 				g_value_set_int ((value = gda_value_new (G_TYPE_INT)), changes);
 				gda_holder_take_value (holder, value, NULL);
 				list = g_slist_append (NULL, holder);
-				set = (GObject*) gda_set_new (list);
+				set = (GObject*) _gda_set_new_read_only (list);
 				g_slist_free (list);
 				g_object_unref (holder);
 			}
 			else
-				set = (GObject*) gda_set_new (NULL);
+				set = (GObject*) _gda_set_new_read_only (NULL);
 
 			return set;
 		}



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