001: /*
002:
003: Derby - Class org.apache.derby.impl.store.raw.data.AllocPageOperation
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.data.RawContainerHandle;
033: import org.apache.derby.iapi.store.raw.Transaction;
034: import org.apache.derby.iapi.store.raw.log.LogInstant;
035:
036: import org.apache.derby.iapi.services.io.CompressedNumber;
037:
038: import java.io.OutputStream;
039: import java.io.ObjectOutput;
040: import java.io.ObjectInput;
041: import java.io.IOException;
042: import org.apache.derby.iapi.services.io.LimitObjectInput;
043:
044: // Allocation page operation - to allocate, deallocate or free a page
045: public final class AllocPageOperation extends PhysicalPageOperation {
046:
047: protected long newPageNumber; // new page's number
048: protected int doStatus; // what the doMe operation should set the status to
049: protected int undoStatus; // what the undoMe operation should set the status to
050:
051: public AllocPageOperation(AllocPage allocPage, long pageNumber,
052: int doStatus, int undoStatus) throws StandardException {
053: super (allocPage);
054:
055: newPageNumber = pageNumber;
056: this .doStatus = doStatus;
057: this .undoStatus = undoStatus;
058: }
059:
060: /*
061: * Formatable methods
062: */
063:
064: // no-arg constructor, required by Formatable
065: public AllocPageOperation() {
066: super ();
067: }
068:
069: public void writeExternal(ObjectOutput out) throws IOException {
070: super .writeExternal(out);
071: CompressedNumber.writeLong(out, newPageNumber);
072: CompressedNumber.writeInt(out, doStatus);
073: CompressedNumber.writeInt(out, undoStatus);
074: }
075:
076: /**
077: @exception IOException error reading from log stream
078: @exception ClassNotFoundException cannot read object from input
079: */
080: public void readExternal(ObjectInput in) throws IOException,
081: ClassNotFoundException {
082: super .readExternal(in);
083: newPageNumber = CompressedNumber.readLong(in);
084: doStatus = CompressedNumber.readInt(in);
085: undoStatus = CompressedNumber.readInt(in);
086: }
087:
088: /**
089: Return my format identifier.
090: */
091: public int getTypeFormatId() {
092: return StoredFormatIds.LOGOP_ALLOC_PAGE;
093: }
094:
095: /*
096: * Loggable methods
097: */
098: /**
099: Allocate/deallocate/free this page number
100: @exception StandardException container Handle is not active
101: */
102: public final void doMe(Transaction tran, LogInstant instant,
103: LimitObjectInput in) throws StandardException {
104: if (SanityManager.DEBUG) {
105: SanityManager.ASSERT(this .page instanceof AllocPage);
106: }
107:
108: ((AllocPage) page).setPageStatus(instant, newPageNumber,
109: doStatus);
110: }
111:
112: /*
113: * Undoable methods
114: */
115:
116: /**
117: Allocate/deallocate/free this page number.
118:
119: @exception StandardException Thrown by methods I call
120:
121: @see PhysicalPageOperation#undoMe
122: */
123: public void undoMe(Transaction xact, BasePage undoPage,
124: LogInstant CLRInstant, LimitObjectInput in)
125: throws StandardException {
126: if (SanityManager.DEBUG) {
127: SanityManager.ASSERT(undoPage != null, "undo Page null");
128: SanityManager.ASSERT(undoPage instanceof AllocPage,
129: "undo Page is not an allocPage");
130: }
131:
132: // RESOLVE: maybe a free page operation should not be undoable.
133: // Who is going to free that page again? If we don't undo it, it may
134: // be problem if we ever free a page in the same transaction that we
135: // deallocate it, in that case, if we don't rollback the free, then we
136: // can't rollback the deallcoate.
137: ((AllocPage) undoPage).setPageStatus(CLRInstant, newPageNumber,
138: undoStatus);
139: }
140:
141: /*
142: * method to support BeforeImageLogging
143: */
144: public void restoreMe(Transaction xact, BasePage undoPage,
145: LogInstant CLRinstant, LimitObjectInput in) {
146: // nobody should be calling this since there is no
147: // BI_AllocPageOperation
148: if (SanityManager.DEBUG)
149: SanityManager
150: .THROWASSERT("cannot call restoreMe on BI_AllocPageOperation");
151: }
152:
153: /** debug */
154: public String toString() {
155: if (SanityManager.DEBUG) {
156: String str = super .toString();
157: str += " Change page allocation status of " + newPageNumber
158: + " to " + doStatus + "(undo " + undoStatus + ")";
159: return str;
160: } else
161: return null;
162: }
163:
164: }
|