001: /*
002:
003: Derby - Class org.apache.derby.impl.store.raw.xact.EndXact
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.xact;
023:
024: import org.apache.derby.iapi.services.io.FormatIdUtil;
025: import org.apache.derby.iapi.services.io.StoredFormatIds;
026: import org.apache.derby.iapi.services.sanity.SanityManager;
027:
028: import org.apache.derby.iapi.store.raw.Transaction;
029: import org.apache.derby.iapi.store.raw.Loggable;
030: import org.apache.derby.iapi.store.raw.GlobalTransactionId;
031:
032: import org.apache.derby.iapi.store.raw.log.LogInstant;
033: import org.apache.derby.iapi.store.raw.xact.RawTransaction;
034:
035: import org.apache.derby.iapi.services.io.CompressedNumber;
036: import org.apache.derby.iapi.util.ByteArray;
037:
038: import java.io.OutputStream;
039: import java.io.InputStream;
040: import java.io.ObjectOutput;
041: import java.io.ObjectInput;
042: import java.io.IOException;
043: import org.apache.derby.iapi.services.io.LimitObjectInput;
044:
045: /**
046: This operation indicates the End of a transaction.
047: @see Loggable
048: */
049:
050: public class EndXact implements Loggable {
051:
052: private int transactionStatus;
053: private GlobalTransactionId xactId;
054:
055: public EndXact(GlobalTransactionId xid, int s) {
056: super ();
057:
058: xactId = xid;
059: transactionStatus = s;
060: }
061:
062: /*
063: * Formatable methods
064: */
065:
066: // no-arg constructor, required by Formatable
067: public EndXact() {
068: super ();
069: }
070:
071: public void writeExternal(ObjectOutput out) throws IOException {
072: out.writeObject(xactId);
073: CompressedNumber.writeInt(out, transactionStatus);
074: }
075:
076: public void readExternal(ObjectInput in) throws IOException,
077: ClassNotFoundException {
078: xactId = (GlobalTransactionId) in.readObject();
079: transactionStatus = CompressedNumber.readInt(in);
080: }
081:
082: /**
083: Return my format identifier.
084: */
085: public int getTypeFormatId() {
086: return StoredFormatIds.LOGOP_END_XACT;
087: }
088:
089: /**
090: Loggable methods
091: @see Loggable
092: */
093:
094: /**
095: Apply the change indicated by this operation and optional data.
096:
097: @param xact the Transaction
098: @param instant the log instant of this operation
099: @param in optional data
100:
101: */
102: public void doMe(Transaction xact, LogInstant instant,
103: LimitObjectInput in) {
104:
105: if ((transactionStatus & Xact.END_PREPARED) == 0) {
106: ((RawTransaction) xact).removeUpdateTransaction();
107: } else {
108: ((RawTransaction) xact).prepareTransaction();
109: }
110: }
111:
112: /**
113: the default for prepared log is always null for all the operations
114: that don't have optionalData. If an operation has optional data,
115: the operation need to prepare the optional data for this method.
116:
117: EndXact has no optional data to write out
118:
119: @see ObjectOutput
120: */
121: public ByteArray getPreparedLog() {
122: return (ByteArray) null;
123: }
124:
125: /**
126: Always redo an EndXact.
127:
128: @param xact The transaction trying to redo this operation
129: @return true if operation needs redoing, false if not.
130: */
131: public boolean needsRedo(Transaction xact) {
132: return true; // always redo this
133: }
134:
135: /**
136: EndXact has no resource to release
137: */
138: public void releaseResource(Transaction xact) {
139: }
140:
141: /**
142: EndXact is a RAWSTORE log record.
143: */
144: public int group() {
145: int group = Loggable.RAWSTORE;
146:
147: if ((transactionStatus & Xact.END_COMMITTED) != 0)
148: group |= (Loggable.COMMIT | Loggable.LAST);
149: else if ((transactionStatus & Xact.END_ABORTED) != 0)
150: group |= (Loggable.ABORT | Loggable.LAST);
151: else if ((transactionStatus & Xact.END_PREPARED) != 0)
152: group |= Loggable.PREPARE;
153:
154: return group;
155: }
156:
157: /**
158: DEBUG: Print self.
159: */
160: public String toString() {
161: if (SanityManager.DEBUG) {
162: String endStatus;
163: switch (transactionStatus
164: & (Xact.END_ABORTED | Xact.END_PREPARED | Xact.END_COMMITTED)) {
165: case Xact.END_ABORTED:
166: endStatus = " Aborted";
167: break;
168: case Xact.END_PREPARED:
169: endStatus = " Prepared";
170: break;
171: case Xact.END_COMMITTED:
172: endStatus = " Committed";
173: break;
174: default:
175: endStatus = "Unknown";
176: }
177:
178: return ("EndXact " + xactId + endStatus
179: + " : transactionStatus = " + endStatus);
180: } else {
181: return null;
182: }
183: }
184: }
|