blob: 11272938d44f8ead2564a919ed7439c14fbc2645 [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.oodt.commons.database;
//JDK imports
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.sql.DataSource;
/**
*
* @author mattmann
* @version $Revision$
*
* <p>
* Abstract layer around a SQL script
* </p>.
*/
public class SqlScript {
public final static char QUERY_ENDS = ';';
private File script;
private DataSource ds;
private boolean useBatch = true;
private List statementList = null;
/**
* @param args
* @throws SQLException
*/
public SqlScript(String scriptFileName, DataSource ds) throws SQLException {
script = new File(scriptFileName);
statementList = new Vector();
this.ds = ds;
}
public static void main(String[] args) {
String usage = "SqlScript [options] </path/to/sql/file>\n"
+ "--user <user>\n" + "--pass <pass>\n" + "--url <jdbc url>\n"
+ "--driver <java class spec>\n";
String user = null, pass = null, url = null, driver = null;
String sqlScriptFilePath = null;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("--user")) {
user = args[++i];
} else if (args[i].equals("--pass")) {
pass = args[++i];
} else if (args[i].equals("--driver")) {
driver = args[++i];
} else if (args[i].equals("--url")) {
url = args[++i];
} else if (!args[i].startsWith("--")) {
sqlScriptFilePath = args[i];
}
}
if (user == null || pass == null || url == null || driver == null
|| sqlScriptFilePath == null) {
System.err.println(usage);
System.exit(1);
}
DataSource ds = DatabaseConnectionBuilder.buildDataSource(user, pass,
driver, url);
try {
SqlScript sqlScript = new SqlScript(sqlScriptFilePath, ds);
sqlScript.loadScript();
sqlScript.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void loadScript() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(script));
try {
String line = null;
StringBuffer query = new StringBuffer();
boolean queryEnds = false;
while ((line = reader.readLine()) != null) {
if (isComment(line))
continue;
queryEnds = checkStatementEnds(line);
query.append(line);
if (queryEnds) {
statementList.add(query.toString());
query.setLength(0);
}
}
}
finally {
reader.close();
}
}
public void execute() throws SQLException {
if (useBatch) {
doExecuteBatch();
} else {
if (statementList != null && statementList.size() > 0) {
for (Iterator i = statementList.iterator(); i.hasNext();) {
String sqlStatement = (String) i.next();
doExecuteIndividual(sqlStatement);
}
}
}
}
/**
* @return the useBatch
*/
public boolean isUseBatch() {
return useBatch;
}
/**
* @param useBatch
* the useBatch to set
*/
public void setUseBatch(boolean useBatch) {
this.useBatch = useBatch;
}
private boolean isComment(String line) {
if ((line != null) && (line.length() > 0))
return (line.charAt(0) == '#');
return false;
}
private boolean checkStatementEnds(String s) {
return (s.indexOf(QUERY_ENDS) != -1);
}
private void doExecuteIndividual(String sql) {
Connection conn = null;
Statement statement = null;
try {
conn = ds.getConnection();
statement = conn.createStatement();
statement.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Exception executing SQL: [" + sql
+ "]: message: " + e.getMessage());
} finally {
if (statement != null) {
try {
statement.close();
} catch (Exception ignore) {
}
statement = null;
}
if (conn != null) {
try {
conn.close();
} catch (Exception ignore) {
}
conn = null;
}
}
}
private void doExecuteBatch() {
Connection conn = null;
Statement statement = null;
try {
if (statementList != null && statementList.size() > 0) {
conn = ds.getConnection();
statement = conn.createStatement();
for (Iterator i = statementList.iterator(); i.hasNext();) {
String sqlStatement = (String) i.next();
statement.addBatch(sqlStatement);
}
statement.executeBatch();
}
} catch (SQLException e) {
e.printStackTrace();
System.out
.println("Exception executing SQL batch statement: message: "
+ e.getMessage());
} finally {
if (statement != null) {
try {
statement.close();
} catch (Exception ignore) {
}
statement = null;
}
if (conn != null) {
try {
conn.close();
} catch (Exception ignore) {
}
conn = null;
}
}
}
}