📄 tinysqlpreparedstatement.java
字号:
/*
* PreparedStatement object for the tinySQL driver
*
* A lot of this code is based on or directly taken from
* George Reese's (borg@imaginary.com) mSQL driver.
*
* So, it's probably safe to say:
*
* Portions of this code Copyright (c) 1996 George Reese
*
* The rest of it:
*
* Copyright 1996, Brian C. Jepson
* (bjepson@ids.net)
*
* $Author: davis $
* $Date: 2004/12/18 21:31:53 $
* $Revision: 1.1 $
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.sqlmagic.tinysql;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.ResultSet;
import java.sql.Connection;
import java.sql.ResultSetMetaData;
import java.sql.Date;
import java.util.*;
import java.math.*;
/**
* @author Thomas Morgner <mgs@sherito.org> statementString contains the last
* used SQL-Query. Support for set/getFetchSize, ResultSets are created with a
* reference to the creating statement
*/
public class tinySQLPreparedStatement implements java.sql.PreparedStatement {
/**
* Holds the original prepare stement including ? placeholders for
* values that will be replaced later.
*/
private String statementString;
/**
* Holds the list of substitution values to be used in the prepared
* statement.
*/
private Vector substitute=(Vector)null;
/**
* Holds the list of table file objects so that they can be closed
* when all the updates have been completed.
*/
private Vector tableList=new Vector();
/**
* Holds the error message for invalid substitution index.
*/
private String invalidIndex = (String)null;
/**
* Holds the last used queryString. execute() has to be synchronized,
* to guarantee thread-safety
*/
/**
*
* A connection object to execute queries and... stuff
*
*/
private tinySQLConnection connection;
/**
*
* A result set returned from this query
*
*/
private tinySQLResultSet result;
/**
*
* A set of actions returned by tinySQLParser (see tinySQL.java)
*
*/
private Vector actions=(Vector)null;
/**
*
* The max field size for tinySQL
* This can be pretty big, before things start to break.
*
*/
private int max_field_size = 0;
/**
*
* The max rows supported by tinySQL
* I can't think of any limits, right now, but I'm sure some
* will crop up...
*
*/
private int max_rows = 65536;
/**
*
* The number of seconds the driver will allow for a SQL statement to
* execute before giving up. The default is to wait forever (0).
*
*/
private int timeout = 0;
/**
* How many rows to fetch in a single run. Default is now 4096 rows.
*/
private int fetchsize = 4096;
/**
* Debug flag
*/
private static boolean debug=false;
/**
*
* Constructs a new tinySQLStatement object.
* @param conn the tinySQLConnection object
*
*/
public tinySQLPreparedStatement(tinySQLConnection conn,String inputString) {
int nextQuestionMark,startAt;
connection = conn;
startAt = 0;
statementString = inputString;
while ( (nextQuestionMark=statementString.indexOf("?",startAt)) > -1 )
{
if ( substitute == (Vector)null ) substitute = new Vector();
substitute.addElement(new String(""));
startAt = nextQuestionMark + 1;
}
invalidIndex = " is not in the range 1 to "
+ Integer.toString(substitute.size());
if ( debug ) System.out.println("Prepare statement has " + substitute.size()
+ " parameters.");
}
/**
*
* Execute an SQL statement and return a result set.
* @see java.sql.PreparedStatement#executeQuery
* @exception SQLException raised for any errors
* @param sql the SQL statement string
* @return the result set from the query
*
*/
public synchronized ResultSet executeQuery()
throws SQLException {
// tinySQL only supports one result set at a time, so
// don't let them get another one, just in case it's
// hanging out.
//
result = null;
// create a new tinySQLResultSet with the tsResultSet
// returned from connection.executetinySQL()
//
if ( debug) System.out.println("executeQuery conn is " + connection.toString());
return new tinySQLResultSet(connection.executetinySQL(this), this);
}
public synchronized ResultSet executeQuery(String sql)
throws SQLException {
// tinySQL only supports one result set at a time, so
// don't let them get another one, just in case it's
// hanging out.
//
result = null;
statementString = sql;
// create a new tinySQLResultSet with the tsResultSet
// returned from connection.executetinySQL()
//
if ( debug) System.out.println("executeQuery conn is " + connection.toString());
return new tinySQLResultSet(connection.executetinySQL(this), this);
}
/**
*
* Execute an update, insert, delete, create table, etc. This can
* be anything that doesn't return rows.
* @see java.sql.PreparedStatement#executeUpdate
* @exception java.sql.SQLException thrown when an error occurs executing
* the SQL
* @return either the row count for INSERT, UPDATE or DELETE or 0 for SQL statements that return nothing
*/
public synchronized int executeUpdate(String sql) throws SQLException {
statementString = sql;
return connection.executetinyUpdate(this);
}
public synchronized int executeUpdate() throws SQLException {
return connection.executetinyUpdate(this);
}
/**
*
* Executes some SQL and returns true or false, depending on
* the success. The result set is stored in result, and can
* be retrieved with getResultSet();
* @see java.sql.PreparedStatement#execute
* @exception SQLException raised for any errors
* @param sql the SQL to be executed
* @return true if there is a result set available
*/
public boolean execute() throws SQLException {
// a result set object
//
tsResultSet r;
// execute the query
//
r = connection.executetinySQL(this);
// check for a null result set. If it wasn't null,
// use it to create a tinySQLResultSet, and return whether or
// not it is null (not null returns true).
//
if( r == null ) {
result = null;
} else {
result = new tinySQLResultSet(r, this);
}
return (result != null);
}
public boolean execute(String sql) throws SQLException {
// a result set object
//
tsResultSet r;
statementString = sql;
// execute the query
//
r = connection.executetinySQL(this);
// check for a null result set. If it wasn't null,
// use it to create a tinySQLResultSet, and return whether or
// not it is null (not null returns true).
//
if( r == null ) {
result = null;
} else {
result = new tinySQLResultSet(r, this);
}
return (result != null);
}
/**
* Returns the current query-String
*/
public String getSQLString ()
{
return statementString;
}
/**
*
* Close any result sets. This is not used by tinySQL.
* @see java.sql.PreparedStatement#close
*
*/
public void close() throws SQLException
{
int i;
tinySQLTable nextTable;
for ( i = 0; i < tableList.size(); i++ )
{
nextTable = (tinySQLTable)tableList.elementAt(i);
if ( debug ) System.out.println("Closing " + nextTable.table);
nextTable.close();
}
}
/**
*
* Returns the last result set
* @see java.sql.PreparedStatement#getResultSet
* @return null if no result set is available, otherwise a result set
*
*/
public ResultSet getResultSet() throws SQLException {
ResultSet r;
r = result; // save the existing result set
result = null; // null out the existing result set
return r; // return the previously extant result set
}
/**
*
* Return the row count of the last operation. tinySQL does not support
* this, so it returns -1
* @see java.sql.PreparedStatement#getUpdateCount
* @return -1
*/
public int getUpdateCount() throws SQLException {
return -1;
}
/**
*
* This returns true if there are any pending result sets. This
* should only be true after invoking execute()
* @see java.sql.PreparedStatement#getMoreResults
* @return true if rows are to be gotten
*
*/
public boolean getMoreResults() throws SQLException {
return (result != null);
}
/**
*
* Get the maximum field size to return in a result set.
* @see java.sql.PreparedStatement#getMaxFieldSize
* @return the value of max field size
*
*/
public int getMaxFieldSize() throws SQLException {
return max_field_size;
}
/**
*
* set the max field size.
* @see java.sql.PreparedStatement#setMaxFieldSize
* @param max the maximum field size
*
*/
public void setMaxFieldSize(int max) throws SQLException {
max_field_size = max;
}
/**
*
* Get the maximum row count that can be returned by a result set.
* @see java.sql.PreparedStatement#getMaxRows
* @return the maximum rows
*
*/
public int getMaxRows() throws SQLException {
return max_rows;
}
/**
*
* Get the maximum row count that can be returned by a result set.
* @see java.sql.PreparedStatement.setMaxRows
* @param max the max rows
*
*/
public void setMaxRows(int max) throws SQLException {
max_rows = max;
}
/**
*
* If escape scanning is on (the default) the driver will do
* escape substitution before sending the SQL to the database.
* @see java.sql.PreparedStatement#setEscapeProcessing
* @param enable this does nothing right now
*
*/
public void setEscapeProcessing(boolean enable)
throws SQLException {
throw new SQLException("The tinySQL Driver doesn't " +
"support escape processing.");
}
/**
*
* Discover the query timeout.
* @see java.sql.PreparedStatement#getQueryTimeout
* @see setQueryTimeout
* @return the timeout value for this statement
*
*/
public int getQueryTimeout() throws SQLException {
return timeout;
}
/**
*
* Set the query timeout.
* @see java.sql.PreparedStatement#setQueryTimeout
* @see getQueryTimeout
* @param x the new query timeout value
*
*/
public void setQueryTimeout(int x) throws SQLException {
timeout = x;
}
/**
*
* This can be used by another thread to cancel a statement. This
* doesn't matter for tinySQL, as far as I can tell.
* @see java.sql.PreparedStatement#cancel
*
*/
public void cancel() {
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -