00001
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
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
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
00077 public long getId()
00078 {
00079
return id;
00080 }
00081
00085 public String
getLogin()
00086 {
00087
return login;
00088 }
00089
00093 public String
getQuery()
00094 {
00095
return query;
00096 }
00097
00101 public long getTid()
00102 {
00103
return tid;
00104 }
00105
00109 public boolean getEscapeProcessing()
00110 {
00111
return escapeProcessing;
00112 }
00113 }
00114
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
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
00148 public synchronized void rollbackTransactions()
00149 {
00150
if (
logQueue.isEmpty())
00151 {
00152
logger.debug(
Translate
00153 .get(
"recovery.jdbc.loggerthread.rollback.no.transaction"));
00154
return;
00155 }
00156
00157
LogObject log;
00158
for (
int i = 0; i <
logQueue.size(); i++)
00159 {
00160 log = (
LogObject)
logQueue.get(i);
00161
if (log.
getQuery().equalsIgnoreCase(
"begin"))
00162 {
00163
00164
rollbackTransaction(log.
getTid());
00165 }
00166 }
00167 }
00168
00175 public synchronized void rollbackTransaction(
long tid)
00176 {
00177
logger.debug(
Translate.get(
"recovery.jdbc.loggerthread.rollback", tid));
00178
LogObject logEntry;
00179
for (
int i = 0; i <
logQueue.size(); i++)
00180 {
00181 logEntry = (
LogObject)
logQueue.get(i);
00182
if (logEntry.
getTid() == tid)
00183
logQueue.remove(i);
00184 }
00185 }
00186
00192 public synchronized boolean getLogQueueIsEmpty()
00193 {
00194
if (
logQueue.isEmpty())
00195 {
00196
00197 notify();
00198
return true;
00199 }
00200
else
00201 {
00202
return false;
00203 }
00204 }
00205
00210 public void run()
00211 {
00212
LogObject params;
00213
00214
while (!
killed)
00215 {
00216
synchronized (
this)
00217 {
00218
while (
getLogQueueIsEmpty())
00219 {
00220
try
00221 {
00222 wait();
00223 }
00224
catch (InterruptedException e)
00225 {
00226
logger.warn(
Translate.get(
"recovery.jdbc.loggerthread.awaken"), e);
00227 }
00228 }
00229 params = (
LogObject)
logQueue.remove(0);
00230
try
00231 {
00232
pstmt.setLong(1, params.
getId());
00233
pstmt.setString(2, params.
getLogin());
00234
pstmt.setString(3, params.
getQuery());
00235
pstmt.setLong(4, params.
getTid());
00236
try
00237 {
00238
pstmt.setEscapeProcessing(params.
getEscapeProcessing());
00239 }
00240
catch (Exception ignore)
00241 {
00242 }
00243
pstmt.executeUpdate();
00244
if (
logger.isDebugEnabled())
00245
logger.debug(
Translate.get(
"recovery.jdbc.loggerthread.log.debug",
00246
new String[]{String.valueOf(params.
getId()), params.
getLogin(),
00247 params.
getQuery(), String.valueOf(params.
getTid()),
00248 String.valueOf(params.
getEscapeProcessing())}));
00249
else if (
logger.isInfoEnabled())
00250
logger.info(
Translate.get(
"recovery.jdbc.loggerthread.log.info",
00251 params.
getId()));
00252 }
00253
catch (SQLException e)
00254 {
00255
logger.error(
00256
Translate.get(
"recovery.jdbc.loggerthread.log.failed",
00257
new String[]{params.
getQuery(),
00258 String.valueOf(params.
getTid())}), e);
00259 }
00260 }
00261 }
00262 }
00263
00264 }