001: /*
002:
003: Derby - Class org.apache.derby.impl.store.raw.data.ChainAllocPageOperation
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.store.raw.data;
023:
024: import org.apache.derby.impl.store.raw.data.PhysicalPageOperation;
025: import org.apache.derby.impl.store.raw.data.BasePage;
026:
027: import org.apache.derby.iapi.services.io.FormatIdUtil;
028: import org.apache.derby.iapi.services.io.StoredFormatIds;
029: import org.apache.derby.iapi.services.sanity.SanityManager;
030:
031: import org.apache.derby.iapi.error.StandardException;
032: import org.apache.derby.iapi.store.raw.ContainerHandle;
033: import org.apache.derby.iapi.store.raw.data.RawContainerHandle;
034: import org.apache.derby.iapi.store.raw.Transaction;
035: import org.apache.derby.iapi.store.raw.log.LogInstant;
036:
037: import org.apache.derby.iapi.services.io.CompressedNumber;
038:
039: import java.io.OutputStream;
040: import java.io.ObjectOutput;
041: import java.io.IOException;
042: import org.apache.derby.iapi.services.io.LimitObjectInput;
043: import java.io.ObjectInput;
044:
045: // Allocation page operation - to allocate, deallocate or free a page
046: public final class ChainAllocPageOperation extends
047: PhysicalPageOperation {
048:
049: protected long newAllocPageNum; // the next alloc page's page number
050: protected long newAllocPageOffset; // the next alloc page's page offset
051:
052: public ChainAllocPageOperation(AllocPage allocPage,
053: long pageNumber, long pageOffset) throws StandardException {
054: super (allocPage);
055:
056: newAllocPageNum = pageNumber;
057: newAllocPageOffset = pageOffset;
058: }
059:
060: /*
061: * Formatable methods
062: */
063:
064: // no-arg constructor, required by Formatable
065: public ChainAllocPageOperation() {
066: super ();
067: }
068:
069: public void writeExternal(ObjectOutput out) throws IOException {
070: super .writeExternal(out);
071: CompressedNumber.writeLong(out, newAllocPageNum);
072: CompressedNumber.writeLong(out, newAllocPageOffset);
073: }
074:
075: /**
076: @exception IOException error reading from log stream
077: @exception ClassNotFoundException cannot read object from input
078: */
079: public void readExternal(ObjectInput in) throws IOException,
080: ClassNotFoundException {
081: super .readExternal(in);
082: newAllocPageNum = CompressedNumber.readLong(in);
083: newAllocPageOffset = CompressedNumber.readLong(in);
084: }
085:
086: /**
087: Return my format identifier.
088: */
089: public int getTypeFormatId() {
090: return StoredFormatIds.LOGOP_CHAIN_ALLOC_PAGE;
091: }
092:
093: /*
094: * Loggable methods
095: */
096: /**
097: Link the next alloc page into the page chain
098: @exception StandardException container Handle is not active
099: */
100: public final void doMe(Transaction tran, LogInstant instant,
101: LimitObjectInput in) throws StandardException {
102: if (SanityManager.DEBUG) {
103: SanityManager.ASSERT(this .page instanceof AllocPage);
104: }
105:
106: ((AllocPage) page).chainNextAllocPage(instant, newAllocPageNum,
107: newAllocPageOffset);
108: }
109:
110: /*
111: * Undoable methods
112: */
113:
114: /**
115: Unlink the next alloc page from the page chain
116:
117: @exception StandardException Thrown by methods I call
118: @see PhysicalPageOperation#undoMe
119: */
120: public void undoMe(Transaction xact, BasePage undoPage,
121: LogInstant CLRInstant, LimitObjectInput in)
122: throws StandardException {
123: if (SanityManager.DEBUG) {
124: SanityManager.ASSERT(undoPage != null, "undo Page null");
125: SanityManager.ASSERT(undoPage instanceof AllocPage,
126: "undo Page is not an allocPage");
127: }
128:
129: ((AllocPage) undoPage).chainNextAllocPage(CLRInstant,
130: ContainerHandle.INVALID_PAGE_NUMBER, 0 /* undefine */);
131: }
132:
133: /*
134: * method to support BeforeImageLogging
135: */
136: public void restoreMe(Transaction xact, BasePage undoPage,
137: LogInstant CLRinstant, LimitObjectInput in) {
138: // nobody should be calling this since there is no
139: // BI_AllocPageOperation
140: if (SanityManager.DEBUG)
141: SanityManager
142: .THROWASSERT("cannot call restoreMe on BI_ChainAllocPageOperation");
143: }
144:
145: /** debug */
146: public String toString() {
147: if (SanityManager.DEBUG) {
148: String str = super .toString();
149: str += " Chain new alloc page number " + newAllocPageNum
150: + " at " + newAllocPageOffset + " to "
151: + getPageId();
152: return str;
153: } else
154: return null;
155: }
156:
157: }
|