blob: add7f6bb3612b1b6fc740066634d14166ed474c5 [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 macromedia.qa.metrics;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import java.util.Calendar;
public abstract class AbstractDatabase {
protected AbstractDatabase() {
}
protected Connection connection;
public PreparedStatement select(String[] columns, String[] tables, Map clauses, String other) throws SQLException {
StringBuffer sb = new StringBuffer(256);
sb.append("SELECT ");
if (columns != null && columns.length > 0) {
for (int i = 0; i < columns.length; i++) {
sb.append(" ").append(columns[i]);
if (i < columns.length - 1)
sb.append(", ");
}
sb.append("\r\n");
} else {
sb.append(" * \r\n");
}
if (tables != null && tables.length > 0) {
sb.append("\tFROM ");
for (int i = 0; i < tables.length; i++) {
sb.append(" \"").append(tables[i]).append("\"");
if (i < tables.length - 1)
sb.append(", ");
}
sb.append("\r\n");
}
if (clauses != null && clauses.size() > 0) {
sb.append("\tWHERE \r\n");
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
String key = (String) kit.next();
if (i > 0)
sb.append("\t\tAND ");
else
sb.append("\t\t");
sb.append(" ").append(key).append(" = ? \r\n");
i++;
}
}
if (other != null)
sb.append(other);
PreparedStatement statement = connection.prepareStatement(sb.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//WHERE (VALUES)
if (clauses != null && clauses.size() > 0) {
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 1;
while (kit.hasNext()) {
String key = (String) kit.next();
Object value = clauses.get(key);
addParameter(statement, i, value);
i++;
}
}
return statement;
}
/**
* Creates a <code>PreparedStatement</code> for a SQL INSERT.
* <p>
* e.g.
* <pre>
* INSERT INTO myTable ( field1, field2 )
* VALUES ( 'string1', 'string2' )
* WHERE field3 = 'string3'
* AND field4 = 'string4'
* </pre>
*
* @param table The table name to insert
* @param values A collection of key-value pairs to insert, with column aliases appropriately formatted
* @param clauses A collection of key-value pairs for the WHERE clause; the key must be a string and the value can be any valid ODBC object
* @return A PreparedStatement that can be subsequently executed.
* @throws SQLException
*/
public PreparedStatement insert(String table, Map values, Map clauses, String other) throws SQLException {
StringBuffer sb = new StringBuffer(256);
sb.append("INSERT INTO ");
//TABLE
sb.append(table).append(" ( ");
//COLUMNS (can include aliases if correctly formatted)
if (values != null && values.size() > 0) {
Set keys = values.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
sb.append(" ").append(kit.next());
if (i < values.size() - 1)
sb.append(", ");
i++;
}
sb.append("\r\n");
}
sb.append(" ) \r\n");
//VALUES
if (values != null && values.size() > 0) {
sb.append("\tVALUES ( ");
Set keys = values.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
kit.next();
sb.append(" ? ");
if (i < values.size() - 1)
sb.append(", ");
i++;
}
sb.append(" ) \r\n");
}
//WHERE (KEYS)
if (clauses != null && clauses.size() > 0) {
sb.append("\tWHERE \r\n");
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
String key = (String) kit.next();
if (i > 0)
sb.append("\t\tAND ");
else
sb.append("\t\t");
sb.append(" ").append(key).append(" = ? \r\n");
i++;
}
}
//ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
if (other != null)
sb.append(other);
PreparedStatement statement = connection.prepareStatement(sb.toString());
//VALUES (AS SQL PARAMETERS)
if (values != null && values.size() > 0) {
Set keys = values.keySet();
Iterator kit = keys.iterator();
int i = 1;
while (kit.hasNext()) {
String key = (String) kit.next();
Object value = values.get(key);
addParameter(statement, i, value);
i++;
}
}
//WHERE (VALUES)
if (clauses != null && clauses.size() > 0) {
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 1;
while (kit.hasNext()) {
String key = (String) kit.next();
Object value = clauses.get(key);
addParameter(statement, i, value);
i++;
}
}
return statement;
}
/**
* Creates a <code>PreparedStatement</code> for a SQL UPDATE.
* <p>
* e.g.
* <pre>
* UPDATE Job
* SET Position = 'Manager'
* WHERE Employee_ID = 12345678
*
* </pre>
*
* @param table The table name to update
* @param updates A list of column names to select, with column aliases appropriately formatted
* @param clauses A collection of key-value pairs, the key must be a string and the value can be any valid ODBC object
* @return A PreparedStatement that can be subsequently executed.
* @throws SQLException
*/
public PreparedStatement update(String table, Map updates, Map clauses, String other) throws SQLException {
StringBuffer sb = new StringBuffer(256);
sb.append("UPDATE ");
//TABLE
sb.append(table).append(" \r\n");
//SET (KEYS)
if (updates != null && updates.size() > 0) {
sb.append("\tSET \r\n");
Set keys = updates.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
String key = (String) kit.next();
if (i > 0)
sb.append("\t\tAND ");
else
sb.append("\t\t");
sb.append(" ").append(key).append(" = ? \r\n");
i++;
}
}
//WHERE (KEYS)
if (clauses != null && clauses.size() > 0) {
sb.append("\tWHERE \r\n");
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
String key = (String) kit.next();
if (i > 0)
sb.append("\t\tAND ");
else
sb.append("\t\t");
sb.append(" ").append(key).append(" = ? \r\n");
i++;
}
}
//ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
if (other != null)
sb.append(other);
PreparedStatement statement = connection.prepareStatement(sb.toString());
//SET (VALUES)
if (updates != null && updates.size() > 0) {
Set keys = updates.keySet();
Iterator kit = keys.iterator();
int i = 1;
while (kit.hasNext()) {
String key = (String) kit.next();
Object value = updates.get(key);
addParameter(statement, i, value);
i++;
}
}
//WHERE (VALUES)
if (clauses != null && clauses.size() > 0) {
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 1;
while (kit.hasNext()) {
String key = (String) kit.next();
Object value = clauses.get(key);
addParameter(statement, i, value);
i++;
}
}
return statement;
}
/**
* Creates a <code>PreparedStatement</code> for a SQL DELETE.
* <p>
* e.g.
* <pre>
* DELETE FROM Employee
* WHERE First_Name = 'John'
* AND Last_Name = 'Smith'
* </pre>
*
* @param table The name of the table from which to delete rows
* @param clauses A collection of key-value pairs, the key must be a string and the value can be any valid ODBC object
* @return A PreparedStatement that can be subsequently executed.
* @throws SQLException
*/
public PreparedStatement delete(String table, Map clauses, String other) throws SQLException {
StringBuffer sb = new StringBuffer(256);
sb.append("DELETE FROM ");
//TABLE
sb.append(table).append(" \r\n");
//WHERE (KEYS)
if (clauses != null && clauses.size() > 0) {
sb.append("\tWHERE \r\n");
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 0;
while (kit.hasNext()) {
String key = (String) kit.next();
if (i > 0)
sb.append("\t\tAND ");
else
sb.append("\t\t");
sb.append(" ").append(key).append(" = ? \r\n");
i++;
}
}
//ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
if (other != null)
sb.append(other);
PreparedStatement statement = connection.prepareStatement(sb.toString());
//WHERE (VALUES)
if (clauses != null && clauses.size() > 0) {
Set keys = clauses.keySet();
Iterator kit = keys.iterator();
int i = 1;
while (kit.hasNext()) {
String key = (String) kit.next();
Object value = clauses.get(key);
addParameter(statement, i, value);
i++;
}
}
return statement;
}
public static long getId(Object val) {
long id = -1;
if (val != null) {
if (val instanceof Number) {
id = ((Number) val).longValue();
} else {
id = Long.parseLong(val.toString());
}
}
return id;
}
public static int countRecords(ResultSet resultSet) {
int rowCount = 0;
//Determine rs size
if (resultSet != null) {
try {
int currentIndex = resultSet.getRow();
//Go to the end and get that row number
if (resultSet.last()) {
rowCount = resultSet.getRow();
}
//Put the cursor back
if (currentIndex > 0) {
resultSet.absolute(currentIndex);
} else {
resultSet.beforeFirst();
}
} catch (SQLException ex) {
//TODO: Decide whether if absolute() not be supported, try first() as a last resort??
try {
resultSet.first();
} catch (SQLException se) {
//we won't try anymore.
}
}
}
return rowCount;
}
private void addParameter(PreparedStatement statement, int i, Object value) throws SQLException {
if (value == null)
statement.setObject(i, value);
else if (value instanceof String)
statement.setString(i, value.toString());
else if (value instanceof Persistable)
statement.setLong(i, ((Persistable) value).id);
else if (value instanceof Boolean)
statement.setBoolean(i, ((Boolean) value).booleanValue());
else if (value instanceof Integer)
statement.setInt(i, ((Integer) value).intValue());
else if (value instanceof Double)
statement.setDouble(i, ((Double) value).doubleValue());
else if (value instanceof Float)
statement.setFloat(i, ((Float) value).floatValue());
else if (value instanceof Short)
statement.setShort(i, ((Short) value).shortValue());
else if (value instanceof Long)
statement.setLong(i, ((Long) value).longValue());
else if (value instanceof Calendar)
statement.setDate(i, new java.sql.Date(((Calendar) value).getTime().getTime()));
else if (value instanceof java.util.Date)
statement.setDate(i, new java.sql.Date(((java.util.Date) value).getTime()));
else if (value instanceof java.sql.Date)
statement.setDate(i, ((java.sql.Date) value));
else if (value instanceof java.sql.Timestamp)
statement.setTimestamp(i, ((java.sql.Timestamp) value));
else if (value instanceof java.sql.Time)
statement.setTime(i, ((java.sql.Time) value));
else
statement.setObject(i, value);
}
}