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

数据库系统

开发平台:

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.io.*;
  7. import java.lang.*;
  8. import java.lang.reflect.*;
  9. import java.net.*;
  10. import java.util.*;
  11. import java.sql.*;
  12. import postgresql.Field;
  13. import postgresql.fastpath.*;
  14. import postgresql.largeobject.*;
  15. import postgresql.util.*;
  16. /**
  17.  * $Id: Connection.java,v 1.2 1999/05/18 23:17:26 peter Exp $
  18.  *
  19.  * A Connection represents a session with a specific database.  Within the
  20.  * context of a Connection, SQL statements are executed and results are
  21.  * returned.
  22.  *
  23.  * <P>A Connection's database is able to provide information describing
  24.  * its tables, its supported SQL grammar, its stored procedures, the
  25.  * capabilities of this connection, etc.  This information is obtained
  26.  * with the getMetaData method.
  27.  *
  28.  * <p><B>Note:</B> By default, the Connection automatically commits changes
  29.  * after executing each statement.  If auto-commit has been disabled, an
  30.  * explicit commit must be done or database changes will not be saved.
  31.  *
  32.  * @see java.sql.Connection
  33.  */
  34. public class Connection extends postgresql.Connection implements java.sql.Connection 
  35. {
  36.   // This is a cache of the DatabaseMetaData instance for this connection
  37.   protected DatabaseMetaData metadata;
  38.   
  39.   /**
  40.    * SQL statements without parameters are normally executed using
  41.    * Statement objects.  If the same SQL statement is executed many
  42.    * times, it is more efficient to use a PreparedStatement
  43.    *
  44.    * @return a new Statement object
  45.    * @exception SQLException passed through from the constructor
  46.    */
  47.   public java.sql.Statement createStatement() throws SQLException
  48.   {
  49.     return new Statement(this);
  50.   }
  51.   
  52.   /**
  53.    * A SQL statement with or without IN parameters can be pre-compiled
  54.    * and stored in a PreparedStatement object.  This object can then
  55.    * be used to efficiently execute this statement multiple times.
  56.    *
  57.    * <B>Note:</B> This method is optimized for handling parametric
  58.    * SQL statements that benefit from precompilation if the drivers
  59.    * supports precompilation.  PostgreSQL does not support precompilation.
  60.    * In this case, the statement is not sent to the database until the
  61.    * PreparedStatement is executed.  This has no direct effect on users;
  62.    * however it does affect which method throws certain SQLExceptions
  63.    *
  64.    * @param sql a SQL statement that may contain one or more '?' IN
  65.    * parameter placeholders
  66.    * @return a new PreparedStatement object containing the pre-compiled
  67.    * statement.
  68.    * @exception SQLException if a database access error occurs.
  69.    */
  70.   public java.sql.PreparedStatement prepareStatement(String sql) throws SQLException
  71.   {
  72.     return new PreparedStatement(this, sql);
  73.   }
  74.   
  75.   /**
  76.    * A SQL stored procedure call statement is handled by creating a
  77.    * CallableStatement for it.  The CallableStatement provides methods
  78.    * for setting up its IN and OUT parameters and methods for executing
  79.    * it.
  80.    *
  81.    * <B>Note:</B> This method is optimised for handling stored procedure
  82.    * call statements.  Some drivers may send the call statement to the
  83.    * database when the prepareCall is done; others may wait until the
  84.    * CallableStatement is executed.  This has no direct effect on users;
  85.    * however, it does affect which method throws certain SQLExceptions
  86.    *
  87.    * @param sql a SQL statement that may contain one or more '?' parameter
  88.    * placeholders.  Typically this statement is a JDBC function call
  89.    * escape string.
  90.    * @return a new CallableStatement object containing the pre-compiled
  91.    * SQL statement
  92.    * @exception SQLException if a database access error occurs
  93.    */
  94.   public java.sql.CallableStatement prepareCall(String sql) throws SQLException
  95.   {
  96.     throw new PSQLException("postgresql.con.call");
  97.     // return new CallableStatement(this, sql);
  98.   }
  99.   
  100.   /**
  101.    * A driver may convert the JDBC sql grammar into its system's
  102.    * native SQL grammar prior to sending it; nativeSQL returns the
  103.    * native form of the statement that the driver would have sent.
  104.    *
  105.    * @param sql a SQL statement that may contain one or more '?'
  106.    * parameter placeholders
  107.    * @return the native form of this statement
  108.    * @exception SQLException if a database access error occurs
  109.    */
  110.   public String nativeSQL(String sql) throws SQLException
  111.   {
  112.     return sql;
  113.   }
  114.   
  115.   /**
  116.    * If a connection is in auto-commit mode, than all its SQL
  117.    * statements will be executed and committed as individual
  118.    * transactions.  Otherwise, its SQL statements are grouped
  119.    * into transactions that are terminated by either commit()
  120.    * or rollback().  By default, new connections are in auto-
  121.    * commit mode.  The commit occurs when the statement completes
  122.    * or the next execute occurs, whichever comes first.  In the
  123.    * case of statements returning a ResultSet, the statement
  124.    * completes when the last row of the ResultSet has been retrieved
  125.    * or the ResultSet has been closed.  In advanced cases, a single
  126.    * statement may return multiple results as well as output parameter
  127.    * values.  Here the commit occurs when all results and output param
  128.    * values have been retrieved.
  129.    *
  130.    * @param autoCommit - true enables auto-commit; false disables it
  131.    * @exception SQLException if a database access error occurs
  132.    */
  133.   public void setAutoCommit(boolean autoCommit) throws SQLException
  134.   {
  135.     if (this.autoCommit == autoCommit)
  136.       return;
  137.     if (autoCommit)
  138.       ExecSQL("end");
  139.     else
  140.       ExecSQL("begin");
  141.     this.autoCommit = autoCommit;
  142.   }
  143.   
  144.   /**
  145.    * gets the current auto-commit state
  146.    * 
  147.    * @return Current state of the auto-commit mode
  148.    * @exception SQLException (why?)
  149.    * @see setAutoCommit
  150.    */
  151.   public boolean getAutoCommit() throws SQLException
  152.   {
  153.     return this.autoCommit;
  154.   }
  155.   
  156.   /**
  157.    * The method commit() makes all changes made since the previous
  158.    * commit/rollback permanent and releases any database locks currently
  159.    * held by the Connection.  This method should only be used when
  160.    * auto-commit has been disabled.  (If autoCommit == true, then we
  161.    * just return anyhow)
  162.    *
  163.    * @exception SQLException if a database access error occurs
  164.    * @see setAutoCommit
  165.    */
  166.   public void commit() throws SQLException
  167.   {
  168.     if (autoCommit)
  169.       return;
  170.     ExecSQL("commit");
  171.     autoCommit = true;
  172.     ExecSQL("begin");
  173.     autoCommit = false;
  174.   }
  175.   
  176.   /**
  177.    * The method rollback() drops all changes made since the previous
  178.    * commit/rollback and releases any database locks currently held by
  179.    * the Connection. 
  180.    *
  181.    * @exception SQLException if a database access error occurs
  182.    * @see commit
  183.    */
  184.   public void rollback() throws SQLException
  185.   {
  186.     if (autoCommit)
  187.       return;
  188.     ExecSQL("rollback");
  189.     autoCommit = true;
  190.     ExecSQL("begin");
  191.     autoCommit = false;
  192.   }
  193.   
  194.   /**
  195.    * In some cases, it is desirable to immediately release a Connection's
  196.    * database and JDBC resources instead of waiting for them to be
  197.    * automatically released (cant think why off the top of my head)
  198.    *
  199.    * <B>Note:</B> A Connection is automatically closed when it is
  200.    * garbage collected.  Certain fatal errors also result in a closed
  201.    * connection.
  202.    *
  203.    * @exception SQLException if a database access error occurs
  204.    */
  205.   public void close() throws SQLException
  206.   {
  207.     if (pg_stream != null)
  208.       {
  209. try
  210.   {
  211.     pg_stream.close();
  212.   } catch (IOException e) {}
  213.   pg_stream = null;
  214.       }
  215.   }
  216.   
  217.   /**
  218.    * Tests to see if a Connection is closed
  219.    *
  220.    * @return the status of the connection
  221.    * @exception SQLException (why?)
  222.    */
  223.   public boolean isClosed() throws SQLException
  224.   {
  225.     return (pg_stream == null);
  226.   }
  227.   
  228.   /**
  229.    * A connection's database is able to provide information describing
  230.    * its tables, its supported SQL grammar, its stored procedures, the
  231.    * capabilities of this connection, etc.  This information is made
  232.    * available through a DatabaseMetaData object.
  233.    *
  234.    * @return a DatabaseMetaData object for this connection
  235.    * @exception SQLException if a database access error occurs
  236.    */
  237.   public java.sql.DatabaseMetaData getMetaData() throws SQLException
  238.   {
  239.     if(metadata==null)
  240.       metadata = new DatabaseMetaData(this);
  241.     return metadata;
  242.   }
  243.   
  244.   /**
  245.    * You can put a connection in read-only mode as a hunt to enable
  246.    * database optimizations
  247.    *
  248.    * <B>Note:</B> setReadOnly cannot be called while in the middle
  249.    * of a transaction
  250.    *
  251.    * @param readOnly - true enables read-only mode; false disables it
  252.    * @exception SQLException if a database access error occurs
  253.    */
  254.   public void setReadOnly (boolean readOnly) throws SQLException
  255.   {
  256.     this.readOnly = readOnly;
  257.   }
  258.   
  259.   /**
  260.    * Tests to see if the connection is in Read Only Mode.  Note that
  261.    * we cannot really put the database in read only mode, but we pretend
  262.    * we can by returning the value of the readOnly flag
  263.    *
  264.    * @return true if the connection is read only
  265.    * @exception SQLException if a database access error occurs
  266.    */
  267.   public boolean isReadOnly() throws SQLException
  268.   {
  269.     return readOnly;
  270.   }
  271.   
  272.   /**
  273.    * A sub-space of this Connection's database may be selected by
  274.    * setting a catalog name.  If the driver does not support catalogs,
  275.    * it will silently ignore this request
  276.    *
  277.    * @exception SQLException if a database access error occurs
  278.    */
  279.   public void setCatalog(String catalog) throws SQLException
  280.   {
  281.     // No-op
  282.   }
  283.   
  284.   /**
  285.    * Return the connections current catalog name, or null if no
  286.    * catalog name is set, or we dont support catalogs.
  287.    *
  288.    * @return the current catalog name or null
  289.    * @exception SQLException if a database access error occurs
  290.    */
  291.   public String getCatalog() throws SQLException
  292.   {
  293.     return null;
  294.   }
  295.   
  296.   /**
  297.    * You can call this method to try to change the transaction
  298.    * isolation level using one of the TRANSACTION_* values.  
  299.    *
  300.    * <B>Note:</B> setTransactionIsolation cannot be called while
  301.    * in the middle of a transaction
  302.    *
  303.    * @param level one of the TRANSACTION_* isolation values with
  304.    * the exception of TRANSACTION_NONE; some databases may
  305.    * not support other values
  306.    * @exception SQLException if a database access error occurs
  307.    * @see java.sql.DatabaseMetaData#supportsTransactionIsolationLevel
  308.    */
  309.   public void setTransactionIsolation(int level) throws SQLException
  310.   {
  311.       throw postgresql.Driver.notImplemented();
  312.   }
  313.   
  314.   /**
  315.    * Get this Connection's current transaction isolation mode.
  316.    * 
  317.    * @return the current TRANSACTION_* mode value
  318.    * @exception SQLException if a database access error occurs
  319.    */
  320.   public int getTransactionIsolation() throws SQLException
  321.   {
  322.     return java.sql.Connection.TRANSACTION_SERIALIZABLE;
  323.   }
  324.   
  325.   /**
  326.    * The first warning reported by calls on this Connection is
  327.    * returned.
  328.    *
  329.    * <B>Note:</B> Sebsequent warnings will be changed to this
  330.    * SQLWarning
  331.    *
  332.    * @return the first SQLWarning or null
  333.    * @exception SQLException if a database access error occurs
  334.    */
  335.   public SQLWarning getWarnings() throws SQLException
  336.   {
  337.     return firstWarning;
  338.   }
  339.   
  340.   /**
  341.    * After this call, getWarnings returns null until a new warning
  342.    * is reported for this connection.
  343.    *
  344.    * @exception SQLException if a database access error occurs
  345.    */
  346.   public void clearWarnings() throws SQLException
  347.   {
  348.     firstWarning = null;
  349.   }
  350.     
  351.     /**
  352.      * This overides the method in postgresql.Connection and returns a
  353.      * ResultSet.
  354.      */
  355.     protected java.sql.ResultSet getResultSet(postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount) throws SQLException
  356.     {
  357. return new postgresql.jdbc2.ResultSet((postgresql.jdbc2.Connection)conn,fields,tuples,status,updateCount);
  358.     }
  359.     
  360.     // *****************
  361.     // JDBC 2 extensions
  362.     // *****************
  363.     
  364.     public java.sql.Statement createStatement(int resultSetType,int resultSetConcurrency) throws SQLException
  365.     {
  366. // normal create followed by 2 sets?
  367. throw postgresql.Driver.notImplemented();
  368.     }
  369.     
  370.     public java.sql.PreparedStatement prepareStatement(String sql,int resultSetType,int resultSetConcurrency) throws SQLException
  371.     {
  372. // normal prepare followed by 2 sets?
  373. throw postgresql.Driver.notImplemented();
  374.     }
  375.     
  376.     public java.sql.CallableStatement prepareCall(String sql,int resultSetType,int resultSetConcurrency) throws SQLException
  377.     {
  378. // normal prepare followed by 2 sets?
  379. throw postgresql.Driver.notImplemented();
  380.     }
  381.     
  382.     public int getResultSetConcurrency() throws SQLException
  383.     {
  384. throw postgresql.Driver.notImplemented();
  385.     }
  386.     
  387.     public int getResultSetType() throws SQLException
  388.     {
  389. throw postgresql.Driver.notImplemented();
  390.     }
  391.     
  392.     public java.util.Map getTypeMap() throws SQLException
  393.     {
  394. throw postgresql.Driver.notImplemented();
  395.     }
  396.     
  397.     public void setResultSetConcurrency(int value) throws SQLException
  398.     {
  399. throw postgresql.Driver.notImplemented();
  400.     }
  401.     
  402.     public void setResultSetType(int type) throws SQLException
  403.     {
  404. throw postgresql.Driver.notImplemented();
  405.     }
  406.     
  407.     public void setTypeMap(java.util.Map map) throws SQLException
  408.     {
  409. throw postgresql.Driver.notImplemented();
  410.     }
  411.     
  412. }
  413. // ***********************************************************************