Merge pull request #305 from robwilkens/master
authorMiguel de Icaza <miguel@gnome.org>
Sat, 26 May 2012 01:21:41 +0000 (18:21 -0700)
committerMiguel de Icaza <miguel@gnome.org>
Sat, 26 May 2012 01:21:41 +0000 (18:21 -0700)
This fixes bug # 853 in ximarin bugzilla.

mcs/class/System.Data/Makefile
mcs/class/System.Data/SqliteTest.db [new file with mode: 0644]
mcs/class/System.Data/System.Data.Common/DbDataAdapter.cs
mcs/class/System.Data/Test/System.Data.Common/DbDataAdapterTest.cs

index 648db864b4104ad7e366b8047e50a5963091ac42..8b5e6d851200a5d07784e33023df1e91d12c60f5 100644 (file)
@@ -44,7 +44,7 @@ LIB_MCS_FLAGS += \
 endif
 endif
 
-TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -r:System.Core.dll -nowarn:618,169,612,219,168
+TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -r:System.Core.dll -r:Mono.Data.Sqlite.dll -nowarn:618,169,612,219,168
 
 TEST_MONO_PATH = .
 
diff --git a/mcs/class/System.Data/SqliteTest.db b/mcs/class/System.Data/SqliteTest.db
new file mode 100644 (file)
index 0000000..afbf64b
Binary files /dev/null and b/mcs/class/System.Data/SqliteTest.db differ
index 3fdc3ca11052a0f53df4ee8ba5d95bd44fef5082..f438cb100f1536a8c552ffb0729631cc438950e4 100644 (file)
@@ -866,6 +866,28 @@ namespace System.Data.Common
                        if (dataTable == null)
                                throw new ArgumentException (String.Format ("Missing table {0}",
                                                                            srcTable));
+
+                       /** Copied from another Update function **/
+                       if (tableMapping != null) {
+                               foreach (DataColumn col in dataTable.Columns) {
+                                       if (tableMapping.ColumnMappings.IndexOf (col.ColumnName) >= 0)
+                                               continue;
+                                       DataColumnMapping columnMapping = DataColumnMappingCollection.GetColumnMappingBySchemaAction (tableMapping.ColumnMappings, col.ColumnName, MissingMappingAction);
+                                       if (columnMapping == null)
+                                               columnMapping = new DataColumnMapping (col.ColumnName, col.ColumnName);
+                                       tableMapping.ColumnMappings.Add (columnMapping);
+                               }
+                       } else {
+                               ArrayList cmc = new ArrayList ();
+                               foreach (DataColumn col in dataTable.Columns)
+                                       cmc.Add (new DataColumnMapping (col.ColumnName, col.ColumnName));
+                               tableMapping =
+                                       new DataTableMapping (
+                                                             dataTable.TableName,
+                                                             dataTable.TableName,
+                                                             cmc.ToArray (typeof (DataColumnMapping)) as DataColumnMapping []);
+                       }
+                       /**end insert from another update**/
                        return Update (dataTable, tableMapping);
                }
 
index b96de09c8f95c6e2769deaca7886bd83031b09f0..18e664a8d634408f379ef206711cc2612d3d6019 100644 (file)
@@ -31,6 +31,10 @@ using System.Data;
 using System.Data.Common;
 using System.Data.SqlClient;
 
+/*--For Bug 853 Test Begin--*/
+using Mono.Data.Sqlite;
+/*--For Bug 853 Test End--*/
+
 using NUnit.Framework;
 
 namespace MonoTests.System.Data.Common
@@ -180,6 +184,43 @@ namespace MonoTests.System.Data.Common
                                Assert.IsNotNull (ex.Message, "#4");
                        }
                }
+               
+               [Test]
+               public void XimarinBugzillaBug853Test()
+                {
+                        const string connectionString = "URI = file:./SqliteTest.db; Version = 3";//will be in System.Data directory
+                        SqliteConnection dbConnection = new SqliteConnection(connectionString);
+                        dbConnection.Open();
+                       SqliteCommand ClearTableEntry=new SqliteCommand("DELETE FROM Primus;",dbConnection);
+                       ClearTableEntry.ExecuteNonQuery();
+
+                        SqliteDataAdapter sqliteDataAdapter = new SqliteDataAdapter("SELECT * FROM primus", dbConnection);
+                        SqliteCommandBuilder builder = new SqliteCommandBuilder(sqliteDataAdapter);
+                       sqliteDataAdapter.InsertCommand = builder.GetInsertCommand();
+                        sqliteDataAdapter.DeleteCommand = builder.GetDeleteCommand();
+                       
+                        DataSet dataSet = new DataSet();
+
+                        sqliteDataAdapter.Fill(dataSet, "Primus");//reset
+
+                        DataRow rowToBeAdded = dataSet.Tables["Primus"].NewRow();
+                        rowToBeAdded["id"] = 123;
+                        rowToBeAdded["name"] = "Name";//not null primary key
+                        rowToBeAdded["value"] = 777;
+
+                        dataSet.Tables["Primus"].Rows.Add(rowToBeAdded);
+sqliteDataAdapter.Update (dataSet, "Primus");
+
+                       //This would fail with NULL constraint violation in bug
+                       //report.  Because before the patch, it would create
+                       //a new record with all fields being null-- if the
+                       //exception rises, test fails
+                        sqliteDataAdapter.Update (dataSet, "Primus");
+
+                        dbConnection.Close();
+                        dbConnection = null;
+               }
+
 #endif
 
                class MyAdapter : DbDataAdapter