Package org.apache.derby.impl.store.raw.data

Examples of org.apache.derby.impl.store.raw.data.StoredRecordHeader


    @exception StandardException Standard Derby error policy
  */
  public int fetchNumFieldsAtSlot(int slot) throws StandardException
  {

    StoredRecordHeader recordHeader = getHeaderAtSlot(slot);

    if (!recordHeader.hasOverflow())
      return super.fetchNumFieldsAtSlot(slot);

    BasePage overflowPage = getOverflowPage(recordHeader.getOverflowPage());
    int count = overflowPage.fetchNumFieldsAtSlot(getOverflowSlot(overflowPage, recordHeader));
    overflowPage.unlatch();
    return count;
  }
View Full Code Here


  private void storeRecordForInsert(int slot, ObjectInput in)
    throws StandardException, IOException
  {

    StoredRecordHeader recordHeader = shiftUp(slot);
    if (recordHeader == null) {
      recordHeader = new StoredRecordHeader();
      setHeaderAtSlot(slot, recordHeader);
    }

    bumpRecordCount(1);

    // recordHeader represents the new version of the record header.
    recordHeader.read(in);

    // the record is already marked delete, we need to bump the deletedRowCount
    if (recordHeader.isDeleted()) {
      deletedRowCount++;
      headerOutOfDate = true;
    }

    // during a rollforward insert, recordId == nextId
    // during a rollback of purge, recordId < nextId
    if (nextId <= recordHeader.getId())
      nextId = recordHeader.getId()+1;

    int recordOffset = firstFreeByte;
    int offset = recordOffset;

    // write each field out to the page
    int numberFields = recordHeader.getNumberFields();

    rawDataOut.setPosition(offset);
    offset += recordHeader.write(rawDataOut);

    int userData = 0;
    for (int i = 0; i < numberFields; i++) {

      // get the field header information, the input stream came from the log
View Full Code Here

  private void storeRecordForUpdate(int slot, ObjectInput in)
    throws StandardException, IOException
  {
    // set up to read the in-memory record header back from the record
    StoredRecordHeader recordHeader = getHeaderAtSlot(slot);
    StoredRecordHeader newRecorderHeader = new StoredRecordHeader();

    // recordHeader represents the new version of the record header.
    newRecorderHeader.read(in);

    int oldFieldCount = recordHeader.getNumberFields();
    int newFieldCount = newRecorderHeader.getNumberFields();

    int startField = recordHeader.getFirstField();
    if (SanityManager.DEBUG) {
      if (startField != newRecorderHeader.getFirstField())
        SanityManager.THROWASSERT("First field changed from " + startField + " to " + newRecorderHeader.getFirstField());
    }

    // See if the number of fields shrunk, if so clear out the old data
    // we do this first to stop shuffling about the fields that are going to
    // be deleted during the update of the earlier fields. This case occurs
    // on an update that changes the row to be overflowed.
    if (newFieldCount < oldFieldCount) {

      int oldDataStartingOffset = getFieldOffset(slot, startField + newFieldCount);

      // calculate the length of the to be deleted fields
      int deleteLength = getRecordOffset(slot) + getRecordPortionLength(slot) - oldDataStartingOffset;

      // we are updateing to zero bytes!
      updateRecordPortionLength(slot, -(deleteLength), deleteLength);
    }

    // write each field out to the page

    int startingOffset = getRecordOffset(slot);
    int newOffset = startingOffset;
    int oldOffset = startingOffset;

    // see which field we get to use the reserve space
    int reservedSpaceFieldId = newFieldCount < oldFieldCount ?
      newFieldCount - 1 : oldFieldCount - 1;
    reservedSpaceFieldId += startField;


    // the new data the needs to be written at newOffset but can't until
    // unsedSpace >= newDataToWrite.length (allowing for the header)
    DynamicByteArrayOutputStream newDataToWrite = null;

    rawDataOut.setPosition(newOffset);

    // write the record header, which may change in size
    int oldLength = recordHeader.size();
    int newLength = newRecorderHeader.size();

    int unusedSpace = oldLength; // the unused space at newOffset

    // no fields, so we can eat into the reserve space
    if (reservedSpaceFieldId < startField) // no fields
      unusedSpace += getReservedCount(slot);

    if (unusedSpace >= newLength) {
      newRecorderHeader.write(rawDataOut);
      newOffset += newLength;
      unusedSpace -= newLength;
     
    } else {     

      newDataToWrite = new DynamicByteArrayOutputStream(getPageSize());
      newRecorderHeader.write(newDataToWrite);
    }
    oldOffset += oldLength;
    int recordDelta = (newLength - oldLength);

    int oldFieldStatus = 0;
View Full Code Here

  }

  public void skipRecord(ObjectInput in) throws IOException
  {

    StoredRecordHeader recordHeader = new StoredRecordHeader();
    recordHeader.read(in);

    for (int i = recordHeader.getNumberFields(); i > 0; i--) {
      skipField(in);   
    }
  }
View Full Code Here

    deletedRowCount += super.setDeleteStatus(slot, delete);
    headerOutOfDate = true;

    int offset = getRecordOffset(slot);
    StoredRecordHeader recordHeader = getHeaderAtSlot(slot);

    rawDataOut.setPosition(offset);
    recordHeader.write(logicalDataOut);
  }
View Full Code Here

  private int getFieldOffset(int slot, int fieldNumber) throws IOException
  {
    // RESOLVE - overflow, needs to be changed
    int offset = getRecordOffset(slot);

    StoredRecordHeader recordHeader = getHeaderAtSlot(slot);

    // get the number of fields
    int startField = recordHeader.getFirstField();

    if (SanityManager.DEBUG) {
      int numberFields = recordHeader.getNumberFields();

      if ((fieldNumber < startField) || (fieldNumber >= (startField + numberFields)))
        SanityManager.THROWASSERT(
          "fieldNumber: " + fieldNumber +
          " start field: " + startField +
          " number of fields " + numberFields);
    }

    ArrayInputStream lrdi = rawDataIn;

    // skip the record header
    lrdi.setPosition(offset + recordHeader.size());

    // skip any earlier fields ...
    for (int i = startField; i < fieldNumber; i++) {
      skipField(lrdi);
    }
View Full Code Here

    throws StandardException, IOException
  {
    int                 slot       =
            findRecordById(fetchStream.getOverflowId(), FIRST_SLOT_NUMBER);

    StoredRecordHeader recordHeader = getHeaderAtSlot(slot);

    int offset       = getRecordOffset(slot);
    int numberFields = recordHeader.getNumberFields();

    if (SanityManager.DEBUG)
        {
      if ((numberFields > 2) || (numberFields < 1))
            {
        SanityManager.THROWASSERT(
          "longColumn record header must have 1 or 2 fields." +
                    "numberFields = " + numberFields);
            }
    }

    rawDataIn.setPosition(offset + recordHeader.size());

    int fieldStatus     =
            StoredFieldHeader.readStatus(rawDataIn);
    int fieldDataLength =
            StoredFieldHeader.readFieldDataLength(
View Full Code Here

      // in the long column portion on the new page there will be 1 field
            // if the portion fits on the page (2 if it needs another pointer
            // to continue to yet another page).
      int numberFields = 1;

      StoredRecordHeader recordHeader =
                new StoredRecordHeader(recordId, numberFields);

      int recordHeaderLength = recordHeader.write(logicalDataOut);

      spaceAvailable -= recordHeaderLength;

      if (spaceAvailable < 0)
            {
View Full Code Here

    DynamicByteArrayOutputStream  out)
    throws StandardException, IOException
  {
    setOutputStream(out);
   
    StoredRecordHeader pageRecordHeader = getHeaderAtSlot(slot);
       
        StoredRecordHeader  overflow_rh = getOverFlowRecordHeader();
        overflow_rh.setOverflowFields(pageRecordHeader);

    if (SanityManager.DEBUG)
        {
      SanityManager.ASSERT(overflow_rh.getOverflowPage() != 0);
    }

    /*
    // #1 situation,
    // we want to update the header to just an overflow pointer with no data
    // so, update the recordHeader, and we are done...
    if (!overflow_rh.isPartialOverflow()) {
      // this recordHeader becomes just a overflow pointer,
      // we need to make sure that the number of fields is set to 0.
      overflow_rh.setNumberFields(0);
     
      spaceAvailable -= overflow_rh.write(logicalDataOut);

      if (spaceAvailable < 0) {
        throw new NoSpaceOnPage(isOverflowPage());
      }

      resetOutputStream();

      return (-1);
    }
    */

    // #2 situation,
    // we want to only update the recordheader of the page, while leaving
        // the data of the record on the page.  Just update the header part and
        // then arrange for the data part to move to after the new header.

    int oldSize = pageRecordHeader.size();
    int newSize = overflow_rh.size();

    if (oldSize < newSize)
        {
      // need extra room...
      int delta = newSize - oldSize;
      if (spaceAvailable < delta)
            {
        throw new NoSpaceOnPage(isOverflowPage());
      }
    }

    // write the new overflow_rh for the record.
    overflow_rh.write(logicalDataOut);

    // now, log the data
    logRecordDataPortion(
            slot, LOG_RECORD_DEFAULT, pageRecordHeader,
            (FormatableBitSet) null, logicalDataOut, (RecordHandle)null);
View Full Code Here

    FormatableBitSet         validColumns,
    OutputStream    out,
    RecordHandle    headRowHandle)
    throws StandardException, IOException
  {
    StoredRecordHeader recordHeader = getHeaderAtSlot(slot);

    if (recordId != recordHeader.getId())
        {
      // the record is being logged under a different identifier,
      // write it out with the correct identifier
      StoredRecordHeader newRecordHeader =
                new StoredRecordHeader(recordHeader);

      newRecordHeader.setId(recordId);

      newRecordHeader.write(out);
      newRecordHeader = null;
    }
        else
        {
      // write the original record header
View Full Code Here

TOP

Related Classes of org.apache.derby.impl.store.raw.data.StoredRecordHeader

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.