org.apache.torque.task.TorqueSQLExec Maven / Gradle / Ivy
package org.apache.torque.task;
/*
* 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.
*/
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.PropertyHelper;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
/**
* This task uses an SQL -> Database map in the form of a properties file to insert each SQL file listed into its
* designated database.
*
* @author Jeff Martin
* @author Michael McCallum
* @author Tim Stephenson
* @author Jason van Zyl
* @author Martin Poeschl
* @version $Id: TorqueSQLExec.java,v 1.1 2007-10-21 07:57:26 abyrne Exp $
*/
public class TorqueSQLExec extends Task {
private int goodSql = 0;
private int totalSql = 0;
private Path classpath;
private AntClassLoader loader;
/**
*
*/
public static class DelimiterType extends EnumeratedAttribute {
public static final String NORMAL = "normal";
public static final String ROW = "row";
public String[] getValues() {
return new String[] { NORMAL, ROW };
}
}
/** Database connection */
private Connection conn = null;
/** Autocommit flag. Default value is false */
private boolean autocommit = false;
/** SQL statement */
private Statement statement = null;
/** DB driver. */
private String driver = null;
/** DB url. */
private String url = null;
/** User name. */
private String userId = null;
/** Password */
private String password = null;
/** SQL Statement delimiter */
private String delimiter = ";";
/**
* The delimiter type indicating whether the delimiter will only be recognized on a line by itself
*/
private String delimiterType = DelimiterType.NORMAL;
/** Print SQL results. */
private boolean print = false;
/** Print header columns. */
private boolean showheaders = true;
/** Results Output file. */
private File output = null;
/** RDBMS Product needed for this SQL. */
private String rdbms = null;
/** RDBMS Version needed for this SQL. */
private String version = null;
/** Action to perform if an error is found */
private String onError = "abort";
/** Encoding to use when reading SQL statements from a file */
private String encoding = null;
/** Src directory for the files listed in the sqldbmap. */
private String srcDir;
/** Properties file that maps an individual SQL file to a database. */
private File sqldbmap;
/**
* Set the sqldbmap properties file.
*
* @param sqldbmap
* filename for the sqldbmap
*/
public void setSqlDbMap(String sqldbmap) {
this.sqldbmap = getProject().resolveFile(sqldbmap);
}
/**
* Get the sqldbmap properties file.
*
* @return filename for the sqldbmap
*/
public File getSqlDbMap() {
return sqldbmap;
}
/**
* Set the src directory for the sql files listed in the sqldbmap file.
*
* @param srcDir
* sql source directory
*/
public void setSrcDir(String srcDir) {
this.srcDir = getProject().resolveFile(srcDir).toString();
}
/**
* Get the src directory for the sql files listed in the sqldbmap file.
*
* @return sql source directory
*/
public String getSrcDir() {
return srcDir;
}
/**
* Set the classpath for loading the driver.
*
* @param classpath
* the classpath
*/
public void setClasspath(Path classpath) {
if (this.classpath == null) {
this.classpath = classpath;
} else {
this.classpath.append(classpath);
}
}
/**
* Create the classpath for loading the driver.
*
* @return the classpath
*/
public Path createClasspath() {
if (this.classpath == null) {
this.classpath = new Path(getProject());
}
return this.classpath.createPath();
}
/**
* Set the classpath for loading the driver using the classpath reference.
*
* @param r
* reference to the classpath
*/
public void setClasspathRef(Reference r) {
createClasspath().setRefid(r);
}
/**
* Set the sql command to execute
*
* @param sql
* sql command to execute
* @deprecated This method has no effect and will be removed in a future version.
*/
public void addText(String sql) {
}
/**
* Set the JDBC driver to be used.
*
* @param driver
* driver class name
*/
public void setDriver(String driver) {
this.driver = driver;
}
/**
* Set the DB connection url.
*
* @param url
* connection url
*/
public void setUrl(String url) {
this.url = url;
}
/**
* Set the user name for the DB connection.
*
* @param userId
* database user
*/
public void setUserid(String userId) {
this.userId = userId;
}
/**
* Set the file encoding to use on the sql files read in
*
* @param encoding
* the encoding to use on the files
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* Set the password for the DB connection.
*
* @param password
* database password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Set the autocommit flag for the DB connection.
*
* @param autocommit
* the autocommit flag
*/
public void setAutocommit(boolean autocommit) {
this.autocommit = autocommit;
}
/**
* Set the statement delimiter.
*
*
* For example, set this to "go" and delimitertype to "ROW" for Sybase ASE or MS SQL Server.
*
*
* @param delimiter
*/
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
/**
* Set the Delimiter type for this sql task. The delimiter type takes two values - normal and row. Normal means that
* any occurence of the delimiter terminate the SQL command whereas with row, only a line containing just the
* delimiter is recognized as the end of the command.
*
* @param delimiterType
*/
public void setDelimiterType(DelimiterType delimiterType) {
this.delimiterType = delimiterType.getValue();
}
/**
* Set the print flag.
*
* @param print
*/
public void setPrint(boolean print) {
this.print = print;
}
/**
* Set the showheaders flag.
*
* @param showheaders
*/
public void setShowheaders(boolean showheaders) {
this.showheaders = showheaders;
}
/**
* Set the output file.
*
* @param output
*/
public void setOutput(File output) {
this.output = output;
}
/**
* Set the rdbms required
*
* @param vendor
*/
public void setRdbms(String vendor) {
this.rdbms = vendor.toLowerCase();
}
/**
* Set the version required
*
* @param version
*/
public void setVersion(String version) {
this.version = version.toLowerCase();
}
/**
* Set the action to perform onerror
*
* @param action
*/
public void setOnerror(OnError action) {
this.onError = action.getValue();
}
/**
* Load the sql file and then execute it
*
* @throws BuildException
*/
@SuppressWarnings("unchecked")
public void execute() throws BuildException {
if (sqldbmap == null || getSqlDbMap().exists() == false) {
throw new BuildException("You haven't provided an sqldbmap, or " + "the one you specified doesn't exist: " + sqldbmap);
}
if (driver == null) {
throw new BuildException("Driver attribute must be set!", getLocation());
}
if (userId == null) {
throw new BuildException("User Id attribute must be set!", getLocation());
}
if (password == null) {
throw new BuildException("Password attribute must be set!", getLocation());
}
if (url == null) {
throw new BuildException("Url attribute must be set!", getLocation());
}
Properties map = new Properties();
try {
FileInputStream fis = new FileInputStream(getSqlDbMap());
map.load(fis);
fis.close();
} catch (IOException ioe) {
throw new BuildException("Cannot open and process the sqldbmap!");
}
Map