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