📄 dataview.java
字号:
* Requires: if value param, value or entity binding * Requires: if retPrimaryKey, primary key binding (no index). * Requires: if retValue, value or entity binding */ DatabaseEntry keyThang = new DatabaseEntry(); DatabaseEntry valueThang = new DatabaseEntry(); useValue(value, valueThang, null); OperationStatus status; if (keyAssigner != null) { keyAssigner.assignKey(keyThang); if (!range.check(keyThang)) { throw new IllegalArgumentException( "assigned key out of range"); } DataCursor cursor = new DataCursor(this, true); try { status = cursor.getCursor().putNoOverwrite(keyThang, valueThang); } finally { cursor.close(); } } else { /* Assume QUEUE/RECNO access method. */ if (currentTxn.isCDBCursorOpen(db)) { throw new IllegalStateException( "cannot open CDB write cursor when read cursor is open"); } status = DbCompat.append(db, useTransaction(), keyThang, valueThang); if (status == OperationStatus.SUCCESS && !range.check(keyThang)) { db.delete(useTransaction(), keyThang); throw new IllegalArgumentException( "appended record number out of range"); } } if (status == OperationStatus.SUCCESS) { returnPrimaryKeyAndValue(keyThang, valueThang, retPrimaryKey, retValue); } return status; } /** * Returns the current transaction if the database is transaction, or null * if the database is not transactional or there is no current transaction. */ Transaction useTransaction() { return transactional ? currentTxn.getTransaction() : null; } /** * Deletes all records in the current range. */ void clear() throws DatabaseException { DataCursor cursor = new DataCursor(this, true); try { OperationStatus status = OperationStatus.SUCCESS; while (status == OperationStatus.SUCCESS) { if (keysRenumbered) { status = cursor.getFirst(true); } else { status = cursor.getNext(true); } if (status == OperationStatus.SUCCESS) { cursor.delete(); } } } finally { cursor.close(); } } /** * Returns a cursor for this view that reads only records having the * specified index key values. */ DataCursor join(DataView[] indexViews, Object[] indexKeys, JoinConfig joinConfig) throws DatabaseException { DataCursor joinCursor = null; DataCursor[] indexCursors = new DataCursor[indexViews.length]; try { for (int i = 0; i < indexViews.length; i += 1) { indexCursors[i] = new DataCursor(indexViews[i], false); indexCursors[i].getSearchKey(indexKeys[i], null, false); } joinCursor = new DataCursor(this, indexCursors, joinConfig, true); return joinCursor; } finally { if (joinCursor == null) { // An exception is being thrown, so close cursors we opened. for (int i = 0; i < indexCursors.length; i += 1) { if (indexCursors[i] != null) { try { indexCursors[i].close(); } catch (Exception e) { /* FindBugs, this is ok. */ } } } } } } /** * Returns a cursor for this view that reads only records having the * index key values at the specified cursors. */ DataCursor join(DataCursor[] indexCursors, JoinConfig joinConfig) throws DatabaseException { return new DataCursor(this, indexCursors, joinConfig, false); } /** * Returns primary key and value if return parameters are non-null. */ private void returnPrimaryKeyAndValue(DatabaseEntry keyThang, DatabaseEntry valueThang, Object[] retPrimaryKey, Object[] retValue) throws DatabaseException { // Requires: if retPrimaryKey, primary key binding (no index). // Requires: if retValue, value or entity binding if (retPrimaryKey != null) { if (keyBinding == null) { throw new IllegalArgumentException( "returning key requires primary key binding"); } else if (isSecondary()) { throw new IllegalArgumentException( "returning key requires unindexed view"); } else { retPrimaryKey[0] = keyBinding.entryToObject(keyThang); } } if (retValue != null) { retValue[0] = makeValue(keyThang, valueThang); } } /** * Populates the key entry and returns whether the key is within range. */ boolean useKey(Object key, Object value, DatabaseEntry keyThang, KeyRange checkRange) throws DatabaseException { if (key != null) { if (keyBinding == null) { throw new IllegalArgumentException( "non-null key with null key binding"); } keyBinding.objectToEntry(key, keyThang); } else { if (value == null) { throw new IllegalArgumentException( "null key and null value"); } if (entityBinding == null) { throw new IllegalStateException( "EntityBinding required to derive key from value"); } if (!dupsView && isSecondary()) { DatabaseEntry primaryKeyThang = new DatabaseEntry(); entityBinding.objectToKey(value, primaryKeyThang); DatabaseEntry valueThang = new DatabaseEntry(); entityBinding.objectToData(value, valueThang); secKeyCreator.createSecondaryKey(secDb, primaryKeyThang, valueThang, keyThang); } else { entityBinding.objectToKey(value, keyThang); } } if (recNumAccess && DbCompat.getRecordNumber(keyThang) <= 0) { return false; } if (checkRange != null && !checkRange.check(keyThang)) { return false; } return true; } /** * Returns whether data keys can be derived from the value/entity binding * of this view, which determines whether a value/entity object alone is * sufficient for operations that require keys. */ final boolean canDeriveKeyFromValue() { return (entityBinding != null); } /** * Populates the value entry and throws an exception if the primary key * would be changed via an entity binding. */ void useValue(Object value, DatabaseEntry valueThang, DatabaseEntry checkKeyThang) throws DatabaseException { if (value != null) { if (valueBinding != null) { valueBinding.objectToEntry(value, valueThang); } else if (entityBinding != null) { entityBinding.objectToData(value, valueThang); if (checkKeyThang != null) { DatabaseEntry thang = new DatabaseEntry(); entityBinding.objectToKey(value, thang); if (!KeyRange.equalBytes(thang, checkKeyThang)) { throw new IllegalArgumentException( "cannot change primary key"); } } } else { throw new IllegalArgumentException( "non-null value with null value/entity binding"); } } else { valueThang.setData(KeyRange.ZERO_LENGTH_BYTE_ARRAY); valueThang.setOffset(0); valueThang.setSize(0); } } /** * Converts a key entry to a key object. */ Object makeKey(DatabaseEntry keyThang, DatabaseEntry priKeyThang) { if (keyBinding == null) { throw new UnsupportedOperationException(); } else { DatabaseEntry thang = dupsView ? priKeyThang : keyThang; if (thang.getSize() == 0) { return null; } else { return keyBinding.entryToObject(thang); } } } /** * Converts a key-value entry pair to a value object. */ Object makeValue(DatabaseEntry primaryKeyThang, DatabaseEntry valueThang) { Object value; if (valueBinding != null) { value = valueBinding.entryToObject(valueThang); } else if (entityBinding != null) { value = entityBinding.entryToObject(primaryKeyThang, valueThang); } else { throw new UnsupportedOperationException( "requires valueBinding or entityBinding"); } return value; } /** * Intersects the given key and the current range. */ KeyRange subRange(KeyRange useRange, Object singleKey) throws DatabaseException, KeyRangeException { return useRange.subRange(makeRangeKey(singleKey)); } /** * Intersects the given range and the current range. */ KeyRange subRange(KeyRange useRange, Object beginKey, boolean beginInclusive, Object endKey, boolean endInclusive) throws DatabaseException, KeyRangeException { if (beginKey == endKey && beginInclusive && endInclusive) { return subRange(useRange, beginKey); } if (!ordered) { throw new UnsupportedOperationException( "Cannot use key ranges on an unsorted database"); } DatabaseEntry beginThang = (beginKey != null) ? makeRangeKey(beginKey) : null; DatabaseEntry endThang = (endKey != null) ? makeRangeKey(endKey) : null; return useRange.subRange(beginThang, beginInclusive, endThang, endInclusive); } /** * Returns the range to use for sub-ranges. Returns range if this is not a * dupsView, or the dupsRange if this is a dupsView, creating dupsRange if * necessary. */ KeyRange useSubRange() throws DatabaseException { if (dupsView) { synchronized (this) { if (dupsRange == null) { DatabaseConfig config = secDb.getPrimaryDatabase().getConfig(); dupsRange = new KeyRange(config.getBtreeComparator()); } } return dupsRange; } else { return range; } } /** * Given a key object, make a key entry that can be used in a range. */ private DatabaseEntry makeRangeKey(Object key) throws DatabaseException { DatabaseEntry thang = new DatabaseEntry(); if (keyBinding != null) { useKey(key, null, thang, null); } else { useKey(null, key, thang, null); } return thang; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -