00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 package org.objectweb.cjdbc.controller.recoverylog;
00026
00027 import java.sql.PreparedStatement;
00028 import java.sql.SQLException;
00029 import java.util.ArrayList;
00030
00031 import org.objectweb.cjdbc.common.i18n.Translate;
00032 import org.objectweb.cjdbc.common.log.Trace;
00033
00034
00035
00036
00037
00038
00039
00040 public class JDBCLoggerThread extends Thread
00041 {
00042 private boolean killed = false;
00043 private ArrayList logQueue;
00044 private PreparedStatement pstmt;
00045 private Trace logger;
00046
00047 private class LogObject
00048 {
00049 private long tid;
00050 private String query;
00051 private String login;
00052 private long id;
00053 private boolean escapeProcessing;
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 public LogObject(long id, String login, String query, long tid,
00065 boolean escapeProcessing)
00066 {
00067 this.id = id;
00068 this.login = login;
00069 this.query = query;
00070 this.tid = tid;
00071 this.escapeProcessing = escapeProcessing;
00072 }
00073
00074
00075
00076
00077 public long getId()
00078 {
00079 return id;
00080 }
00081
00082
00083
00084
00085 public String getLogin()
00086 {
00087 return login;
00088 }
00089
00090
00091
00092
00093 public String getQuery()
00094 {
00095 return query;
00096 }
00097
00098
00099
00100
00101 public long getTid()
00102 {
00103 return tid;
00104 }
00105
00106
00107
00108
00109 public boolean getEscapeProcessing()
00110 {
00111 return escapeProcessing;
00112 }
00113 }
00114
00115
00116
00117
00118
00119
00120
00121 public JDBCLoggerThread(PreparedStatement pstmt, Trace logger)
00122 {
00123 super("JDBCLoggerThread");
00124 this.pstmt = pstmt;
00125 this.logger = logger;
00126 logQueue = new ArrayList();
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 public synchronized void log(long id, String login, String query, long tid,
00139 boolean escapeProcessing)
00140 {
00141 logQueue.add(new LogObject(id, login, query, tid, escapeProcessing));
00142 notify();
00143 }
00144
00145
00146
00147
00148 public synchronized void rollbackTransactions()
00149 {
00150 if (logQueue.isEmpty())
00151 {
00152 if (logger.isDebugEnabled())
00153 logger
00154 .debug(Translate.get("recovery.jdbc.loggerthread.no.transaction"));
00155 return;
00156 }
00157
00158 LogObject log;
00159 for (int i = 0; i < logQueue.size(); i++)
00160 {
00161 log = (LogObject) logQueue.get(i);
00162 if (log.getQuery().equalsIgnoreCase("begin"))
00163 {
00164
00165 removeQueriesOfTransactionFromQueue(log.getTid());
00166 }
00167 }
00168 }
00169
00170
00171
00172
00173
00174
00175
00176 public synchronized void removeQueriesOfTransactionFromQueue(long tid)
00177 {
00178 if (logger.isDebugEnabled())
00179 logger.debug(Translate.get("recovery.jdbc.loggerthread.removing", tid));
00180 LogObject logEntry;
00181 for (int i = 0; i < logQueue.size(); i++)
00182 {
00183 logEntry = (LogObject) logQueue.get(i);
00184 if (logEntry.getTid() == tid)
00185 logQueue.remove(i);
00186 }
00187 }
00188
00189
00190
00191
00192
00193
00194 public synchronized boolean getLogQueueIsEmpty()
00195 {
00196 if (logQueue.isEmpty())
00197 {
00198
00199 notify();
00200 return true;
00201 }
00202 else
00203 {
00204 return false;
00205 }
00206 }
00207
00208
00209
00210
00211
00212 public void run()
00213 {
00214 LogObject params;
00215
00216 while (!killed)
00217 {
00218 synchronized (this)
00219 {
00220 while (getLogQueueIsEmpty())
00221 {
00222 try
00223 {
00224 wait();
00225 }
00226 catch (InterruptedException e)
00227 {
00228 logger.warn(Translate.get("recovery.jdbc.loggerthread.awaken"), e);
00229 }
00230 }
00231
00232 params = (LogObject) logQueue.remove(0);
00233 try
00234 {
00235 pstmt.setLong(1, params.getId());
00236 pstmt.setString(2, params.getLogin());
00237 pstmt.setString(3, params.getQuery());
00238 pstmt.setLong(4, params.getTid());
00239 try
00240 {
00241 pstmt.setEscapeProcessing(params.getEscapeProcessing());
00242 }
00243 catch (Exception ignore)
00244 {
00245 }
00246 pstmt.executeUpdate();
00247 if (logger.isDebugEnabled())
00248 logger.debug(Translate.get("recovery.jdbc.loggerthread.log.debug",
00249 new String[]{String.valueOf(params.getId()), params.getLogin(),
00250 params.getQuery(), String.valueOf(params.getTid()),
00251 String.valueOf(params.getEscapeProcessing())}));
00252 else if (logger.isInfoEnabled())
00253 logger.info(Translate.get("recovery.jdbc.loggerthread.log.info",
00254 params.getId()));
00255 }
00256 catch (SQLException e)
00257 {
00258 logger.error(
00259 Translate.get("recovery.jdbc.loggerthread.log.failed",
00260 new String[]{params.getQuery(),
00261 String.valueOf(params.getTid())}), e);
00262
00263 logQueue.add(0, params);
00264 }
00265 }
00266 }
00267 }
00268
00269 }