libgda r3185 - in trunk: . doc/C doc/C/tmpl libgda libgda/providers-support libgda/sqlite po providers/firebird providers/mysql providers/postgres providers/skel-implementation/capi tests/data-models



Author: vivien
Date: Mon Jul 28 19:51:03 2008
New Revision: 3185
URL: http://svn.gnome.org/viewvc/libgda?rev=3185&view=rev

Log:
2008-07-28  Vivien Malerba <malerba gnome-db org>

	* libgda/sqlite/gda-sqlite-recordset.c:
	* providers/firebird/gda-firebird-recordset.c:
	* providers/mysql/gda-mysql-recordset.c:
	* providers/postgres/gda-postgres-recordset.c:
	* providers/skel-implementation/capi/gda-capi-recordset.c:
	* libgda/providers-support/gda-pmodel.[ch]:
	* libgda/providers-support/gda-prow.[ch]:
	* libgda/gda-data-model-row.[ch]: overwrote the current GdaRow implementation
	with the GdaPRow one, and removed GdaPRow
	* libgda/gda-data-access-wrapper.c:
	* libgda/gda-data-model-row.[ch]:
	* libgda/gda-data-model-array.[ch]: reimplemented GdaDataModelArray without using
	the GdaDataModelRow object (which has been removed)
	* libgda/gda-data-model.h: new error code
	* libgda/gda-config.c: added missing header
	* tests/data-models/check_data_proxy.c: corrected test
	* po/POTFILES.in: removed non existent files, and ran "make update-po"
	* doc/C: doc updates


Removed:
   trunk/doc/C/tmpl/gda-data-model-row.sgml
   trunk/doc/C/tmpl/gda-prow.sgml
   trunk/libgda/gda-data-model-row.c
   trunk/libgda/gda-data-model-row.h
   trunk/libgda/providers-support/gda-prow.c
   trunk/libgda/providers-support/gda-prow.h
Modified:
   trunk/ChangeLog
   trunk/doc/C/libgda-4.0-docs.sgml
   trunk/doc/C/libgda-4.0-sections.txt
   trunk/doc/C/libgda-4.0.types.in
   trunk/doc/C/prov-writing.xml
   trunk/doc/C/tmpl/gda-data-model-array.sgml
   trunk/doc/C/tmpl/gda-row.sgml
   trunk/libgda/Makefile.am
   trunk/libgda/gda-config.c
   trunk/libgda/gda-data-access-wrapper.c
   trunk/libgda/gda-data-model-array.c
   trunk/libgda/gda-data-model-array.h
   trunk/libgda/gda-data-model.h
   trunk/libgda/gda-row.c
   trunk/libgda/gda-row.h
   trunk/libgda/providers-support/Makefile.am
   trunk/libgda/providers-support/gda-pmodel.c
   trunk/libgda/providers-support/gda-pmodel.h
   trunk/libgda/sqlite/gda-sqlite-recordset.c
   trunk/po/POTFILES.in
   trunk/po/ar.po
   trunk/po/az.po
   trunk/po/ca.po
   trunk/po/cs.po
   trunk/po/da.po
   trunk/po/de.po
   trunk/po/dz.po
   trunk/po/el.po
   trunk/po/en_CA.po
   trunk/po/en_GB.po
   trunk/po/es.po
   trunk/po/eu.po
   trunk/po/fa.po
   trunk/po/fi.po
   trunk/po/fr.po
   trunk/po/ga.po
   trunk/po/gl.po
   trunk/po/hr.po
   trunk/po/hu.po
   trunk/po/it.po
   trunk/po/ja.po
   trunk/po/ko.po
   trunk/po/lt.po
   trunk/po/mk.po
   trunk/po/ml.po
   trunk/po/ms.po
   trunk/po/nb.po
   trunk/po/ne.po
   trunk/po/nl.po
   trunk/po/oc.po
   trunk/po/pa.po
   trunk/po/pl.po
   trunk/po/pt.po
   trunk/po/pt_BR.po
   trunk/po/ru.po
   trunk/po/rw.po
   trunk/po/sk.po
   trunk/po/sl.po
   trunk/po/sq.po
   trunk/po/sr.po
   trunk/po/sr Latn po
   trunk/po/sv.po
   trunk/po/tr.po
   trunk/po/uk.po
   trunk/po/vi.po
   trunk/po/zh_CN.po
   trunk/po/zh_HK.po
   trunk/po/zh_TW.po
   trunk/providers/firebird/gda-firebird-recordset.c
   trunk/providers/mysql/gda-mysql-recordset.c
   trunk/providers/postgres/gda-postgres-recordset.c
   trunk/providers/skel-implementation/capi/gda-capi-recordset.c
   trunk/tests/data-models/check_data_proxy.c

Modified: trunk/doc/C/libgda-4.0-docs.sgml
==============================================================================
--- trunk/doc/C/libgda-4.0-docs.sgml	(original)
+++ trunk/doc/C/libgda-4.0-docs.sgml	Mon Jul 28 19:51:03 2008
@@ -45,11 +45,11 @@
 <!ENTITY libgda-GdaMutex SYSTEM "xml/gda-mutex.xml">
 <!ENTITY libgda-GdaLockable SYSTEM "xml/gda-lockable.xml">
 <!ENTITY libgda-GdaThreader SYSTEM "xml/gda-threader.xml">
+<!ENTITY libgda-GdaRow SYSTEM "xml/gda-row.xml">
 <!ENTITY libgda-GdaDataModelArray SYSTEM "xml/gda-data-model-array.xml">
 <!ENTITY libgda-GdaDataModelBdb SYSTEM "xml/gda-data-model-bdb.xml">
 <!ENTITY libgda-GdaDataModelDir SYSTEM "xml/gda-data-model-dir.xml">
 <!ENTITY libgda-GdaDataModelQuery SYSTEM "xml/gda-data-model-query.xml">
-<!ENTITY libgda-GdaDataModelRow SYSTEM "xml/gda-data-model-row.xml">
 <!ENTITY libgda-GdaDataModel SYSTEM "xml/gda-data-model.xml">
 <!ENTITY libgda-GdaDataModelIter SYSTEM "xml/gda-data-model-iter.xml">
 <!ENTITY libgda-GdaDataModelImport SYSTEM "xml/gda-data-model-import.xml">
@@ -60,7 +60,6 @@
 <!ENTITY libgda-init SYSTEM "xml/libgda.xml">
 <!ENTITY libgda-log SYSTEM "xml/gda-log.xml">
 <!ENTITY libgda-quark-list SYSTEM "xml/gda-quark-list.xml">
-<!ENTITY libgda-GdaRow SYSTEM "xml/gda-row.xml">
 <!ENTITY libgda-GdaServerProvider SYSTEM "xml/gda-server-provider.xml">
 <!ENTITY libgda-GdaVirtualProvider SYSTEM "xml/gda-virtual-provider.xml">
 <!ENTITY libgda-GdaVproviderDataModel SYSTEM "xml/gda-vprovider-data-model.xml">
@@ -98,7 +97,6 @@
 <!ENTITY libgda-GdaSqlParser SYSTEM "xml/gda-sql-parser.xml">
 <!ENTITY libgda-GdaMetaStore SYSTEM "xml/gda-meta-store.xml">
 <!ENTITY libgda-GdaMetaStruct SYSTEM "xml/gda-meta-struct.xml">
-<!ENTITY libgda-PRow SYSTEM "xml/gda-prow.xml">
 <!ENTITY libgda-PModel SYSTEM "xml/gda-pmodel.xml">
 <!ENTITY libgda-PStmt SYSTEM "xml/gda-pstmt.xml">
 <!ENTITY libgda-Enums SYSTEM "xml/gda-enums.xml">
@@ -576,6 +574,7 @@
       &libgda-GdaDataModelImport;
       &libgda-GdaDataAccessWrapper;
       &libgda-GdaDataModelArray;
+      &libgda-GdaRow;
       &libgda-GdaDataModelBdb;
       &libgda-GdaDataModelDir;
       &libgda-GdaDataProxy;
@@ -905,7 +904,6 @@
       &libgda-util;
       &libgda-log;
       &libgda-quark-list;
-      &libgda-GdaDataModelRow;
       &libgda-GdaMutex;
       &libgda-GdaLockable;
       &libgda-GdaThreader;
@@ -1280,7 +1278,6 @@
       <title>Providers' support API</title>
       &libgda-GdaServerProvider;
       &libgda-PModel;
-      &libgda-PRow;
       &libgda-PStmt;
       &provider-support;
     </chapter>

Modified: trunk/doc/C/libgda-4.0-sections.txt
==============================================================================
--- trunk/doc/C/libgda-4.0-sections.txt	(original)
+++ trunk/doc/C/libgda-4.0-sections.txt	Mon Jul 28 19:51:03 2008
@@ -180,6 +180,7 @@
 gda_data_model_array_new
 gda_data_model_array_new_with_g_types
 gda_data_model_array_copy_model
+gda_data_model_array_get_row
 gda_data_model_array_set_n_columns
 gda_data_model_array_clear
 <SUBSECTION Standard>
@@ -249,21 +250,6 @@
 </SECTION>
 
 <SECTION>
-<FILE>gda-data-model-row</FILE>
-<TITLE>GdaDataModelRow</TITLE>
-GdaDataModelRow
-GdaDataModelRowClass
-GdaDataModelRowPrivate
-<SUBSECTION Standard>
-GDA_DATA_MODEL_ROW
-GDA_DATA_MODEL_ROW_CLASS
-GDA_IS_DATA_MODEL_ROW
-GDA_IS_DATA_MODEL_ROW_CLASS
-GDA_TYPE_DATA_MODEL_ROW
-gda_data_model_row_get_type
-</SECTION>
-
-<SECTION>
 <FILE>gda-data-model-import</FILE>
 <TITLE>GdaDataModelImport</TITLE>
 GdaDataModelImport
@@ -459,19 +445,8 @@
 <TITLE>GdaRow</TITLE>
 GdaRow
 gda_row_new
-gda_row_copy
-gda_row_new_from_list
-gda_row_set_model
-gda_row_get_model
-gda_row_get_number
-gda_row_set_number
-gda_row_get_id
-gda_row_set_id
-gda_row_get_value
-gda_row_set_value
 gda_row_get_length
-gda_row_set_is_default
-gda_row_get_is_default
+gda_row_get_value
 <SUBSECTION Standard>
 GDA_IS_ROW
 GDA_IS_ROW_CLASS
@@ -1400,22 +1375,6 @@
 </SECTION>
 
 <SECTION>
-<FILE>gda-prow</FILE>
-<TITLE>GdaPRow</TITLE>
-<INCLUDE>providers-support/gda-prow.h</INCLUDE>
-GdaPRow
-gda_prow_new
-gda_prow_get_length
-gda_prow_get_value
-<SUBSECTION Standard>
-GDA_IS_PROW
-GDA_PROW
-GDA_PROW_CLASS
-GDA_TYPE_PROW
-gda_prow_get_type
-</SECTION>
-
-<SECTION>
 <FILE>gda-pmodel</FILE>
 <TITLE>GdaPModel</TITLE>
 <INCLUDE>providers-support/gda-pmodel.h</INCLUDE>

Modified: trunk/doc/C/libgda-4.0.types.in
==============================================================================
--- trunk/doc/C/libgda-4.0.types.in	(original)
+++ trunk/doc/C/libgda-4.0.types.in	Mon Jul 28 19:51:03 2008
@@ -21,7 +21,7 @@
 gda_data_model_array_get_type
 @LIBGDA_BDB_TYPE@
 gda_data_model_dir_get_type
-gda_data_model_row_get_type
+gda_row_get_type
 gda_data_model_get_type
 gda_data_model_import_get_type
 gda_data_model_iter_get_type

Modified: trunk/doc/C/prov-writing.xml
==============================================================================
--- trunk/doc/C/prov-writing.xml	(original)
+++ trunk/doc/C/prov-writing.xml	Mon Jul 28 19:51:03 2008
@@ -512,12 +512,12 @@
     few virtual methods, and offering some services.
   </para>
   <para>
-    The data model represents each row in a separate <link linkend="GdaPRow">GdaPRow</link> object, and virtual
+    The data model represents each row in a separate <link linkend="GdaRow">GdaRow</link> object, and virtual
     methods to retreive rows have to return new (and correctly initialized) objects of that class. The referencing
     of these new objects is left up to the implementation which:
     <itemizedlist>
       <listitem>
-	<para>can rely on the <link linkend="GdaPRow">GdaPRow</link> implementation to keep them, using
+	<para>can rely on the <link linkend="GdaRow">GdaRow</link> implementation to keep them, using
 	  the <link linkend="gda-pmodel-take-row">gda_pmodel_take_row ()</link> method for each row object created which
 	  is the easiest, the fastest as once created, the rows are available for further usage, 
 	  but will consume more memory with each row read from the model.</para>
@@ -559,7 +559,7 @@
     <title>store_all()</title>
     <para>
       This method is called when the user sets the "store-all-rows" to TRUE. It has the effect of forcing the creation
-      of a <link linkend="GdaPRow">GdaPRow</link> object for each row of the data model (thus increasing the memory consumption
+      of a <link linkend="GdaRow">GdaRow</link> object for each row of the data model (thus increasing the memory consumption
       but reducing further access times). It is available only when the data access mode for the data model is random 
       (that is not cursor based). When data access is cursor based, this method will not be called.
     </para>

Modified: trunk/doc/C/tmpl/gda-data-model-array.sgml
==============================================================================
--- trunk/doc/C/tmpl/gda-data-model-array.sgml	(original)
+++ trunk/doc/C/tmpl/gda-data-model-array.sgml	Mon Jul 28 19:51:03 2008
@@ -34,6 +34,11 @@
 
 </para>
 
+<!-- ##### ARG GdaDataModelArray:read-only ##### -->
+<para>
+
+</para>
+
 <!-- ##### STRUCT GdaDataModelArrayClass ##### -->
 <para>
 
@@ -76,6 +81,17 @@
 @Returns: 
 
 
+<!-- ##### FUNCTION gda_data_model_array_get_row ##### -->
+<para>
+
+</para>
+
+ model: 
+ row: 
+ error: 
+ Returns: 
+
+
 <!-- ##### FUNCTION gda_data_model_array_set_n_columns ##### -->
 <para>
 

Modified: trunk/doc/C/tmpl/gda-row.sgml
==============================================================================
--- trunk/doc/C/tmpl/gda-row.sgml	(original)
+++ trunk/doc/C/tmpl/gda-row.sgml	Mon Jul 28 19:51:03 2008
@@ -1,12 +1,17 @@
 <!-- ##### SECTION Title ##### -->
-GdaDataModel rows
+GdaDataModelArray's rows
 
 <!-- ##### SECTION Short_Description ##### -->
-Row for a #GdaDataModel object
+Row for a #GdaDataModelArray object
 
 <!-- ##### SECTION Long_Description ##### -->
 <para>
-Each #GdaDataModel uses #GdaRow to let the user access each row it contains.
+  The #GdaDataModelArray object uses #GdaRow to store each row of data. Each #GdaRow has the same
+  number of #GValue values (equal to the number of columns of the data model).
+</para>
+<para>
+  As a side note, the #GdaRow object is also used internally by the implementation of the data models returned
+  when executing a SELECT statement.
 </para>
 
 <!-- ##### SECTION See_Also ##### -->
@@ -22,110 +27,18 @@
 
 </para>
 
- object: 
- priv: 
-
-<!-- ##### FUNCTION gda_row_new ##### -->
-<para>
-
-</para>
-
- model: 
- count: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_copy ##### -->
-<para>
-
-</para>
-
- row: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_new_from_list ##### -->
-<para>
-
-</para>
-
- model: 
- values: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_set_model ##### -->
-<para>
-
-</para>
-
- row: 
- model: 
-
-
-<!-- ##### FUNCTION gda_row_get_model ##### -->
-<para>
-
-</para>
-
- row: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_get_number ##### -->
-<para>
-
-</para>
-
- row: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_set_number ##### -->
-<para>
-
-</para>
-
- row: 
- number: 
-
 
-<!-- ##### FUNCTION gda_row_get_id ##### -->
+<!-- ##### ARG GdaRow:nb-values ##### -->
 <para>
 
 </para>
 
- row: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_set_id ##### -->
-<para>
-
-</para>
-
- row: 
- id: 
-
-
-<!-- ##### FUNCTION gda_row_get_value ##### -->
-<para>
-
-</para>
-
- row: 
- num: 
- Returns: 
-
-
-<!-- ##### FUNCTION gda_row_set_value ##### -->
+<!-- ##### FUNCTION gda_row_new ##### -->
 <para>
 
 </para>
 
- row: 
- num: 
- value: 
+ count: 
 @Returns: 
 
 
@@ -138,17 +51,7 @@
 @Returns: 
 
 
-<!-- ##### FUNCTION gda_row_set_is_default ##### -->
-<para>
-
-</para>
-
- row: 
- num: 
- is_default: 
-
-
-<!-- ##### FUNCTION gda_row_get_is_default ##### -->
+<!-- ##### FUNCTION gda_row_get_value ##### -->
 <para>
 
 </para>

Modified: trunk/libgda/Makefile.am
==============================================================================
--- trunk/libgda/Makefile.am	(original)
+++ trunk/libgda/Makefile.am	Mon Jul 28 19:51:03 2008
@@ -35,7 +35,6 @@
 	gda-data-comparator.h \
 	gda-data-handler.h \
 	gda-data-model-array.h \
-	gda-data-model-row.h \
 	gda-data-model.h \
 	$(GDA_BDB_H) \
 	gda-data-model-dir.h \
@@ -58,8 +57,8 @@
 	gda-meta-struct.h \
 	gda-mutex.h \
 	gda-quark-list.h \
-	gda-set.h \
 	gda-row.h \
+	gda-set.h \
 	gda-server-operation.h \
 	gda-server-provider.h \
 	gda-server-provider-extra.h \
@@ -90,7 +89,6 @@
 	gda-data-handler.c \
 	gda-data-model-array.c \
 	$(GDA_BDB_S) \
-	gda-data-model-row.c \
 	gda-data-model.c \
 	gda-data-model-dir.c \
 	gda-data-model-dsn-list.c \
@@ -113,8 +111,8 @@
 	gda-meta-struct-io.c \
 	gda-mutex.c \
 	gda-quark-list.c \
-	gda-set.c \
 	gda-row.c \
+	gda-set.c \
 	gda-server-operation.c \
 	gda-server-provider.c \
 	gda-server-provider-extra.c \

Modified: trunk/libgda/gda-config.c
==============================================================================
--- trunk/libgda/gda-config.c	(original)
+++ trunk/libgda/gda-config.c	Mon Jul 28 19:51:03 2008
@@ -24,6 +24,7 @@
 #include <gmodule.h>
 #include <libgda/gda-config.h>
 #include <glib/gi18n-lib.h>
+#include <glib/gstdio.h>
 #include "gda-marshal.h"
 #include <string.h>
 #include <libgda/binreloc/gda-binreloc.h>
@@ -1257,7 +1258,6 @@
 		GdaProviderInfo *info;
 		GModule *handle;
 		gchar *path;
-		gchar *ext;
 		void (*plugin_init) (const gchar *);
 		const gchar * (* plugin_get_name) (void);
 		const gchar * (* plugin_get_description) (void);

Modified: trunk/libgda/gda-data-access-wrapper.c
==============================================================================
--- trunk/libgda/gda-data-access-wrapper.c	(original)
+++ trunk/libgda/gda-data-access-wrapper.c	Mon Jul 28 19:51:03 2008
@@ -454,13 +454,22 @@
 	gint i;
 	GdaRow *row;
 
-	row = gda_row_new ((GdaDataModel *) model, model->priv->nb_cols);
+	row = gda_row_new (model->priv->nb_cols);
 	for (i = 0; i < model->priv->nb_cols; i++) {
 		GdaHolder *holder;
 
 		holder = gda_data_model_iter_get_holder_for_field (model->priv->iter, i);
-		if (holder)
-			gda_row_set_value (row, i, gda_holder_get_value (holder));
+		if (holder) {
+			GValue *dest;
+			const GValue *cvalue = gda_holder_get_value (holder);
+			dest = gda_row_get_value (row, i);
+			if (cvalue) {
+				gda_value_reset_with_type (dest, G_VALUE_TYPE ((GValue *) cvalue));
+				gda_value_set_from_value (dest, cvalue);
+			}
+			else
+				gda_value_set_null (dest);
+		}
 	}
 
 	g_hash_table_insert (model->priv->rows, GINT_TO_POINTER (model->priv->iter_row), row);

Modified: trunk/libgda/gda-data-model-array.c
==============================================================================
--- trunk/libgda/gda-data-model-array.c	(original)
+++ trunk/libgda/gda-data-model-array.c	Mon Jul 28 19:51:03 2008
@@ -25,24 +25,26 @@
 #include <glib/garray.h>
 #include <libgda/gda-data-model-array.h>
 #include <glib/gi18n-lib.h>
-#include <libgda/gda-row.h>
 #include <libgda/gda-data-model.h>
 #include <libgda/gda-data-model-extra.h>
 #include <libgda/gda-util.h>
 
-#define PARENT_TYPE GDA_TYPE_DATA_MODEL_ROW
-
 struct _GdaDataModelArrayPrivate {
+	gboolean       notify_changes;
+        GHashTable    *column_spec;
+
+        gboolean       read_only;
+
 	/* number of columns in each row */
-	gint number_of_columns;
+	gint           number_of_columns;
 
 	/* the array of rows, each item is a GdaRow */
-	GPtrArray *rows;
+	GArray        *rows;
 };
 
 enum {
 	PROP_0,
-
+	PROP_READ_ONLY,
 	PROP_N_COLUMNS
 };
 
@@ -55,205 +57,103 @@
 
 static GObjectClass *parent_class = NULL;
 
+/* GdaDataModel interface */
+static void                 gda_data_model_array_data_model_init (GdaDataModelClass *iface);
+static gint                 gda_data_model_array_get_n_rows      (GdaDataModel *model);
+static gint                 gda_data_model_array_get_n_columns   (GdaDataModel *model);
+static GdaColumn           *gda_data_model_array_describe_column (GdaDataModel *model, gint col);
+static const GValue        *gda_data_model_array_get_value_at    (GdaDataModel *model, gint col, gint row);
+static GdaValueAttribute    gda_data_model_array_get_attributes_at (GdaDataModel *model, gint col, gint row);
+static GdaDataModelAccessFlags gda_data_model_array_get_access_flags(GdaDataModel *model);
+
+static gboolean             gda_data_model_array_set_value_at    (GdaDataModel *model, gint col, gint row,
+                                                                 const GValue *value, GError **error);
+static gboolean             gda_data_model_array_set_values      (GdaDataModel *model, gint row,
+                                                                 GList *values, GError **error);
+static gint                 gda_data_model_array_append_values   (GdaDataModel *model, const GList *values, GError **error);
+static gint                 gda_data_model_array_append_row      (GdaDataModel *model, GError **error);
+static gboolean             gda_data_model_array_remove_row      (GdaDataModel *model, gint row, GError **error);
+
+static void                 gda_data_model_array_set_notify      (GdaDataModel *model, gboolean do_notify_changes);
+static gboolean             gda_data_model_array_get_notify      (GdaDataModel *model);
+
 /*
  * GdaDataModelArray class implementation
  */
 
-static gint
-gda_data_model_array_get_n_rows (GdaDataModelRow *model)
-{
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), -1);
-	return GDA_DATA_MODEL_ARRAY (model)->priv->rows->len;
-}
-
-static gint
-gda_data_model_array_get_n_columns (GdaDataModelRow *model)
-{
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), -1);
-	return GDA_DATA_MODEL_ARRAY (model)->priv->number_of_columns;
-}
-
-static GdaRow *
-gda_data_model_array_get_row (GdaDataModelRow *model, gint row, GError **error)
-{
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), NULL);
-
-	if (row >= GDA_DATA_MODEL_ARRAY (model)->priv->rows->len) {
-		g_set_error (error, 0, 0,
-			     _("Row %d out of range (0-%d)"), row,
-			     GDA_DATA_MODEL_ARRAY (model)->priv->rows->len- 1);
-		return NULL;
-	}
-
-	return GDA_ROW (g_ptr_array_index (GDA_DATA_MODEL_ARRAY (model)->priv->rows, row));
-}
-
-static const GValue *
-gda_data_model_array_get_value_at (GdaDataModelRow *model, gint col, gint row)
-{
-	GdaRow *fields;
-
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), NULL);
-
-	if (GDA_DATA_MODEL_ARRAY (model)->priv->rows->len == 0) {
-		g_warning (_("No row in data model"));
-		return NULL;
-	}
-
-	if (row >= GDA_DATA_MODEL_ARRAY (model)->priv->rows->len) {
-		g_warning (_("Row %d out of range (0-%d)"), row, 
-			   GDA_DATA_MODEL_ARRAY (model)->priv->rows->len - 1);
-		return NULL;
-	}
-
-	if (col >= GDA_DATA_MODEL_ARRAY (model)->priv->number_of_columns) {
-		g_warning (_("Column %d out of range (0-%d)"), col, 
-			   GDA_DATA_MODEL_ARRAY (model)->priv->number_of_columns - 1);
-		return NULL;
-	}
-
-	fields = g_ptr_array_index (GDA_DATA_MODEL_ARRAY (model)->priv->rows, row);
-	if (fields != NULL) {
-		GValue *field;
-
-		field = gda_row_get_value (fields, col);
-		return (const GValue *) field;
-	}
-
-	return NULL;
-}
-
-static gboolean
-gda_data_model_array_is_updatable (GdaDataModelRow *model)
-{
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), FALSE);
-	return TRUE;
-}
-
-static GdaRow *
-gda_data_model_array_append_values (GdaDataModelRow *model, const GList *values, GError **error)
-{
-	gint len;
-	GdaRow *row = NULL;
-
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), NULL);
-	g_return_val_if_fail (values != NULL, NULL);
-
-	len = g_list_length ((GList *) values);
-	if (len != GDA_DATA_MODEL_ARRAY (model)->priv->number_of_columns) {
-		g_set_error (error, 0, GDA_DATA_MODEL_VALUES_LIST_ERROR,
-			     _("Wrong number of values in values list"));
-		return NULL;
-	}
-
-	row = gda_row_new_from_list (GDA_DATA_MODEL (model), values);
-	if (!GDA_DATA_MODEL_ROW_CLASS (G_OBJECT_GET_CLASS (model))->append_row (model, row, error)) {
-		g_object_unref (row);
-		return NULL;
-	}
-
-	g_object_unref (row);
-	return (GdaRow *) row;
-}
-
-static gboolean
-gda_data_model_array_append_row (GdaDataModelRow *model, GdaRow *row, GError **error)
+static void
+gda_data_model_array_data_model_init (GdaDataModelClass *iface)
 {
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), FALSE);
-	g_return_val_if_fail (row != NULL, FALSE);
-
-	g_ptr_array_add (GDA_DATA_MODEL_ARRAY (model)->priv->rows, (GdaRow *) row);
-	g_object_ref (row);
-	gda_row_set_number ((GdaRow *) row, GDA_DATA_MODEL_ARRAY (model)->priv->rows->len - 1);
-	gda_data_model_row_inserted ((GdaDataModel *) model, GDA_DATA_MODEL_ARRAY (model)->priv->rows->len - 1);
-
-	return TRUE;
+        iface->i_get_n_rows = gda_data_model_array_get_n_rows;
+        iface->i_get_n_columns = gda_data_model_array_get_n_columns;
+        iface->i_describe_column = gda_data_model_array_describe_column;
+        iface->i_get_access_flags = gda_data_model_array_get_access_flags;
+        iface->i_get_value_at = gda_data_model_array_get_value_at;
+        iface->i_get_attributes_at = gda_data_model_array_get_attributes_at;
+
+        iface->i_create_iter = NULL;
+        iface->i_iter_at_row = NULL;
+        iface->i_iter_next = NULL;
+        iface->i_iter_prev = NULL;
+
+        iface->i_set_value_at = gda_data_model_array_set_value_at;
+        iface->i_set_values = gda_data_model_array_set_values;
+        iface->i_append_values = gda_data_model_array_append_values;
+        iface->i_append_row = gda_data_model_array_append_row;
+        iface->i_remove_row = gda_data_model_array_remove_row;
+        iface->i_find_row = NULL;
+
+        iface->i_set_notify = gda_data_model_array_set_notify;
+        iface->i_get_notify = gda_data_model_array_get_notify;
+        iface->i_send_hint = NULL;
 }
 
-static gboolean
-gda_data_model_array_update_row (GdaDataModelRow *model, GdaRow *row, GError **error)
+GType
+gda_data_model_array_get_type (void)
 {
-        gint i;
-        GdaDataModelArrayPrivate *priv;
-	gint num;
-
-        g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), FALSE);
-        g_return_val_if_fail (row != NULL, FALSE);
-
-	num = gda_row_get_number (row);
-        priv = GDA_DATA_MODEL_ARRAY (model)->priv;
-
-        for (i = 0; i < priv->rows->len; i++) {
-                if (gda_row_get_number (priv->rows->pdata[i]) == num) {
-			GdaRow *tmp;
-
-			if (row == priv->rows->pdata[i]) {
-				gda_data_model_row_updated ((GdaDataModel *) model, i);
-				return TRUE;
-			}
-
-			tmp = gda_row_copy (row);
-			g_object_unref (priv->rows->pdata[i]);
-			priv->rows->pdata[i] = tmp;
-			gda_data_model_row_updated ((GdaDataModel *) model, i);
-
-                        return TRUE;
-                }
-        }
+	static GType type = 0;
 
-	g_set_error (error, 0, GDA_DATA_MODEL_ROW_NOT_FOUND_ERROR,
-		     _("Row not found in data model"));
-        return FALSE;
-}
+	if (G_UNLIKELY (type == 0)) {
+		static GStaticMutex registering = G_STATIC_MUTEX_INIT;
+		static const GTypeInfo info = {
+			sizeof (GdaDataModelArrayClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) gda_data_model_array_class_init,
+			NULL,
+			NULL,
+			sizeof (GdaDataModelArray),
+			0,
+			(GInstanceInitFunc) gda_data_model_array_init
+		};
 
-static gboolean
-gda_data_model_array_remove_row (GdaDataModelRow *model, GdaRow *row, GError **error)
-{
-	gint i, rownum;
-	
-	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), FALSE);
-	g_return_val_if_fail (row != NULL, FALSE);
+		static const GInterfaceInfo data_model_info = {
+                        (GInterfaceInitFunc) gda_data_model_array_data_model_init,
+                        NULL,
+                        NULL
+                };
 
-	if (g_ptr_array_remove (GDA_DATA_MODEL_ARRAY (model)->priv->rows, (gpointer) row)) {
-		/* renumber following rows */
-		rownum = gda_row_get_number ((GdaRow *) row);
-		for (i = (rownum + 1); i < GDA_DATA_MODEL_ARRAY (model)->priv->rows->len; i++)
-			gda_row_set_number ((GdaRow *) gda_data_model_array_get_row (model, i, error), (i-1));
-
-		/* tag the row as being removed */
-		gda_row_set_id ((GdaRow *) row, "R");
-		gda_row_set_number ((GdaRow *) row, -1);
 
-		gda_data_model_row_removed ((GdaDataModel *) model, rownum);
-		g_object_unref (row);
-		return TRUE;
+		g_static_mutex_lock (&registering);
+		if (type == 0) {
+			type = g_type_register_static (G_TYPE_OBJECT, "GdaDataModelArray", &info, 0);
+			g_type_add_interface_static (type, GDA_TYPE_DATA_MODEL, &data_model_info);
+		}
+		g_static_mutex_unlock (&registering);
 	}
-
-	g_set_error (error, 0, GDA_DATA_MODEL_ROW_NOT_FOUND_ERROR,
-		     _("Row not found in data model"));
-	return FALSE;
+	return type;
 }
 
 static void
 gda_data_model_array_class_init (GdaDataModelArrayClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	GdaDataModelRowClass *model_class = GDA_DATA_MODEL_ROW_CLASS (klass);
 
 	parent_class = g_type_class_peek_parent (klass);
 
 	object_class->finalize = gda_data_model_array_finalize;
-	object_class->get_property = gda_data_model_array_get_property;
 	object_class->set_property = gda_data_model_array_set_property;
-	model_class->get_n_rows = gda_data_model_array_get_n_rows;
-	model_class->get_n_columns = gda_data_model_array_get_n_columns;
-	model_class->get_row = gda_data_model_array_get_row;
-	model_class->get_value_at = gda_data_model_array_get_value_at;
-	model_class->is_updatable = gda_data_model_array_is_updatable;
-	model_class->append_values = gda_data_model_array_append_values;
-	model_class->append_row = gda_data_model_array_append_row;
-	model_class->update_row = gda_data_model_array_update_row;
-	model_class->remove_row = gda_data_model_array_remove_row;
+	object_class->get_property = gda_data_model_array_get_property;
 
 	g_object_class_install_property (object_class,
 	                                 PROP_N_COLUMNS,
@@ -264,6 +164,11 @@
 	                                                    G_MAXUINT,
 	                                                    0,
 	                                                    G_PARAM_READWRITE));
+	g_object_class_install_property (object_class, PROP_READ_ONLY,
+                                         g_param_spec_boolean ("read_only", NULL, 
+							       _("Whether data model can be modified"),
+                                                               FALSE,
+                                                               G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
 static void
@@ -273,10 +178,24 @@
 
 	/* allocate internal structure */
 	model->priv = g_new0 (GdaDataModelArrayPrivate, 1);
+	model->priv->notify_changes = TRUE;
+        model->priv->column_spec = g_hash_table_new (g_direct_hash, g_direct_equal);
+        model->priv->read_only = FALSE;
 	model->priv->number_of_columns = 0;
-	model->priv->rows = g_ptr_array_new ();
+	model->priv->rows = g_array_new (FALSE, FALSE, sizeof (GdaRow *));
 }
 
+static void column_g_type_changed_cb (GdaColumn *column, GType old, GType new, GdaDataModelArray *model);
+
+static void
+hash_free_column (gpointer key, GdaColumn *column, GdaDataModelArray *model)
+{
+        g_signal_handlers_disconnect_by_func (G_OBJECT (column),
+                                              G_CALLBACK (column_g_type_changed_cb), model);
+        g_object_unref (column);
+}
+
+
 static void
 gda_data_model_array_finalize (GObject *object)
 {
@@ -287,7 +206,10 @@
 	/* free memory */
 	gda_data_model_freeze (GDA_DATA_MODEL(model));
 	gda_data_model_array_clear (model);
-	g_ptr_array_free (model->priv->rows, TRUE);
+	g_array_free (model->priv->rows, TRUE);
+	g_hash_table_foreach (model->priv->column_spec, (GHFunc) hash_free_column, model);
+        g_hash_table_destroy (model->priv->column_spec);
+        model->priv->column_spec = NULL;
 
 	g_free (model->priv);
 	model->priv = NULL;
@@ -304,10 +226,12 @@
 	g_return_if_fail (GDA_IS_DATA_MODEL_ARRAY (object));
 	model = GDA_DATA_MODEL_ARRAY (object);
 
-	switch (prop_id)
-	{
+	switch (prop_id) {
+	case PROP_READ_ONLY:
+		model->priv->read_only = g_value_get_boolean (value);
+		break;
 	case PROP_N_COLUMNS:
-		gda_data_model_array_set_n_columns(model, g_value_get_uint(value));
+		gda_data_model_array_set_n_columns (model, g_value_get_uint (value));
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -315,17 +239,20 @@
 	}
 }
 
-static void gda_data_model_array_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+static void
+gda_data_model_array_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
 {
 	GdaDataModelArray *model;
 
 	g_return_if_fail (GDA_IS_DATA_MODEL_ARRAY (object));
 	model = GDA_DATA_MODEL_ARRAY (object);
 
-	switch (prop_id)
-	{
+	switch (prop_id) {
+	case PROP_READ_ONLY:
+		g_value_set_boolean (value, model->priv->read_only);
+		break;
 	case PROP_N_COLUMNS:
-		g_value_set_uint(value, model->priv->number_of_columns);
+		g_value_set_uint (value, model->priv->number_of_columns);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -333,31 +260,7 @@
 	}
 }
 
-GType
-gda_data_model_array_get_type (void)
-{
-	static GType type = 0;
 
-	if (G_UNLIKELY (type == 0)) {
-		static GStaticMutex registering = G_STATIC_MUTEX_INIT;
-		static const GTypeInfo info = {
-			sizeof (GdaDataModelArrayClass),
-			(GBaseInitFunc) NULL,
-			(GBaseFinalizeFunc) NULL,
-			(GClassInitFunc) gda_data_model_array_class_init,
-			NULL,
-			NULL,
-			sizeof (GdaDataModelArray),
-			0,
-			(GInstanceInitFunc) gda_data_model_array_init
-		};
-		g_static_mutex_lock (&registering);
-		if (type == 0)
-			type = g_type_register_static (PARENT_TYPE, "GdaDataModelArray", &info, 0);
-		g_static_mutex_unlock (&registering);
-	}
-	return type;
-}
 
 /**
  * gda_data_model_array_new
@@ -467,6 +370,31 @@
 }
 
 /**
+ * gda_data_model_array_get_row
+ * @model: a #GdaDataModelArray object
+ * @row:
+ * @error: a place to store errors, or %NULL
+ *
+ * Get a pointer to a row in @model
+ *
+ * Returns: the #GdaRow, or %NULL if an error occurred
+ */
+GdaRow *
+gda_data_model_array_get_row (GdaDataModelArray *model, gint row, GError **error)
+{
+	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), NULL);
+
+	if (row >= model->priv->rows->len) {
+		g_set_error (error, 0, 0,
+			     _("Row %d out of range (0-%d)"), row,
+			     model->priv->rows->len- 1);
+		return NULL;
+	}
+
+	return g_array_index (model->priv->rows, GdaRow*, row);
+}
+
+/**
  * gda_data_model_array_set_n_columns
  * @model: the #GdaDataModelArray.
  * @cols: number of columns for rows this data model should use.
@@ -498,9 +426,331 @@
 {
 	g_return_if_fail (GDA_IS_DATA_MODEL_ARRAY (model));
 
-	while (model->priv->rows->len > 0) {
-		GdaRow *row = (GdaRow *) g_ptr_array_index (model->priv->rows, model->priv->rows->len-1);
+	while (model->priv->rows->len > 0) 
+		gda_data_model_array_remove_row ((GdaDataModel*) model, 0, NULL);
+}
+
+
+/*
+ * GdaDataModel interface
+ */
+static gint
+gda_data_model_array_get_n_rows (GdaDataModel *model)
+{
+	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), -1);
+	return GDA_DATA_MODEL_ARRAY (model)->priv->rows->len;
+}
+
+static gint
+gda_data_model_array_get_n_columns (GdaDataModel *model)
+{
+	g_return_val_if_fail (GDA_IS_DATA_MODEL_ARRAY (model), -1);
+	return GDA_DATA_MODEL_ARRAY (model)->priv->number_of_columns;
+}
+
+static GdaColumn *
+gda_data_model_array_describe_column (GdaDataModel *model, gint col)
+{
+        GdaColumn *column;
+
+        if (col >= gda_data_model_get_n_columns (model)) {
+                g_warning ("Column %d out of range (0-%d)", col, gda_data_model_get_n_columns (model) - 1);
+                return NULL;
+        }
+
+        column = g_hash_table_lookup (((GdaDataModelArray*) model)->priv->column_spec,
+                                      GINT_TO_POINTER (col));
+        if (!column) {
+                column = gda_column_new ();
+                g_signal_connect (G_OBJECT (column), "g_type_changed",
+                                  G_CALLBACK (column_g_type_changed_cb), model);
+                gda_column_set_position (column, col);
+                g_hash_table_insert (((GdaDataModelArray*) model)->priv->column_spec,
+                                     GINT_TO_POINTER (col), column);
+        }
 
-		gda_data_model_array_remove_row (GDA_DATA_MODEL_ROW(model), row, NULL);
+        return column;
+}
+
+static void
+column_g_type_changed_cb (GdaColumn *column, GType old, GType new, GdaDataModelArray *model)
+{
+        /* emit a warning if there are GValues which are not compatible with the new type */
+        gint i, nrows, col;
+        const GValue *value;
+        gchar *str;
+        gint nb_warnings = 0;
+#define max_warnings 5
+
+        if ((new == G_TYPE_INVALID) ||
+            (new == GDA_TYPE_NULL))
+                return;
+
+        col = gda_column_get_position (column);
+	nrows = model->priv->rows->len;
+        for (i = 0; (i < nrows) && (nb_warnings < max_warnings); i++) {
+                GType vtype;
+
+                value = gda_data_model_array_get_value_at (GDA_DATA_MODEL (model), col, i);
+                if (value)
+                        vtype = G_VALUE_TYPE ((GValue *) value);
+                if (value && (vtype != GDA_TYPE_NULL) && (vtype != new)) {
+                        nb_warnings ++;
+                        if (nb_warnings < max_warnings) {
+                                if (nb_warnings == max_warnings)
+                                        g_warning ("Max number of warning reached, "
+                                                   "more incompatible types...");
+                                else {
+                                        str = gda_value_stringify ((GValue *) value);
+                                        g_warning ("Value of type %s not compatible with new"
+                                                   " column type %s (value=%s)",
+                                                   gda_g_type_to_string (G_VALUE_TYPE ((GValue *) value)),
+                                                   gda_g_type_to_string (new), str);
+                                        g_free (str);
+                                }
+                        }
+                }
+
+        }
+}
+
+static const GValue *
+gda_data_model_array_get_value_at (GdaDataModel *model, gint col, gint row)
+{
+	GdaRow *fields;
+	GdaDataModelArray *amodel = (GdaDataModelArray*) model;
+
+	if (amodel->priv->rows->len == 0) {
+		g_warning (_("No row in data model"));
+		return NULL;
+	}
+
+	if (row >= amodel->priv->rows->len) {
+		g_warning (_("Row %d out of range (0-%d)"), row, 
+			   amodel->priv->rows->len - 1);
+		return NULL;
 	}
+
+	if (col >= amodel->priv->number_of_columns) {
+		g_warning (_("Column %d out of range (0-%d)"), col, 
+			   amodel->priv->number_of_columns - 1);
+		return NULL;
+	}
+
+	fields = g_array_index (amodel->priv->rows, GdaRow*, row);
+	if (fields != NULL) {
+		GValue *field;
+
+		field = gda_row_get_value (fields, col);
+		return (const GValue *) field;
+	}
+
+	return NULL;
+}
+
+static GdaValueAttribute
+gda_data_model_array_get_attributes_at (GdaDataModel *model, gint col, gint row)
+{
+        const GValue *gdavalue;
+        GdaValueAttribute flags = 0;
+        GdaColumn *column;
+
+        column = gda_data_model_array_describe_column (model, col);
+        if (gda_column_get_allow_null (column))
+                flags |= GDA_VALUE_ATTR_CAN_BE_NULL;
+        if (gda_column_get_default_value (column))
+                flags |= GDA_VALUE_ATTR_CAN_BE_DEFAULT;
+
+        if (row >= 0) {
+                gdavalue = gda_data_model_get_value_at (model, col, row);
+                if (!gdavalue || gda_value_is_null ((GValue *) gdavalue))
+                        flags |= GDA_VALUE_ATTR_IS_NULL;
+        }
+
+        if (((GdaDataModelArray *)model)->priv->read_only)
+                flags |= GDA_VALUE_ATTR_NO_MODIF;
+
+        return flags;
+}
+
+
+static GdaDataModelAccessFlags
+gda_data_model_array_get_access_flags (GdaDataModel *model)
+{
+        GdaDataModelAccessFlags flags = GDA_DATA_MODEL_ACCESS_RANDOM |
+                GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD |
+                GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD;
+
+        if (! ((GdaDataModelArray *)model)->priv->read_only)
+                flags |= GDA_DATA_MODEL_ACCESS_WRITE;
+
+        return flags;
+}
+
+static gboolean
+gda_data_model_array_set_value_at (GdaDataModel *model, gint col, gint row,
+				   const GValue *value, GError **error)
+{
+        GdaRow *gdarow;
+	GdaDataModelArray *amodel = (GdaDataModelArray*) model;
+
+        g_return_val_if_fail (row >= 0, FALSE);
+
+	if (amodel->priv->read_only) {
+		g_set_error (error, 0, GDA_DATA_MODEL_ACCESS_ERROR,
+                             _("Attempting to modify a read-only data model"));
+                return FALSE;
+        }
+
+	if (row > amodel->priv->rows->len) {
+		g_set_error (error, 0, GDA_DATA_MODEL_VALUES_LIST_ERROR,
+			     _("Row number out of range"));
+                return FALSE;
+        }
+
+	gdarow = gda_data_model_array_get_row ((GdaDataModelArray *) model, row, error);
+        if (gdarow) {
+		GValue *dest;
+		dest = gda_row_get_value (gdarow, col);
+		if (value) {
+			gda_value_reset_with_type (dest, G_VALUE_TYPE ((GValue *) value));
+			gda_value_set_from_value (dest, value);
+		}
+		else
+			gda_value_set_null (dest);
+		gda_data_model_row_updated ((GdaDataModel *) model, row);
+		return TRUE;
+        }
+        else 
+                return FALSE;
+}
+
+static gboolean
+gda_data_model_array_set_values (GdaDataModel *model, gint row, GList *values, GError **error)
+{
+        GdaRow *gdarow;
+	GdaDataModelArray *amodel = (GdaDataModelArray*) model;
+
+        g_return_val_if_fail (row >= 0, FALSE);
+
+        if (!values)
+                return TRUE;
+
+	if (amodel->priv->read_only) {
+		g_set_error (error, 0, GDA_DATA_MODEL_ACCESS_ERROR,
+                             _("Attempting to modify a read-only data model"));
+                return FALSE;
+        }
+
+        if (g_list_length (values) > gda_data_model_get_n_columns (model)) {
+                g_set_error (error, 0, GDA_DATA_MODEL_VALUES_LIST_ERROR,
+                             _("Too many values in list"));
+                return FALSE;
+        }
+
+	gdarow = gda_data_model_array_get_row (amodel, row, error);
+        if (gdarow) {
+                GList *list;
+                gint col;
+		for (list = values, col = 0; list; list = list->next, col++) {
+			GValue *dest;
+			dest = gda_row_get_value (gdarow, col);
+			if (list->data) {
+				gda_value_reset_with_type (dest, G_VALUE_TYPE ((GValue *) list->data));
+				gda_value_set_from_value (dest, (GValue *) list->data);
+			}
+			else
+				gda_value_set_null (dest);
+		}
+		gda_data_model_row_updated (model, row);
+		return TRUE;
+        }
+
+        return FALSE;
+}
+
+static gint
+gda_data_model_array_append_values (GdaDataModel *model, const GList *values, GError **error)
+{
+        GdaRow *row;
+	const GList *list;
+	gint i;
+	GdaDataModelArray *amodel = (GdaDataModelArray *) model;
+	
+        if (amodel->priv->read_only) {
+		g_set_error (error, 0, GDA_DATA_MODEL_ACCESS_ERROR,
+                             _("Attempting to modify a read-only data model"));
+                return FALSE;
+        }
+
+	if (g_list_length ((GList *) values) > amodel->priv->number_of_columns) {
+                g_set_error (error, 0, GDA_DATA_MODEL_VALUES_LIST_ERROR,
+                             _("Too many values in list"));
+                return FALSE;
+        }
+
+	row = gda_row_new (amodel->priv->number_of_columns);
+	for (i = 0, list = values; list; i++, list = list->next) {
+		GValue *dest;
+		dest = gda_row_get_value (row, i);
+		if (list->data) {
+			gda_value_reset_with_type (dest, G_VALUE_TYPE ((GValue *) list->data));
+			gda_value_set_from_value (dest, (GValue *) list->data);
+		}
+		else
+			gda_value_set_null (dest);
+	}
+
+	g_array_append_val (amodel->priv->rows, row);
+	gda_data_model_row_inserted (model, amodel->priv->rows->len - 1);
+	return amodel->priv->rows->len - 1;
+}
+
+static gint
+gda_data_model_array_append_row (GdaDataModel *model, GError **error)
+{
+	GdaRow *row;
+	GdaDataModelArray *amodel = (GdaDataModelArray *) model;
+
+	if (amodel->priv->read_only) {
+		g_set_error (error, 0, GDA_DATA_MODEL_ACCESS_ERROR,
+                             _("Attempting to modify a read-only data model"));
+                return FALSE;
+        }
+
+	row = gda_row_new (amodel->priv->number_of_columns);
+	g_array_append_val (amodel->priv->rows, row);
+	gda_data_model_row_inserted (model, amodel->priv->rows->len - 1);
+	return amodel->priv->rows->len - 1;
+}
+
+static gboolean
+gda_data_model_array_remove_row (GdaDataModel *model, gint row, GError **error)
+{
+	GdaRow *gdarow;
+	GdaDataModelArray *amodel = (GdaDataModelArray *) model;
+
+	gdarow = g_array_index (amodel->priv->rows, GdaRow*, row);
+	if (gdarow) {
+		amodel->priv->rows = g_array_remove_index (amodel->priv->rows, row);
+		gda_data_model_row_removed ((GdaDataModel *) model, row);
+		g_object_unref (gdarow);
+		return TRUE;
+	}
+
+	g_set_error (error, 0, GDA_DATA_MODEL_ROW_NOT_FOUND_ERROR,
+		     _("Row not found in data model"));
+	return FALSE;
+}
+
+static void
+gda_data_model_array_set_notify (GdaDataModel *model, gboolean do_notify_changes)
+{
+	((GdaDataModelArray *) model)->priv->notify_changes = do_notify_changes;
+}
+
+static gboolean
+gda_data_model_array_get_notify (GdaDataModel *model)
+{
+	return ((GdaDataModelArray *) model)->priv->notify_changes;
 }

Modified: trunk/libgda/gda-data-model-array.h
==============================================================================
--- trunk/libgda/gda-data-model-array.h	(original)
+++ trunk/libgda/gda-data-model-array.h	Mon Jul 28 19:51:03 2008
@@ -25,7 +25,7 @@
 #define __GDA_DATA_MODEL_ARRAY_H__
 
 #include <libgda/gda-data-model.h>
-#include <libgda/gda-data-model-row.h>
+#include <libgda/gda-row.h>
 
 G_BEGIN_DECLS
 
@@ -40,18 +40,20 @@
 typedef struct _GdaDataModelArrayPrivate GdaDataModelArrayPrivate;
 
 struct _GdaDataModelArray {
-	GdaDataModelRow           model;
+	GObject                   object;
 	GdaDataModelArrayPrivate *priv;
 };
 
 struct _GdaDataModelArrayClass {
-	GdaDataModelRowClass      parent_class;
+	GObjectClass              parent_class;
 };
 
 GType              gda_data_model_array_get_type          (void) G_GNUC_CONST;
 GdaDataModel      *gda_data_model_array_new_with_g_types  (gint cols, ...);
 GdaDataModel      *gda_data_model_array_new               (gint cols);
 GdaDataModelArray *gda_data_model_array_copy_model        (GdaDataModel *src, GError **error);
+
+GdaRow            *gda_data_model_array_get_row           (GdaDataModelArray *model, gint row, GError **error);
 void               gda_data_model_array_set_n_columns     (GdaDataModelArray *model, gint cols);
 void               gda_data_model_array_clear             (GdaDataModelArray *model);
 

Modified: trunk/libgda/gda-data-model.h
==============================================================================
--- trunk/libgda/gda-data-model.h	(original)
+++ trunk/libgda/gda-data-model.h	Mon Jul 28 19:51:03 2008
@@ -66,7 +66,8 @@
 	GDA_DATA_MODEL_ROW_OUT_OF_RANGE_ERROR,
 	GDA_DATA_MODEL_COLUMN_OUT_OF_RANGE_ERROR,
 	GDA_DATA_MODEL_VALUES_LIST_ERROR,
-	GDA_DATA_MODEL_ROW_NOT_FOUND_ERROR
+	GDA_DATA_MODEL_ROW_NOT_FOUND_ERROR,
+	GDA_DATA_MODEL_ACCESS_ERROR
 };
 
 /* struct for the interface */

Modified: trunk/libgda/gda-row.c
==============================================================================
--- trunk/libgda/gda-row.c	(original)
+++ trunk/libgda/gda-row.c	Mon Jul 28 19:51:03 2008
@@ -24,34 +24,21 @@
 
 #include "gda-row.h"
 #include <string.h>
-#include "gda-marshal.h"
 #include "gda-data-model.h"
 
 #define PARENT_TYPE G_TYPE_OBJECT
 
 struct _GdaRowPrivate {
 	GdaDataModel *model; /* can be NULL */
-        gint          number;
-        gchar        *id;
 
         GValue       *fields;        /* GValue for each column */
-        gboolean     *is_default;    /* one gboolean for each column */
         gint          nfields;
 };
 
-/* signals */
-enum {
-	VALUE_TO_CHANGE,
-	VALUE_CHANGED,
-	LAST_SIGNAL
-};
-
 /* properties */
 enum
 {
         PROP_0,
-        PROP_MODEL,
-        PROP_VALUES,
         PROP_NB_VALUES
 };
 
@@ -69,7 +56,6 @@
 				  GValue *value,
 				  GParamSpec *pspec);
 
-static guint gda_row_signals[LAST_SIGNAL] = { 0, 0 };
 static GObjectClass *parent_class = NULL;
 
 static void
@@ -78,25 +64,6 @@
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	
 	parent_class = g_type_class_peek_parent (klass);
-	
-	gda_row_signals[VALUE_CHANGED] =
-		g_signal_new ("value_changed",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (GdaRowClass, value_changed),
-			      NULL, NULL,
-			      gda_marshal_VOID__INT_BOXED_BOXED,
-			      G_TYPE_NONE,
-			      3, G_TYPE_INT, G_TYPE_VALUE, G_TYPE_VALUE);
-	gda_row_signals[VALUE_TO_CHANGE] =
-		g_signal_new ("value_to_change",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (GdaRowClass, value_to_change),
-			      NULL, NULL,
-			      gda_marshal_VOID__INT_BOXED_BOXED,
-			      G_TYPE_BOOLEAN,
-			      3, G_TYPE_INT, G_TYPE_VALUE, G_TYPE_VALUE);
 
 	object_class->finalize = gda_row_finalize;
 	object_class->dispose = gda_row_dispose;
@@ -105,17 +72,6 @@
         object_class->set_property = gda_row_set_property;
         object_class->get_property = gda_row_get_property;
 
-	g_object_class_install_property (object_class, PROP_MODEL,
-                                         g_param_spec_object ("model", NULL, NULL, 
-                                                               GDA_TYPE_DATA_MODEL,
-							       G_PARAM_READABLE | G_PARAM_WRITABLE));
-
-        /* Note that this is actually a GList*, 
-         * but there does not seem to be a way to define that in the properties system:
-         */
-	g_object_class_install_property (object_class, PROP_VALUES,
-                                         g_param_spec_pointer ("values", NULL, NULL, 
-							       G_PARAM_WRITABLE));
 	g_object_class_install_property (object_class, PROP_NB_VALUES,
                                          g_param_spec_int ("nb_values", NULL, NULL,
 							   1, G_MAXINT, 1, 
@@ -129,10 +85,7 @@
 	
 	row->priv = g_new0 (GdaRowPrivate, 1);
 	row->priv->model = NULL;
-	row->priv->number = -1;
-	row->priv->id = NULL;
 	row->priv->fields = NULL;
-	row->priv->is_default = NULL;
 	row->priv->nfields = 0;
 }
 
@@ -142,10 +95,7 @@
 	GdaRow *row = (GdaRow *) object;
 	
 	g_return_if_fail (GDA_IS_ROW (row));
-	
-	if (row->priv->model)
-		gda_row_set_model (row, NULL);
-	
+		
 	parent_class->finalize (object);
 }
 
@@ -159,13 +109,9 @@
 	if (row->priv) {
 		gint i;
 
-		if (row->priv->id)
-			g_free (row->priv->id);
 		for (i = 0; i < row->priv->nfields; i++)
 			gda_value_set_null (&(row->priv->fields [i]));
 		g_free (row->priv->fields);
-		if (row->priv->is_default)
-			g_free (row->priv->is_default);
 
 		g_free (row->priv);
 		row->priv = NULL;
@@ -185,36 +131,6 @@
         row = GDA_ROW (object);
         if (row->priv) {
                 switch (param_id) {
-                case PROP_MODEL:
-			gda_row_set_model (row, GDA_DATA_MODEL (g_value_get_object(value)));
-                        break;
-                case PROP_VALUES: {
-			const GList *l;
-			GList *values;
-			gint i;
-			
-			g_return_if_fail (!row->priv->fields);
-
-			values = (GList *) g_value_get_pointer (value);
-			i = g_list_length (values);
-
-			row->priv->nfields = i;
-			row->priv->fields = g_new0 (GValue, row->priv->nfields);
-			
-			for (i = 0, l = values; l != NULL; l = l->next, i++) {
-				const GValue *value = (const GValue *) l->data;
-				
-				if (value && !gda_value_is_null (value)) {
-					GValue *dest;
-					dest = gda_row_get_value (row, i);
-					gda_value_reset_with_type (dest, G_VALUE_TYPE ((GValue *) value));
-					gda_value_set_from_value (dest, value);
-				}
-				else
-					gda_value_set_null (gda_row_get_value (row, i));
-			}
-                        break;
-		}
 		case PROP_NB_VALUES:
 			g_return_if_fail (!row->priv->fields);
 
@@ -239,11 +155,10 @@
         row = GDA_ROW (object);
         if (row->priv) {
                 switch (param_id) {
-                case PROP_MODEL:
-			g_value_set_object (value, G_OBJECT (gda_row_get_model (row)));
-                        break;
-                case PROP_VALUES:
 		case PROP_NB_VALUES:
+			g_value_set_int (value, row->priv->nfields);
+			break;
+		default:
 			g_assert_not_reached ();
 			break;
                 }
@@ -291,200 +206,11 @@
  * Returns: a newly allocated #GdaRow object.
  */
 GdaRow *
-gda_row_new (GdaDataModel *model, gint count)
+gda_row_new (gint count)
 {
-	GdaRow *row = NULL;
-
-	if (model)
-		g_return_val_if_fail (GDA_IS_DATA_MODEL (model), NULL);
         g_return_val_if_fail (count > 0, NULL);
-
-	row = g_object_new (GDA_TYPE_ROW, "model", model, "nb_values", count, NULL);
-
-	return row;
-}
-
-/**
- * gda_row_copy
- * @row: the #GdaRow to copy
- *
- * Copy constructor.
- *
- * Returns: a new #GdaRow
- */
-GdaRow *
-gda_row_copy (GdaRow *row)
-{
-	GdaRow *newrow;
-	gint i;
-
-	g_return_val_if_fail (GDA_IS_ROW (row), NULL);
-	g_return_val_if_fail (row->priv, NULL);
-
-	newrow = g_object_new (GDA_TYPE_ROW, "model", row->priv->model, "nb_values", row->priv->nfields, NULL);
-
-	newrow->priv->number = row->priv->number;
-	if (row->priv->id)
-		newrow->priv->id = g_strdup (row->priv->id);
-	
-	/* copy values */
-	newrow->priv->fields = g_new0 (GValue, row->priv->nfields);
-	for (i = 0; i < row->priv->nfields; i++) {
-		GValue *origval = gda_row_get_value (row, i);
-		g_value_init (&(newrow->priv->fields[i]), G_VALUE_TYPE (origval));
-		gda_value_set_from_value (&(newrow->priv->fields[i]), origval);
-	}
-
-	/* copy values' attributes */
-	if (row->priv->is_default) {
-		newrow->priv->is_default = g_new0 (gboolean, row->priv->nfields);
-		memcpy (newrow->priv->is_default, row->priv->is_default, sizeof (gboolean) * row->priv->nfields);
-	}
-
-	return newrow;
-}
-
-/**
- * gda_row_new_from_list
- * @model: a #GdaDataModel this row belongs to, or %NULL if the row is outside any data model
- * @values: a list of #GValue's.
- *
- * Creates a #GdaRow from a list of #GValue's.  These GValue's are
- * value-copied and the user is still responsible for freeing them with g_object_unref().
- *
- * See the gda_row_new() function's documentation for more information about the @model attribute
- *
- * Returns: the newly created row.
- */
-GdaRow *
-gda_row_new_from_list (GdaDataModel *model, const GList *values)
-{
-        GdaRow *row;
 	
-	if (model)
-		g_return_val_if_fail (GDA_IS_DATA_MODEL (model), NULL);
-        row = g_object_new (GDA_TYPE_ROW, "model", model, "values", values, NULL);
-
-        return row;
-}
-
-/**
- * gda_row_set_model
- * @row: a #GdaRow.
- * @model: a #GdaDataModel this row belongs to, or %NULL if the row is outside any data model
- *
- * Set the #GdaDataModel the given #GdaRow belongs to. Note that calling
- * this method should be reserved to GdaDataModel implementations and should
- * therefore not be called by the user.
- */
-void
-gda_row_set_model (GdaRow *row, GdaDataModel *model)
-{
-        g_return_if_fail (GDA_IS_ROW (row));
-	g_return_if_fail (row->priv);
-
-	if (row->priv->model) {
-		g_object_remove_weak_pointer (G_OBJECT (row->priv->model), (gpointer *) &(row->priv->model));
-		row->priv->model = NULL;
-	}
-
-	if (model) {
-		g_return_if_fail (GDA_IS_DATA_MODEL (model));
-		row->priv->model = model;
-		g_object_add_weak_pointer (G_OBJECT (model), (gpointer *) &(row->priv->model));
-	}
-}
-
-/**
- * gda_row_get_model
- * @row: a #GdaRow.
- *
- * Gets the #GdaDataModel the given #GdaRow belongs to.
- *
- * Returns: a #GdaDataModel.
- */
-GdaDataModel *
-gda_row_get_model (GdaRow *row)
-{
-        g_return_val_if_fail (GDA_IS_ROW (row), NULL);
-	g_return_val_if_fail (row->priv, NULL);
-
-        return row->priv->model;
-}
-
-/**
- * gda_row_get_number
- * @row: a #GdaRow.
- *
- * Gets the number of the given row, that is, its position in its containing
- * data model.
- *
- * Returns: the row number, or -1 if there was an error.
- */
-gint
-gda_row_get_number (GdaRow *row)
-{
-        g_return_val_if_fail (GDA_IS_ROW (row), -1);
-	g_return_val_if_fail (row->priv, -1);
-
-        return row->priv->number;
-}
-
-/**
- * gda_row_set_number
- * @row: a #GdaRow.
- * @number: the new row number.
- *
- * Sets the row number for the given row.
- */
-void
-gda_row_set_number (GdaRow *row, gint number)
-{
-	g_return_if_fail (GDA_IS_ROW (row));
-	g_return_if_fail (row->priv);
-
-	row->priv->number = number;
-}
-
-/**
- * gda_row_get_id
- * @row: a #GdaRow (which contains #GValue).
- *
- * Returns the unique identifier for this row. This identifier is
- * assigned by the different providers, to uniquely identify
- * rows returned to clients. If there is no ID, this means that
- * the row has not been created by a provider, or that it the
- * provider cannot identify it (ie, modifications to it won't
- * take place into the database).
- *
- * Returns: the unique identifier for this row.
- */
-const gchar *
-gda_row_get_id (GdaRow *row)
-{
-        g_return_val_if_fail (GDA_IS_ROW (row), NULL);
-	g_return_val_if_fail (row->priv, NULL);
-
-        return (const gchar *) row->priv->id;
-}
-
-/**
- * gda_row_set_id
- * @row: a #GdaRow (which contains #GValue).
- * @id: new identifier for the row.
- *
- * Assigns a new identifier to the given row. This function is
- * usually called by providers.
- */
-void
-gda_row_set_id (GdaRow *row, const gchar *id)
-{
-	g_return_if_fail (GDA_IS_ROW (row));
-	g_return_if_fail (row->priv); 
-
-        if (row->priv->id)
-                g_free (row->priv->id);
-        row->priv->id = g_strdup (id);
+	return (GdaRow*) g_object_new (GDA_TYPE_ROW, "nb_values", count, NULL);
 }
 
 /**
@@ -495,7 +221,7 @@
  * Gets a pointer to a #GValue stored in a #GdaRow.
  *
  * This is a pointer to the internal array of values. Don't try to free
- * or modify it.
+ * or modify it!
  *
  * Returns: a pointer to the #GValue in the position @num of @row.
  */
@@ -503,73 +229,11 @@
 gda_row_get_value (GdaRow *row, gint num)
 {
         g_return_val_if_fail (GDA_IS_ROW (row), NULL);
-	g_return_val_if_fail (row->priv, NULL);
         g_return_val_if_fail (num >= 0 && num < row->priv->nfields, NULL);
 
         return & (row->priv->fields[num]);
 }
 
-/**
- * gda_row_set_value
- * @row: a #GdaRow
- * @num: field index.
- * @value: a #GValue to insert into @row at the @num position, or %NULL
- *
- * Sets the value stored at position @num in @row to be a copy of
- * @value.
- *
- * Returns: TRUE if no error occurred.
- */
-gboolean
-gda_row_set_value (GdaRow *row, gint num, const GValue *value)
-{
-	GValue *current, *newval;
-	gboolean retval;
-
-        g_return_val_if_fail (GDA_IS_ROW (row), FALSE);
-	g_return_val_if_fail (row->priv, FALSE);
-        g_return_val_if_fail (num >= 0 && num < row->priv->nfields, FALSE);
-
-	if (!value) 
-		newval = gda_value_new_null ();
-	else
-		newval = (GValue *) value;
-
-	current = gda_row_get_value (row, num);
-	g_signal_emit (G_OBJECT (row),
-		       gda_row_signals [VALUE_TO_CHANGE],
-		       0, num, current, newval, &retval);
-	
-	/* FIXME: it seems the return value is always FALSE */
-	retval = TRUE;
-
-	if (retval) {
-		current = gda_value_copy (gda_row_get_value (row, num));
-		if (value) {
-			if (gda_value_is_null (&(row->priv->fields[num])))
-				gda_value_reset_with_type (&(row->priv->fields[num]),
-							   G_VALUE_TYPE (newval));
-			retval = gda_value_set_from_value (&(row->priv->fields[num]), newval);
-		}
-		else
-			gda_value_set_null (&(row->priv->fields[num]));
-		
-		if (retval) {
-			const GValue *realval;
-			realval = gda_row_get_value (row, num);
-			g_signal_emit (G_OBJECT (row),
-				       gda_row_signals [VALUE_CHANGED],
-				       0, num, current, realval);
-		}
-		gda_value_free (current);
-	}
-
-	if (!value)
-		gda_value_free (newval);
-
-
-	return retval;
-}
 
 /**
  * gda_row_get_length
@@ -585,47 +249,3 @@
 
         return row->priv->nfields;
 }
-
-
-/**
- * gda_row_set_default
- * @row: a #GdaRow
- * @num: field index
- * @is_default:
- *
- * Instructs the @row that the value at column @num must be considered as a default value
- */
-void
-gda_row_set_is_default (GdaRow *row, gint num, gboolean is_default)
-{
-        g_return_if_fail (GDA_IS_ROW (row));
-	g_return_if_fail (row->priv);
-        g_return_if_fail (num >= 0 && num < row->priv->nfields);
-
-        if (! row->priv->is_default)
-                row->priv->is_default = g_new0 (gboolean, row->priv->nfields);
-        row->priv->is_default [num] = is_default;
-}
-
-
-/**
- * gda_row_get_is_default
- * @row: a #GdaRow
- * @num: field index
- *
- * Tells if the value at column @num in @row must be considered as a default value
- *
- * Returns:
- */
-gboolean
-gda_row_get_is_default (GdaRow *row, gint num)
-{
-        g_return_val_if_fail (GDA_IS_ROW (row), FALSE);
-	g_return_val_if_fail (row->priv, FALSE);
-        g_return_val_if_fail (num >= 0 && num < row->priv->nfields, FALSE);
-
-        if (row->priv->is_default)
-                return row->priv->is_default [num];
-        else
-                return FALSE;
-}

Modified: trunk/libgda/gda-row.h
==============================================================================
--- trunk/libgda/gda-row.h	(original)
+++ trunk/libgda/gda-row.h	Mon Jul 28 19:51:03 2008
@@ -1,5 +1,5 @@
 /* GDA library
- * Copyright (C) 1998 - 2005 The GNOME Foundation.
+ * Copyright (C) 1998 - 2008 The GNOME Foundation.
  *
  * AUTHORS:
  *      Michael Lausch <michael lausch at>
@@ -26,8 +26,6 @@
 #define __GDA_ROW_H__
 
 #include <glib-object.h>
-#include <libgda/gda-column.h>
-#include <glib/gmacros.h>
 #include <libgda/gda-decl.h>
 
 G_BEGIN_DECLS
@@ -49,34 +47,13 @@
 
 struct _GdaRowClass {
 	GObjectClass   parent_class;
-	
-	/* signals */
-	gboolean (* value_to_change) (GdaRow *row, gint num, const GValue *current, const GValue *proposed);
-	void     (* value_changed)   (GdaRow *row, gint num, const GValue *old_value, const GValue *new_value);
 };
 
-GType         gda_row_get_type           (void) G_GNUC_CONST;
-
-GdaRow       *gda_row_new            (GdaDataModel *model, gint count);
-GdaRow       *gda_row_new_from_list  (GdaDataModel *model, const GList *values);
-GdaRow       *gda_row_copy           (GdaRow *row);
-
-void          gda_row_set_model      (GdaRow *row, GdaDataModel *model);
-GdaDataModel *gda_row_get_model      (GdaRow *row);
+GType         gda_row_get_type       (void) G_GNUC_CONST;
 
+GdaRow       *gda_row_new            (gint count);
 gint          gda_row_get_length     (GdaRow *row);
-
-gint          gda_row_get_number     (GdaRow *row);
-void          gda_row_set_number     (GdaRow *row, gint number);
-
-const gchar  *gda_row_get_id         (GdaRow *row);
-void          gda_row_set_id         (GdaRow *row, const gchar *id);
-
-GValue     *gda_row_get_value      (GdaRow *row, gint num);
-gboolean      gda_row_set_value      (GdaRow *row, gint num, const GValue *value);
-
-void          gda_row_set_is_default (GdaRow *row, gint num, gboolean is_default);
-gboolean      gda_row_get_is_default (GdaRow *row, gint num);
+GValue       *gda_row_get_value      (GdaRow *row, gint num);
 
 G_END_DECLS
 

Modified: trunk/libgda/providers-support/Makefile.am
==============================================================================
--- trunk/libgda/providers-support/Makefile.am	(original)
+++ trunk/libgda/providers-support/Makefile.am	Mon Jul 28 19:51:03 2008
@@ -8,17 +8,15 @@
 
 psupport_headers = \
 	gda-pmodel.h \
-	gda-prow.h \
 	gda-pstmt.h
 
 libgda_psupport_la_SOURCES = \
 	$(psupport_headers) \
 	gda-pmodel.c \
-	gda-prow.c \
 	gda-pstmt.c
 
 libgda_psupport_la_LDFLAGS = -export-dynamic -module -avoid-version $(NO_UNDEFINED)
 libgda_psupport_la_LIBADD = $(LIBGDA_LIBS)
 
 psupportincludedir=$(includedir)/libgda-$(GDA_ABI_MAJOR_VERSION).$(GDA_ABI_MINOR_VERSION)/providers-support
-psupportinclude_HEADERS=$(psupport_headers)
\ No newline at end of file
+psupportinclude_HEADERS=$(psupport_headers)

Modified: trunk/libgda/providers-support/gda-pmodel.c
==============================================================================
--- trunk/libgda/providers-support/gda-pmodel.c	(original)
+++ trunk/libgda/providers-support/gda-pmodel.c	Mon Jul 28 19:51:03 2008
@@ -26,7 +26,7 @@
 #include <libgda/gda-data-model-private.h>
 #include <string.h>
 #include "gda-pmodel.h"
-#include "gda-prow.h"
+#include "gda-row.h"
 #include "gda-pstmt.h"
 #include <libgda/gda-statement.h>
 #include <libgda/gda-holder.h>
@@ -44,12 +44,12 @@
 };
 
 /*
- * Getting a GdaPRow from a model row:
- * model row ==(model->index)==> model->rows index ==(model->rows)==> GdaPRow
+ * Getting a GdaRow from a model row:
+ * model row ==(model->index)==> model->rows index ==(model->rows)==> GdaRow
  */
 struct _GdaPModelPrivate {
 	GSList                 *columns; /* list of GdaColumn objects */
-	GArray                 *rows; /* Array of GdaPRow */
+	GArray                 *rows; /* Array of GdaRow pointers */
 	GHashTable             *index; /* key = model row number + 1, value = index in @rows array + 1*/
 
 	/* Internal iterator's information, if GDA_DATA_MODEL_CURSOR_* based access */
@@ -227,7 +227,7 @@
 	g_return_if_fail (GDA_IS_PMODEL (model));
 	model->priv = g_new0 (GdaPModelPrivate, 1);
 	model->cnc = NULL;
-	model->priv->rows = g_array_new (FALSE, FALSE, sizeof (GdaPRow *));
+	model->priv->rows = g_array_new (FALSE, FALSE, sizeof (GdaRow *));
 	model->priv->index = g_hash_table_new (g_direct_hash, g_direct_equal);
 	model->prep_stmt = NULL;
 	model->priv->columns = NULL;
@@ -257,8 +257,8 @@
 		}
 		if (model->priv->rows) {
 			for (i = 0; i < model->priv->rows->len; i++) {
-				GdaPRow *prow;
-				prow = g_array_index (model->priv->rows, GdaPRow *, i);
+				GdaRow *prow;
+				prow = g_array_index (model->priv->rows, GdaRow *, i);
 				g_object_unref (prow);
 			}
 			g_array_free (model->priv->rows, TRUE);
@@ -447,17 +447,17 @@
 /**
  * gda_pmodel_take_row
  * @model: a #GdaPModel data model
- * @row: a #GdaPRow row
+ * @row: a #GdaRow row
  * @rownum: "external" advertized row number
  *
  * Stores @row into @model, externally advertized at row number @rownum. The reference to
  * @row is stolen.
  */
 void
-gda_pmodel_take_row (GdaPModel *model, GdaPRow *row, gint rownum)
+gda_pmodel_take_row (GdaPModel *model, GdaRow *row, gint rownum)
 {
 	g_return_if_fail (GDA_IS_PMODEL (model));
-	g_return_if_fail (GDA_IS_PROW (row));
+	g_return_if_fail (GDA_IS_ROW (row));
 
 	if (g_hash_table_lookup (model->priv->index, GINT_TO_POINTER (rownum + 1))) 
 		g_error ("INTERNAL error: row %d already exists, aborting", rownum);
@@ -472,11 +472,11 @@
  * @model: a #GdaPModel data model
  * @rownum: "external" advertized row number
  *
- * Get the #GdaPRow object stored within @model at row @rownum
+ * Get the #GdaRow object stored within @model at row @rownum
  *
- * Returns: the requested #GdaPRow, or %NULL if not found
+ * Returns: the requested #GdaRow, or %NULL if not found
  */
-GdaPRow *
+GdaRow *
 gda_pmodel_get_stored_row (GdaPModel *model, gint rownum)
 {
 	gint irow;
@@ -487,7 +487,7 @@
 	if (irow <= 0) 
 		return NULL;
 	else 
-		return g_array_index (model->priv->rows, GdaPRow *, irow - 1);
+		return g_array_index (model->priv->rows, GdaRow *, irow - 1);
 }
 
 /**
@@ -618,7 +618,7 @@
 static const GValue *
 gda_pmodel_get_value_at (GdaDataModel *model, gint col, gint row)
 {
-	GdaPRow *prow;
+	GdaRow *prow;
 	gint irow, nrows;
 	GdaPModel *imodel;
 
@@ -642,10 +642,10 @@
 			CLASS (model)->fetch_random (imodel, &prow, row, NULL);
 	}
 	else 
-		prow = g_array_index (imodel->priv->rows, GdaPRow *, irow - 1);
+		prow = g_array_index (imodel->priv->rows, GdaRow *, irow - 1);
 	
 	if (prow) 
-		return gda_prow_get_value (prow, col);
+		return gda_row_get_value (prow, col);
 
 	return NULL;
 }
@@ -690,12 +690,12 @@
 	}
 }
 
-static void update_iter (GdaPModel *imodel, GdaPRow *prow);
+static void update_iter (GdaPModel *imodel, GdaRow *prow);
 static gboolean
 gda_pmodel_iter_next (GdaDataModel *model, GdaDataModelIter *iter)
 {
 	GdaPModel *imodel;
-	GdaPRow *prow = NULL;
+	GdaRow *prow = NULL;
 	gint target_iter_row;
 	gint irow;
 
@@ -719,7 +719,7 @@
 
 	irow = GPOINTER_TO_INT (g_hash_table_lookup (imodel->priv->index, GINT_TO_POINTER (target_iter_row + 1)));
 	if (irow > 0)
-		prow = g_array_index (imodel->priv->rows, GdaPRow *, irow - 1);
+		prow = g_array_index (imodel->priv->rows, GdaRow *, irow - 1);
 	if (!CLASS (model)->fetch_next (imodel, &prow, target_iter_row, NULL))
 		TO_IMPLEMENT;
 	
@@ -740,7 +740,7 @@
 gda_pmodel_iter_prev (GdaDataModel *model, GdaDataModelIter *iter)
 {
 	GdaPModel *imodel;
-	GdaPRow *prow = NULL;
+	GdaRow *prow = NULL;
 	gint target_iter_row;
 	gint irow;
 
@@ -767,7 +767,7 @@
 
 	irow = GPOINTER_TO_INT (g_hash_table_lookup (imodel->priv->index, GINT_TO_POINTER (target_iter_row + 1)));
 	if (irow > 0)
-		prow = g_array_index (imodel->priv->rows, GdaPRow *, irow - 1);
+		prow = g_array_index (imodel->priv->rows, GdaRow *, irow - 1);
 	if (!CLASS (model)->fetch_prev (imodel, &prow, target_iter_row, NULL))
 		TO_IMPLEMENT;
 
@@ -787,7 +787,7 @@
 gda_pmodel_iter_at_row (GdaDataModel *model, GdaDataModelIter *iter, gint row)
 {
 	GdaPModel *imodel;
-	GdaPRow *prow = NULL;
+	GdaRow *prow = NULL;
 	gint irow;
 
 	g_return_val_if_fail (GDA_IS_PMODEL (model), FALSE);
@@ -802,7 +802,7 @@
 
 	irow = GPOINTER_TO_INT (g_hash_table_lookup (imodel->priv->index, GINT_TO_POINTER (row + 1)));
 	if (irow > 0)
-		prow = g_array_index (imodel->priv->rows, GdaPRow *, irow - 1);
+		prow = g_array_index (imodel->priv->rows, GdaRow *, irow - 1);
 
 	if (CLASS (model)->fetch_at) {
 		if (!CLASS (model)->fetch_at (imodel, &prow, row, NULL))
@@ -833,7 +833,7 @@
 }
 
 static void
-update_iter (GdaPModel *imodel, GdaPRow *prow)
+update_iter (GdaPModel *imodel, GdaRow *prow)
 {
         gint i;
 	GdaDataModelIter *iter = imodel->priv->iter;
@@ -848,7 +848,7 @@
 	     plist;
 	     i++, plist = plist->next) {
 		const GValue *value;
-		value = gda_prow_get_value (prow, i);
+		value = gda_row_get_value (prow, i);
 		gda_holder_set_value ((GdaHolder*) plist->data, value);
         }
 

Modified: trunk/libgda/providers-support/gda-pmodel.h
==============================================================================
--- trunk/libgda/providers-support/gda-pmodel.h	(original)
+++ trunk/libgda/providers-support/gda-pmodel.h	Mon Jul 28 19:51:03 2008
@@ -24,7 +24,7 @@
 #define __GDA_PMODEL_H__
 
 #include <glib-object.h>
-#include <libgda/providers-support/gda-prow.h>
+#include <libgda/gda-row.h>
 #include <libgda/providers-support/gda-pstmt.h>
 
 G_BEGIN_DECLS
@@ -44,7 +44,7 @@
 	GdaPModelPrivate *priv;
 	/* read only information */
 	GdaPStmt         *prep_stmt; /* use the "prepared-stmt" property to set this */
-	gint              nb_stored_rows; /* number of GdaPRow objects currently stored */
+	gint              nb_stored_rows; /* number of GdaRow objects currently stored */
 	gint              advertized_nrows; /* set when the number of rows becomes known */
 	GdaConnection    *cnc;
 };
@@ -66,18 +66,18 @@
 
 	/* GDA_DATA_MODEL_ACCESS_RANDOM */
 	gint             (*fetch_nb_rows) (GdaPModel *model);
-	gboolean         (*fetch_random)  (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+	gboolean         (*fetch_random)  (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 	gboolean         (*store_all)     (GdaPModel *model, GError **error);
 
 	/* GDA_STATEMENT_MODEL_CURSOR_* */
-	gboolean         (*fetch_next)    (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-	gboolean         (*fetch_prev)    (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-	gboolean         (*fetch_at)      (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+	gboolean         (*fetch_next)    (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+	gboolean         (*fetch_prev)    (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+	gboolean         (*fetch_at)      (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 };
 
 GType          gda_pmodel_get_type                     (void) G_GNUC_CONST;
-void           gda_pmodel_take_row                     (GdaPModel *model, GdaPRow *row, gint rownum);
-GdaPRow       *gda_pmodel_get_stored_row               (GdaPModel *model, gint rownum);
+void           gda_pmodel_take_row                     (GdaPModel *model, GdaRow *row, gint rownum);
+GdaRow        *gda_pmodel_get_stored_row               (GdaPModel *model, gint rownum);
 
 GdaConnection *gda_pmodel_get_connection               (GdaPModel *model);
 gboolean       gda_pmodel_set_modification_query       (GdaPModel *model, GdaStatement *mod_stmt, GError **error);

Modified: trunk/libgda/sqlite/gda-sqlite-recordset.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-recordset.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-recordset.c	Mon Jul 28 19:51:03 2008
@@ -40,16 +40,16 @@
 
 /* virtual methods */
 static gint    gda_sqlite_recordset_fetch_nb_rows (GdaPModel *model);
-static gboolean gda_sqlite_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+static gboolean gda_sqlite_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 
-static gboolean gda_sqlite_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+static gboolean gda_sqlite_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 
 
-static GdaPRow *fetch_next_sqlite_row (GdaSqliteRecordset *model, gboolean do_store, GError **error);
+static GdaRow *fetch_next_sqlite_row (GdaSqliteRecordset *model, gboolean do_store, GError **error);
 
 struct _GdaSqliteRecordsetPrivate {
 	gint           next_row_num;
-	GdaPRow       *tmp_row; /* used in cursor mode */
+	GdaRow       *tmp_row; /* used in cursor mode */
 };
 static GObjectClass *parent_class = NULL;
 
@@ -148,7 +148,7 @@
 		g_print ("Hey!, all columns are known for prep stmt %p\n", pmodel->prep_stmt);
 	*/
 	for (; nb_missing > 0; ) {
-		GdaPRow *prow;
+		GdaRow *prow;
 		prow = fetch_next_sqlite_row (model, TRUE, NULL);
 		if (!prow)
 			break;
@@ -314,13 +314,13 @@
 	return gtype;
 }
 
-static GdaPRow *
+static GdaRow *
 fetch_next_sqlite_row (GdaSqliteRecordset *model, gboolean do_store, GError **error)
 {
 	int rc;
 	SqliteConnectionData *cdata;
 	GdaSqlitePStmt *ps;
-	GdaPRow *prow = NULL;
+	GdaRow *prow = NULL;
 
 	cdata = (SqliteConnectionData*) gda_connection_internal_get_provider_data 
 		(gda_pmodel_get_connection ((GdaPModel*) model));
@@ -334,7 +334,7 @@
 		gint col;
 		gboolean has_error = FALSE;
 		
-		prow = gda_prow_new (_GDA_PSTMT (ps)->ncols);
+		prow = gda_row_new (_GDA_PSTMT (ps)->ncols);
 		for (col = 0; col < _GDA_PSTMT (ps)->ncols; col++) {
 			GValue *value;
 			GType type = _GDA_PSTMT (ps)->types [col];
@@ -353,7 +353,7 @@
 			}
 			
 			/* fill GValue */
-			value = gda_prow_get_value (prow, col);
+			value = gda_row_get_value (prow, col);
 			if (sqlite3_column_text (ps->sqlite_stmt, col) == NULL) {
 				/* we have a NULL value */
 				gda_value_set_null (value);
@@ -474,7 +474,7 @@
 gda_sqlite_recordset_fetch_nb_rows (GdaPModel *model)
 {
 	GdaSqliteRecordset *imodel;
-	GdaPRow *prow = NULL;
+	GdaRow *prow = NULL;
 
 	imodel = GDA_SQLITE_RECORDSET (model);
 	if (model->advertized_nrows >= 0)
@@ -487,12 +487,12 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the row at position @rownum.
+ * Create a new filled #GdaRow object for the row at position @rownum.
  *
- * Each new #GdaPRow created is "given" to the #GdaPModel implementation using gda_pmodel_take_row ().
+ * Each new #GdaRow created is "given" to the #GdaPModel implementation using gda_pmodel_take_row ().
  */
 static gboolean
-gda_sqlite_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_sqlite_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaSqliteRecordset *imodel;
 
@@ -518,13 +518,13 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the next cursor row
+ * Create a new filled #GdaRow object for the next cursor row
  *
- * Each new #GdaPRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
- * never keeps a reference to it). Before a new #GdaPRow gets created, the previous one, if set, is discarded.
+ * Each new #GdaRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
+ * never keeps a reference to it). Before a new #GdaRow gets created, the previous one, if set, is discarded.
  */
 static gboolean
-gda_sqlite_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_sqlite_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaSqliteRecordset *imodel = (GdaSqliteRecordset*) model;
 

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Mon Jul 28 19:51:03 2008
@@ -12,7 +12,6 @@
 libgda/gda-data-model-import.c
 libgda/gda-data-model-iter.c
 libgda/gda-data-model-query.c
-libgda/gda-data-model-row.c
 libgda/gda-data-proxy.c
 libgda/gda-easy.c
 libgda/gda-init.c

Modified: trunk/providers/firebird/gda-firebird-recordset.c
==============================================================================
--- trunk/providers/firebird/gda-firebird-recordset.c	(original)
+++ trunk/providers/firebird/gda-firebird-recordset.c	Mon Jul 28 19:51:03 2008
@@ -38,10 +38,10 @@
 
 /* virtual methods */
 static gint     gda_firebird_recordset_fetch_nb_rows (GdaPModel *model);
-static gboolean gda_firebird_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_firebird_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_firebird_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_firebird_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+static gboolean gda_firebird_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_firebird_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_firebird_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_firebird_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 
 
 struct _GdaFirebirdRecordsetPrivate {
@@ -232,22 +232,22 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the row at position @rownum, and put it into *prow.
+ * Create a new filled #GdaRow object for the row at position @rownum, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row(). If new row objects are "given" to the GdaPModel implemantation
  * using that method, then this method should detect when all the data model rows have been analysed
  * (when model->nb_stored_rows == model->advertized_nrows) and then possibly discard the API handle
  * as it won't be used anymore to fetch rows.
  */
 static gboolean 
-gda_firebird_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_firebird_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaFirebirdRecordset *imodel;
 
@@ -259,7 +259,7 @@
 }
 
 /*
- * Create and "give" filled #GdaPRow object for all the rows in the model
+ * Create and "give" filled #GdaRow object for all the rows in the model
  */
 static gboolean
 gda_firebird_recordset_store_all (GdaPModel *model, GError **error)
@@ -271,7 +271,7 @@
 
 	/* default implementation */
 	for (i = 0; i < model->advertized_nrows; i++) {
-		GdaPRow *prow;
+		GdaRow *prow;
 		if (! gda_firebird_recordset_fetch_random (model, &prow, i, error))
 			return FALSE;
 	}
@@ -279,19 +279,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the next cursor row, and put it into *prow.
+ * Create a new filled #GdaRow object for the next cursor row, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_firebird_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_firebird_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaFirebirdRecordset *imodel = (GdaFirebirdRecordset*) model;
 
@@ -301,19 +301,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the previous cursor row, and put it into *prow.
+ * Create a new filled #GdaRow object for the previous cursor row, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_firebird_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_firebird_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaFirebirdRecordset *imodel = (GdaFirebirdRecordset*) model;
 
@@ -323,19 +323,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the cursor row at position @rownum, and put it into *prow.
+ * Create a new filled #GdaRow object for the cursor row at position @rownum, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_firebird_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_firebird_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaFirebirdRecordset *imodel = (GdaFirebirdRecordset*) model;
 	

Modified: trunk/providers/mysql/gda-mysql-recordset.c
==============================================================================
--- trunk/providers/mysql/gda-mysql-recordset.c	(original)
+++ trunk/providers/mysql/gda-mysql-recordset.c	Mon Jul 28 19:51:03 2008
@@ -58,22 +58,22 @@
 gda_mysql_recordset_fetch_nb_rows (GdaPModel  *model);
 static gboolean
 gda_mysql_recordset_fetch_random (GdaPModel  *model,
-				  GdaPRow   **prow,
+				  GdaRow    **prow,
 				  gint        rownum,
 				  GError    **error);
 static gboolean
 gda_mysql_recordset_fetch_next (GdaPModel  *model,
-				GdaPRow   **prow,
+				GdaRow    **prow,
 				gint        rownum,
 				GError    **error);
 static gboolean
 gda_mysql_recordset_fetch_prev (GdaPModel  *model,
-				GdaPRow   **prow,
+				GdaRow    **prow,
 				gint        rownum,
 				GError    **error);
 static gboolean
 gda_mysql_recordset_fetch_at (GdaPModel  *model,
-			      GdaPRow   **prow,
+			      GdaRow    **prow,
 			      gint        rownum,
 			      GError    **error);
 
@@ -455,7 +455,7 @@
 }
 
 
-static GdaPRow *
+static GdaRow *
 new_row_from_mysql_stmt (GdaMysqlRecordset  *imodel,
 			 gint                rownum)
 {
@@ -464,13 +464,13 @@
 	MYSQL_BIND *mysql_bind_result = ((GdaMysqlPStmt *) ((GdaPModel *) imodel)->prep_stmt)->mysql_bind_result;
 	g_assert (mysql_bind_result);
 	
-	GdaPRow *prow = gda_prow_new (((GdaPModel *) imodel)->prep_stmt->ncols);
+	GdaRow *prow = gda_row_new (((GdaPModel *) imodel)->prep_stmt->ncols);
 	gint col;
 	for (col = 0; col < ((GdaPModel *) imodel)->prep_stmt->ncols; ++col) {
 		
 		gint i = col;
 		
-		GValue *value = gda_prow_get_value (prow, i);
+		GValue *value = gda_row_get_value (prow, i);
 		GType type = ((GdaPModel *) imodel)->prep_stmt->types[i];
 		gda_value_reset_with_type (value, type);
 		
@@ -616,15 +616,15 @@
 
 
 /*
- * Create a new filled #GdaPRow object for the row at position @rownum, and put it into *prow.
+ * Create a new filled #GdaRow object for the row at position @rownum, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row(). If new row objects are "given" to the GdaPModel implemantation
  * using that method, then this method should detect when all the data model rows have been analysed
  * (when model->nb_stored_rows == model->advertized_nrows) and then possibly discard the API handle
@@ -632,7 +632,7 @@
  */
 static gboolean 
 gda_mysql_recordset_fetch_random (GdaPModel  *model,
-				  GdaPRow   **prow,
+				  GdaRow    **prow,
 				  gint        rownum,
 				  GError    **error)
 {
@@ -667,7 +667,7 @@
 }
 
 /*
- * Create and "give" filled #GdaPRow object for all the rows in the model
+ * Create and "give" filled #GdaRow object for all the rows in the model
  */
 static gboolean
 gda_mysql_recordset_store_all (GdaPModel *model, GError **error)
@@ -679,7 +679,7 @@
 
 	/* default implementation */
 	for (i = 0; i < model->advertized_nrows; i++) {
-		GdaPRow *prow;
+		GdaRow *prow;
 		if (! gda_mysql_recordset_fetch_random (model, &prow, i, error))
 			return FALSE;
 	}
@@ -687,19 +687,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the next cursor row, and put it into *prow.
+ * Create a new filled #GdaRow object for the next cursor row, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_mysql_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_mysql_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaMysqlRecordset *imodel = (GdaMysqlRecordset*) model;
 
@@ -709,19 +709,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the previous cursor row, and put it into *prow.
+ * Create a new filled #GdaRow object for the previous cursor row, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_mysql_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_mysql_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaMysqlRecordset *imodel = (GdaMysqlRecordset*) model;
 
@@ -731,19 +731,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the cursor row at position @rownum, and put it into *prow.
+ * Create a new filled #GdaRow object for the cursor row at position @rownum, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_mysql_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_mysql_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaMysqlRecordset *imodel = (GdaMysqlRecordset*) model;
 	

Modified: trunk/providers/postgres/gda-postgres-recordset.c
==============================================================================
--- trunk/providers/postgres/gda-postgres-recordset.c	(original)
+++ trunk/providers/postgres/gda-postgres-recordset.c	Mon Jul 28 19:51:03 2008
@@ -52,18 +52,18 @@
 
 /* virtual methods */
 static gint     gda_postgres_recordset_fetch_nb_rows (GdaPModel *model);
-static gboolean gda_postgres_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+static gboolean gda_postgres_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 static gboolean gda_postgres_recordset_store_all (GdaPModel *model, GError **error);
-static gboolean gda_postgres_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_postgres_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_postgres_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+static gboolean gda_postgres_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_postgres_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_postgres_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 
 /* static helper functions */
 static void make_point (GdaGeometricPoint *point, const gchar *value);
 static void set_value (GdaConnection *cnc, GValue *value, GType type, const gchar *thevalue, gint length);
 
-static void     set_prow_with_pg_res (GdaPostgresRecordset *imodel, GdaPRow *prow, gint pg_res_rownum);
-static GdaPRow *new_row_from_pg_res (GdaPostgresRecordset *imodel, gint pg_res_rownum);
+static void     set_prow_with_pg_res (GdaPostgresRecordset *imodel, GdaRow *prow, gint pg_res_rownum);
+static GdaRow *new_row_from_pg_res (GdaPostgresRecordset *imodel, gint pg_res_rownum);
 static gboolean row_is_in_current_pg_res (GdaPostgresRecordset *model, gint row);
 static gboolean fetch_next_chunk (GdaPostgresRecordset *model, gboolean *fetch_error, GError **error);
 static gboolean fetch_prev_chunk (GdaPostgresRecordset *model, gboolean *fetch_error, GError **error);
@@ -75,7 +75,7 @@
 	PGresult         *pg_res;
 
 	/* cursor access attributes */
-	GdaPRow          *tmp_row; /* used to store a reference to the last #GdaPRow returned */
+	GdaRow           *tmp_row; /* used to store a reference to the last #GdaRow returned */
 	gchar            *cursor_name;
 	PGconn           *pconn;
 	gint              chunk_size; /* Number of rows to fetch at a time when iterating forward or backwards. */
@@ -422,12 +422,12 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the row at position @rownum.
+ * Create a new filled #GdaRow object for the row at position @rownum.
  *
- * Each new #GdaPRow created is "given" to the #GdaPModel implementation using gda_pmodel_take_row ().
+ * Each new #GdaRow created is "given" to the #GdaPModel implementation using gda_pmodel_take_row ().
  */
 static gboolean
-gda_postgres_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_postgres_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaPostgresRecordset *imodel = (GdaPostgresRecordset *) model;
 
@@ -444,7 +444,7 @@
 	gda_pmodel_take_row (model, *prow, rownum);
 
 	if (model->nb_stored_rows == model->advertized_nrows) {
-		/* all the rows have been converted from PGresult to GdaPRow objects => we can
+		/* all the rows have been converted from PGresult to GdaRow objects => we can
 		 * discard the PGresult */
 		PQclear (imodel->priv->pg_res);
 		imodel->priv->pg_res = NULL;
@@ -454,7 +454,7 @@
 }
 
 /*
- * Create and "give" filled #GdaPRow object for all the rows in the model
+ * Create and "give" filled #GdaRow object for all the rows in the model
  */
 static gboolean
 gda_postgres_recordset_store_all (GdaPModel *model, GError **error)
@@ -469,7 +469,7 @@
 	}
 
 	for (i = 0; i < model->advertized_nrows; i++) {
-		GdaPRow *prow;
+		GdaRow *prow;
 		if (! gda_postgres_recordset_fetch_random (model, &prow, i, error))
 			return FALSE;
 	}
@@ -477,13 +477,13 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the next cursor row
+ * Create a new filled #GdaRow object for the next cursor row
  *
- * Each new #GdaPRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
- * never keeps a reference to it). Before a new #GdaPRow gets created, the previous one, if set, is discarded.
+ * Each new #GdaRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
+ * never keeps a reference to it). Before a new #GdaRow gets created, the previous one, if set, is discarded.
  */
 static gboolean
-gda_postgres_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_postgres_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaPostgresRecordset *imodel = (GdaPostgresRecordset*) model;
 
@@ -514,13 +514,13 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the previous cursor row
+ * Create a new filled #GdaRow object for the previous cursor row
  *
- * Each new #GdaPRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
- * never keeps a reference to it). Before a new #GdaPRow gets created, the previous one, if set, is discarded.
+ * Each new #GdaRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
+ * never keeps a reference to it). Before a new #GdaRow gets created, the previous one, if set, is discarded.
  */
 static gboolean
-gda_postgres_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_postgres_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaPostgresRecordset *imodel = (GdaPostgresRecordset*) model;
 
@@ -551,13 +551,13 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the cursor row at position @rownum
+ * Create a new filled #GdaRow object for the cursor row at position @rownum
  *
- * Each new #GdaPRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
- * never keeps a reference to it). Before a new #GdaPRow gets created, the previous one, if set, is discarded.
+ * Each new #GdaRow created is referenced only by imodel->priv->tmp_row (the #GdaPModel implementation
+ * never keeps a reference to it). Before a new #GdaRow gets created, the previous one, if set, is discarded.
  */
 static gboolean
-gda_postgres_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_postgres_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaPostgresRecordset *imodel = (GdaPostgresRecordset*) model;
 
@@ -717,7 +717,7 @@
 }
 
 static void
-set_prow_with_pg_res (GdaPostgresRecordset *imodel, GdaPRow *prow, gint pg_res_rownum)
+set_prow_with_pg_res (GdaPostgresRecordset *imodel, GdaRow *prow, gint pg_res_rownum)
 {
 	gchar *thevalue;
 	gint col;
@@ -725,22 +725,22 @@
 	for (col = 0; col < ((GdaPModel*) imodel)->prep_stmt->ncols; col++) {
 		thevalue = PQgetvalue (imodel->priv->pg_res, pg_res_rownum, col);
 		if (thevalue && (*thevalue != '\0' ? FALSE : PQgetisnull (imodel->priv->pg_res, pg_res_rownum, col)))
-			gda_value_set_null (gda_prow_get_value (prow, col));
+			gda_value_set_null (gda_row_get_value (prow, col));
 		else
 			set_value (((GdaPModel*) imodel)->cnc,
-				   gda_prow_get_value (prow, col), 
+				   gda_row_get_value (prow, col), 
 				   ((GdaPModel*) imodel)->prep_stmt->types [col], 
 				   thevalue, 
 				   PQgetlength (imodel->priv->pg_res, pg_res_rownum, col));
 	}
 }
 
-static GdaPRow *
+static GdaRow *
 new_row_from_pg_res (GdaPostgresRecordset *imodel, gint pg_res_rownum)
 {
-	GdaPRow *prow;
+	GdaRow *prow;
 
-	prow = gda_prow_new (((GdaPModel*) imodel)->prep_stmt->ncols);
+	prow = gda_row_new (((GdaPModel*) imodel)->prep_stmt->ncols);
 	set_prow_with_pg_res (imodel, prow, pg_res_rownum);
 	return prow;
 }

Modified: trunk/providers/skel-implementation/capi/gda-capi-recordset.c
==============================================================================
--- trunk/providers/skel-implementation/capi/gda-capi-recordset.c	(original)
+++ trunk/providers/skel-implementation/capi/gda-capi-recordset.c	Mon Jul 28 19:51:03 2008
@@ -38,10 +38,10 @@
 
 /* virtual methods */
 static gint     gda_capi_recordset_fetch_nb_rows (GdaPModel *model);
-static gboolean gda_capi_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_capi_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_capi_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
-static gboolean gda_capi_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error);
+static gboolean gda_capi_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_capi_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_capi_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
+static gboolean gda_capi_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error);
 
 
 struct _GdaCapiRecordsetPrivate {
@@ -232,22 +232,22 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the row at position @rownum, and put it into *prow.
+ * Create a new filled #GdaRow object for the row at position @rownum, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row(). If new row objects are "given" to the GdaPModel implemantation
  * using that method, then this method should detect when all the data model rows have been analysed
  * (when model->nb_stored_rows == model->advertized_nrows) and then possibly discard the API handle
  * as it won't be used anymore to fetch rows.
  */
 static gboolean 
-gda_capi_recordset_fetch_random (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_capi_recordset_fetch_random (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaCapiRecordset *imodel;
 
@@ -259,7 +259,7 @@
 }
 
 /*
- * Create and "give" filled #GdaPRow object for all the rows in the model
+ * Create and "give" filled #GdaRow object for all the rows in the model
  */
 static gboolean
 gda_capi_recordset_store_all (GdaPModel *model, GError **error)
@@ -271,7 +271,7 @@
 
 	/* default implementation */
 	for (i = 0; i < model->advertized_nrows; i++) {
-		GdaPRow *prow;
+		GdaRow *prow;
 		if (! gda_capi_recordset_fetch_random (model, &prow, i, error))
 			return FALSE;
 	}
@@ -279,19 +279,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the next cursor row, and put it into *prow.
+ * Create a new filled #GdaRow object for the next cursor row, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_capi_recordset_fetch_next (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_capi_recordset_fetch_next (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaCapiRecordset *imodel = (GdaCapiRecordset*) model;
 
@@ -301,19 +301,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the previous cursor row, and put it into *prow.
+ * Create a new filled #GdaRow object for the previous cursor row, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_capi_recordset_fetch_prev (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_capi_recordset_fetch_prev (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaCapiRecordset *imodel = (GdaCapiRecordset*) model;
 
@@ -323,19 +323,19 @@
 }
 
 /*
- * Create a new filled #GdaPRow object for the cursor row at position @rownum, and put it into *prow.
+ * Create a new filled #GdaRow object for the cursor row at position @rownum, and put it into *prow.
  *
  * WARNING: @prow will NOT be NULL, but *prow may or may not be NULL:
- *  -  If *prow is NULL then a new #GdaPRow object has to be created, 
- *  -  and otherwise *prow contains a #GdaPRow object which has already been created 
+ *  -  If *prow is NULL then a new #GdaRow object has to be created, 
+ *  -  and otherwise *prow contains a #GdaRow object which has already been created 
  *     (through a call to this very function), and in this case it should not be modified
  *     but the function may return FALSE if an error occurred.
  *
- * Memory management for that new GdaPRow object is left to the implementation, which
+ * Memory management for that new GdaRow object is left to the implementation, which
  * can use gda_pmodel_take_row().
  */
 static gboolean 
-gda_capi_recordset_fetch_at (GdaPModel *model, GdaPRow **prow, gint rownum, GError **error)
+gda_capi_recordset_fetch_at (GdaPModel *model, GdaRow **prow, gint rownum, GError **error)
 {
 	GdaCapiRecordset *imodel = (GdaCapiRecordset*) model;
 	

Modified: trunk/tests/data-models/check_data_proxy.c
==============================================================================
--- trunk/tests/data-models/check_data_proxy.c	(original)
+++ trunk/tests/data-models/check_data_proxy.c	Mon Jul 28 19:51:03 2008
@@ -524,7 +524,7 @@
 	/* 
 	 * delete a proxy row, in current proxy's chunk
 	 */
-	declare_expected_signals ("R5", "Delete a proxy row - 3");
+	declare_expected_signals ("R6", "Delete a proxy row - 3");
 	if (!check_data_model_remove_row (model, 25)) goto out;
 	clean_expected_signals (proxy);
 	gda_data_model_dump (proxy, stdout);



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