Statement.java
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.jdbc1;
  2. // IMPORTANT NOTE: This file implements the JDBC 1 version of the driver.
  3. // If you make any modifications to this file, you must make sure that the
  4. // changes are also made (if relevent) to the related JDBC 2 class in the
  5. // postgresql.jdbc2 package.
  6. import java.sql.*;
  7. import postgresql.util.PSQLException;
  8. /**
  9.  * A Statement object is used for executing a static SQL statement and
  10.  * obtaining the results produced by it.
  11.  *
  12.  * <p>Only one ResultSet per Statement can be open at any point in time.  
  13.  * Therefore, if the reading of one ResultSet is interleaved with the
  14.  * reading of another, each must have been generated by different
  15.  * Statements.  All statement execute methods implicitly close a
  16.  * statement's current ResultSet if an open one exists.
  17.  *
  18.  * @see java.sql.Statement
  19.  * @see ResultSet
  20.  */
  21. public class Statement implements java.sql.Statement
  22. {
  23.     Connection connection; // The connection who created us
  24.     java.sql.ResultSet result = null; // The current results
  25.     SQLWarning warnings = null; // The warnings chain.
  26.     int timeout = 0; // The timeout for a query (not used)
  27.     boolean escapeProcessing = true;// escape processing flag
  28.     
  29. /**
  30.  * Constructor for a Statement.  It simply sets the connection
  31.  * that created us.
  32.  *
  33.  * @param c the Connection instantation that creates us
  34.  */
  35. public Statement (Connection c)
  36. {
  37. connection = c;
  38. }
  39. /**
  40.  * Execute a SQL statement that retruns a single ResultSet
  41.  *
  42.  * @param sql typically a static SQL SELECT statement
  43.  * @return a ResulSet that contains the data produced by the query
  44.  * @exception SQLException if a database access error occurs
  45.  */
  46. public java.sql.ResultSet executeQuery(String sql) throws SQLException
  47. {
  48. this.execute(sql);
  49. while (result != null && !((postgresql.ResultSet)result).reallyResultSet())
  50. result = ((postgresql.ResultSet)result).getNext();
  51. if (result == null)
  52. throw new PSQLException("postgresql.stat.noresult");
  53. return result;
  54. }
  55. /**
  56.  * Execute a SQL INSERT, UPDATE or DELETE statement.  In addition
  57.  * SQL statements that return nothing such as SQL DDL statements
  58.  * can be executed
  59.  *
  60.  * @param sql a SQL statement
  61.  * @return either a row count, or 0 for SQL commands
  62.  * @exception SQLException if a database access error occurs
  63.  */
  64. public int executeUpdate(String sql) throws SQLException
  65. {
  66. this.execute(sql);
  67. if (((postgresql.ResultSet)result).reallyResultSet())
  68. throw new PSQLException("postgresql.stat.result");
  69. return this.getUpdateCount();
  70. }
  71. /**
  72.  * In many cases, it is desirable to immediately release a
  73.  * Statement's database and JDBC resources instead of waiting
  74.  * for this to happen when it is automatically closed.  The
  75.  * close method provides this immediate release.
  76.  *
  77.  * <p><B>Note:</B> A Statement is automatically closed when it is 
  78.  * garbage collected.  When a Statement is closed, its current 
  79.  * ResultSet, if one exists, is also closed.
  80.  *
  81.  * @exception SQLException if a database access error occurs (why?)
  82.  */
  83. public void close() throws SQLException
  84. {
  85. result = null;
  86. }
  87. /**
  88.  * The maxFieldSize limit (in bytes) is the maximum amount of
  89.  * data returned for any column value; it only applies to
  90.  * BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR and LONGVARCHAR
  91.  * columns.  If the limit is exceeded, the excess data is silently
  92.  * discarded.
  93.  *
  94.  * @return the current max column size limit; zero means unlimited
  95.  * @exception SQLException if a database access error occurs
  96.  */
  97. public int getMaxFieldSize() throws SQLException
  98. {
  99. return 8192; // We cannot change this
  100. }
  101. /**
  102.  * Sets the maxFieldSize - NOT! - We throw an SQLException just
  103.  * to inform them to stop doing this.
  104.  *
  105.  * @param max the new max column size limit; zero means unlimited
  106.  * @exception SQLException if a database access error occurs
  107.  */
  108. public void setMaxFieldSize(int max) throws SQLException
  109. {
  110. throw new PSQLException("postgresql.stat.maxfieldsize");
  111. }
  112. /**
  113.  * The maxRows limit is set to limit the number of rows that
  114.  * any ResultSet can contain.  If the limit is exceeded, the
  115.  * excess rows are silently dropped.
  116.  *
  117.  * @return the current maximum row limit; zero means unlimited
  118.  * @exception SQLException if a database access error occurs
  119.  */
  120. public int getMaxRows() throws SQLException
  121. {
  122. return connection.maxrows;
  123. }
  124. /**
  125.  * Set the maximum number of rows
  126.  *
  127.  * @param max the new max rows limit; zero means unlimited
  128.  * @exception SQLException if a database access error occurs
  129.  * @see getMaxRows
  130.  */
  131. public void setMaxRows(int max) throws SQLException
  132. {
  133.   connection.maxrows = max;
  134. }
  135. /**
  136.  * If escape scanning is on (the default), the driver will do escape
  137.  * substitution before sending the SQL to the database.  
  138.  *
  139.  * @param enable true to enable; false to disable
  140.  * @exception SQLException if a database access error occurs
  141.  */
  142. public void setEscapeProcessing(boolean enable) throws SQLException
  143. {
  144. escapeProcessing = enable;
  145. }
  146. /**
  147.  * The queryTimeout limit is the number of seconds the driver
  148.  * will wait for a Statement to execute.  If the limit is
  149.  * exceeded, a SQLException is thrown.
  150.  *
  151.  * @return the current query timeout limit in seconds; 0 = unlimited
  152.  * @exception SQLException if a database access error occurs
  153.  */
  154. public int getQueryTimeout() throws SQLException
  155. {
  156. return timeout;
  157. }
  158. /**
  159.  * Sets the queryTimeout limit
  160.  *
  161.  * @param seconds - the new query timeout limit in seconds
  162.  * @exception SQLException if a database access error occurs
  163.  */
  164. public void setQueryTimeout(int seconds) throws SQLException
  165. {
  166. timeout = seconds;
  167. }
  168. /**
  169.  * Cancel can be used by one thread to cancel a statement that
  170.  * is being executed by another thread.  However, PostgreSQL is
  171.  * a sync. sort of thing, so this really has no meaning - we 
  172.  * define it as a no-op (i.e. you can't cancel, but there is no
  173.  * error if you try.)
  174.  *
  175.  * 6.4 introduced a cancel operation, but we have not implemented it
  176.  * yet. Sometime before 6.5, this method will be implemented.
  177.  *
  178.  * @exception SQLException only because thats the spec.
  179.  */
  180. public void cancel() throws SQLException
  181. {
  182. // No-op
  183. }
  184. /**
  185.  * The first warning reported by calls on this Statement is
  186.  * returned.  A Statement's execute methods clear its SQLWarning
  187.  * chain.  Subsequent Statement warnings will be chained to this
  188.  * SQLWarning.
  189.  *
  190.  * <p>The Warning chain is automatically cleared each time a statement
  191.  * is (re)executed.
  192.  *
  193.  * <p><B>Note:</B>  If you are processing a ResultSet then any warnings
  194.  * associated with ResultSet reads will be chained on the ResultSet
  195.  * object.
  196.  *
  197.  * @return the first SQLWarning on null
  198.  * @exception SQLException if a database access error occurs
  199.  */
  200. public SQLWarning getWarnings() throws SQLException
  201. {
  202. return warnings;
  203. }
  204. /**
  205.  * After this call, getWarnings returns null until a new warning
  206.  * is reported for this Statement.
  207.  *
  208.  * @exception SQLException if a database access error occurs (why?)
  209.  */
  210. public void clearWarnings() throws SQLException
  211. {
  212. warnings = null;
  213. }
  214. /**
  215.  * setCursorName defines the SQL cursor name that will be used by
  216.  * subsequent execute methods.  This name can then be used in SQL
  217.  * positioned update/delete statements to identify the current row
  218.  * in the ResultSet generated by this statement.  If a database
  219.  * doesn't support positioned update/delete, this method is a
  220.  * no-op.
  221.  *
  222.  * <p><B>Note:</B> By definition, positioned update/delete execution
  223.  * must be done by a different Statement than the one which
  224.  * generated the ResultSet being used for positioning.  Also, cursor
  225.  * names must be unique within a Connection.
  226.  *
  227.  * <p>We throw an additional constriction.  There can only be one
  228.  * cursor active at any one time.
  229.  *
  230.  * @param name the new cursor name
  231.  * @exception SQLException if a database access error occurs
  232.  */
  233. public void setCursorName(String name) throws SQLException
  234. {
  235. connection.setCursorName(name);
  236. }
  237. /**
  238.  * Execute a SQL statement that may return multiple results. We
  239.  * don't have to worry about this since we do not support multiple
  240.  * ResultSets.   You can use getResultSet or getUpdateCount to 
  241.  * retrieve the result.
  242.  *
  243.  * @param sql any SQL statement
  244.  * @return true if the next result is a ResulSet, false if it is
  245.  *  an update count or there are no more results
  246.  * @exception SQLException if a database access error occurs
  247.  */
  248. public boolean execute(String sql) throws SQLException
  249. {
  250. result = connection.ExecSQL(sql);
  251. return (result != null && ((postgresql.ResultSet)result).reallyResultSet());
  252. }
  253. /**
  254.  * getResultSet returns the current result as a ResultSet.  It
  255.  * should only be called once per result.
  256.  *
  257.  * @return the current result set; null if there are no more
  258.  * @exception SQLException if a database access error occurs (why?)
  259.  */
  260. public java.sql.ResultSet getResultSet() throws SQLException
  261. {
  262. return result;
  263. }
  264. /**
  265.  * getUpdateCount returns the current result as an update count,
  266.  * if the result is a ResultSet or there are no more results, -1
  267.  * is returned.  It should only be called once per result.
  268.  *
  269.  * @return the current result as an update count.
  270.  * @exception SQLException if a database access error occurs
  271.  */
  272. public int getUpdateCount() throws SQLException
  273. {
  274. if (result == null)  return -1;
  275. if (((postgresql.ResultSet)result).reallyResultSet()) return -1;
  276. return ((postgresql.ResultSet)result).getResultCount();
  277. }
  278. /**
  279.  * getMoreResults moves to a Statement's next result.  If it returns
  280.  * true, this result is a ResulSet.
  281.  *
  282.  * @return true if the next ResultSet is valid
  283.  * @exception SQLException if a database access error occurs
  284.  */
  285. public boolean getMoreResults() throws SQLException
  286. {
  287. result = ((postgresql.ResultSet)result).getNext();
  288. return (result != null && ((postgresql.ResultSet)result).reallyResultSet());
  289. }
  290.    
  291.    /**
  292.     * Returns the status message from the current Result.<p>
  293.     * This is used internally by the driver.
  294.     *
  295.     * @return status message from backend
  296.     */
  297.    public String getResultStatusString()
  298.    {
  299.      if(result == null)
  300.        return null;
  301.      return ((postgresql.ResultSet)result).getStatusString();
  302.    }
  303. }