1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 2000,2008 Oracle. All rights reserved. 5 * 6 * $Id: DbCompat.java,v 12.12 2008/02/07 17:12:18 mark Exp $ 7 */ 8 9package com.sleepycat.compat; 10 11import java.io.FileNotFoundException; 12import java.util.Comparator; 13 14import com.sleepycat.db.Cursor; 15import com.sleepycat.db.CursorConfig; 16import com.sleepycat.db.Database; 17import com.sleepycat.db.DatabaseConfig; 18import com.sleepycat.db.DatabaseEntry; 19import com.sleepycat.db.DatabaseException; 20import com.sleepycat.db.DatabaseType; 21import com.sleepycat.db.Environment; 22import com.sleepycat.db.EnvironmentConfig; 23import com.sleepycat.db.LockDetectMode; 24import com.sleepycat.db.LockMode; 25import com.sleepycat.db.OperationStatus; 26import com.sleepycat.db.SecondaryConfig; 27import com.sleepycat.db.SecondaryCursor; 28import com.sleepycat.db.SecondaryDatabase; 29import com.sleepycat.db.Transaction; 30import com.sleepycat.db.TransactionConfig; 31 32/** 33 * A minimal set of DB-JE compatibility methods for internal use only. 34 * Two versions are maintained in parallel in the DB and JE source trees. 35 * Used by the collections package. 36 */ 37public class DbCompat { 38 39 /* Capabilities */ 40 41 public static final boolean CDB = true; 42 public static final boolean JOIN = true; 43 public static final boolean NESTED_TRANSACTIONS = true; 44 public static final boolean INSERTION_ORDERED_DUPLICATES = true; 45 public static final boolean SEPARATE_DATABASE_FILES = true; 46 public static final boolean MEMORY_SUBSYSTEM = true; 47 public static final boolean LOCK_SUBSYSTEM = true; 48 public static final boolean HASH_METHOD = true; 49 public static final boolean RECNO_METHOD = true; 50 public static final boolean QUEUE_METHOD = true; 51 public static final boolean BTREE_RECNUM_METHOD = true; 52 public static final boolean OPTIONAL_READ_UNCOMMITTED = true; 53 public static final boolean SECONDARIES = true; 54 public static boolean TRANSACTION_RUNNER_PRINT_STACK_TRACES = true; 55 public static final boolean DATABASE_COUNT = false; 56 57 /* Methods used by the collections package. */ 58 59 public static boolean getInitializeCache(EnvironmentConfig config) { 60 return config.getInitializeCache(); 61 } 62 63 public static boolean getInitializeLocking(EnvironmentConfig config) { 64 return config.getInitializeLocking(); 65 } 66 67 public static boolean getInitializeCDB(EnvironmentConfig config) { 68 return config.getInitializeCDB(); 69 } 70 71 public static boolean isTypeBtree(DatabaseConfig dbConfig) { 72 return dbConfig.getType() == DatabaseType.BTREE; 73 } 74 75 public static boolean isTypeHash(DatabaseConfig dbConfig) { 76 return dbConfig.getType() == DatabaseType.HASH; 77 } 78 79 public static boolean isTypeQueue(DatabaseConfig dbConfig) { 80 return dbConfig.getType() == DatabaseType.QUEUE; 81 } 82 83 public static boolean isTypeRecno(DatabaseConfig dbConfig) { 84 return dbConfig.getType() == DatabaseType.RECNO; 85 } 86 87 public static boolean getBtreeRecordNumbers(DatabaseConfig dbConfig) { 88 return dbConfig.getBtreeRecordNumbers(); 89 } 90 91 public static boolean getReadUncommitted(DatabaseConfig dbConfig) { 92 return dbConfig.getReadUncommitted(); 93 } 94 95 public static boolean getRenumbering(DatabaseConfig dbConfig) { 96 return dbConfig.getRenumbering(); 97 } 98 99 public static boolean getSortedDuplicates(DatabaseConfig dbConfig) { 100 return dbConfig.getSortedDuplicates(); 101 } 102 103 public static boolean getUnsortedDuplicates(DatabaseConfig dbConfig) { 104 return dbConfig.getUnsortedDuplicates(); 105 } 106 107 public static boolean getDeferredWrite(DatabaseConfig dbConfig) { 108 return false; 109 } 110 111 // XXX Remove this when DB and JE support CursorConfig.cloneConfig 112 public static CursorConfig cloneCursorConfig(CursorConfig config) { 113 CursorConfig newConfig = new CursorConfig(); 114 newConfig.setReadCommitted(config.getReadCommitted()); 115 newConfig.setReadUncommitted(config.getReadUncommitted()); 116 newConfig.setWriteCursor(config.getWriteCursor()); 117 return newConfig; 118 } 119 120 public static boolean getWriteCursor(CursorConfig config) { 121 return config.getWriteCursor(); 122 } 123 124 public static void setWriteCursor(CursorConfig config, boolean val) { 125 config.setWriteCursor(val); 126 } 127 128 public static void setRecordNumber(DatabaseEntry entry, int recNum) { 129 entry.setRecordNumber(recNum); 130 } 131 132 public static int getRecordNumber(DatabaseEntry entry) { 133 return entry.getRecordNumber(); 134 } 135 136 public static String getDatabaseFile(Database db) 137 throws DatabaseException { 138 return db.getDatabaseFile(); 139 } 140 141 public static long getDatabaseCount(Database db) 142 throws DatabaseException { 143 144 throw new UnsupportedOperationException(); 145 } 146 147 public static void syncDeferredWrite(Database db, boolean flushLog) 148 throws DatabaseException { 149 } 150 151 public static OperationStatus getCurrentRecordNumber(Cursor cursor, 152 DatabaseEntry key, 153 LockMode lockMode) 154 throws DatabaseException { 155 return cursor.getRecordNumber(key, lockMode); 156 } 157 158 public static OperationStatus getSearchRecordNumber(Cursor cursor, 159 DatabaseEntry key, 160 DatabaseEntry data, 161 LockMode lockMode) 162 throws DatabaseException { 163 return cursor.getSearchRecordNumber(key, data, lockMode); 164 } 165 166 public static OperationStatus getSearchRecordNumber(SecondaryCursor cursor, 167 DatabaseEntry key, 168 DatabaseEntry pKey, 169 DatabaseEntry data, 170 LockMode lockMode) 171 throws DatabaseException { 172 return cursor.getSearchRecordNumber(key, pKey, data, lockMode); 173 } 174 175 public static OperationStatus putAfter(Cursor cursor, 176 DatabaseEntry key, 177 DatabaseEntry data) 178 throws DatabaseException { 179 return cursor.putAfter(key, data); 180 } 181 182 public static OperationStatus putBefore(Cursor cursor, 183 DatabaseEntry key, 184 DatabaseEntry data) 185 throws DatabaseException { 186 return cursor.putBefore(key, data); 187 } 188 189 public static OperationStatus append(Database db, 190 Transaction txn, 191 DatabaseEntry key, 192 DatabaseEntry data) 193 throws DatabaseException { 194 return db.append(txn, key, data); 195 } 196 197 public static Transaction getThreadTransaction(Environment env) 198 throws DatabaseException { 199 return null; 200 } 201 202 /* Methods used by the collections tests. */ 203 204 public static void setInitializeCache(EnvironmentConfig config, 205 boolean val) { 206 config.setInitializeCache(val); 207 } 208 209 public static void setInitializeLocking(EnvironmentConfig config, 210 boolean val) { 211 config.setInitializeLocking(val); 212 } 213 214 public static void setInitializeCDB(EnvironmentConfig config, 215 boolean val) { 216 config.setInitializeCDB(val); 217 } 218 219 public static void setLockDetectModeOldest(EnvironmentConfig config) { 220 221 config.setLockDetectMode(LockDetectMode.OLDEST); 222 } 223 224 public static void setBtreeComparator(DatabaseConfig dbConfig, 225 Comparator comparator) { 226 dbConfig.setBtreeComparator(comparator); 227 } 228 229 public static void setTypeBtree(DatabaseConfig dbConfig) { 230 dbConfig.setType(DatabaseType.BTREE); 231 } 232 233 public static void setTypeHash(DatabaseConfig dbConfig) { 234 dbConfig.setType(DatabaseType.HASH); 235 } 236 237 public static void setTypeRecno(DatabaseConfig dbConfig) { 238 dbConfig.setType(DatabaseType.RECNO); 239 } 240 241 public static void setTypeQueue(DatabaseConfig dbConfig) { 242 dbConfig.setType(DatabaseType.QUEUE); 243 } 244 245 public static void setBtreeRecordNumbers(DatabaseConfig dbConfig, 246 boolean val) { 247 dbConfig.setBtreeRecordNumbers(val); 248 } 249 250 public static void setReadUncommitted(DatabaseConfig dbConfig, 251 boolean val) { 252 dbConfig.setReadUncommitted(val); 253 } 254 255 public static void setRenumbering(DatabaseConfig dbConfig, 256 boolean val) { 257 dbConfig.setRenumbering(val); 258 } 259 260 public static void setSortedDuplicates(DatabaseConfig dbConfig, 261 boolean val) { 262 dbConfig.setSortedDuplicates(val); 263 } 264 265 public static void setUnsortedDuplicates(DatabaseConfig dbConfig, 266 boolean val) { 267 dbConfig.setUnsortedDuplicates(val); 268 } 269 270 public static void setDeferredWrite(DatabaseConfig dbConfig, boolean val) { 271 } 272 273 public static void setRecordLength(DatabaseConfig dbConfig, int val) { 274 dbConfig.setRecordLength(val); 275 } 276 277 public static void setRecordPad(DatabaseConfig dbConfig, int val) { 278 dbConfig.setRecordPad(val); 279 } 280 281 public static Database openDatabase(Environment env, 282 Transaction txn, 283 String fileName, 284 String dbName, 285 DatabaseConfig config) 286 throws DatabaseException, FileNotFoundException { 287 288 assert fileName != null; 289 return env.openDatabase(txn, fileName, dbName, config); 290 } 291 292 public static SecondaryDatabase openSecondaryDatabase( 293 Environment env, 294 Transaction txn, 295 String fileName, 296 String dbName, 297 Database primaryDatabase, 298 SecondaryConfig config) 299 throws DatabaseException, FileNotFoundException { 300 301 assert fileName != null; 302 return env.openSecondaryDatabase 303 (txn, fileName, dbName, primaryDatabase, config); 304 } 305 306 public static long truncateDatabase(Environment env, 307 Transaction txn, 308 String fileName, 309 String dbName, 310 boolean returnCount) 311 throws DatabaseException, FileNotFoundException { 312 313 assert fileName != null; 314 Database db = env.openDatabase(txn, fileName, dbName, null); 315 try { 316 return db.truncate(txn, returnCount); 317 } finally { 318 db.close(); 319 } 320 } 321 322 public static void removeDatabase(Environment env, 323 Transaction txn, 324 String fileName, 325 String dbName) 326 throws DatabaseException, FileNotFoundException { 327 328 assert fileName != null; 329 env.removeDatabase(txn, fileName, dbName); 330 } 331 332 public static void renameDatabase(Environment env, 333 Transaction txn, 334 String oldFileName, 335 String oldDbName, 336 String newFileName, 337 String newDbName) 338 throws DatabaseException, FileNotFoundException { 339 340 assert oldFileName != null; 341 assert newFileName != null; 342 if (!oldFileName.equals(newFileName)) { 343 env.renameDatabase(txn, oldFileName, null, newFileName); 344 } 345 if (oldDbName != null && !oldDbName.equals(newDbName)) { 346 env.renameDatabase(txn, newFileName, oldDbName, newDbName); 347 } 348 } 349 350 public static Database testOpenDatabase(Environment env, 351 Transaction txn, 352 String file, 353 String name, 354 DatabaseConfig config) 355 throws DatabaseException, FileNotFoundException { 356 return env.openDatabase(txn, file, name, config); 357 } 358 359 public static SecondaryDatabase 360 testOpenSecondaryDatabase(Environment env, 361 Transaction txn, 362 String file, 363 String name, 364 Database primary, 365 SecondaryConfig config) 366 throws DatabaseException, FileNotFoundException { 367 return env.openSecondaryDatabase(txn, file, name, primary, config); 368 } 369} 370