Search in sources :

Example 1 with BTreeLockingPolicy

use of org.apache.derby.impl.store.access.btree.BTreeLockingPolicy in project derby by apache.

the class B2I method create.

/*
	** Methods of B2I.
	*/
/**
 *	Create an empty secondary index b-tree, using the generic b-tree to do the
 *    generic part of the creation process.
 *
 *    This routine opens the newly created container, adds a single page, and
 *    makes this page the root by inserting a LeafControlRow onto this page
 *    at slot 0 and marking in that control row that the page is a root page.
 *
 *    The following properties are specific to the b-tree secondary index:
 *    <UL>
 *    <LI> "baseConglomerateId" (integer).  The conglomerate id of the base
 *    conglomerate is never actually accessed by the b-tree secondary
 *    index implementation, it only serves as a namespace for row locks.
 *    This property is required.
 *    <LI> "rowLocationColumn" (integer).  The zero-based index into the row which
 *    the b-tree secondary index will assume holds a @see RowLocation of
 *    the base row in the base conglomerate.  This value will be used
 *    for acquiring locks.  In this implementation RowLocationColumn must be
 *    the last key column.
 *    This property is required.
 *    </UL>
 *
 *    A secondary index i (a, b) on table t (a, b, c) would have rows
 *    which looked like (a, b, row_location).  baseConglomerateId is set to the
 *    conglomerate id of t.  rowLocationColumns is set to 2.  allowsDuplicates
 *    would be set to false, @see BTree#create.  To create a unique
 *    secondary index set uniquenessColumns to 2, this means that the btree
 *    code will compare the key values but not the row id when determing
 *    uniqueness.  To create a nonunique secondary index set uniquenessColumns
 *    to 3, this would mean that the uniqueness test would include the row
 *    location and since all row locations will be unique  all rows inserted
 *    into the index will be differentiated (at least) by row location.
 *
 *	@see BTree#create
 *
 *	@exception StandardException Standard exception policy.
 */
public void create(TransactionManager xact_manager, int segmentId, long input_conglomid, DataValueDescriptor[] template, ColumnOrdering[] columnOrder, int[] collationIds, Properties properties, int temporaryFlag) throws StandardException {
    String property_value = null;
    Transaction rawtran = xact_manager.getRawStoreXact();
    if (properties == null) {
        throw (StandardException.newException(SQLState.BTREE_PROPERTY_NOT_FOUND, PROPERTY_BASECONGLOMID));
    }
    // Get baseConglomerateId //
    property_value = properties.getProperty(PROPERTY_BASECONGLOMID);
    if (property_value == null) {
        throw (StandardException.newException(SQLState.BTREE_PROPERTY_NOT_FOUND, PROPERTY_BASECONGLOMID));
    }
    if (SanityManager.DEBUG) {
        if (property_value == null)
            SanityManager.THROWASSERT(PROPERTY_BASECONGLOMID + "property not passed to B2I.create()");
    }
    baseConglomerateId = Long.parseLong(property_value);
    // Get rowLocationColumn //
    property_value = properties.getProperty(PROPERTY_ROWLOCCOLUMN);
    if (SanityManager.DEBUG) {
        if (property_value == null)
            SanityManager.THROWASSERT(PROPERTY_ROWLOCCOLUMN + "property not passed to B2I.create()");
    }
    if (property_value == null) {
        throw (StandardException.newException(SQLState.BTREE_PROPERTY_NOT_FOUND, PROPERTY_BASECONGLOMID));
    }
    rowLocationColumn = Integer.parseInt(property_value);
    // comparing the columns in the index easier.
    if (SanityManager.DEBUG) {
        SanityManager.ASSERT(rowLocationColumn == template.length - 1, "rowLocationColumn is not the last column in the index");
        SanityManager.ASSERT(template[rowLocationColumn] instanceof RowLocation);
        // There must be at least one key column
        if (rowLocationColumn < 1)
            SanityManager.THROWASSERT("rowLocationColumn (" + rowLocationColumn + ") expected to be >= 1");
    }
    /* convert the sorting order information into a boolean array map.
		 * If the sorting order for the columns is not provided, we
		 * assign the default as Ascending Order.
		 * array length is equal to template length, because column order
		 * length changes whether it is unique or is non unique. store assumes
		 * template length arrays. So, we make template length array and make
		 * the last column as ascending instead of having lot of execeptions 
         * code.
		 */
    ascDescInfo = new boolean[template.length];
    for (int i = 0; i < ascDescInfo.length; i++) {
        if (columnOrder != null && i < columnOrder.length)
            ascDescInfo[i] = columnOrder[i].getIsAscending();
        else
            // default values - ascending order
            ascDescInfo[i] = true;
    }
    // get collation ids from input collation ids, store it in the
    // conglom state.
    collation_ids = ConglomerateUtil.createCollationIds(template.length, collationIds);
    hasCollatedTypes = hasCollatedColumns(collation_ids);
    // Do the generic part of creating the b-tree.
    super.create(rawtran, segmentId, input_conglomid, template, properties, getTypeFormatId(), temporaryFlag);
    // open the base conglomerate - to get the lock
    ConglomerateController base_cc = xact_manager.openConglomerate(baseConglomerateId, false, TransactionController.OPENMODE_FOR_LOCK_ONLY, TransactionController.MODE_TABLE, TransactionController.ISOLATION_SERIALIZABLE);
    OpenBTree open_btree = new OpenBTree();
    BTreeLockingPolicy b2i_locking_policy = new B2ITableLocking3(rawtran, TransactionController.MODE_TABLE, rawtran.newLockingPolicy(LockingPolicy.MODE_CONTAINER, TransactionController.ISOLATION_SERIALIZABLE, true), base_cc, open_btree);
    // The following call will "open" the new btree.  Create is
    // an interesting case.  What we really want is read only table lock
    // on the base conglomerate and update locks on the index.  For now
    // just get the update lock on the base table, this is done by the
    // lockTable() call made by base class.
    open_btree.init(// current user xact
    (TransactionManager) xact_manager, // current xact
    (TransactionManager) xact_manager, // have init open the container.
    (ContainerHandle) null, rawtran, false, (ContainerHandle.MODE_FORUPDATE), TransactionController.MODE_TABLE, // get table level lock.
    b2i_locking_policy, this, // no logical undo necessary, as
    (LogicalUndo) null, // rows will not move.
    (DynamicCompiledOpenConglomInfo) null);
    // Open the newly created container, and insert the first control row.
    LeafControlRow.initEmptyBtree(open_btree);
    open_btree.close();
    base_cc.close();
}
Also used : OpenBTree(org.apache.derby.impl.store.access.btree.OpenBTree) Transaction(org.apache.derby.iapi.store.raw.Transaction) ConglomerateController(org.apache.derby.iapi.store.access.ConglomerateController) RowLocation(org.apache.derby.iapi.types.RowLocation) BTreeLockingPolicy(org.apache.derby.impl.store.access.btree.BTreeLockingPolicy)

Example 2 with BTreeLockingPolicy

use of org.apache.derby.impl.store.access.btree.BTreeLockingPolicy in project derby by apache.

the class B2IController method init.

void init(TransactionManager xact_manager, Transaction rawtran, boolean hold, int open_mode, int lock_level, LockingPolicy locking_policy, boolean get_locks, B2I conglomerate, B2IUndo undo, B2IStaticCompiledInfo static_info, DynamicCompiledOpenConglomInfo dynamic_info) throws StandardException {
    // open and lock the base table.
    int base_open_mode = open_mode | TransactionController.OPENMODE_FOR_LOCK_ONLY;
    // used for geting the IX intent lock on the table.
    if (static_info != null) {
        base_cc_for_locking = xact_manager.openCompiledConglomerate(false, base_open_mode, lock_level, TransactionController.ISOLATION_REPEATABLE_READ, static_info.base_table_static_info, /* TODO - maintain a dynamic info for this */
        ((Conglomerate) static_info.getConglom()).getDynamicCompiledConglomInfo());
    } else {
        base_cc_for_locking = xact_manager.openConglomerate(conglomerate.baseConglomerateId, false, base_open_mode, lock_level, TransactionController.ISOLATION_REPEATABLE_READ);
    }
    BTreeLockingPolicy b2i_locking_policy;
    if (lock_level == TransactionController.MODE_TABLE) {
        b2i_locking_policy = new B2ITableLocking3(rawtran, lock_level, locking_policy, base_cc_for_locking, this);
    } else if (lock_level == TransactionController.MODE_RECORD) {
        b2i_locking_policy = new B2IRowLocking3(rawtran, lock_level, locking_policy, base_cc_for_locking, this);
    } else {
        if (SanityManager.DEBUG) {
            SanityManager.THROWASSERT("Bad lock level: " + lock_level);
        }
        b2i_locking_policy = null;
    }
    // Do generic b-tree initialization.
    super.init(xact_manager, hold, (ContainerHandle) null, rawtran, open_mode, lock_level, b2i_locking_policy, conglomerate, undo, static_info, dynamic_info);
    if (SanityManager.DEBUG)
        SanityManager.ASSERT(conglomerate != null);
}
Also used : Conglomerate(org.apache.derby.iapi.store.access.conglomerate.Conglomerate) BTreeLockingPolicy(org.apache.derby.impl.store.access.btree.BTreeLockingPolicy)

Example 3 with BTreeLockingPolicy

use of org.apache.derby.impl.store.access.btree.BTreeLockingPolicy in project derby by apache.

the class B2IForwardScan method init.

/**
 *	Initialize the scan for use.
 *	<p>
 *	Any changes to this method may have to be reflected in close as well.
 *    <p>
 *    The btree init opens the container (super.init), and stores away the
 *    state of the qualifiers.  The actual searching for the first position
 *    is delayed until the first next() call.
 *
 *	@exception  StandardException  Standard exception policy.
 */
public void init(TransactionManager xact_manager, Transaction rawtran, boolean hold, int open_mode, int lock_level, LockingPolicy locking_policy, int isolation_level, boolean open_for_locking, FormatableBitSet scanColumnList, DataValueDescriptor[] startKeyValue, int startSearchOperator, Qualifier[][] qualifier, DataValueDescriptor[] stopKeyValue, int stopSearchOperator, B2I conglomerate, B2IUndo undo, B2IStaticCompiledInfo static_info, DynamicCompiledOpenConglomInfo dynamic_info) throws StandardException {
    // open and lock the base table.
    int base_open_mode = open_mode | TransactionController.OPENMODE_FOR_LOCK_ONLY;
    // open the base conglomerate - just to get lock
    if (static_info != null) {
        base_cc_for_locking = xact_manager.openCompiledConglomerate(false, base_open_mode, lock_level, isolation_level, static_info.base_table_static_info, /* TODO - maintain a dynamic info for this */
        ((Conglomerate) static_info.getConglom()).getDynamicCompiledConglomInfo());
    } else {
        base_cc_for_locking = xact_manager.openConglomerate(conglomerate.baseConglomerateId, false, base_open_mode, lock_level, isolation_level);
    }
    BTreeLockingPolicy b2i_locking_policy = conglomerate.getBtreeLockingPolicy(rawtran, lock_level, open_mode, isolation_level, base_cc_for_locking, this);
    super.init(xact_manager, rawtran, hold, open_mode, lock_level, b2i_locking_policy, scanColumnList, startKeyValue, startSearchOperator, qualifier, stopKeyValue, stopSearchOperator, conglomerate, undo, static_info, dynamic_info);
    // todo - should just save the isolation level in OpenBtree but
    // save it here for now.
    init_isolation_level = isolation_level;
}
Also used : Conglomerate(org.apache.derby.iapi.store.access.conglomerate.Conglomerate) BTreeLockingPolicy(org.apache.derby.impl.store.access.btree.BTreeLockingPolicy)

Example 4 with BTreeLockingPolicy

use of org.apache.derby.impl.store.access.btree.BTreeLockingPolicy in project derby by apache.

the class B2IMaxScan method init.

/**
 *	Initialize the scan for use.
 *	<p>
 *	Any changes to this method may have to be reflected in close as well.
 *    <p>
 *    The btree init opens the container (super.init), and stores away the
 *    state of the qualifiers.  The actual searching for the first position
 *    is delayed until the first next() call.
 *
 *	@exception  StandardException  Standard exception policy.
 */
public void init(TransactionManager xact_manager, Transaction rawtran, int open_mode, int lock_level, LockingPolicy locking_policy, int isolation_level, boolean open_for_locking, FormatableBitSet scanColumnList, B2I conglomerate, B2IUndo undo) throws StandardException {
    // open and lock the base table.
    int base_open_mode = open_mode | TransactionController.OPENMODE_FOR_LOCK_ONLY;
    // open the base conglomerate - just to get lock
    base_cc_for_locking = xact_manager.openConglomerate(conglomerate.baseConglomerateId, false, base_open_mode, lock_level, isolation_level);
    BTreeLockingPolicy b2i_locking_policy = conglomerate.getBtreeLockingPolicy(rawtran, lock_level, open_mode, isolation_level, base_cc_for_locking, this);
    super.init(xact_manager, rawtran, false, open_mode, lock_level, b2i_locking_policy, scanColumnList, // no start position supported
    (DataValueDescriptor[]) null, // no start position supported
    ScanController.NA, // no qualifier supported
    (Qualifier[][]) null, // no stop position supported
    (DataValueDescriptor[]) null, // no stop position supported
    ScanController.NA, conglomerate, undo, (StaticCompiledOpenConglomInfo) null, (DynamicCompiledOpenConglomInfo) null);
}
Also used : DataValueDescriptor(org.apache.derby.iapi.types.DataValueDescriptor) BTreeLockingPolicy(org.apache.derby.impl.store.access.btree.BTreeLockingPolicy)

Aggregations

BTreeLockingPolicy (org.apache.derby.impl.store.access.btree.BTreeLockingPolicy)4 Conglomerate (org.apache.derby.iapi.store.access.conglomerate.Conglomerate)2 ConglomerateController (org.apache.derby.iapi.store.access.ConglomerateController)1 Transaction (org.apache.derby.iapi.store.raw.Transaction)1 DataValueDescriptor (org.apache.derby.iapi.types.DataValueDescriptor)1 RowLocation (org.apache.derby.iapi.types.RowLocation)1 OpenBTree (org.apache.derby.impl.store.access.btree.OpenBTree)1