001: /*
002:
003: Derby - Class org.apache.derby.impl.store.raw.xact.BeginXact
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.util.ByteArray;
036:
037: import java.io.OutputStream;
038: import java.io.InputStream;
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: /**
045: This operation indicates the beginning of a transaction.
046: @see Loggable
047: */
048:
049: public class BeginXact implements Loggable {
050:
051: protected int transactionStatus;
052: protected GlobalTransactionId xactId;
053:
054: public BeginXact(GlobalTransactionId xid, int s) {
055: xactId = xid;
056: transactionStatus = s;
057: }
058:
059: /*
060: * Formatable methods
061: */
062: public BeginXact() {
063: super ();
064: }
065:
066: public void writeExternal(ObjectOutput out) throws IOException {
067: out.writeInt(transactionStatus);
068: out.writeObject(xactId);
069: }
070:
071: public void readExternal(ObjectInput in) throws IOException,
072: ClassNotFoundException {
073: transactionStatus = in.readInt();
074: xactId = (GlobalTransactionId) in.readObject();
075: }
076:
077: /**
078: Return my format identifier.
079: */
080: public int getTypeFormatId() {
081: return StoredFormatIds.LOGOP_BEGIN_XACT;
082: }
083:
084: /**
085: Loggable methods
086: @see Loggable
087: */
088:
089: /**
090: Apply the change indicated by this operation and optional data.
091:
092: @param xact the Transaction
093: @param instant the log instant of this operation
094: @param in optional data
095:
096: */
097: public void doMe(Transaction xact, LogInstant instant,
098: LimitObjectInput in) {
099: RawTransaction rt = (RawTransaction) xact;
100:
101: // If we are not doing fake logging for in memory database
102: if (instant != null) {
103: rt.setFirstLogInstant(instant);
104:
105: // need to do this here rather than in the transaction object for
106: // recovery.
107: rt.addUpdateTransaction(transactionStatus);
108: }
109: }
110:
111: /**
112: the default for prepared log is always null for all the operations
113: that don't have optionalData. If an operation has optional data,
114: the operation need to prepare the optional data for this method.
115:
116: BeginXact has no optional data to write out
117:
118: @see ObjectOutput
119: */
120: public ByteArray getPreparedLog() {
121: return (ByteArray) null;
122: }
123:
124: /**
125: Always redo a BeginXact.
126:
127: @param xact The transaction trying to redo this operation
128: @return true if operation needs redoing, false if not.
129: */
130: public boolean needsRedo(Transaction xact) {
131: return true; // always redo this
132: }
133:
134: /**
135: BeginXact has no resource to release
136: */
137: public void releaseResource(Transaction xact) {
138: }
139:
140: /**
141: BeginXact is both a FIRST and a RAWSTORE log record
142: */
143: public int group() {
144: int group = Loggable.FIRST | Loggable.RAWSTORE;
145: return group;
146: }
147:
148: /**
149: DEBUG: Print self.
150: */
151: public String toString() {
152: if (SanityManager.DEBUG)
153: return "BeginXact " + xactId + " transactionStatus "
154: + Integer.toHexString(transactionStatus);
155: else
156: return null;
157:
158: }
159:
160: /**
161: BeginXact method
162: */
163: public GlobalTransactionId getGlobalId() {
164: return xactId;
165: }
166:
167: }
|