private void openEnvironment(File file) throws DatabaseInitException { EnvironmentConfig envConfig = new EnvironmentConfig(); envConfig.setCachePercent(30); envConfig.setAllowCreate(true); envConfig.setTransactional(true); envConfig.setTxnTimeout(10, TimeUnit.SECONDS); envConfig.setLockTimeout(2000, TimeUnit.MILLISECONDS); try { environment = new Environment(file, envConfig); transactionConfig = new TransactionConfig(); transactionConfig.setReadCommitted(true); cursorConfig = new CursorConfig(); cursorConfig.setReadCommitted(true); } catch (EnvironmentLockedException e) { String message = "Environment locked exception. Another process is using the same database, or the current user has no write access (database location: \"" + file.getAbsolutePath() + "\")"; throw new DatabaseInitException(message); } catch (DatabaseException e) { String message = "A database initialisation error has occured (" + e.getMessage() + ")"; throw new DatabaseInitException(message); } }
@Override protected List<ObjectId> lookUpInternal(final byte[] partialId) { DatabaseEntry key; { byte[] keyData = partialId.clone(); key = new DatabaseEntry(keyData); } DatabaseEntry data = new DatabaseEntry(); data.setPartial(0, 0, true); // do not retrieve data List<ObjectId> matches; CursorConfig cursorConfig = new CursorConfig(); cursorConfig.setReadCommitted(true); cursorConfig.setReadUncommitted(false); Cursor cursor = objectDb.openCursor(txn.getTransaction(), cursorConfig); try { // position cursor at the first closest key to the one looked up OperationStatus status = cursor.getSearchKeyRange(key, data, LockMode.DEFAULT); if (SUCCESS.equals(status)) { matches = new ArrayList<ObjectId>(2); final byte[] compKey = new byte[partialId.length]; while (SUCCESS.equals(status)) { byte[] keyData = key.getData(); System.arraycopy(keyData, 0, compKey, 0, compKey.length); if (Arrays.equals(partialId, compKey)) { matches.add(new ObjectId(keyData)); } else { break; } status = cursor.getNext(key, data, LockMode.DEFAULT); } } else { matches = Collections.emptyList(); } return matches; } finally { cursor.close(); } }
/** Constructor helper. */ private void init(DataView view, boolean writeAllowed, CursorConfig config, KeyRange range) throws DatabaseException { if (config == null) { config = view.cursorConfig; } this.view = view; this.writeAllowed = writeAllowed && view.writeAllowed; this.range = (range != null) ? range : view.range; readUncommitted = config.getReadUncommitted() || view.currentTxn.isReadUncommitted(); initThangs(); if (joinCursor == null) { cursor = new MyRangeCursor(this.range, config, view, this.writeAllowed); } }