⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataview.java

📁 linux 下的源代码分析阅读器 red hat公司新版
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
         * 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 + -