001: /*
002:
003: Derby - Class org.apache.derby.impl.store.raw.data.SetReservedSpaceOperation
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.iapi.reference.SQLState;
025:
026: import org.apache.derby.impl.store.raw.data.BasePage;
027:
028: import org.apache.derby.iapi.services.io.FormatIdUtil;
029: import org.apache.derby.iapi.services.io.StoredFormatIds;
030:
031: import org.apache.derby.iapi.store.raw.Page;
032: import org.apache.derby.iapi.store.raw.Transaction;
033:
034: import org.apache.derby.iapi.store.raw.log.LogInstant;
035: import org.apache.derby.iapi.store.raw.xact.RawTransaction;
036:
037: import org.apache.derby.iapi.services.sanity.SanityManager;
038: import org.apache.derby.iapi.error.StandardException;
039:
040: import org.apache.derby.iapi.services.io.CompressedNumber;
041: import org.apache.derby.iapi.util.ByteArray;
042: import org.apache.derby.iapi.services.io.DynamicByteArrayOutputStream;
043: import org.apache.derby.iapi.services.io.DynamicByteArrayOutputStream;
044:
045: import java.io.OutputStream;
046: import java.io.ObjectOutput;
047: import java.io.ObjectInput;
048: import java.io.IOException;
049: import org.apache.derby.iapi.services.io.LimitObjectInput;
050:
051: /**
052: Represents shrinking of the reserved space of a particular row on a page.
053: This operation is not undoable.
054: */
055: public class SetReservedSpaceOperation extends PageBasicOperation {
056:
057: protected int doMeSlot; // slot where record is at
058: protected int recordId; // recordId
059: protected int newValue; // the new reserved space value
060: protected int oldValue; // the old reserved space value (for BI_logging)
061:
062: public SetReservedSpaceOperation(BasePage page, int slot,
063: int recordId, int newValue, int oldValue) {
064: super (page);
065: doMeSlot = slot;
066: this .recordId = recordId;
067: this .newValue = newValue;
068: this .oldValue = oldValue;
069:
070: if (SanityManager.DEBUG) // we only use this for shrinking
071: SanityManager.ASSERT(oldValue > newValue);
072: }
073:
074: /*
075: * Formatable methods
076: */
077: // no-arg constructor, required by Formatable
078: public SetReservedSpaceOperation() {
079: super ();
080: }
081:
082: /**
083: Return my format identifier.
084: */
085: public int getTypeFormatId() {
086: return StoredFormatIds.LOGOP_SET_RESERVED_SPACE;
087: }
088:
089: public void writeExternal(ObjectOutput out) throws IOException {
090: super .writeExternal(out);
091:
092: CompressedNumber.writeInt(out, doMeSlot);
093: CompressedNumber.writeInt(out, recordId);
094: CompressedNumber.writeInt(out, newValue);
095: CompressedNumber.writeInt(out, oldValue);
096: }
097:
098: /**
099: Read this in
100: @exception IOException error reading from log stream
101: @exception ClassNotFoundException log stream corrupted
102: */
103: public void readExternal(ObjectInput in) throws IOException,
104: ClassNotFoundException {
105: super .readExternal(in);
106: doMeSlot = CompressedNumber.readInt(in);
107: recordId = CompressedNumber.readInt(in);
108: newValue = CompressedNumber.readInt(in);
109: oldValue = CompressedNumber.readInt(in);
110: }
111:
112: /*
113: * Loggable methods
114: */
115: /**
116: @exception IOException Can be thrown by any of the methods of ObjectInput.
117: @exception StandardException Standard Cloudscape policy.
118:
119: @see org.apache.derby.iapi.store.raw.Loggable#doMe
120: */
121: public void doMe(Transaction xact, LogInstant instant,
122: LimitObjectInput in) throws StandardException, IOException {
123: if (SanityManager.DEBUG) {
124: SanityManager.ASSERT(oldValue == this .page
125: .getReservedCount(doMeSlot));
126: SanityManager
127: .ASSERT(newValue < oldValue,
128: "cannot set reserved space to be bigger than before");
129: }
130:
131: page.setReservedSpace(instant, doMeSlot, newValue);
132: }
133:
134: /*
135: * method to support BeforeImageLogging - This log operation is not
136: * undoable in the logical sense , but all log operations that touch a page
137: * must support physical undo during RRR transaction.
138: */
139:
140: /**
141: * restore the before image of the page
142: *
143: * @exception StandardException Standard Cloudscape Error Policy
144: * @exception IOException problem reading the complete log record from the
145: * input stream
146: */
147:
148: public void restoreMe(Transaction xact, BasePage undoPage,
149: LogInstant CLRinstant, LimitObjectInput in)
150: throws StandardException, IOException {
151: int slot = undoPage.findRecordById(recordId,
152: Page.FIRST_SLOT_NUMBER);
153: if (SanityManager.DEBUG) {
154: if (!getPageId().equals(undoPage.getPageId()))
155: SanityManager
156: .THROWASSERT("restoreMe cannot restore to a different page. "
157: + "doMe page:"
158: + getPageId()
159: + " undoPage:" + undoPage.getPageId());
160: if (slot != doMeSlot)
161: SanityManager
162: .THROWASSERT("restoreMe cannot restore to a different slot. "
163: + "doMe slot:"
164: + doMeSlot
165: + " undoMe slot: "
166: + slot
167: + " recordId:" + recordId);
168:
169: }
170:
171: page.setReservedSpace(CLRinstant, slot, oldValue);
172:
173: }
174:
175: /**
176: DEBUG: Print self.
177: */
178: public String toString() {
179: if (SanityManager.DEBUG) {
180: return super .toString() + "Set Reserved space of recordId "
181: + recordId + " from " + oldValue + " to "
182: + newValue;
183: }
184: return null;
185: }
186: }
|