public interface Page
A Page represents exclusive access to a data page within a container. Exclusive access is released by calling the unlatch() method, once that occurs the caller must no longer use the Page reference.
Several of the methods in Page take a RecordHandle as an argument. RecordHandles are obtained from a Page, while holding exclusive access of Page or a from a previous exclusive access of a Page representing the same data page. All RecordHandle's used as arguments to methods (with the exception of recordExists()) must be valid for the current state of the page. If they are not valid then the method will throw an exception. A caller can ensure that a record handle is valid by:
Several of the methods in Page take a slot number as an argument. A slot
always correspond to a record, which may be deleted or undeleted.
MT - Latched - In general every method requires the page to be latched.
Latching
All page methods which are not valid for a latched page throw an exception if the page is not latched. [@exception clauses on all the methods should be updated to reflect this].
Aux Objects
The page cache will manage a client object along with the page as long
as it remains in cache. This object is called the "aux object". The
aux object is associated with the page with setAuxObject(), and can be
retreived later with getAuxObject(). The aux object will remain valid
as long as the page is latched, but callers cannot assume that an aux
object will ever stick around once the page is unlatched. However, the
page manager promises to call pageBeingEvicted() once before clearing
the aux reference from the page.
Object
,
ContainerHandle
,
RecordHandle
,
AuxObject
Modifier and Type | Field and Description |
---|---|
static java.lang.String |
DIAG_BYTES_FREE |
static java.lang.String |
DIAG_BYTES_RESERVED |
static java.lang.String |
DIAG_MAXROWSIZE |
static java.lang.String |
DIAG_MINIMUM_REC_SIZE |
static java.lang.String |
DIAG_MINROWSIZE |
static java.lang.String |
DIAG_NUMOVERFLOWED |
static java.lang.String |
DIAG_PAGE_SIZE |
static java.lang.String |
DIAG_PAGEOVERHEAD |
static java.lang.String |
DIAG_RESERVED_SPACE |
static java.lang.String |
DIAG_ROWSIZE |
static java.lang.String |
DIAG_SLOTTABLE_SIZE |
static int |
FIRST_SLOT_NUMBER
The slot number of the first slot.
|
static byte |
INSERT_CONDITIONAL |
static byte |
INSERT_DEFAULT |
static byte |
INSERT_FOR_SPLIT |
static byte |
INSERT_INITIAL
Values for insertFlag.
|
static byte |
INSERT_OVERFLOW |
static byte |
INSERT_UNDO_WITH_PURGE |
static int |
INVALID_SLOT_NUMBER
A slot number guaranteed to be invalid.
|
Modifier and Type | Method and Description |
---|---|
void |
copyAndPurge(Page destPage,
int src_slot,
int num_rows,
int dest_slot)
move rows from one page to another, purging in the process.
|
PageTimeStamp |
currentTimeStamp()
Return a time stamp that can be used to identify the page of this
specific instance.
|
RecordHandle |
deleteAtSlot(int slot,
boolean delete,
LogicalUndo undo)
Mark the record at slot as deleted or undeleted according to delete flag.
|
boolean |
equalTimeStamp(PageTimeStamp ts)
See if timeStamp for this page is the same as the current
instance of the page.
|
RecordHandle |
fetchFieldFromSlot(int slot,
int fieldId,
java.lang.Object column)
Fetch a single field from a deleted or non-deleted record.
|
RecordHandle |
fetchFromSlot(RecordHandle rh,
int slot,
java.lang.Object[] row,
FetchDescriptor fetchDesc,
boolean ignoreDelete)
Fetch a record located in the passed in slot.
|
int |
fetchNumFields(RecordHandle handle)
Fetch the number of fields in a record.
|
int |
fetchNumFieldsAtSlot(int slot)
Fetch the number of fields in a record.
|
AuxObject |
getAuxObject()
Retrieve this page's aux object, returning null if there isn't one.
|
RecordHandle |
getInvalidRecordHandle()
Return an invalid record handle.
|
int |
getNextSlotNumber(RecordHandle handle)
Find slot for record with an id greater than the passed in identifier.
|
PageKey |
getPageKey()
Return the page key of this page.
|
long |
getPageNumber()
Return the page number of this page.
|
long |
getPageVersion()
Get the current version number of the page.
|
RecordHandle |
getRecordHandle(int recordId)
Get a record handle from a previously stored record id.
|
RecordHandle |
getRecordHandleAtSlot(int slot)
Get the record handle of row at slot.
|
int |
getSlotNumber(RecordHandle handle)
Get the slot number.
|
RecordHandle |
insert(java.lang.Object[] row,
FormatableBitSet validColumns,
byte insertFlag,
int overflowThreshold)
Insert a record anywhere on the page.
|
RecordHandle |
insertAtSlot(int slot,
java.lang.Object[] row,
FormatableBitSet validColumns,
LogicalUndo undo,
byte insertFlag,
int overflowThreshold)
Insert a record at the specified slot.
|
boolean |
isDeletedAtSlot(int slot)
Test if a record is deleted.
|
boolean |
isLatched() |
boolean |
isRepositionNeeded(long version)
Check if this page has been changed in such a way that scans that are
positioned on it will have to reposition.
|
RecordHandle |
makeRecordHandle(int recordHandleConstant)
Return a record handle for the given constant record id.
|
int |
moveRecordForCompressAtSlot(int slot,
java.lang.Object[] row,
RecordHandle[] old_handle,
RecordHandle[] new_handle)
Move record to a page toward the beginning of the file.
|
int |
nonDeletedRecordCount()
Return the number of records on this page that are not marked as deleted.
|
void |
purgeAtSlot(int slot,
int numpurges,
boolean needDataLogged)
Purge the row(s) from page.
|
int |
recordCount()
Return the number of records on the page.
|
boolean |
recordExists(RecordHandle handle,
boolean ignoreDelete)
does the record still exist on the page?
|
void |
setAuxObject(AuxObject aux)
Set the aux object for this page.
|
void |
setRepositionNeeded()
Set a hint in the page object to indicate that scans positioned on it
need to reposition.
|
void |
setTimeStamp(PageTimeStamp ts)
Set the time stamp to what is on page at this instance.
|
boolean |
shouldReclaimSpace(int num_non_deleted_rows,
int slot_just_deleted)
Is this page/deleted row a candidate for immediate reclaim space.
|
boolean |
spaceForInsert()
Is it likely that an insert will fit on this page?
|
boolean |
spaceForInsert(java.lang.Object[] row,
FormatableBitSet validColumns,
int overflowThreshold)
will insert of this row fit on this page?
|
void |
unlatch()
Unlatch me, the page is exclusivly latched by its current user until
this method call is made.
|
RecordHandle |
updateAtSlot(int slot,
java.lang.Object[] row,
FormatableBitSet validColumns)
Update the complete record identified by the slot.
|
RecordHandle |
updateFieldAtSlot(int slot,
int fieldId,
java.lang.Object newValue,
LogicalUndo undo)
Update a field within the record, replacing its current value with
the stored representation of newValue.
|
static final int FIRST_SLOT_NUMBER
static final int INVALID_SLOT_NUMBER
static final byte INSERT_INITIAL
INSERT_INITIAL - flag initializer INSERT_DEFAULT - default insert behavior, if the record does not fit on the page where the insert operation is called, an error will be returned, instead of overflowing the record. INSERT_UNDO_WITH_PURGE - if this is set, then the undo of this insert will purge the row rather than mark it as deleted, which is the default behaviro for insertAtSlot and insert. INSERT_CONDITIONAL - if this flag is set, then, the overflow is conditional. The record will be overflowed only if it exceeds the threshold specified by the properties, or the parameter. INSERT_OVERFLOW - if this flag is set, then the insert operation will overflow the record if it does not fit on the page. INSERT_FOR_SPLIT - a record is being updated that causes new portions to be inserted *and* the last new portion needs to point to an existing portion. Rules for the insert flags: 1. If INSERT_DEFAULT is set, INSERT_CONDITIONAL and INSERT_OVERFLOW will be ignored 2. INSERT_UNDO_WITH_PURGE can be set with any of the other 3 flags. 3. If INSERT_OVERFLOW is not set, INSERT_CONDITIONAL will be ignored. But, it is not necessary to set INSERT_CONDITIONAL when setting INSERT_OVERFLOW. 4. If INSERT_DEFAULT, INSERT_OVERFLOW both are not set, then, default insert action will be taken, i.e. no overflow will be allowed.
static final byte INSERT_DEFAULT
static final byte INSERT_UNDO_WITH_PURGE
static final byte INSERT_CONDITIONAL
static final byte INSERT_OVERFLOW
static final byte INSERT_FOR_SPLIT
static final java.lang.String DIAG_PAGE_SIZE
static final java.lang.String DIAG_RESERVED_SPACE
static final java.lang.String DIAG_MINIMUM_REC_SIZE
static final java.lang.String DIAG_BYTES_FREE
static final java.lang.String DIAG_BYTES_RESERVED
static final java.lang.String DIAG_NUMOVERFLOWED
static final java.lang.String DIAG_ROWSIZE
static final java.lang.String DIAG_MINROWSIZE
static final java.lang.String DIAG_MAXROWSIZE
static final java.lang.String DIAG_PAGEOVERHEAD
static final java.lang.String DIAG_SLOTTABLE_SIZE
long getPageNumber()
Page numbers are unique within a container and start at ContainerHandle.FIRST_PAGE_NUMBER and increment by 1 regardless of the page size.
MT - Latched
ContainerHandle
PageKey getPageKey()
MT - Latched
ContainerHandle
RecordHandle getInvalidRecordHandle()
RecordHandle makeRecordHandle(int recordHandleConstant) throws StandardException
Return a record handle that doesn't represent a record but rather has a special meaning. Used for special cases like creating a key specific to the page, but not specific to a row on the page.
See RecordHandle interface for a list of "special record handles."
recordHandleConstant
- the special recordIdStandardException
- if input is not a special record identifier.RecordHandle
RecordHandle getRecordHandle(int recordId)
Get a record handle from a previously stored record identifier that was obtained from a RecordHandle.
MT - Latched
recordId
- previously stored recordId.RecordHandle.getId()
boolean recordExists(RecordHandle handle, boolean ignoreDelete) throws StandardException
If "ignoreDelete" is true and the record handle represents a record on
the page (either marked deleted or not) return true. If "ignoreDelete"
is false return true if the record handle represents a record on the
page and the record is not marked as deleted. Return false otherwise.
MT - Latched
handle
- handle of the record to look for.ignoreDelete
- if true, then routine will return true even if the
row is marked deleted.StandardException
- Standard exception policy.boolean spaceForInsert() throws StandardException
Return true if there is a good chance an insert will fit on this page,
false otherwise. If this returns true then an insert may still fail by
throwing an exception or by returning null, see insertAtSlot for details.
It is very probable that this call is much faster than the version that
takes a row. In situations where it is expected that the
majority of times a row will fit on a page this method should be used
and the null return handled from insert/insertAtSlot.
MT - latched
StandardException
- Standard exception policy.boolean spaceForInsert(java.lang.Object[] row, FormatableBitSet validColumns, int overflowThreshold) throws StandardException
Return true if this record is guaranteed to be inserted successfully using insert() or insertAtSlot(). This guarantee is only valid if the following conditions are fulfilled before an insert is called with t his row.
row
- The row to check for insert.validColumns
- bit map to interpret valid columns in row.overflowThreshold
- The percentage of the page to use for the
insert. 100 means use 100% of the page,
50 means use 50% of page (ie. make sure
2 rows fit per page).StandardException
- Standard exception policy.RecordHandle insert(java.lang.Object[] row, FormatableBitSet validColumns, byte insertFlag, int overflowThreshold) throws StandardException
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object
passed to the openContainer() call before the record is inserted.
MT - latched
row
- The row version of the datavalidColumns
- a bit map of which columns in the row is valid.
ValidColumns will not be changed by RawStore.insertFlag
- see values for insertFlag below.StandardException
- if the container was not opened in update
mode, or if the row cannot fit on the page, or if the row is nullint moveRecordForCompressAtSlot(int slot, java.lang.Object[] row, RecordHandle[] old_handle, RecordHandle[] new_handle) throws StandardException
As part of compressing the table records need to be moved from the end of the file toward the beginning of the file. Only the contiguous set of free pages at the very end of the file can be given back to the OS. This call is used to purge the row from the current page, insert it into a previous page, and return the new row location Mark the record identified by position as deleted. The record may be undeleted sometime later using undelete() by any transaction that sees the record.
The interface is optimized to work on a number of rows at a time, optimally processing all rows on the page at once. The call will process either all rows on the page, or the number of slots in the input arrays - whichever is smaller. Locking Policy
MUST be called with table locked, not locks are requested. Because
it is called with table locks the call will go ahead and purge any
row which is marked deleted. It will also use purge rather than
delete to remove the old row after it moves it to a new page. This
is ok since the table lock insures that no other transaction will
use space on the table before this transaction commits.
A page latch on the new page will be requested and released.
slot
- Slot of row to move.row
- A template to read the current row into as part
of moving it.old_handle
- An array to be filled in by the call with the
old handles of all rows moved.new_handle
- An array to be filled in by the call with the
new handles of all rows moved.StandardException
- Standard Derby error policyLockingPolicy
int fetchNumFields(RecordHandle handle) throws StandardException
Locking Policy
No locks are obtained.
MT - latched
handle
- record handle to deleted or non-deleted recordStandardException
- Standard Derby error policy, a
statement level exception is thrown if the
record handle does not match a record on
the page.int getSlotNumber(RecordHandle handle) throws StandardException
Get the slot number of a record on a latched page using its record handle.
Note
The slot number is only good for as long as the page is latched.
MT - latched
handle
- the record handleStandardException
- Standard Derby error policyRecordHandle getRecordHandleAtSlot(int slot) throws StandardException
Get the record handle of a record on a latched page using its slot
number.
MT - latched
slot
- the slot numberStandardException
- Standard Derby error policyint getNextSlotNumber(RecordHandle handle) throws StandardException
Find the slot for the first record on the page with an id greater than
the passed in identifier.
Returns the slot of the first record on the page with an id greater than
the one passed in. Usefulness of this functionality depends on the
client's use of the raw store interfaces. If all "new" records are
always inserted at the end of the page, and the raw store continues to
guarantee that all record id's will be allocated in increasing order on
a given page (assuming a PAGE_REUSABLE_RECORD_ID container), then a page
is always sorted in record id order. For instance current heap tables
function this way. If the client ever inserts at a particular slot
number, rather than at the "end" then the record id's will not be sorted.
In the case where all record id's are always sorted on a page, then this
routine can be used by scan's which "lose" their position because the
row they have as a position was purged. They can reposition their scan
at the "next" row after the row that is now missing from the table.
This method returns the record regardless of its deleted status.
MT - latched
handle
- record handle to find the next higher id.StandardException
- Standard exception policy.RecordHandle insertAtSlot(int slot, java.lang.Object[] row, FormatableBitSet validColumns, LogicalUndo undo, byte insertFlag, int overflowThreshold) throws StandardException
All records that occupy FIRST_SLOT_NUMBER to (slot - 1) are not moved.
All records that occupy slot to (recordCount() - 1) are moved up one
slot.
The new record is inserted at the specified slot.
If slot == FIRST_SLOT_NUMBER, then the new record will be inserted at
the first slot.
If slot == recordCount(), then the record is inserted in a new slot, no
records are moved.
If slot is > recordCount() or if slot < FIRST_SLOT_NUMBER, an exception
will be thrown.
Space Policy
If the row will not fit on a page then:
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object passed
to the openContainer() call before the record is inserted.
MT - latched
slot
- The specified slotrow
- The row version of the dataundo
- if logical undo may be necessary, a function pointer
to the access code where the logical undo logic
resides. Null if logical undo is not necessary.validColumns
- a bit map of which columns in the row is valid.
ValidColumns will not be changed by RawStore.insertFlag
- if INSERT_UNDO_WITH_PURGE set, then the undo of this
insert will purge the row rather than mark it as
deleted, which is the default bahavior for
insertAtSlot and insert.StandardException
- if the container was not opened in update
mode, or if the row cannot fit on the pageLogicalUndo
,
LogicalUndoable
RecordHandle fetchFromSlot(RecordHandle rh, int slot, java.lang.Object[] row, FetchDescriptor fetchDesc, boolean ignoreDelete) throws StandardException
Fetch a record located in the passed in slot and fill-in the passed in
StorebleRow and the Object columns contained within. If row
is null then the record is locked but is not fetched.
This interface allows the caller to either return a deleted row or not.
If "ignoreDelete" is set to true, fetch the record regardless of whether
it is deleted or not (same as above fetchFromSlot). However, if
"ignoreDelete" is set to false and the and the slot correspond to a
deleted row, null is returned.
If a non-null Qualifier list is provided then the qualifier array will
be applied to the row and the row will only be returned if the row
qualifies, otherwise null will be returned. Values in the columns of
row may or may not be altered while trying to apply the qualifiers, if
null is returned the state of the columns is undefined. If a null
Qualifier list is provided then no qualification is applied.
If a non-null record handle is passed in, it is assumed that the record
handle corresponds to the record in the slot. If record handle is null,
a record handle will be manufactured and returned if the record is not
deleted or if "ignoreDelete" is true. This parameter is here for the
case where the caller have already manufactured the record handle for
locking or other purposes so it would make sense for the page to avoid
creating a new record handle object if possible.
rh
- the record handle of the row. If non-null it must
refer to the same record as the slot.slot
- the slot numberrow
- Row to be filled in with information from record.fetchDesc
- A structure to efficiently carry a set of parameters
needed to describe the fetch, these include:
validColumns - A bit map of which columns in the
row to be fetched. ValidColumns will not be
changed by RawStore.
qualifier_list -
A list of Qualifiers to apply to the row to see if
the row should be returned.
An array of qualifiers which restrict whether or not
the row should be returned by the fetch. Rows for
which any one of the qualifiers returns false are
not returned by the fetch. If null, no qualification
is done and the requested columns of the rows are
returned. Qualifiers can only reference columns
which are included in the scanColumnList. The
column id that a qualifier returns is the column id
the table, not the column id in the partial row
being returned.
qualifier_scratch_space -
An array of int's that matches the size of the
row[] array. Used to process qualifiers, if no
qualifiers are input then array need not be
input. Passed in rather than allocated so that
space can be allocated a single time in a scan.
If not passed in then raw store will allocate and
deallocate per call.ignoreDelete
- if true, return row regardless of whether it is
deleted or not. If false, only return non-deleted
row.StandardException
- Standard Derby error policyLockingPolicy
RecordHandle fetchFieldFromSlot(int slot, int fieldId, java.lang.Object column) throws StandardException
Locking Policy
No locks are obtained.
It is up to the caller to obtain the correct locks.
It is guaranteed that the page latch is not released by this method
slot
- is the slot numberfieldId
- is the column idcolumn
- is to be filled in with information from the record.StandardException
- Standard Derby error policy, a
statement level exception is thrown if
the slot is not on the page.fetchFromSlot(org.apache.derby.iapi.store.raw.RecordHandle, int, java.lang.Object[], org.apache.derby.iapi.store.raw.FetchDescriptor, boolean)
,
LockingPolicy
boolean isDeletedAtSlot(int slot) throws StandardException
Locking Policy
No locks are obtained.
It is guaranteed that the page latch is not released by this method
slot
- slot of record to be tested.StandardException
- Standard Derby error policy, a
statement level exception is thrown if the
slot is not on the page.RecordHandle updateFieldAtSlot(int slot, int fieldId, java.lang.Object newValue, LogicalUndo undo) throws StandardException
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object
passed to the openContainer() call before the record is updated.
It is guaranteed that the page latch is not released by this method
slot
- is the slot numberfieldId
- is the column idnewValue
- has the new colum value to be stored in the recordundo
- if logical undo may be necessary, a function pointer to the
access code where the logical undo logic resides. Null if logical undo
is not necessary.StandardException
- Standard Derby error policy, a
statement level exception is thrown if
the slot is not on the page, or if the
record is deleted, or if the fieldId
is not on the record and (fieldId - 1)
does not exist, or if the container was
not opened in update mode.LockingPolicy
,
LogicalUndo
,
LogicalUndoable
int fetchNumFieldsAtSlot(int slot) throws StandardException
Locking Policy
No locks are obtained.
It is guaranteed that the page latch is not released by this method
slot
- is the slot numberStandardException
- Standard Derby error policyRecordHandle deleteAtSlot(int slot, boolean delete, LogicalUndo undo) throws StandardException
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object passed
to the openContainer() call before the record is deleted. If record
already deleted, and an attempt is made to delete it, an exception is
thrown. If record not deleted, and an attempt is made to undelete it,
an exception is thrown.
MT - latched
slot
- is the slot numberdelete
- true if this record is to be deleted false if this
deleted record is to be marked undeletedundo
- if logical undo may be necessary, a function pointer to
the access code where the logical undo logic resides.
Null if logical undo is not necessary.StandardException
- if the container was not opened in update
mode, or if an attempt was made to delete an already deleted record or
undelete a not deleted record, or if the slot is not on the pageLockingPolicy
,
LogicalUndo
,
LogicalUndoable
void purgeAtSlot(int slot, int numpurges, boolean needDataLogged) throws StandardException
Purge the row(s) from page, get rid of the row(s) and slot(s) - USE WITH CAUTION, please see entire description of this operation before attempting to use this. Starting from the specified slot, n rows will be purged. That is, rows that occupies from slot to slot+n-1 will be purged from the page.
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object passed to the openContainer() call before the records are purged.
NOTE : CAVEAT
This operation will physically get rid of the row from the page, so if a
subsequent operation on this page uses a slot that has been purged, then
the undo of this operation will fail. It is only safe to use this
operation if the caller knows that it has exclusive access to the page
for the duration of the transaction, i.e, effectively holding a page
lock on the page
NOTE
Outstanding handles to purged rows are no longer valid, accessing them
will cause an exception to be thrown.
NOTE : Data Logging for Purges
needDataLogged is used to specify whether data is required to be
logged for purge operatios. Data Logging is required
Only if the row can be reused or required for key search if a purge is
rolled back;(rollback can occur if the system crashes in the middle of
purges or some unexpected error condiditions rolled back.
For example:
1)Btree expects the data to be there if a purge is rolled back;
needDataLogged=true
2)Heaps does not care if data exist because only operation that can occur
on a row whose purge rolled back is purging again.(needDataLogged=false)
MT - latched
slot
- the starting slot numbernumpurges
- number of slots to purge. If <= 0,
just returns as a no-op.needDataLogged
- if set to true data is logged for purges else
only headers.StandardException
- Standard Derby error policyLockingPolicy
void copyAndPurge(Page destPage, int src_slot, int num_rows, int dest_slot) throws StandardException
Move from this page slot[src_slot] to slot[src_slot+num_rows-1] to
destPage slot[dest_slot] to slot[dest_slot + num_rows - 1], in that
order. Both this page and destPage must be latched and from the same
container with the same page and record format.
Slot[src_slot] to slot[src_slot+numrows-1] will be purged from this
page. RecordId on the dest page will be brand new and not in any
particular order or range. RecordId of the purged rows in this page is
never reused. Deleted and undeleted rows are copied over just the same.
Exception will be thrown if this page does not have all the rows in the
moved over range.
RESOLVE: reserve space now not copied over because in btree, a
row never shrinks. When this routine is called by heap or by some page
which will have shrunken row, then we need to add that
DestPage must have at least dest_slot row occupying slot[0] to
slot[dest_slot-1]. DestPage must have enough space to take the copied
over data. Rows that occupied slot number > dest_slot will be moved up
the slot (I.e., slot[dest_slot] -> slot[dest_slot + num_rows]).
If this operation rolls back, this page (the src page) will get the
rows back and the dest page will purge the rows that were copied - this
is as if the rows were inserted into the dest page with
INSERT_UNDO_WITH_PURGE.
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object passed to the openContainer() call before the rows are copied over and bore the records are purged. I.e, for num_rows moved, there will be 2*num_rows calls to lockRecordForWrite.
Use with caution
As with a normal purge, no space is reserved on this page for
rollback of the purge, so you must commit before inserting any rows
onto this page - unless those inserts are INSERT_UNDO_WITH_PURGE.
destPage
- the page to copy tosrc_slot
- start copying from this slotnum_rows
- copy and purge this many rows from this pagedest_slot
- copying into this slot of destPageStandardException
- Standard Derby error policyRecordHandle updateAtSlot(int slot, java.lang.Object[] row, FormatableBitSet validColumns) throws StandardException
Locking Policy
Calls the lockRecordForWrite() method of the LockingPolicy object
passed to the openContainer() call before the record is undeleted.
If record already deleted, an exception is thrown.
It is guaranteed that the page latch is not released by this method
slot
- is the slot numbervalidColumns
- a bit map of which columns in the row is valid.
ValidColumns will not be changed by RawStore.StandardException
- the container was not opened in update
mode, or the slot is not on the pagevoid unlatch()
ref.unlatch(); ref = null;
int recordCount() throws StandardException
StandardException
- Standard Derby error policyint nonDeletedRecordCount() throws StandardException
StandardException
- Standard Derby error policyboolean shouldReclaimSpace(int num_non_deleted_rows, int slot_just_deleted) throws StandardException
Used by access methods after executing a delete on "slot_just_deleted" to ask whether a post commit should be queued to try to reclaim space after the delete commits.
Will return true if the number of non-deleted rows on the page is <= "num_non_deleted_rows". For instance 0 means schedule reclaim only if all rows are deleted, 1 if all rows but one are deleted.
Will return true if the row just deleted is either a long row or long column. In this case doing a reclaim space on the single row may reclaim multiple pages of free space, so better to do it now rather than wait for all rows on page to be deleted. This case is to address the worst case scenario of all rows with long columns, but very short rows otherwise. In this case there could be 1000's of rows on the main page with many gigabytes of data on overflow pages in deleted space that would not be reclaimed until all rows on the page were deleted.
num_non_deleted_rows
- threshold number of non-deleted rows to
schedule reclaim space.slot_just_deleted
- row on page to check for long row/long columnStandardException
- Standard exception policy.void setAuxObject(AuxObject aux)
AuxObject
AuxObject getAuxObject()
AuxObject
void setRepositionNeeded()
boolean isRepositionNeeded(long version)
version
- the version number of the page when the scan positioned
on it (after which version the page should not have changed in a way
that requires repositioning)true
if a scan that was positioned on the page at page
version version
needs to reposition; false
otherwiselong getPageVersion()
void setTimeStamp(PageTimeStamp ts) throws StandardException
StandardException
- Standard Derby error policy.PageTimeStamp currentTimeStamp()
boolean equalTimeStamp(PageTimeStamp ts) throws StandardException
ts
- the time stamp gotten from an earlier call to this page's
getTimeStampStandardException
- Standard Derby error policy.PageTimeStamp
boolean isLatched()
Apache Derby V10.13 Internals - Copyright © 2004,2016 The Apache Software Foundation. All Rights Reserved.