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): Emmanuel Cecchet.
019: * Contributor(s): ______________________.
020: */package org.continuent.sequoia.controller.recoverylog.events;
021:
022: import java.sql.PreparedStatement;
023: import java.sql.SQLException;
024:
025: import org.continuent.sequoia.common.i18n.Translate;
026: import org.continuent.sequoia.common.log.Trace;
027: import org.continuent.sequoia.controller.recoverylog.LoggerThread;
028: import org.continuent.sequoia.controller.recoverylog.RecoveryLog;
029:
030: /**
031: * This class defines a LogRequestEvent to log a request log entry.
032: *
033: * @author <a href="mailto:emmanuel.cecchet@emicnetworks.com">Emmanuel Cecchet</a>
034: * @version 1.0
035: */
036: public class LogRequestEvent implements LogEvent {
037: protected LogEntry logEntry;
038:
039: /**
040: * Creates a new <code>LogRequestEvent</code> object
041: *
042: * @param entry the log entry to use (not null)
043: */
044: public LogRequestEvent(LogEntry entry) {
045: if (entry == null)
046: throw new RuntimeException(
047: "Invalid null entry in LogRequestEvent constructor");
048: this .logEntry = entry;
049: }
050:
051: /**
052: * @see org.continuent.sequoia.controller.recoverylog.events.LogEvent#belongToTransaction(long)
053: */
054: public boolean belongToTransaction(long tid) {
055: return logEntry.getTid() == tid;
056: }
057:
058: /**
059: * @see org.continuent.sequoia.controller.recoverylog.events.LogEvent#execute(org.continuent.sequoia.controller.recoverylog.LoggerThread)
060: */
061: public void execute(LoggerThread loggerThread) {
062: Trace logger = loggerThread.getLogger();
063: try {
064: if (logger.isDebugEnabled())
065: logger.debug(Translate.get(
066: "recovery.jdbc.loggerthread.log.info", logEntry
067: .getLogId()));
068:
069: PreparedStatement pstmt = loggerThread
070: .getLogPreparedStatement();
071: pstmt.setLong(RecoveryLog.COLUMN_INDEX_LOG_ID, logEntry
072: .getLogId());
073: pstmt.setString(RecoveryLog.COLUMN_INDEX_VLOGIN, logEntry
074: .getLogin());
075: pstmt.setString(RecoveryLog.COLUMN_INDEX_SQL, logEntry
076: .getQuery());
077: pstmt.setString(RecoveryLog.COLUMN_INDEX_SQL_PARAMS,
078: logEntry.getQueryParams());
079: pstmt.setString(RecoveryLog.COLUMN_INDEX_AUTO_CONN_TRAN,
080: logEntry.getAutoConnTrans());
081: pstmt.setLong(RecoveryLog.COLUMN_INDEX_TRANSACTION_ID,
082: logEntry.getTid());
083: pstmt.setLong(RecoveryLog.COLUMN_INDEX_REQUEST_ID, logEntry
084: .getRequestId());
085: pstmt.setString(RecoveryLog.COLUMN_INDEX_EXEC_STATUS,
086: logEntry.getExecutionStatus());
087: pstmt.setLong(RecoveryLog.COLUMN_INDEX_EXEC_TIME, logEntry
088: .getExecutionTimeInMs());
089: pstmt.setLong(RecoveryLog.COLUMN_INDEX_UPDATE_COUNT,
090: logEntry.getUpdateCountResult());
091:
092: if (logger.isDebugEnabled())
093: logger.debug(pstmt.toString());
094: try {
095: pstmt.setEscapeProcessing(logEntry
096: .getEscapeProcessing());
097: } catch (Exception ignore) {
098: }
099: int updatedRows = pstmt.executeUpdate();
100: if ((updatedRows != 1) && logger.isWarnEnabled())
101: logger
102: .warn("Recovery log did not update a single entry while executing: "
103: + pstmt.toString());
104: } catch (SQLException e) {
105: loggerThread.invalidateLogStatements();
106: if ("T".equals(logEntry.getAutoConnTrans()))
107: logger
108: .error(
109: Translate
110: .get(
111: "recovery.jdbc.loggerthread.log.failed.transaction",
112: new String[] {
113: logEntry
114: .getQuery(),
115: String
116: .valueOf(logEntry
117: .getTid()) }),
118: e);
119: else
120: logger.error(Translate.get(
121: "recovery.jdbc.loggerthread.log.failed",
122: logEntry.getQuery()), e);
123: // Push object back in the queue, it needs to be logged again
124: loggerThread.putBackAtHeadOfQueue(this , e);
125: }
126: }
127:
128: /**
129: * @see java.lang.Object#toString()
130: */
131: public String toString() {
132: return "LogRequestEvent: " + logEntry;
133: }
134:
135: }
|