Imported Upstream version 5.3.21
[platform/upstream/libdb.git] / test / csharp / SecondaryRecnoDatabaseTest.cs
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 2009, 2012 Oracle and/or its affiliates.  All rights reserved.
5  *
6  */
7 using System;
8 using System.Collections;
9 using System.Collections.Generic;
10 using System.IO;
11 using System.Text;
12 using System.Threading;
13 using System.Xml;
14 using NUnit.Framework;
15 using BerkeleyDB;
16
17 namespace CsharpAPITest
18 {
19         [TestFixture]
20         public class SecondaryRecnoDatabaseTest : CSharpTestFixture
21         {
22
23                 [TestFixtureSetUp]
24                 public void SetUpTestFixture()
25                 {
26                         testFixtureName = "SecondaryRecnoDatabaseTest";
27                         base.SetUpTestfixture();
28                 }
29
30                 /*
31                  * Tests to all Open() share the same configuration in 
32                  * AllTestData.xml.
33                  */
34                 [Test]
35                 public void TestOpen()
36                 {
37                         testName = "TestOpen";
38                         SetUpTest(true);
39                         string dbFileName = testHome + "/" + testName + ".db";
40                         string dbSecFileName = testHome + "/" +
41                             testName + "_sec.db";
42
43                         OpenSecRecnoDB(testFixtureName, "TestOpen",
44                             dbFileName, dbSecFileName, false);
45                 }
46
47                 [Test]
48                 public void TestOpenWithDBName()
49                 {
50                         testName = "TestOpenWithDBName";
51                         SetUpTest(true);
52                         string dbFileName = testHome + "/" + testName + ".db";
53                         string dbSecFileName = testHome + "/" +
54                             testName + "_sec.db";
55
56                         OpenSecRecnoDB(testFixtureName, "TestOpen",
57                             dbFileName, dbSecFileName, true);
58                 }
59
60                 public void OpenSecRecnoDB(string className,
61                     string funName, string dbFileName, string dbSecFileName,
62                     bool ifDBName)
63                 {
64                         XmlElement xmlElem = Configuration.TestSetUp(
65                             className, funName);
66
67                         // Open a primary recno database.
68                         RecnoDatabaseConfig primaryDBConfig =
69                             new RecnoDatabaseConfig();
70                         primaryDBConfig.Creation = CreatePolicy.IF_NEEDED;
71                         RecnoDatabase primaryDB;
72
73                         /*
74                          * If secondary database name is given, the primary 
75                          * database is also opened with database name.
76                          */
77                         if (ifDBName == false)
78                                 primaryDB = RecnoDatabase.Open(dbFileName,
79                                     primaryDBConfig);
80                         else
81                                 primaryDB = RecnoDatabase.Open(dbFileName,
82                                     "primary", primaryDBConfig);
83
84                         try
85                         {
86                                 // Open a new secondary database.
87                                 SecondaryRecnoDatabaseConfig secRecnoDBConfig =
88                                     new SecondaryRecnoDatabaseConfig(
89                                     primaryDB, null);
90                                 SecondaryRecnoDatabaseConfigTest.Config(
91                                     xmlElem, ref secRecnoDBConfig, false);
92                                 secRecnoDBConfig.Creation =
93                                     CreatePolicy.IF_NEEDED;
94
95                                 SecondaryRecnoDatabase secRecnoDB;
96                                 if (ifDBName == false)
97                                         secRecnoDB = SecondaryRecnoDatabase.Open(
98                                             dbSecFileName, secRecnoDBConfig);
99                                 else
100                                         secRecnoDB = SecondaryRecnoDatabase.Open(
101                                             dbSecFileName, "secondary",
102                                             secRecnoDBConfig);
103
104                                 // Close the secondary database.
105                                 secRecnoDB.Close();
106
107                                 // Open the existing secondary database.
108                                 SecondaryDatabaseConfig secDBConfig =
109                                     new SecondaryDatabaseConfig(
110                                     primaryDB, null);
111
112                                 SecondaryDatabase secDB;
113                                 if (ifDBName == false)
114                                         secDB = SecondaryRecnoDatabase.Open(
115                                             dbSecFileName, secDBConfig);
116                                 else
117                                         secDB = SecondaryRecnoDatabase.Open(
118                                             dbSecFileName, "secondary", secDBConfig);
119
120                                 // Close secondary database.
121                                 secDB.Close();
122                         }
123                         catch (DatabaseException)
124                         {
125                                 throw new TestException();
126                         }
127                         finally
128                         {
129                                 // Close primary database.
130                                 primaryDB.Close();
131                         }
132                 }
133
134                 [Test]
135                 public void TestOpenWithinTxn()
136                 {
137                         testName = "TestOpenWithinTxn";
138                         SetUpTest(true);
139                         string dbFileName = testName + ".db";
140                         string dbSecFileName = testName + "_sec.db";
141
142                         OpenSecRecnoDBWithinTxn(testFixtureName,
143                             "TestOpen", testHome, dbFileName,
144                             dbSecFileName, false);
145                 }
146
147                 [Test]
148                 public void TestOpenDBNameWithinTxn()
149                 {
150                         testName = "TestOpenDBNameWithinTxn";
151                         SetUpTest(true);
152                         string dbFileName = testName + ".db";
153                         string dbSecFileName = testName + "_sec.db";
154
155                         OpenSecRecnoDBWithinTxn(testFixtureName,
156                             "TestOpen", testHome, dbFileName,
157                             dbSecFileName, true);
158                 }
159
160                 public void OpenSecRecnoDBWithinTxn(string className,
161                     string funName, string home, string dbFileName,
162                     string dbSecFileName, bool ifDbName)
163                 {
164                         XmlElement xmlElem = Configuration.TestSetUp(
165                             className, funName);
166
167                         // Open an environment.
168                         DatabaseEnvironmentConfig envConfig =
169                             new DatabaseEnvironmentConfig();
170                         envConfig.Create = true;
171                         envConfig.UseTxns = true;
172                         envConfig.UseMPool = true;
173                         envConfig.UseLogging = true;
174                         DatabaseEnvironment env = DatabaseEnvironment.Open(
175                             home, envConfig);
176
177                         // Open a primary recno database.
178                         Transaction openDBTxn = env.BeginTransaction();
179                         RecnoDatabaseConfig dbConfig =
180                             new RecnoDatabaseConfig();
181                         dbConfig.Creation = CreatePolicy.IF_NEEDED;
182
183                         dbConfig.Env = env;
184                         RecnoDatabase db = RecnoDatabase.Open(
185                             dbFileName, dbConfig, openDBTxn);
186                         openDBTxn.Commit();
187
188                         // Open a secondary recno database.
189                         Transaction openSecTxn = env.BeginTransaction();
190                         SecondaryRecnoDatabaseConfig secDBConfig =
191                             new SecondaryRecnoDatabaseConfig(db,
192                             new SecondaryKeyGenDelegate(SecondaryKeyGen));
193                         SecondaryRecnoDatabaseConfigTest.Config(xmlElem,
194                             ref secDBConfig, false);
195                         secDBConfig.Env = env;
196                         SecondaryRecnoDatabase secDB;
197                         if (ifDbName == false)
198                                 secDB = SecondaryRecnoDatabase.Open(
199                                     dbSecFileName, secDBConfig, openSecTxn);
200                         else
201                                 secDB = SecondaryRecnoDatabase.Open(
202                                     dbSecFileName, "secondary", secDBConfig,
203                                     openSecTxn);
204                         openSecTxn.Commit();
205
206                         // Confirm its flags configured in secDBConfig.
207                         Confirm(xmlElem, secDB, true);
208                         secDB.Close();
209
210                         // Open the existing secondary database.
211                         Transaction secTxn = env.BeginTransaction();
212                         SecondaryDatabaseConfig secConfig =
213                             new SecondaryDatabaseConfig(db,
214                             new SecondaryKeyGenDelegate(SecondaryKeyGen));
215                         secConfig.Env = env;
216
217                         SecondaryDatabase secExDB;
218                         if (ifDbName == false)
219                                 secExDB = SecondaryRecnoDatabase.Open(
220                                     dbSecFileName, secConfig, secTxn);
221                         else
222                                 secExDB = SecondaryRecnoDatabase.Open(
223                                     dbSecFileName, "secondary", secConfig,
224                                     secTxn);
225                         secExDB.Close();
226                         secTxn.Commit();
227                         
228                         db.Close();
229                         env.Close();
230                 }
231
232                 public DatabaseEntry SecondaryKeyGen(
233                     DatabaseEntry key, DatabaseEntry data)
234                 {
235                         DatabaseEntry dbtGen;
236                         dbtGen = new DatabaseEntry(data.Data);
237                         return dbtGen;
238                 }
239
240                 public static void Confirm(XmlElement xmlElem,
241                     SecondaryRecnoDatabase secDB, bool compulsory)
242                 {
243                         Configuration.ConfirmInt(xmlElem, "Delimiter",
244                             secDB.Delimiter, compulsory);
245                         Configuration.ConfirmUint(xmlElem, "Length",
246                             secDB.Length, compulsory);
247                         Configuration.ConfirmInt(xmlElem, "PadByte",
248                             secDB.PadByte, compulsory);
249                         Configuration.ConfirmBool(xmlElem,
250                             "Renumber", secDB.Renumber, compulsory);
251                         Configuration.ConfirmBool(xmlElem, "Snapshot",
252                             secDB.Snapshot, compulsory);
253                 }
254         }
255 }