[libgda] API changes to GdaData.Object.append(). Now all tests pass.



commit 2850f8d7afd7ea61653a5abee266b1405a5ba6bf
Author: Daniel Espinosa <despinosa src gnome org>
Date:   Wed Jan 4 16:02:05 2012 -0600

    API changes to GdaData.Object.append(). Now all tests pass.
    
    * In order to append new objects you must set at least id if db definition
    don't set it for you. All fields are appended using standard INSERT command.
    * Unless you set id to the new object you can lost the object and any save
    command will fail

 libgda/data/DataObject.vala         |   19 +++++++---
 libgda/data/DataObjectSingleId.vala |   20 ++++++++---
 libgda/data/GdaData-5.0.gir         |   19 ++--------
 samples/vala/SampleDataObject.vala  |   12 +-----
 tests/vala/CheckDataObject.vala     |   68 +++++++++++++++++++---------------
 5 files changed, 72 insertions(+), 66 deletions(-)
---
diff --git a/libgda/data/DataObject.vala b/libgda/data/DataObject.vala
index 4ede3ff..d7d493b 100644
--- a/libgda/data/DataObject.vala
+++ b/libgda/data/DataObject.vala
@@ -24,7 +24,7 @@ namespace GdaData {
 
     public abstract class Object<G> : GLib.Object {
         
-        protected HashMap<string,Field<G>> _model;
+        protected HashMap<string,Field<G>> _model = new HashMap<string,Field<G>> ();
         /**
          * Derived classes must implement this property to set the table used to get data from.
          */
@@ -52,9 +52,18 @@ namespace GdaData {
         public void set_value (string field, G v)
         	throws Error
         {
-        	var f = _model.get (field);
-        	f.value = v;
-        	this._model.set (field, f);
+        	if (_model.has_key (field)) {
+		    	var f = this._model.get (field);
+		    	f.value = v;
+		    	this._model.set (field, f);
+        	}
+        	else {
+        		// FIXME: Get default attributes from table
+        		var n = new Field<G> (field, DbField.Attribute.NONE); 
+        		n.value = v;
+        		this._model.set (field, n);
+        	}
+        	
         }
         /**
          * Saves any modficiation made to in memory representation of the data directly to
@@ -69,7 +78,7 @@ namespace GdaData {
          * Append a new row to the defined table and returns its ID. If defaults is set to true,
          * default value for each field is set.
          */
-        public abstract void append (out G id) throws Error;
+        public abstract bool append () throws Error;
         
         public abstract string to_string ();
     }
diff --git a/libgda/data/DataObjectSingleId.vala b/libgda/data/DataObjectSingleId.vala
index ab2ea05..6dd8156 100644
--- a/libgda/data/DataObjectSingleId.vala
+++ b/libgda/data/DataObjectSingleId.vala
@@ -56,6 +56,7 @@ namespace GdaData {
         			string col_name = m.get_column_name (c);
         			var f = new Field<Value?> (col_name, (DbField.Attribute) attr);
         			f.value = m.get_value_at (c, r);
+        			this._model.set (f.name, f);
         		}
         	}
         }
@@ -90,12 +91,16 @@ namespace GdaData {
 			var e_id = sql.add_expr_value (null, this._id_value);
 			var c_id = sql.add_cond (SqlOperatorType.EQ, f_id, e_id, 0);
 			sql.set_where (c_id);
+//			stdout.printf ("DEBUG: UPDATE statement to execute: \n"+ 
+//							(sql.get_statement()).to_sql_extended (this.connection, null, 
+//																	StatementSqlFlag.PRETTY, null)
+//							+ "\n");
 			var i = this.connection.statement_execute_non_select (sql.get_statement (), null, null);
 			if (i != 1) {
 				throw new DbObjectError.APPEND ("Have been saved more or less rows than expected");
 			}
         }
-        public override void append (out Value? id) throws Error
+        public override bool append () throws Error
         {
         	var sql = new SqlBuilder (SqlStatementType.INSERT);
 			sql.set_table (this.table);
@@ -103,12 +108,16 @@ namespace GdaData {
 			foreach (Field<Value?> f in _model.values) {
 				sql.add_field_value_as_gvalue (f.column_name, f.value);
 			}
+//			stdout.printf ("DEBUG: INSERT statement to execute: \n"+ 
+//				(sql.get_statement()).to_sql_extended (this.connection, null, 
+//														StatementSqlFlag.PRETTY, null)
+//				+ "\n");
 			Set last_inserted;
-			var i = this.connection.statement_execute_non_select (sql.get_statement (), null, out last_inserted);
+			var i = this.connection.statement_execute_non_select (sql.get_statement (), null, null);
 			if (i != 1) {
 				throw new DbObjectError.APPEND ("Have been added more or less rows than expected");
 			}
-			id = last_inserted.get_holder_value (this.field_id_index.to_string ());
+			return true;
         }
 		public override void update ()
         	throws Error
@@ -122,10 +131,11 @@ namespace GdaData {
 			foreach (Field<Value?> f in this.fields) {
 				r += "|" + f.name;
 			}
-			
+			r+="\n";
 			foreach (Field<Value?> f in this.fields) {
-				r += "|" + f.to_string ();
+				r += "|" + Gda.value_stringify (f.value);
 			}
+			r+="\n";
 			return r;
         }
 	}
diff --git a/libgda/data/GdaData-5.0.gir b/libgda/data/GdaData-5.0.gir
index 8be1f0c..d01125e 100644
--- a/libgda/data/GdaData-5.0.gir
+++ b/libgda/data/GdaData-5.0.gir
@@ -75,23 +75,13 @@
 			</return-value>
 		</virtual-method>
 		<method name="append" c:identifier="gda_data_object_append" throws="1">
-			<parameters>
-				<parameter name="id" direction="out" transfer-ownership="full" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
-				</parameter>
-			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="none"/>
+				<type name="gboolean" c:type="gboolean"/>
 			</return-value>
 		</method>
 		<virtual-method name="append" invoker="append" throws="1">
-			<parameters>
-				<parameter name="id" direction="out" transfer-ownership="full" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
-				</parameter>
-			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="none"/>
+				<type name="gboolean" c:type="gboolean"/>
 			</return-value>
 		</virtual-method>
 		<method name="to_string" c:identifier="gda_data_object_to_string">
@@ -152,12 +142,9 @@
 					<parameter name="self" transfer-ownership="none">
 						<type name="GdaData.Object" c:type="GdaDataObject*"/>
 					</parameter>
-					<parameter name="id" direction="out" transfer-ownership="full" allow-none="1">
-						<type name="gpointer" c:type="gpointer"/>
-					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
-					<type name="none"/>
+					<type name="gboolean" c:type="gboolean"/>
 				</return-value>
 			</callback>
 		</field>
diff --git a/samples/vala/SampleDataObject.vala b/samples/vala/SampleDataObject.vala
index cacbcb4..5c86b0c 100644
--- a/samples/vala/SampleDataObject.vala
+++ b/samples/vala/SampleDataObject.vala
@@ -143,18 +143,10 @@ namespace Sample {
 			stdout.printf("DEMO: Appending Objects...\n");
 			var ob = new Record ();
 			ob.connection = this.connection;
-			ob.set_id ("Jane Castle PhD.");
-			Value id;
-			ob.append (out id);
+			ob.name = "Jacob Sanders PhD.";
+			ob.append ();
 			var m = this.connection.execute_select_command ("SELECT * FROM user");
 			stdout.printf ("Appended Values:\n" + m.dump_as_string () + "\n");
-			var o = new Record ();
-			o.connection = this.connection;
-			o.set_id (id);
-			o.name = name;
-			o.functions = functions;
-			stdout.printf ("name = " + o.name + "\nfunctions = " + o.functions);
-			o.save ();
 		}
 			
 		public static int main (string[] args) {
diff --git a/tests/vala/CheckDataObject.vala b/tests/vala/CheckDataObject.vala
index e7a1067..9d4c6a8 100644
--- a/tests/vala/CheckDataObject.vala
+++ b/tests/vala/CheckDataObject.vala
@@ -21,8 +21,9 @@ using Gda;
 using GdaData;
 
 namespace Check {
-	class Tests : GdaData.ObjectSingleId {
-		private static string t = "user";
+	class Record : GdaData.ObjectSingleId
+	{
+		public static string t = "user";
 		public override string table { 
 			get { return this.t; }
 		}
@@ -32,6 +33,9 @@ namespace Check {
 		public override int field_id_index {
 			get { return 0;}
 		}
+	}
+	class Tests :  GLib.Object {
+		public Gda.Connection connection { get; set; }
 		
 		Tests()
 		{
@@ -40,7 +44,7 @@ namespace Check {
 				stdout.printf("Creating Database...\n");
 				this.connection = Connection.open_from_string("SQLite", "DB_DIR=.;DB_NAME=dataobject", null, Gda.ConnectionOptions.NONE);
 				stdout.printf("Creating table 'user'...\n");
-				this.connection.execute_non_select_command("CREATE TABLE user (id int PRIMARY KEY AUTOINCREMENT, name string, city string)");
+				this.connection.execute_non_select_command("CREATE TABLE user (id integer PRIMARY KEY AUTOINCREMENT, name string, city string)");
 				this.connection.execute_non_select_command("INSERT INTO user (id, name, city) VALUES (1, \"Daniel\", \"Mexico\")");
 				this.connection.execute_non_select_command("INSERT INTO user (id, name, city) VALUES (2, \"Jhon\", \"USA\")");
 				
@@ -60,27 +64,29 @@ namespace Check {
 		{
 			stdout.printf(">>> NEW TEST: Gda.DataObject API tests\n");
 			int fails = 0;
+			var r = new Record ();
+			r.connection = this.connection;
 			stdout.printf("Setting ID to 1\n");
 			try {
-				this.set_id (1);
+				r.set_id (1);
 			}
 			catch (Error e) {
 				fails++;
 				stdout.printf ("Couln't set ID...\nFAILS: %i\nERROR: %s\n", fails, e.message);
 			}
 			
-			stdout.printf("DataObject points to, in table "+ this.table + ":\n", this.table);
-			stdout.printf("%s\n", this.to_string());
+			stdout.printf("DataObject points to, in table "+ r.table + ":\n", r.table);
+			stdout.printf("%s\n", r.to_string());
 			
 			stdout.printf("Getting ID value...\n");
-			var i = (int) this.get_id ();
+			var i = (int) r.get_id ();
 			if (i != 1 ){
 				fails++;
 				stdout.printf("FAILS: %i\n", fails);
 			}
 			
 			stdout.printf("Getting value at 'name'...\n");
-			var vdb = (string) this.get_value ("name");
+			var vdb = (string) r.get_value ("name");
 			if (vdb == null ){
 				fails++;
 				stdout.printf("FAILS: %i\n", fails);
@@ -93,15 +99,15 @@ namespace Check {
 			
 			stdout.printf("Setting value at 'name'...\n");
 			Value n = "Daniel Espinosa";
-			this.set_value ("name", n);
-			stdout.printf("DataObject points to in memory modified value, in table '%s':\n", this.table);
-			stdout.printf("%s\n", this.to_string());
+			r.set_value ("name", n);
+			stdout.printf("DataObject points to in memory modified value, in table '%s':\n", r.table);
+			stdout.printf("%s\n", r.to_string());
 			
 			stdout.printf("Saving changes...\n");
 			try {
-				this.save();
-				stdout.printf("DataObject points to modified value, in table '%s':\n", this.table);
-				stdout.printf("%s\n", this.to_string());
+				r.save();
+				stdout.printf("DataObject points to modified value, in table '%s':\n", r.table);
+				stdout.printf("%s\n", r.to_string());
 			}
 			catch (Error e) {
 				fails++;
@@ -109,18 +115,19 @@ namespace Check {
 			}
 			
 			try {
+				stdout.printf ("Simulating external database update\n");
 				this.connection.execute_non_select_command("UPDATE user SET name = \"Jhon Strauss\", city =\"New Jersey\"");
 			}
 			catch (Error e) {
 				fails++;
-				stdout.printf ("Couln't manual update table '%s'...\nFAILS: %i\nERROR: %s\n", this.table, fails, e.message);
+				stdout.printf ("Couln't manual update table '%s'...\nFAILS: %i\nERROR: %s\n", r.table, fails, e.message);
 			}
 			
 			stdout.printf("Updating values from database...\n");
 			try {
-				this.update();
-				stdout.printf("DataObject points to actual stored values, in table '%s':\n", this.table);
-				stdout.printf("%s\n", this.to_string());
+				r.update();
+				stdout.printf("DataObject points to actual stored values, in table '%s':\n", r.table);
+				stdout.printf("%s\n", r.to_string());
 			}
 			catch (Error e) {
 				fails++;
@@ -128,12 +135,12 @@ namespace Check {
 			}
 			
 			stdout.printf("No Common Operation: Setting a new Table... \n");
-			this.t = "company";
+			r.t = "company";
 			stdout.printf("Updating values from database using a new table 'company'...\n");
 			try {
-				this.update();
-				stdout.printf("DataObject points to actual stored values, in table '%s':\n", this.table);
-				stdout.printf("%s\n", this.to_string());
+				r.update();
+				stdout.printf("DataObject points to actual stored values, in table '%s':\n", r.table);
+				stdout.printf("%s\n", r.to_string());
 			}
 			catch (Error e) {
 				fails++;
@@ -142,15 +149,15 @@ namespace Check {
 			
 			stdout.printf("Setting ID to 2\n");
 			try {
-				this.set_id (2);
-				stdout.printf("DataObject points to actual stored values, in table '%s':\n", this.table);
-				stdout.printf("%s\n", this.to_string());
+				r.set_id (2);
+				stdout.printf("DataObject points to actual stored values, in table '%s':\n", r.table);
+				stdout.printf("%s\n", r.to_string());
 			}
 			catch (Error e) {
 				fails++;
 				stdout.printf ("Couln't set ID...\nFAILS: %i\nERROR: %s\n", fails, e.message);
 			}
-			this.t = "user"; // Reset to default
+			r.t = "user"; // Reset to default
 			return fails;
 		}
 		
@@ -160,13 +167,14 @@ namespace Check {
 			stdout.printf(">>> NEW TEST: Gda.DataObject Adding new objects to DB\n");
 			int fails = 0;
 			try {
-				Value id;
-				this.append (out id);
-				var n = new Tests ();
+				var n = new Record ();
+				n.connection = this.connection;
 				n.set_value ("id", 3);
 				n.set_value ("name", "GdaDataNewName");
 				n.set_value ("city", "GdaDataNewCity");
-				n.save ();
+				stdout.printf("DataObject points to actual stored values, in table '%s':\n", n.table);
+				stdout.printf("%s\n", n.to_string());
+				n.append ();
 				var m = n.connection.execute_select_command ("SELECT * FROM user");
 				if (m.get_n_rows () != 3) fails++;
 				stdout.printf ("All records:\n" + m.dump_as_string () + "\n");



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