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: /**
046:
047: Log operation to implement compressing space from a container and returning
048: it to the operating system.
049:
050: **/
051:
052: public final class CompressSpacePageOperation extends
053: PhysicalPageOperation {
054: /**************************************************************************
055: * Fields of the class
056: **************************************************************************
057: */
058:
059: /**
060: * The new highest page on this allocation page. The number is the
061: * offset of the page in the array of pages maintained by this
062: * allocation page, for instance a value of 0 indicates all page except
063: * the first one are to be truncated. If all pages are truncated then
064: * the offset is set to -1.
065: **/
066: protected int newHighestPage;
067:
068: /**
069: * The number of allocated pages in this allocation page prior to
070: * the truncate. Note that all pages from NewHighestPage+1 through
071: * newHighestPage+num_pages_truncated should be FREE.
072: **/
073: protected int num_pages_truncated;
074:
075: /**************************************************************************
076: * Constructors for This class:
077: **************************************************************************
078: */
079: public CompressSpacePageOperation(AllocPage allocPage,
080: int highest_page, int num_truncated)
081: throws StandardException {
082: super (allocPage);
083:
084: newHighestPage = highest_page;
085: num_pages_truncated = num_truncated;
086: }
087:
088: /**************************************************************************
089: * Public Methods of Formatable interface.
090: **************************************************************************
091: */
092:
093: // no-arg constructor, required by Formatable
094: public CompressSpacePageOperation() {
095: super ();
096: }
097:
098: public void writeExternal(ObjectOutput out) throws IOException {
099: super .writeExternal(out);
100: CompressedNumber.writeInt(out, newHighestPage);
101: CompressedNumber.writeInt(out, num_pages_truncated);
102: }
103:
104: /**
105: @exception IOException error reading from log stream
106: @exception ClassNotFoundException cannot read object from input
107: */
108: public void readExternal(ObjectInput in) throws IOException,
109: ClassNotFoundException {
110: super .readExternal(in);
111: newHighestPage = CompressedNumber.readInt(in);
112: num_pages_truncated = CompressedNumber.readInt(in);
113: }
114:
115: /**
116: Return my format identifier.
117: */
118: public int getTypeFormatId() {
119: return StoredFormatIds.LOGOP_COMPRESS_SPACE;
120: }
121:
122: /**************************************************************************
123: * Public Methods of Loggable interface.
124: **************************************************************************
125: */
126:
127: /**
128: * Compress space from container.
129: * <p>
130: * Compress the indicate space from the container, returning the free
131: * pages to the OS. Update the allocation page to reflect the file
132: * change.
133: *
134: * @param tran transaction doing the operation.
135: * @param instant log instant for this operation.
136: * @param in unused by this log operation.
137: *
138: * @exception StandardException Standard exception policy.
139: **/
140: public final void doMe(Transaction tran, LogInstant instant,
141: LimitObjectInput in) throws StandardException {
142: if (SanityManager.DEBUG) {
143: SanityManager.ASSERT(this .page instanceof AllocPage);
144: }
145:
146: ((AllocPage) page).compressSpace(instant, newHighestPage,
147: num_pages_truncated);
148: }
149:
150: /**************************************************************************
151: * Public Methods of Undoable interface.
152: **************************************************************************
153: */
154:
155: /**
156: * Compress space undo.
157: * <p>
158: *
159: * @exception StandardException Thrown by methods I call
160: * @see PhysicalPageOperation#undoMe
161: **/
162: public void undoMe(Transaction xact, BasePage undoPage,
163: LogInstant CLRInstant, LimitObjectInput in)
164: throws StandardException {
165: if (SanityManager.DEBUG) {
166: SanityManager.ASSERT(undoPage != null, "undo Page null");
167: SanityManager.ASSERT(undoPage instanceof AllocPage,
168: "undo Page is not an allocPage");
169: }
170:
171: ((AllocPage) undoPage).undoCompressSpace(CLRInstant,
172: newHighestPage, num_pages_truncated);
173: }
174:
175: /*
176: * method to support BeforeImageLogging
177: */
178: public void restoreMe(Transaction xact, BasePage undoPage,
179: LogInstant CLRinstant, LimitObjectInput in) {
180: // nobody should be calling this since there is no corresponding
181: // BI operation.
182: if (SanityManager.DEBUG)
183: SanityManager
184: .THROWASSERT("cannot call restoreMe on CompressSpaceOperation.");
185: }
186:
187: /** debug */
188: public String toString() {
189: if (SanityManager.DEBUG) {
190: String str = super .toString();
191: str += " CompressSpaceOperation: " + "newHighestPage = "
192: + newHighestPage + ";num_pages_truncated = "
193: + num_pages_truncated + " to " + getPageId();
194:
195: return str;
196: } else
197: return null;
198: }
199: }
|