提交 f509ff65 authored 作者: Thomas Mueller's avatar Thomas Mueller

--no commit message

--no commit message
上级 2a22d077
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jdbcx;
import java.sql.SQLException;
import org.h2.jdbc.JdbcConnection;
public interface JdbcConnectionListener {
// TODO pooled connection: make sure fatalErrorOccured is called in the right situations
void fatalErrorOccured(JdbcConnection conn, SQLException e) throws SQLException;
void closed(JdbcConnection conn);
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jdbcx;
import java.io.PrintWriter;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.naming.StringRefAddr;
import javax.sql.ConnectionPoolDataSource;
import javax.sql.DataSource;
import javax.sql.PooledConnection;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
import org.h2.jdbc.JdbcConnection;
import org.h2.message.TraceObject;
/**
* A data source for H2 database connections
*
* @author Tom
*/
public class JdbcDataSource extends TraceObject implements XADataSource, DataSource, ConnectionPoolDataSource, Serializable, Referenceable {
private static final long serialVersionUID = 1288136338451857771L;
private JdbcDataSourceFactory factory;
private int timeout;
private PrintWriter logWriter;
private String user;
private String password;
private String url;
public JdbcDataSource() {
this.factory = new JdbcDataSourceFactory();
int id = getNextId(TraceObject.DATASOURCE);
setTrace(factory.getTrace(), TraceObject.DATASOURCE, id);
}
public int getLoginTimeout() throws SQLException {
debugCodeCall("getLoginTimeout");
return timeout;
}
public void setLoginTimeout(int timeout) throws SQLException {
debugCodeCall("setLoginTimeout", timeout);
this.timeout = timeout;
}
public PrintWriter getLogWriter() throws SQLException {
debugCodeCall("getLogWriter");
return logWriter;
}
public void setLogWriter(PrintWriter out) throws SQLException {
debugCodeCall("setLogWriter(out)");
logWriter = out;
}
public Connection getConnection() throws SQLException {
debugCodeCall("getConnection");
return getJdbcConnection(user, password);
}
public Connection getConnection(String user, String password) throws SQLException {
debugCode("getConnection("+quote(user)+", "+quote(password)+");");
return getJdbcConnection(user, password);
}
public JdbcConnection getJdbcConnection(String user, String password) throws SQLException {
debugCode("getJdbcConnection("+quote(user)+", "+quote(password)+");");
Properties info = new Properties();
info.setProperty("user", user);
info.setProperty("password", password);
return new JdbcConnection(url, info);
}
public String getURL() {
debugCodeCall("getURL");
return url;
}
public void setURL(String url) {
debugCodeCall("setURL", url);
this.url = url;
}
public String getPassword() {
debugCodeCall("getPassword");
return password;
}
public void setPassword(String password) {
debugCodeCall("setPassword", password);
this.password = password;
}
public String getUser() {
debugCodeCall("getUser");
return user;
}
public void setUser(String user) {
debugCodeCall("setUser", user);
this.user = user;
}
public Reference getReference() throws NamingException {
debugCodeCall("getReference");
String factoryClassName = JdbcDataSourceFactory.class.getName();
Reference ref = new Reference(getClass().getName(), factoryClassName, null);
ref.add(new StringRefAddr("url", getURL()));
ref.add(new StringRefAddr("user", getUser()));
ref.add(new StringRefAddr("password", password));
return ref;
}
public XAConnection getXAConnection() throws SQLException {
debugCodeCall("getXAConnection");
int id = getNextId(XA_DATASOURCE);
return new JdbcXAConnection(factory, id, url, user, password);
}
public XAConnection getXAConnection(String user, String password) throws SQLException {
debugCode("getXAConnection("+quote(user)+", "+quote(password)+");");
int id = getNextId(XA_DATASOURCE);
return new JdbcXAConnection(factory, id, url, user, password);
}
public PooledConnection getPooledConnection() throws SQLException {
debugCodeCall("getPooledConnection");
return getXAConnection();
}
public PooledConnection getPooledConnection(String user, String password) throws SQLException {
debugCode("getPooledConnection("+quote(user)+", "+quote(password)+");");
return getXAConnection(user, password);
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jdbcx;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
import org.h2.engine.Constants;
import org.h2.message.Trace;
import org.h2.message.TraceSystem;
public class JdbcDataSourceFactory implements ObjectFactory {
private static TraceSystem traceSystem;
private Trace trace;
static {
traceSystem = new TraceSystem("h2datasource" + Constants.SUFFIX_TRACE_FILE);
traceSystem.setLevelFile(TraceSystem.DEBUG);
}
public JdbcDataSourceFactory() {
trace = traceSystem.getTrace("JDBCX");
}
public synchronized Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
trace.debug("getObjectInstance obj=" + obj + " name=" + name + " nameCtx=" + nameCtx + " environment=" + environment);
Reference ref = (Reference) obj;
if (ref.getClassName().equals(JdbcDataSource.class.getName())) {
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setURL((String) ref.get("url").getContent());
dataSource.setUser((String) ref.get("user").getContent());
dataSource.setPassword((String) ref.get("password").getContent());
return dataSource;
}
return null;
}
TraceSystem getTraceSystem() {
return traceSystem;
}
Trace getTrace() {
return trace;
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jdbcx;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Properties;
import javax.sql.ConnectionEvent;
import javax.sql.ConnectionEventListener;
import javax.sql.XAConnection;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import org.h2.jdbc.JdbcConnection;
import org.h2.message.TraceObject;
import org.h2.util.ByteUtils;
public class JdbcXAConnection extends TraceObject implements XAConnection, JdbcConnectionListener, XAResource {
private JdbcDataSourceFactory factory;
private String url, user, password;
private JdbcConnection conn;
private ArrayList listeners = new ArrayList();
private Xid currentTransaction;
JdbcXAConnection(JdbcDataSourceFactory factory, int id, String url, String user, String password) {
this.factory = factory;
setTrace(factory.getTrace(), TraceObject.XA_DATASOURCE, id);
this.url = url;
this.user = user;
this.password = password;
}
public XAResource getXAResource() throws SQLException {
debugCodeCall("getXAResource");
return this;
}
public void close() throws SQLException {
debugCodeCall("close");
if(conn != null) {
conn.closeConnection();
conn = null;
}
}
public Connection getConnection() throws SQLException {
debugCodeCall("getConnection");
close();
Properties info = new Properties();
info.setProperty("user", user);
info.setProperty("password", password);
conn = new JdbcConnection(url, info);
return conn;
}
public void addConnectionEventListener(ConnectionEventListener listener) {
debugCode("addConnectionEventListener(listener)");
listeners.add(listener);
conn.setJdbcConnectionListener(this);
}
public void removeConnectionEventListener(ConnectionEventListener listener) {
debugCode("removeConnectionEventListener(listener)");
listeners.remove(listener);
}
public void fatalErrorOccured(JdbcConnection conn, SQLException e) throws SQLException {
debugCode("fatalErrorOccured(conn, e)");
for(int i=0; i<listeners.size(); i++) {
ConnectionEventListener listener = (ConnectionEventListener)listeners.get(i);
ConnectionEvent event = new ConnectionEvent(this, e);
listener.connectionErrorOccurred(event);
}
close();
}
public void closed(JdbcConnection conn) {
debugCode("closed(conn)");
for(int i=0; i<listeners.size(); i++) {
ConnectionEventListener listener = (ConnectionEventListener)listeners.get(i);
ConnectionEvent event = new ConnectionEvent(this);
listener.connectionClosed(event);
}
}
public int getTransactionTimeout() throws XAException {
debugCodeCall("getTransactionTimeout");
return 0;
}
public boolean setTransactionTimeout(int seconds) throws XAException {
debugCodeCall("setTransactionTimeout", seconds);
return false;
}
public boolean isSameRM(XAResource xares) throws XAException {
debugCode("isSameRM(xares)");
return xares == this;
}
public Xid[] recover(int flag) throws XAException {
debugCodeCall("recover", quoteFlags(flag));
checkOpen();
try {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("SELECT * FROM INFORMATION_SCHEMA.IN_DOUBT ORDER BY ID");
ArrayList list = new ArrayList();
while(rs.next()) {
String tid = rs.getString("TRANSACTION");
int id = getNextId(XID);
Xid xid = new JdbcXid(factory, id, tid);
list.add(xid);
}
Xid[] result = new Xid[list.size()];
list.toArray(result);
return result;
} catch(SQLException e) {
getTrace().debug("throw XAException.XAER_OUTSIDE", e);
throw new XAException(XAException.XAER_OUTSIDE);
}
}
private void checkOpen() throws XAException {
if(conn == null) {
getTrace().debug("conn==null");
throw new XAException(XAException.XAER_OUTSIDE);
}
}
public int prepare(Xid xid) throws XAException {
debugCode("prepare("+quoteXid(xid)+")");
checkOpen();
if(currentTransaction != xid) {
getTrace().debug("throw XAException.XAER_INVAL");
throw new XAException(XAException.XAER_INVAL);
}
try {
conn.createStatement().execute("PREPARE COMMIT");
} catch(SQLException e) {
throw convertException(e);
}
getTrace().debug("return TMSUCCESS");
return TMSUCCESS;
}
public void forget(Xid xid) throws XAException {
debugCode("forget("+quoteXid(xid)+")");
// TODO
}
public void rollback(Xid xid) throws XAException {
debugCode("rollback("+quoteXid(xid)+")");
try {
conn.rollback();
} catch(SQLException e) {
throw convertException(e);
}
getTrace().debug("rolled back");
}
public void end(Xid xid, int flags) throws XAException {
debugCode("end("+quoteXid(xid)+", "+quoteFlags(flags)+")");
if(flags == TMSUSPEND) {
return;
}
if(currentTransaction != xid) {
getTrace().debug("throw XAException.XAER_OUTSIDE");
throw new XAException(XAException.XAER_OUTSIDE);
}
getTrace().debug("currentTransaction=null");
currentTransaction = null;
}
private String quoteFlags(int flags) {
StringBuffer buff = new StringBuffer();
if((flags & XAResource.TMENDRSCAN) != 0) {
buff.append("|XAResource.TMENDRSCAN");
}
if((flags & XAResource.TMFAIL) != 0) {
buff.append("|XAResource.TMFAIL");
}
if((flags & XAResource.TMJOIN) != 0) {
buff.append("|XAResource.TMJOIN");
}
if((flags & XAResource.TMONEPHASE) != 0) {
buff.append("|XAResource.TMONEPHASE");
}
if((flags & XAResource.TMRESUME) != 0) {
buff.append("|XAResource.TMRESUME");
}
if((flags & XAResource.TMSTARTRSCAN) != 0) {
buff.append("|XAResource.TMSTARTRSCAN");
}
if((flags & XAResource.TMSUCCESS) != 0) {
buff.append("|XAResource.TMSUCCESS");
}
if((flags & XAResource.TMSUSPEND) != 0) {
buff.append("|XAResource.TMSUSPEND");
}
if(buff.length() == 0) {
buff.append("|XAResource.TMNOFLAGS");
}
return buff.toString().substring(1);
}
private String quoteXid(Xid xid) {
StringBuffer buff = new StringBuffer();
buff.append("\"f:");
buff.append(xid.getFormatId());
buff.append(",bq:");
buff.append(ByteUtils.convertBytesToString(xid.getBranchQualifier()));
buff.append(",gxid:");
buff.append(ByteUtils.convertBytesToString(xid.getGlobalTransactionId()));
buff.append(",c:");
buff.append(xid.getClass().getName());
buff.append("\"");
return buff.toString();
}
public void start(Xid xid, int flags) throws XAException {
debugCode("start("+quoteXid(xid)+", "+quoteFlags(flags)+")");
if(flags == TMRESUME) {
return;
}
if(currentTransaction != null) {
getTrace().debug("throw XAException.XAER_NOTA");
throw new XAException(XAException.XAER_NOTA);
}
try {
conn.setAutoCommit(false);
} catch(SQLException e) {
throw convertException(e);
}
getTrace().debug("currentTransaction=xid");
currentTransaction = xid;
}
private XAException convertException(SQLException e) {
getTrace().debug("throw XAException("+e.getMessage()+")");
return new XAException(e.getMessage());
}
public void commit(Xid xid, boolean onePhase) throws XAException {
debugCode("commit("+quoteXid(xid)+", "+onePhase+")");
try {
conn.commit();
} catch(SQLException e) {
throw convertException(e);
}
getTrace().debug("committed");
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jdbcx;
import java.sql.SQLException;
import java.util.StringTokenizer;
import javax.transaction.xa.Xid;
import org.h2.message.Message;
import org.h2.message.TraceObject;
import org.h2.util.ByteUtils;
public class JdbcXid extends TraceObject implements Xid {
private static final String PREFIX = "XID";
private int formatId;
private byte[] branchQualifier;
private byte[] globalTransactionId;
JdbcXid(JdbcDataSourceFactory factory, int id, String tid) throws SQLException {
setTrace(factory.getTrace(), TraceObject.XID, id);
try {
StringTokenizer tokenizer = new StringTokenizer(tid, "_");
String prefix = tokenizer.nextToken();
if(!PREFIX.equals(prefix)) {
throw Message.getSQLException(Message.WRONG_XID_FORMAT_1, tid);
}
formatId = Integer.parseInt(tokenizer.nextToken());
branchQualifier = ByteUtils.convertStringToBytes(tokenizer.nextToken());
globalTransactionId = ByteUtils.convertStringToBytes(tokenizer.nextToken());
} catch(Exception e) {
throw Message.getSQLException(Message.WRONG_XID_FORMAT_1, tid);
}
}
// private JdbcXid(JdbcDataSourceFactory factory, int id, Xid xid) {
// setTrace(factory.getTrace(), TraceObject.XID, id);
// this.formatId = xid.getFormatId();
// this.branchQualifier = clone(xid.getBranchQualifier());
// this.globalTransactionId = clone(xid.getGlobalTransactionId());
// }
public String getAsString() {
StringBuffer buff = new StringBuffer(PREFIX);
buff.append('_');
buff.append(formatId);
buff.append('_');
buff.append(ByteUtils.convertBytesToString(branchQualifier));
buff.append('_');
buff.append(ByteUtils.convertBytesToString(globalTransactionId));
return buff.toString();
}
// private byte[] clone(byte[] data) {
// byte[] d2 = new byte[data.length];
// System.arraycopy(data, 0, d2, 0, data.length);
// return d2;
// }
public int getFormatId() {
debugCodeCall("getFormatId");
return formatId;
}
public byte[] getBranchQualifier() {
debugCodeCall("getBranchQualifier");
return branchQualifier;
}
public byte[] getGlobalTransactionId() {
debugCodeCall("getGlobalTransactionId");
return globalTransactionId;
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.message;
public class InternalException extends RuntimeException {
private static final long serialVersionUID = -5369631382082604330L;
private Exception cause;
public InternalException(Exception e) {
cause = e;
}
public Exception getOriginalCause() {
return cause;
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.message;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.Properties;
import org.h2.jdbc.JdbcSQLException;
import org.h2.util.Resources;
import org.h2.util.StringUtils;
/**
* @author Thomas
*/
public class Message {
private static final Properties MESSAGES = new Properties();
static {
// TODO multilanguage messages
// String language = Locale.getDefault().getLanguage();
try {
byte[] messages = Resources.get("/org/h2/res/messages.properties");
if(messages != null) {
MESSAGES.load(new ByteArrayInputStream(messages));
}
} catch (IOException e) {
TraceSystem.traceThrowable(e);
}
}
/**
* Gets the SQL Exception object for a specific SQLState. Supported
* sqlstates are:
*
* @param sqlstate -
* the SQL State
* @param param -
* the parameter of the message
* @return the SQLException object
*/
public static JdbcSQLException getSQLException(int sqlstate, String p1) {
return getSQLException(sqlstate, new String[] { p1 }, null);
}
public static String translate(String key, String[] param) {
String message = MESSAGES.getProperty(key);
if(message == null) {
message = "(Message " +key+ " not found)";
}
if (param != null) {
Object[] o = param;
message = MessageFormat.format(message, o);
}
return message;
}
public static JdbcSQLException getSQLException(int errorCode, String[] param, Throwable cause) {
String sqlstate = getState(errorCode);
String message = translate(sqlstate, param);
return new JdbcSQLException(message, sqlstate, errorCode, cause);
}
public static SQLException getSyntaxError(String sql, int index) {
sql = StringUtils.addAsterix(sql, index);
return Message.getSQLException(Message.SYNTAX_ERROR_1, sql);
}
public static SQLException getSyntaxError(String sql, int index, String expected) {
sql = StringUtils.addAsterix(sql, index);
return Message.getSQLException(Message.SYNTAX_ERROR_2, new String[]{sql, expected}, null);
}
/**
* Gets the SQL Exception object for a specific SQLState.
*
* @param sqlstate -
* the SQL State
* @return the SQLException object
*/
public static JdbcSQLException getSQLException(int sqlstate) {
return getSQLException(sqlstate, null);
}
public static JdbcSQLException getUnsupportedException() {
return getSQLException(Message.FEATURE_NOT_SUPPORTED);
}
public static JdbcSQLException getInvalidValueException(String value, String param) {
return getSQLException(Message.INVALID_VALUE_2, new String[]{value, param}, null);
}
public static Error getInternalError(String s) {
Error e = new Error(s);
TraceSystem.traceThrowable(e);
return e;
}
public static Error getInternalError(String s, Exception e) {
Error e2 = new Error(s, e);
TraceSystem.traceThrowable(e2);
return e2;
}
private static String getState(int errorCode) {
switch(errorCode) {
// 02: no data
case NO_DATA_AVAILABLE: return "02000";
// 07: dynamic SQL error
case INVALID_PARAMETER_COUNT_1: return "07001";
// 08: connection exception
case ERROR_OPENING_DATABASE: return "08000";
case WRONG_USER_OR_PASSWORD: return "08004";
// 21: cardinality violation
case COLUMN_COUNT_DOES_NOT_MATCH: return "21S02";
// 22: data exception
case NUMERIC_VALUE_OUT_OF_RANGE: return "22003";
case DIVISION_BY_ZERO_1: return "22012";
case LIKE_ESCAPE_ERROR_1: return "22025";
// 23: integrity constraint violation
case CHECK_CONSTRAINT_VIOLATED_1: return "23000";
case DUPLICATE_KEY_1: return "23001"; // integrity constraint violation
// 3B: savepoint exception
// 42: syntax error or access rule violation
case SYNTAX_ERROR_1: return "42000";
case SYNTAX_ERROR_2: return "42001";
case TABLE_OR_VIEW_ALREADY_EXISTS_1: return "42S01";
case TABLE_OR_VIEW_NOT_FOUND_1: return "42S02";
case INDEX_ALREADY_EXISTS_1: return "42S11";
case INDEX_NOT_FOUND_1: return "42S12";
case DUPLICATE_COLUMN_NAME_1: return "42S21";
case COLUMN_NOT_FOUND_1: return "42S22";
case SETTING_NOT_FOUND_1: return "42S32";
// 0A: feature not supported
// HZ: remote database access
//
case GENERAL_ERROR_1: return "HY000";
case UNKNOWN_DATA_TYPE_1: return "HY004";
case FEATURE_NOT_SUPPORTED: return "HYC00";
case LOCK_TIMEOUT_1: return "HYT00";
}
return "" + errorCode;
}
// 02: no data
public static final int NO_DATA_AVAILABLE = 2000;
// 07: dynamic SQL error
public static final int INVALID_PARAMETER_COUNT_1 = 7001;
// 08: connection exception
public static final int ERROR_OPENING_DATABASE = 8000;
public static final int WRONG_USER_OR_PASSWORD = 8004;
// 21: cardinality violation
public static final int COLUMN_COUNT_DOES_NOT_MATCH = 21002;
// 22: data exception
public static final int NUMERIC_VALUE_OUT_OF_RANGE = 22003;
public static final int DIVISION_BY_ZERO_1 = 22012;
public static final int LIKE_ESCAPE_ERROR_1 = 22025;
// 23: integrity constraint violation
public static final int CHECK_CONSTRAINT_VIOLATED_1 = 23000;
public static final int DUPLICATE_KEY_1 = 23001; // integrity constraint violation
// 3B: savepoint exception
// 42: syntax error or access rule violation
public static final int SYNTAX_ERROR_1 = 42000;
public static final int SYNTAX_ERROR_2 = 42001;
public static final int TABLE_OR_VIEW_ALREADY_EXISTS_1 = 42101;
public static final int TABLE_OR_VIEW_NOT_FOUND_1 = 42102;
public static final int INDEX_ALREADY_EXISTS_1 = 42111;
public static final int INDEX_NOT_FOUND_1 = 42112;
public static final int DUPLICATE_COLUMN_NAME_1 = 42121;
public static final int COLUMN_NOT_FOUND_1 = 42122;
public static final int SETTING_NOT_FOUND_1 = 42132;
// 0A: feature not supported
// HZ: remote database access
//
public static final int GENERAL_ERROR_1 = 50000;
public static final int UNKNOWN_DATA_TYPE_1 = 50004;
public static final int FEATURE_NOT_SUPPORTED = 50100;
public static final int LOCK_TIMEOUT_1 = 50200;
public static final int FUNCTION_MUST_RETURN_RESULT_SET_1 = 90000;
public static final int METHOD_NOT_ALLOWED_FOR_QUERY = 90001;
public static final int METHOD_ONLY_ALLOWED_FOR_QUERY = 90002;
public static final int HEX_STRING_ODD_1 = 90003;
public static final int HEX_STRING_WRONG_1 = 90004;
public static final int VALUE_TOO_LONG_1 = 90005;
public static final int NULL_NOT_ALLOWED = 90006;
public static final int OBJECT_CLOSED = 90007;
public static final int INVALID_VALUE_2 = 90008;
public static final int DATE_CONSTANT_1 = 90009;
public static final int TIME_CONSTANT_1 = 90010;
public static final int TIMESTAMP_CONSTANT_1 = 90011;
public static final int PARAMETER_NOT_SET_1 = 90012;
public static final int DATABASE_NOT_FOUND_1 = 90013;
public static final int PARSE_ERROR_1 = 90014;
public static final int SUM_OR_AVG_ON_WRONG_DATATYPE_1 = 90015;
public static final int MUST_GROUP_BY_COLUMN_1 = 90016;
public static final int SECOND_PRIMARY_KEY = 90017;
public static final int TRACE_CONNECTION_NOT_CLOSED = 90018;
public static final int CANT_DROP_CURRENT_USER = 90019;
public static final int DATABASE_ALREADY_OPEN_1 = 90020;
public static final int DATA_CONVERSION_ERROR_1 = 90021;
public static final int FUNCTION_NOT_FOUND_1 = 90022;
public static final int COLUMN_MUST_NOT_BE_NULLABLE_1 = 90023;
public static final int FILE_RENAME_FAILED_2 = 90024;
public static final int FILE_DELETE_FAILED_1 = 90025;
public static final int SERIALIZATION_FAILED = 90026;
public static final int DESERIALIZATION_FAILED = 90027;
public static final int IO_EXCEPTION_1 = 90028;
public static final int NOT_ON_UPDATABLE_ROW = 90029;
public static final int FILE_CORRUPTED_1 = 90030;
public static final int CONNECTION_NOT_CLOSED = 90031;
public static final int USER_NOT_FOUND_1 = 90032;
public static final int USER_ALREADY_EXISTS_1 = 90033;
public static final int LOG_FILE_ERROR_1 = 90034;
public static final int SEQUENCE_ALREADY_EXISTS_1 = 90035;
public static final int SEQUENCE_NOT_FOUND_1 = 90036;
public static final int VIEW_NOT_FOUND_1 = 90037;
public static final int VIEW_ALREADY_EXISTS_1 = 90038;
public static final int VALUE_TOO_LARGE_FOR_PRECISION_1 = 90039;
public static final int ADMIN_RIGHTS_REQUIRED = 90040;
public static final int TRIGGER_ALREADY_EXISTS_1 = 90041;
public static final int TRIGGER_NOT_FOUND_1 = 90042;
public static final int ERROR_CREATING_TRIGGER_OBJECT_2 = 90043;
public static final int ERROR_EXECUTING_TRIGGER_2 = 90044;
public static final int CONSTRAINT_ALREADY_EXISTS_1 = 90045;
public static final int URL_FORMAT_ERROR_2 = 90046;
public static final int DRIVER_VERSION_ERROR_2 = 90047;
public static final int FILE_VERSION_ERROR_1 = 90048;
public static final int FILE_ENCRYPTION_ERROR_1 = 90049;
public static final int WRONG_PASSWORD_FORMAT = 90050;
public static final int STATEMENT_WAS_CANCELLED = 90051;
public static final int SUBQUERY_IS_NOT_SINGLE_COLUMN = 90052;
public static final int SCALAR_SUBQUERY_CONTAINS_MORE_THAN_ONE_ROW = 90053;
public static final int INVALID_USE_OF_AGGREGATE_FUNCTION_1 = 90054;
public static final int UNSUPPORTED_CIPHER = 90055;
public static final int NO_DEFAULT_SET_1 = 90056;
public static final int CONSTRAINT_NOT_FOUND_1 = 90057;
public static final int DUPLICATE_TABLE_ALIAS = 90058;
public static final int AMBIGUOUS_COLUMN_NAME_1 = 90059;
public static final int UNSUPPORTED_LOCK_METHOD_1 = 90060;
public static final int EXCEPTION_OPENING_PORT_1 = 90061;
public static final int FILE_CREATION_FAILED_1 = 90062;
public static final int SAVEPOINT_IS_INVALID_1 = 90063;
public static final int SAVEPOINT_IS_UNNAMED = 90064;
public static final int SAVEPOINT_IS_NAMED = 90065;
public static final int DUPLICATE_PROPERTY_1 = 90066;
public static final int CONNECTION_BROKEN = 90067;
public static final int ORDER_BY_NOT_IN_RESULT = 90068;
public static final int ROLE_ALREADY_EXISTS_1 = 90069;
public static final int ROLE_NOT_FOUND_1 = 90070;
public static final int USER_OR_ROLE_NOT_FOUND_1 = 90071;
public static final int ROLES_AND_RIGHT_CANNOT_BE_MIXED = 90072;
public static final int RIGHT_NOT_FOUND = 90073;
public static final int ROLE_ALREADY_GRANTED_1 = 90074;
public static final int COLUMN_IS_PART_OF_INDEX_1 = 90075;
public static final int FUNCTION_ALIAS_ALREADY_EXISTS_1 = 90076;
public static final int FUNCTION_ALIAS_NOT_FOUND_1 = 90077;
public static final int SCHEMA_ALREADY_EXISTS_1 = 90078;
public static final int SCHEMA_NOT_FOUND_1 = 90079;
public static final int SCHEMA_NAME_MUST_MATCH = 90080;
public static final int COLUMN_CONTAINS_NULL_VALUES_1 = 90081;
public static final int SEQUENCE_BELONGS_TO_A_TABLE_1 = 90082;
public static final int COLUMN_MAY_BE_REFERENCED_1 = 90083;
public static final int CANT_DROP_LAST_COLUMN = 90084;
public static final int INDEX_BELONGS_TO_CONSTRAINT_1 = 90085;
public static final int CLASS_NOT_FOUND_1 = 90086;
public static final int METHOD_NOT_FOUND_1 = 90087;
public static final int UNKNOWN_MODE_1 = 90088;
public static final int COLLATION_CHANGE_WITH_DATA_TABLE_1 = 90089;
public static final int SCHEMA_CAN_NOT_BE_DROPPED_1 = 90090;
public static final int ROLE_CAN_NOT_BE_DROPPED_1 = 90091;
public static final int UNSUPPORTED_JAVA_VERSION = 90092;
public static final int CLUSTER_ERROR_DATABASE_RUNS_ALONE = 90093;
public static final int CLUSTER_ERROR_DATABASE_RUNS_CLUSTERED_1 = 90094;
public static final int STRING_FORMAT_ERROR_1 = 90095;
public static final int NOT_ENOUGH_RIGHTS_FOR_1 = 90096;
public static final int DATABASE_IS_READ_ONLY = 90097;
public static final int SIMULATED_POWER_OFF = 90098;
public static final int ERROR_SETTING_DATABASE_EVENT_LISTENER = 90099;
public static final int NO_DISK_SPACE_AVAILABLE = 90100;
public static final int WRONG_XID_FORMAT_1 = 90101;
public static final int UNSUPPORTED_COMPRESSION_OPTIONS_1 = 90102;
public static final int UNSUPPORTED_COMPRESSION_ALGORITHM_1 = 90103;
public static final int COMPRESSION_ERROR = 90104;
private static final int EXCEPTION_IN_FUNCTION = 90105;
public static final int CANT_TRUNCATE_1 = 90106;
public static final int CANT_DROP_2 = 90107;
public static final int STACK_OVERFLOW = 90108;
public static final int VIEW_IS_INVALID_1 = 90109;
public static final int OVERFLOW_FOR_TYPE_1 = 90110;
public static final int ERROR_ACCESSING_LINKED_TABLE_1 = 90111;
public static final int ROW_NOT_FOUND_WHEN_DELETING_1 = 90112;
public static final int UNSUPPORTED_SETTING_1 = 90113;
public static final int CONSTANT_ALREADY_EXISTS_1 = 90114;
public static final int CONSTANT_NOT_FOUND_1 = 90115;
public static final int LITERALS_ARE_NOT_ALLOWED = 90116;
public static final int REMOTE_CONNECTION_NOT_ALLOWED = 90117;
public static final int CANT_DROP_TABLE_1 = 90118;
public static final int USER_DATA_TYPE_ALREADY_EXISTS_1 = 90119;
public static final int USER_DATA_TYPE_NOT_FOUND_1 = 90120;
public static final int DATABASE_CALLED_AT_SHUTDOWN = 90121;
public static final int OPERATION_NOT_SUPPORTED_WITH_VIEWS_2 = 90122;
public static final int CANT_MIX_INDEXED_AND_UNINDEXED_PARAMS = 90123;
public static final int FILE_NOT_FOUND_1 = 90124;
public static SQLException addSQL(SQLException e, String sql) {
if(e.getMessage().indexOf("SQL")>=0) {
return e;
}
if(e instanceof JdbcSQLException) {
JdbcSQLException j = (JdbcSQLException) e;
return new JdbcSQLException(j.getOriginalMessage()+"; SQL statement: "+sql, j.getSQLState(), j.getErrorCode(), j);
} else {
return new JdbcSQLException(e.getMessage()+"; SQL statement: "+sql, e.getSQLState(), e.getErrorCode(), e);
}
}
public static SQLException convert(Throwable e) {
if(e instanceof InternalException) {
e = ((InternalException)e).getOriginalCause();
}
if(e instanceof SQLException) {
return (SQLException)e;
} else if(e instanceof InvocationTargetException) {
InvocationTargetException ite = (InvocationTargetException)e;
Throwable t = ite.getTargetException();
if(t instanceof SQLException) {
return (SQLException)t;
}
return Message.getSQLException(Message.EXCEPTION_IN_FUNCTION, null, e);
} else if(e instanceof IOException) {
return Message.getSQLException(Message.IO_EXCEPTION_1, new String[]{e.toString()}, e);
}
return Message.getSQLException(Message.GENERAL_ERROR_1, new String[]{e.toString()}, e);
}
public static Error getInternalError() {
return getInternalError("unexpected code path");
}
public static InternalException convertToInternal(Exception e) {
return new InternalException(e);
}
public static IOException convertToIOException(Throwable e) {
if(e instanceof JdbcSQLException) {
JdbcSQLException e2 = (JdbcSQLException)e;
if(e2.getOriginalCause() != null) {
e = e2.getOriginalCause();
}
}
IOException io = new IOException(e.toString());
io.fillInStackTrace();
return io;
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.message;
/**
* @author Thomas
*/
public class Trace {
// currently called trace because log mean something else
// TODO trace: java code generation does not always work
private TraceSystem traceSystem;
private String module;
private String lineSeparator;
public static final String LOCK = "lock";
public static final String SETTING = "setting";
public static final String COMMAND = "command";
public static final String INDEX = "index";
public static final String SEQUENCE = "sequence";
public static final String CONSTRAINT = "constraint";
public static final String USER = "user";
public static final String TRIGGER = "trigger";
public static final String FUNCTION = "function";
public static final String JDBC = "jdbc";
public static final String FILE_LOCK = "fileLock";
public static final String TABLE = "table";
public static final String LOG = "log";
public static final String SCHEMA = "schema";
public static final String DATABASE = "database";
public static final String SESSION = "session";
public Trace(TraceSystem traceSystem, String module) {
this.traceSystem = traceSystem;
this.module = module;
this.lineSeparator = System.getProperty("line.separator");
}
public boolean info() {
return traceSystem.isEnabled(TraceSystem.INFO);
}
public boolean debug() {
return traceSystem.isEnabled(TraceSystem.DEBUG);
}
public void error(String s) {
traceSystem.write(TraceSystem.ERROR, module, s, null);
}
public void error(String s, Throwable t) {
traceSystem.write(TraceSystem.ERROR, module, s, t);
}
public void info(String s) {
traceSystem.write(TraceSystem.INFO, module, s, null);
}
public void debugCode(String java) {
traceSystem.write(TraceSystem.DEBUG, module, lineSeparator + "/**/" + java, null);
}
public void infoCode(String java) {
traceSystem.write(TraceSystem.INFO, module, lineSeparator + "/**/" + java, null);
}
public void infoSQL(String sql) {
sql = replaceNewline(sql);
if(sql.startsWith("/*")) {
sql = sql.substring(sql.indexOf("*/") + 2).trim();
}
traceSystem.write(TraceSystem.INFO, module, lineSeparator + "/*SQL*/" + sql, null);
}
private String replaceNewline(String s) {
if(s.indexOf('\r') < 0 && s.indexOf('\n') < 0) {
return s;
}
StringBuffer buff = new StringBuffer(s.length());
for(int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
if(ch == '\r' || ch == '\n') {
ch = ' ';
}
buff.append(ch);
}
return buff.toString();
}
public void debug(String s) {
traceSystem.write(TraceSystem.DEBUG, module, s, null);
}
public void debug(String s, Throwable t) {
traceSystem.write(TraceSystem.DEBUG, module, s, t);
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.message;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.sql.SQLException;
import org.h2.engine.Constants;
import org.h2.util.StringUtils;
/**
*
* @author tgdmuth6
*
*/
public class TraceObject {
public static final int CALLABLE_STATEMENT = 0, CONNECTION = 1, DATABASE_META_DATA = 2,
PREPARED_STATEMENT = 3, RESULT_SET = 4, RESULT_SET_META_DATA = 5,
SAVEPOINT = 6, SQL_EXCEPTION = 7, STATEMENT = 8, BLOB = 9, CLOB = 10,
PARAMETER_META_DATA = 11;
public static final int DATASOURCE = 12, XA_DATASOURCE = 13, XID = 14;
private static int LAST = XID + 1;
private Trace trace;
private static final int[] ID = new int[LAST];
private static final String[] PREFIX = {
"call", "conn", "dbMeta", "prep", "rs", "rsMeta", "sp", "ex", "stat", "blob", "clob", "pMeta",
"ds", "xads", "xid"
};
private int type, id;
protected void setTrace(Trace trace, int type, int id) {
this.trace = trace;
this.type = type;
this.id = id;
}
protected int getTraceId() {
return id;
}
/**
* INTERNAL
*/
public String toString() {
return PREFIX[type] + id ;
}
protected int getNextId(int type) {
return ID[type]++;
}
protected boolean debug() {
return trace.debug();
}
protected Trace getTrace() {
return trace;
}
protected void debugCodeAssign(String className, int type, int id) {
if(!trace.debug()) {
return;
}
trace.debugCode(className + " " + toString() + " = ");
}
protected void infoCodeAssign(String className, int type, int id) {
if(!trace.info()) {
return;
}
trace.infoCode(className + " " + toString() + " = ");
}
protected void debugCodeCall(String text) {
if(!trace.debug()) {
return;
}
trace.debugCode(toString() + "." + text + "();");
}
protected void debugCodeCall(String text, long param) {
if(!trace.debug()) {
return;
}
trace.debugCode(toString() + "." + text + "("+param+");");
}
protected void debugCodeCall(String text, String param) {
if(!trace.debug()) {
return;
}
trace.debugCode(toString() + "." + text + "("+quote(param)+");");
}
protected void debugCode(String text) {
if(!trace.debug()) {
return;
}
trace.debugCode(toString() + "." + text);
}
protected String quote(String s) {
return StringUtils.quoteJavaString(s);
}
protected String quoteTime(java.sql.Time x) {
if(x == null) {
return "null";
}
return "Time.valueOf(\"" + x.toString() + "\")";
}
protected String quoteTimestamp(java.sql.Timestamp x) {
if(x == null) {
return "null";
}
return "Timestamp.valueOf(\"" + x.toString() + "\")";
}
protected String quoteDate(java.sql.Date x) {
if(x == null) {
return "null";
}
return "Date.valueOf(\"" + x.toString() + "\")";
}
protected String quoteBigDecimal(BigDecimal x) {
if(x == null) {
return "null";
}
return "new BigDecimal(\"" + x.toString() + "\")";
}
protected String quoteBytes(byte[] x) {
if(x == null) {
return "null";
}
return "new byte[" + x.length + "]";
}
protected String quoteArray(String[] s) {
return StringUtils.quoteJavaStringArray(s);
}
protected String quoteIntArray(int[] s) {
return StringUtils.quoteJavaIntArray(s);
}
protected SQLException logAndConvert(Throwable e) {
if(Constants.LOG_ALL_ERRORS) {
synchronized(this.getClass()) {
// e.printStackTrace();
try {
FileWriter writer = new FileWriter("c:\\temp\\h2error.txt", true);
PrintWriter p = new PrintWriter(writer);
e.printStackTrace(p);
p.close();
writer.close();
} catch(IOException e2) {
e2.printStackTrace();
}
}
}
if(trace == null) {
TraceSystem.traceThrowable(e);
} else {
if(e instanceof SQLException) {
trace.error("SQLException", e);
return (SQLException)e;
} else {
trace.error("Uncaught Exception", e);
}
}
return Message.convert(e);
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.message;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import org.h2.engine.Constants;
import org.h2.util.FileUtils;
/**
* It is possible to write after close was called, but that means for each write the
* log file will be opened and closed again (which is slower).
*
* @author Thomas
*/
public class TraceSystem {
public static final int OFF = 0, ERROR = 1, INFO = 2, DEBUG = 3;
// TODO log total and free memory from time to time
// max file size is currently 64 MB,
// and then there could be a .old file of the same size
private static final int DEFAULT_MAX_FILE_SIZE = 64 * 1024 * 1024;
public static final int DEFAULT_TRACE_LEVEL_SYSTEM_OUT = OFF;
public static final int DEFAULT_TRACE_LEVEL_FILE = ERROR;
private static final int CHECK_FILE_TIME = 4000;
private int levelSystemOut = DEFAULT_TRACE_LEVEL_SYSTEM_OUT;
private int levelFile = DEFAULT_TRACE_LEVEL_FILE;
private int maxFileSize = DEFAULT_MAX_FILE_SIZE;
private String fileName;
private long lastCheck;
private HashMap traces;
private SimpleDateFormat dateFormat;
private FileWriter fileWriter;
private PrintWriter printWriter;
private static final int CHECK_SIZE_EACH_WRITES = 128;
private int checkSize;
private boolean closed;
public static void traceThrowable(Throwable e) {
PrintWriter writer = DriverManager.getLogWriter();
if(writer != null) {
e.printStackTrace(writer);
}
}
public TraceSystem(String fileName) {
this.fileName = fileName;
traces = new HashMap();
dateFormat = new SimpleDateFormat("MM-dd HH:mm:ss ");
if(fileName != null) {
try {
openWriter();
} catch(Exception e) {
logWritingError(e);
}
}
}
public Trace getTrace(String module) {
Trace t = (Trace) traces.get(module);
if (t == null) {
t = new Trace(this, module);
traces.put(module, t);
}
return t;
}
public boolean isEnabled(int level) {
int max = Math.max(levelSystemOut, levelFile);
return level <= max;
}
public void setFileName(String name) {
this.fileName = name;
}
public void setMaxFileSize(int max) {
this.maxFileSize = max;
}
public int getMaxFileSize() {
return maxFileSize;
}
public void setLevelSystemOut(int l) {
levelSystemOut = l;
}
public int getLevelFile() {
return levelFile;
}
public int getLevelSystemOut() {
return levelSystemOut;
}
public void setLevelFile(int l) {
levelFile = l;
}
private String format(String module, String s) {
return dateFormat.format(new Date()) + module + ": " + s;
}
void write(int l, String module, String s, Throwable t) {
if (l <= levelSystemOut) {
System.out.println(format(module, s));
if (t != null && levelSystemOut == DEBUG) {
t.printStackTrace();
}
}
if (fileName != null) {
if (l > levelFile) {
long time = System.currentTimeMillis();
if (time > lastCheck + CHECK_FILE_TIME) {
String checkFile = fileName + Constants.SUFFIX_TRACE_START_FILE;
lastCheck = time;
if (FileUtils.exists(checkFile)) {
levelFile = DEBUG;
try {
FileUtils.delete(checkFile);
} catch (Exception e) {
// the file may be read only
}
}
}
}
if (l <= levelFile) {
writeFile(format(module, s), t);
}
}
}
private synchronized void writeFile(String s, Throwable t) {
try {
if(checkSize++ >= CHECK_SIZE_EACH_WRITES) {
checkSize = 0;
closeWriter();
if (maxFileSize > 0 && FileUtils.length(fileName) > maxFileSize) {
String old = fileName + ".old";
if (FileUtils.exists(old)) {
FileUtils.delete(old);
}
FileUtils.rename(fileName, old);
}
}
if(!openWriter()) {
return;
}
printWriter.println(s);
if (t != null) {
t.printStackTrace(printWriter);
}
printWriter.flush();
if(closed) {
closeWriter();
}
} catch (Exception e) {
logWritingError(e);
}
}
private void logWritingError(Exception e) {
// TODO translate trace messages
SQLException se = Message.getSQLException(Message.LOG_FILE_ERROR_1, new String[] { fileName }, e);
// print this error only once
fileName = null;
System.out.println(se);
se.printStackTrace();
}
private boolean openWriter() throws IOException {
if(printWriter == null) {
try {
FileUtils.createDirs(fileName);
if(FileUtils.exists(fileName) && FileUtils.isReadOnly(fileName)) {
// read only database: don't log error if the trace file can't be opened
return false;
}
fileWriter = FileUtils.openFileWriter(fileName, true);
printWriter = new PrintWriter(fileWriter, true);
} catch(SQLException e) {
return false;
}
}
return true;
}
private synchronized void closeWriter() {
if(printWriter != null) {
printWriter.flush();
printWriter.close();
printWriter = null;
}
if(fileWriter != null) {
try {
fileWriter.close();
} catch(IOException e) {
// ignore exception
}
fileWriter = null;
}
}
public void close() {
closeWriter();
closed = true;
}
public void finalize() {
if(!Constants.RUN_FINALIZERS) {
return;
}
close();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论