summaryrefslogtreecommitdiff
path: root/db-4.8.30/test/scr037/ForeignKeyTest.cs
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2016-12-17 21:28:53 -0800
committerJesse Morgan <jesse@jesterpm.net>2016-12-17 21:28:53 -0800
commit54df2afaa61c6a03cbb4a33c9b90fa572b6d07b8 (patch)
tree18147b92b969d25ffbe61935fb63035cac820dd0 /db-4.8.30/test/scr037/ForeignKeyTest.cs
Berkeley DB 4.8 with rust build script for linux.
Diffstat (limited to 'db-4.8.30/test/scr037/ForeignKeyTest.cs')
-rw-r--r--db-4.8.30/test/scr037/ForeignKeyTest.cs280
1 files changed, 280 insertions, 0 deletions
diff --git a/db-4.8.30/test/scr037/ForeignKeyTest.cs b/db-4.8.30/test/scr037/ForeignKeyTest.cs
new file mode 100644
index 0000000..e140d7b
--- /dev/null
+++ b/db-4.8.30/test/scr037/ForeignKeyTest.cs
@@ -0,0 +1,280 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2009 Oracle. All rights reserved.
+ *
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
+using System.Xml;
+using NUnit.Framework;
+using BerkeleyDB;
+
+namespace CsharpAPITest {
+ [TestFixture]
+ public class ForeignKeyTest {
+ private string testFixtureHome;
+ private string testFixtureName;
+ private string testName;
+ private string testHome;
+
+ [TestFixtureSetUp]
+ public void RunBeforeTests() {
+ testFixtureName = "ForeignKeyTest";
+ testFixtureHome = "./TestOut/" + testFixtureName;
+
+ }
+
+ [Test]
+ public void TestAbortBTree() {
+ testName = "TestAbortBTree";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.BTREE, ForeignKeyDeleteAction.ABORT);
+ }
+ [Test]
+ public void TestAbortHash() {
+ testName = "TestAbortHash";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.HASH, ForeignKeyDeleteAction.ABORT);
+ }
+ [Test]
+ public void TestAbortQueue() {
+ testName = "TestAbortQueue";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.QUEUE, ForeignKeyDeleteAction.ABORT);
+ }
+ [Test]
+ public void TestAbortRecno() {
+ testName = "TestAbortRecno";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.RECNO, ForeignKeyDeleteAction.ABORT);
+ }
+
+ [Test]
+ public void TestCascadeBTree() {
+ testName = "TestCascadeBTree";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.BTREE, ForeignKeyDeleteAction.CASCADE);
+ }
+
+ [Test]
+ public void TestCascadeHash() {
+ testName = "TestCascadeHash";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.HASH, ForeignKeyDeleteAction.CASCADE);
+ }
+
+ [Test]
+ public void TestCascadeQueue() {
+ testName = "TestCascadeQueue";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.QUEUE, ForeignKeyDeleteAction.CASCADE);
+ }
+
+ [Test]
+ public void TestCascadeRecno() {
+ testName = "TestCascadeRecno";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.RECNO, ForeignKeyDeleteAction.CASCADE);
+ }
+
+ [Test]
+ public void TestNullifyBTree() {
+ testName = "TestNullifyBTree";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.BTREE, ForeignKeyDeleteAction.NULLIFY);
+ }
+
+ [Test]
+ public void TestNullifyHash() {
+ testName = "TestNullifyHash";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.HASH, ForeignKeyDeleteAction.NULLIFY);
+ }
+
+ [Test]
+ public void TestNullifyQueue() {
+ testName = "TestNullifyQueue";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.QUEUE, ForeignKeyDeleteAction.NULLIFY);
+ }
+
+ [Test]
+ public void TestNullifyRecno() {
+ testName = "TestNullifyRecno";
+ testHome = testFixtureHome + "/" + testName;
+ TestForeignKeyDelete(DatabaseType.RECNO, ForeignKeyDeleteAction.NULLIFY);
+ }
+
+ public void TestForeignKeyDelete(DatabaseType dbtype, ForeignKeyDeleteAction action) {
+ string dbFileName = testHome + "/" + testName + ".db";
+ string fdbFileName = testHome + "/" + testName + "foreign.db";
+ string sdbFileName = testHome + "/" + testName + "sec.db";
+ Configuration.ClearDir(testHome);
+
+ Database primaryDB, fdb;
+ SecondaryDatabase secDB;
+
+ // Open primary database.
+ if (dbtype == DatabaseType.BTREE) {
+ BTreeDatabaseConfig btConfig = new BTreeDatabaseConfig();
+ btConfig.Creation = CreatePolicy.ALWAYS;
+ primaryDB = BTreeDatabase.Open(dbFileName, btConfig);
+ fdb = BTreeDatabase.Open(fdbFileName, btConfig);
+ } else if (dbtype == DatabaseType.HASH) {
+ HashDatabaseConfig hConfig = new HashDatabaseConfig();
+ hConfig.Creation = CreatePolicy.ALWAYS;
+ primaryDB = HashDatabase.Open(dbFileName, hConfig);
+ fdb = HashDatabase.Open(fdbFileName, hConfig);
+ } else if (dbtype == DatabaseType.QUEUE) {
+ QueueDatabaseConfig qConfig = new QueueDatabaseConfig();
+ qConfig.Creation = CreatePolicy.ALWAYS;
+ qConfig.Length = 4;
+ primaryDB = QueueDatabase.Open(dbFileName, qConfig);
+ fdb = QueueDatabase.Open(fdbFileName, qConfig);
+ } else if (dbtype == DatabaseType.RECNO) {
+ RecnoDatabaseConfig rConfig = new RecnoDatabaseConfig();
+ rConfig.Creation = CreatePolicy.ALWAYS;
+ primaryDB = RecnoDatabase.Open(dbFileName, rConfig);
+ fdb = RecnoDatabase.Open(fdbFileName, rConfig);
+ } else {
+ throw new ArgumentException("Invalid DatabaseType");
+ }
+
+ // Open secondary database.
+ if (dbtype == DatabaseType.BTREE) {
+ SecondaryBTreeDatabaseConfig secbtConfig =
+ new SecondaryBTreeDatabaseConfig(primaryDB,
+ new SecondaryKeyGenDelegate(SecondaryKeyGen));
+ secbtConfig.Creation = CreatePolicy.ALWAYS;
+ secbtConfig.Duplicates = DuplicatesPolicy.SORTED;
+ if (action == ForeignKeyDeleteAction.NULLIFY)
+ secbtConfig.SetForeignKeyConstraint(fdb, action, new ForeignKeyNullifyDelegate(Nullify));
+ else
+ secbtConfig.SetForeignKeyConstraint(fdb, action);
+ secDB = SecondaryBTreeDatabase.Open(sdbFileName, secbtConfig);
+ } else if (dbtype == DatabaseType.HASH) {
+ SecondaryHashDatabaseConfig sechConfig =
+ new SecondaryHashDatabaseConfig(primaryDB,
+ new SecondaryKeyGenDelegate(SecondaryKeyGen));
+ sechConfig.Creation = CreatePolicy.ALWAYS;
+ sechConfig.Duplicates = DuplicatesPolicy.SORTED;
+ if (action == ForeignKeyDeleteAction.NULLIFY)
+ sechConfig.SetForeignKeyConstraint(fdb, action, new ForeignKeyNullifyDelegate(Nullify));
+ else
+ sechConfig.SetForeignKeyConstraint(fdb, action);
+ secDB = SecondaryHashDatabase.Open(sdbFileName, sechConfig);
+ } else if (dbtype == DatabaseType.QUEUE) {
+ SecondaryQueueDatabaseConfig secqConfig =
+ new SecondaryQueueDatabaseConfig(primaryDB,
+ new SecondaryKeyGenDelegate(SecondaryKeyGen));
+ secqConfig.Creation = CreatePolicy.ALWAYS;
+ secqConfig.Length = 4;
+ if (action == ForeignKeyDeleteAction.NULLIFY)
+ secqConfig.SetForeignKeyConstraint(fdb, action, new ForeignKeyNullifyDelegate(Nullify));
+ else
+ secqConfig.SetForeignKeyConstraint(fdb, action);
+ secDB = SecondaryQueueDatabase.Open(sdbFileName, secqConfig);
+ } else if (dbtype == DatabaseType.RECNO) {
+ SecondaryRecnoDatabaseConfig secrConfig =
+ new SecondaryRecnoDatabaseConfig(primaryDB,
+ new SecondaryKeyGenDelegate(SecondaryKeyGen));
+ secrConfig.Creation = CreatePolicy.ALWAYS;
+ if (action == ForeignKeyDeleteAction.NULLIFY)
+ secrConfig.SetForeignKeyConstraint(fdb, action, new ForeignKeyNullifyDelegate(Nullify));
+ else
+ secrConfig.SetForeignKeyConstraint(fdb, action);
+ secDB = SecondaryRecnoDatabase.Open(sdbFileName, secrConfig);
+ } else {
+ throw new ArgumentException("Invalid DatabaseType");
+ }
+
+ /* Use integer keys for Queue/Recno support. */
+ fdb.Put(new DatabaseEntry(BitConverter.GetBytes(100)),
+ new DatabaseEntry(BitConverter.GetBytes(1001)));
+ fdb.Put(new DatabaseEntry(BitConverter.GetBytes(200)),
+ new DatabaseEntry(BitConverter.GetBytes(2002)));
+ fdb.Put(new DatabaseEntry(BitConverter.GetBytes(300)),
+ new DatabaseEntry(BitConverter.GetBytes(3003)));
+
+ primaryDB.Put(new DatabaseEntry(BitConverter.GetBytes(1)),
+ new DatabaseEntry(BitConverter.GetBytes(100)));
+ primaryDB.Put(new DatabaseEntry(BitConverter.GetBytes(2)),
+ new DatabaseEntry(BitConverter.GetBytes(200)));
+ if (dbtype == DatabaseType.BTREE || dbtype == DatabaseType.HASH)
+ primaryDB.Put(new DatabaseEntry(BitConverter.GetBytes(3)),
+ new DatabaseEntry(BitConverter.GetBytes(100)));
+
+ try {
+ fdb.Delete(new DatabaseEntry(BitConverter.GetBytes(100)));
+ } catch (ForeignConflictException) {
+ Assert.AreEqual(action, ForeignKeyDeleteAction.ABORT);
+ }
+ if (action == ForeignKeyDeleteAction.ABORT) {
+ Assert.IsTrue(secDB.Exists(new DatabaseEntry(BitConverter.GetBytes(100))));
+ Assert.IsTrue(primaryDB.Exists(new DatabaseEntry(BitConverter.GetBytes(1))));
+ Assert.IsTrue(fdb.Exists(new DatabaseEntry(BitConverter.GetBytes(100))));
+ } else if (action == ForeignKeyDeleteAction.CASCADE) {
+ try {
+ Assert.IsFalse(secDB.Exists(new DatabaseEntry(BitConverter.GetBytes(100))));
+ } catch (KeyEmptyException) {
+ Assert.IsTrue(dbtype == DatabaseType.QUEUE || dbtype == DatabaseType.RECNO);
+ }
+ try {
+ Assert.IsFalse(primaryDB.Exists(new DatabaseEntry(BitConverter.GetBytes(1))));
+ } catch (KeyEmptyException) {
+ Assert.IsTrue(dbtype == DatabaseType.QUEUE || dbtype == DatabaseType.RECNO);
+ }
+ try {
+ Assert.IsFalse(fdb.Exists(new DatabaseEntry(BitConverter.GetBytes(100))));
+ } catch (KeyEmptyException) {
+ Assert.IsTrue(dbtype == DatabaseType.QUEUE || dbtype == DatabaseType.RECNO);
+ }
+ } else if (action == ForeignKeyDeleteAction.NULLIFY) {
+ try {
+ Assert.IsFalse(secDB.Exists(new DatabaseEntry(BitConverter.GetBytes(100))));
+ } catch (KeyEmptyException) {
+ Assert.IsTrue(dbtype == DatabaseType.QUEUE || dbtype == DatabaseType.RECNO);
+ }
+ Assert.IsTrue(primaryDB.Exists(new DatabaseEntry(BitConverter.GetBytes(1))));
+ try {
+ Assert.IsFalse(fdb.Exists(new DatabaseEntry(BitConverter.GetBytes(100))));
+ } catch (KeyEmptyException) {
+ Assert.IsTrue(dbtype == DatabaseType.QUEUE || dbtype == DatabaseType.RECNO);
+ }
+ }
+
+ // Close secondary database.
+ secDB.Close();
+
+ // Close primary database.
+ primaryDB.Close();
+
+ // Close foreign database
+ fdb.Close();
+ }
+
+ public DatabaseEntry SecondaryKeyGen(
+ DatabaseEntry key, DatabaseEntry data) {
+ DatabaseEntry dbtGen;
+
+ int skey = BitConverter.ToInt32(data.Data, 0);
+ // don't index secondary key of 0
+ if (skey == 0)
+ return null;
+
+ dbtGen = new DatabaseEntry(data.Data);
+ return dbtGen;
+ }
+
+ public DatabaseEntry Nullify(DatabaseEntry key, DatabaseEntry data, DatabaseEntry fkey) {
+ DatabaseEntry ret = new DatabaseEntry(BitConverter.GetBytes(0));
+ return ret;
+ }
+
+ }
+} \ No newline at end of file