blob: 9550301481331b91063242e0b31c22a329bf199e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.components.language.markup.xsp;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.commons.lang.BooleanUtils;
import java.sql.Connection;
import java.util.Properties;
import java.sql.SQLException;
import java.sql.DatabaseMetaData;
/**
* @author <a href="mailto:tcurdt@apache.org">Torsten Curdt</a>
* @version CVS $Id$
*/
public abstract class AbstractEsqlConnection extends AbstractLogEnabled {
private String url = null;
private Properties properties = null;
private boolean multipleResults = false;
protected AbstractEsqlConnection() {
}
protected abstract Connection getConnection() throws SQLException;
/**
* It appears that some commercial DBMSs like Oracle and Informix
* are broken in that they don't follow the JDBC standard and
* calls to getUpdateCount after getMoreResults result either in
* an exception (Informix) or return the same value (i.e. not -1) (Oracle).
* In addition, this feature is only useful with stored procedures.
* Hence we disable it per default.
**/
public void setMultipleResults(String value) {
this.multipleResults = BooleanUtils.toBoolean(value);
}
public boolean getMultipleResults() {
return (this.multipleResults);
}
public Properties getProperties() {
return (properties);
}
public void setProperty(final String name, final Object value) {
if (properties == null) properties = new Properties();
properties.put(name, value);
}
public void setUser(String user) {
setProperty("user", user);
}
public void setPassword(String password) {
setProperty("password", password);
}
public void setAutoCommit(final boolean autocommit) throws SQLException {
getConnection().setAutoCommit(autocommit);
}
public boolean getAutoCommit() throws SQLException {
return (getConnection().getAutoCommit());
}
public String getURL() throws SQLException {
if (this.url == null) {
this.url = getConnection().getMetaData().getURL();
}
return (this.url);
}
public void setURL(final String url) {
this.url = url;
}
public DatabaseMetaData getMetaData() throws SQLException {
return (getConnection().getMetaData());
}
public void commit() throws SQLException {
getConnection().commit();
}
public void rollback() throws SQLException {
getConnection().rollback();
}
public void close() throws SQLException {
getConnection().close();
}
/**
* Factory method for creating an EsqlQuery object. If type is set to
* "" or "auto" it will try to find type from the JDBC connection URL.
* If this does not succeed the generic JDBC type will be assumed.
* (This type does not work for some databases like mssql though)
*
* @param type {sybase|postgresql|mysql|oracle|jdbc}
* @param queryString
* @return implementation of the AbstractEsqlQuery
* @throws SQLException
*/
public AbstractEsqlQuery createQuery(final String type, final String queryString) throws SQLException {
AbstractEsqlQuery query;
Connection connection = getConnection();
if ("".equals(type) || "auto".equalsIgnoreCase(type)) {
String database = connection.getMetaData().getDatabaseProductName().toLowerCase();
if (database.indexOf("postgresql") > -1) {
query = new PostgresEsqlQuery(connection,queryString);
}
else if (database.indexOf("mysql") > -1) {
query = new MysqlEsqlQuery(connection,queryString);
}
else if (database.indexOf("adaptive server anywhere") > -1 ||
database.indexOf("microsoft sql server") > -1) {
query = new SybaseEsqlQuery(connection,queryString);
}
else if (database.indexOf("oracle") > -1) {
query = new OracleEsqlQuery(connection,queryString);
}
else if (database.indexOf("pervasive") > -1) {
query = new PervasiveEsqlQuery(connection,queryString);
}
else if (database.indexOf("hsql") > -1 ||
database.indexOf("interbase") > -1 ||
database.indexOf("access") > -1 ||
database.indexOf("ingres") > -1 ||
database.indexOf("sap db") > -1 ||
database.indexOf("firebird") > -1 ||
database.indexOf("informix-online") > -1 ||
database.indexOf("sybase sql server") > -1) {
query = new JdbcEsqlQuery(getConnection(),queryString);
}
else {
getLogger().warn("Your database [" + String.valueOf(database) + "] is not being recognized yet." +
" Using the generic [jdbc] query as default. " +
" Please report this to dev@cocoon.apache.org");
query = new JdbcEsqlQuery(getConnection(),queryString);
}
}
else if ("sybase".equalsIgnoreCase(type)) {
query = new SybaseEsqlQuery(connection,queryString);
}
else if ("postgresql".equalsIgnoreCase(type)) {
query = new PostgresEsqlQuery(connection,queryString);
}
else if ("postgresql-old".equalsIgnoreCase(type)) {
query = new PostgresOldEsqlQuery(connection,queryString);
}
else if ("mysql".equalsIgnoreCase(type)) {
query = new MysqlEsqlQuery(connection,queryString);
}
else if ("oracle".equalsIgnoreCase(type)) {
query = new OracleEsqlQuery(connection,queryString);
}
else if ("pervasive".equalsIgnoreCase(type)) {
query = new PervasiveEsqlQuery(connection,queryString);
}
else if ("jdbc".equalsIgnoreCase(type)) {
query = new JdbcEsqlQuery(connection,queryString);
}
else {
getLogger().error("Unknown database type: " + String.valueOf(type));
throw new SQLException("Unknown database type: " + String.valueOf(type));
}
setupLogger(query);
return(query);
}
}