[libgda] API changes to GdaData.Object.append(). Now all tests pass.
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] API changes to GdaData.Object.append(). Now all tests pass.
- Date: Wed, 4 Jan 2012 22:05:24 +0000 (UTC)
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]