001: /**
002: * Sequoia: Database clustering technology.
003: * Copyright (C) 2005 Emic Networks.
004: * Contact: sequoia@continuent.org
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * Initial developer(s): Jeff Mesnil.
019: * Contributor(s): ______________________.
020: */package org.continuent.sequoia.controller.recoverylog.events;
021:
022: import java.sql.Connection;
023: import java.sql.PreparedStatement;
024: import java.sql.ResultSet;
025: import java.sql.SQLException;
026:
027: import org.continuent.sequoia.common.i18n.Translate;
028: import org.continuent.sequoia.controller.recoverylog.LoggerThread;
029:
030: /**
031: * This class defines a GetCheckpointLogIdEvent.
032: * <p>
033: * This event is used to retrieve a log ID associated to a checkpoint. <br>
034: * Once this event has been execute, the log ID is available through the
035: * <code>getCheckpointRequestId()</code> method
036: */
037: public class GetCheckpointLogIdEvent implements LogEvent {
038:
039: private Connection connection;
040: private String checkpointTableName;
041: private String checkpointName;
042: private long logId = -1;
043: private SQLException catchedException = null;
044:
045: /**
046: * Creates a new <code>GetCheckpointLogIdEvent</code> object
047: *
048: * @param connection the connection used to access the checkpoint table
049: * @param checkpointTableName the name of the checkpoint table
050: * @param checkpointName the name of the checkpoint
051: */
052: public GetCheckpointLogIdEvent(Connection connection,
053: String checkpointTableName, String checkpointName) {
054: this .connection = connection;
055: this .checkpointTableName = checkpointTableName;
056: this .checkpointName = checkpointName;
057: }
058:
059: /**
060: * @see org.continuent.sequoia.controller.recoverylog.events.LogEvent#belongToTransaction(long)
061: */
062: public boolean belongToTransaction(long tid) {
063: return false;
064: }
065:
066: /**
067: * @see org.continuent.sequoia.controller.recoverylog.events.LogEvent#execute(org.continuent.sequoia.controller.recoverylog.LoggerThread)
068: */
069: public void execute(LoggerThread loggerThread) {
070: PreparedStatement stmt = null;
071: ResultSet rs = null;
072: try {
073: stmt = connection.prepareStatement("SELECT log_id FROM "
074: + checkpointTableName + " WHERE name LIKE ?");
075: stmt.setString(1, checkpointName);
076: rs = stmt.executeQuery();
077:
078: if (rs.next())
079: logId = rs.getLong(1);
080: else {
081: String msg = Translate.get(
082: "recovery.jdbc.checkpoint.not.found",
083: checkpointName);
084: throw new SQLException(msg);
085: }
086: } catch (SQLException e) {
087: catchedException = new SQLException(Translate.get(
088: "recovery.jdbc.checkpoint.not.found.error",
089: new String[] { checkpointName, e.getMessage() }));
090: } finally {
091: try {
092: if (rs != null)
093: rs.close();
094: } catch (Exception ignore) {
095: }
096: try {
097: if (stmt != null)
098: stmt.close();
099: } catch (Exception ignore) {
100: }
101: synchronized (this ) {
102: notify();
103: }
104: }
105: }
106:
107: /**
108: * Returns the catched exception if an error occured during the execution.
109: * Returns null if no error occured or the query did not execute yet.
110: *
111: * @return Returns the catchedException.
112: */
113: public final SQLException getCatchedException() {
114: return catchedException;
115: }
116:
117: /**
118: * Gets the log identifier corresponding to the checkpoint
119: *
120: * @return long the request identifier corresponding to the checkpoint.
121: * @throws SQLException if an error occurs
122: */
123: public long getCheckpointLogId() throws SQLException {
124: if (logId == -1) {
125: throw catchedException;
126: }
127: return logId;
128: }
129:
130: /**
131: * @see java.lang.Object#toString()
132: */
133: public String toString() {
134: return "GetCheckpointLogIdEvent for checkpoint "
135: + checkpointName;
136: }
137: }
|