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

数据库系统

开发平台:

Unix_Linux

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