JDBC SQLStatus for Dynamic SQL, unsupported feature, invalid transaction state and others

Поиск
Список
Период
Сортировка
От Fernando Nasser
Тема JDBC SQLStatus for Dynamic SQL, unsupported feature, invalid transaction state and others
Дата
Msg-id 3DE2A7D5.1000107@redhat.com
обсуждение исходный текст
Список pgsql-patches
This patch includes all the others and adds SQLState support for the following
additional conditions:

     public static final PSQLState parameter_mismatch = new PSQLState("07001");
     public static final PSQLState inv_parameter_type = new PSQLState("07006");
     public static final PSQLState unable_to_connect = new PSQLState("08001");
     public static final PSQLState inexistent_connection = new PSQLState("08003");
     public static final PSQLState connection_rejected = new PSQLState("08004");
     public static final PSQLState connection_failure = new PSQLState("08006");
     public static final PSQLState feature_not_supported = new PSQLState("0A000");
     public static final PSQLState data_exception = new PSQLState("22000");
     public static final PSQLState inv_transaction_state = new PSQLState("25000");

--
Fernando Nasser
Red Hat - Toronto                       E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario   M4P 2C9
? src/interfaces/jdbc/org/postgresql/util/PSQLState.java
Index: src/interfaces/jdbc/org/postgresql/PG_Stream.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/PG_Stream.java,v
retrieving revision 1.17
diff -c -p -r1.17 PG_Stream.java
*** src/interfaces/jdbc/org/postgresql/PG_Stream.java    2002/08/20 04:26:02    1.17
--- src/interfaces/jdbc/org/postgresql/PG_Stream.java    2002/11/25 22:17:47
*************** public class PG_Stream
*** 137,147 ****
          {
              c = pg_input.read();
              if (c < 0)
!                 throw new PSQLException("postgresql.stream.eof");
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", e);
          }
          return c;
      }
--- 137,147 ----
          {
              c = pg_input.read();
              if (c < 0)
!                 throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error);
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e);
          }
          return c;
      }
*************** public class PG_Stream
*** 164,176 ****
                  int b = pg_input.read();

                  if (b < 0)
!                     throw new PSQLException("postgresql.stream.eof");
                  n = n | (b << (8 * i)) ;
              }
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", e);
          }
          return n;
      }
--- 164,176 ----
                  int b = pg_input.read();

                  if (b < 0)
!                     throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error);
                  n = n | (b << (8 * i)) ;
              }
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e);
          }
          return n;
      }
*************** public class PG_Stream
*** 193,205 ****
                  int b = pg_input.read();

                  if (b < 0)
!                     throw new PSQLException("postgresql.stream.eof");
                  n = b | (n << 8);
              }
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", e);
          }
          return n;
      }
--- 193,205 ----
                  int b = pg_input.read();

                  if (b < 0)
!                     throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error);
                  n = b | (n << 8);
              }
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e);
          }
          return n;
      }
*************** public class PG_Stream
*** 227,233 ****
                  {
                      int c = pg_input.read();
                      if (c < 0)
!                         throw new PSQLException("postgresql.stream.eof");
                      else if (c == 0)
                      {
                          rst[s] = 0;
--- 227,233 ----
                  {
                      int c = pg_input.read();
                      if (c < 0)
!                         throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error);
                      else if (c == 0)
                      {
                          rst[s] = 0;
*************** public class PG_Stream
*** 250,256 ****
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", e);
          }
          return encoding.decode(rst, 0, s);
      }
--- 250,256 ----
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e);
          }
          return encoding.decode(rst, 0, s);
      }
*************** public class PG_Stream
*** 330,342 ****
              {
                  int w = pg_input.read(b, off + s, siz - s);
                  if (w < 0)
!                     throw new PSQLException("postgresql.stream.eof");
                  s += w;
              }
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", e);
          }
      }

--- 330,342 ----
              {
                  int w = pg_input.read(b, off + s, siz - s);
                  if (w < 0)
!                     throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error);
                  s += w;
              }
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e);
          }
      }

*************** public class PG_Stream
*** 353,359 ****
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.flush", e);
          }
      }

--- 353,359 ----
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.stream.flush", PSQLException.comm_link_error, e);
          }
      }

Index: src/interfaces/jdbc/org/postgresql/errors.properties
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/errors.properties,v
retrieving revision 1.15
diff -c -p -r1.15 errors.properties
*** src/interfaces/jdbc/org/postgresql/errors.properties    2002/11/14 05:35:45    1.15
--- src/interfaces/jdbc/org/postgresql/errors.properties    2002/11/25 22:17:47
*************** postgresql.updateable.beforestartdelete:
*** 83,89 ****
  postgresql.updateable.afterlastdelete:After end of result set. Can not call deleteRow().
  postgresql.updateable.notoninsertrow:Not on insert row.
  postgresql.updateable.inputstream:Input Stream is null.
! postgresql.updateable.ioerror:Input Stream Error.
  postgresql.call.noreturntype:A CallableStatement Function was declared but no call to 'registerOutParameter (1,
<some_type>)'was made. 
  postgresql.call.noinout:PostgreSQL only supports function return value [@ 1] (no OUT or INOUT arguments)
  postgresql.call.procasfunc:This Statement [{0}] defines a procedure call (needs ?= call <stmt> to be considered a
function.
--- 83,89 ----
  postgresql.updateable.afterlastdelete:After end of result set. Can not call deleteRow().
  postgresql.updateable.notoninsertrow:Not on insert row.
  postgresql.updateable.inputstream:Input Stream is null.
! postgresql.updateable.ioerror:Input Stream Error - {0}
  postgresql.call.noreturntype:A CallableStatement Function was declared but no call to 'registerOutParameter (1,
<some_type>)'was made. 
  postgresql.call.noinout:PostgreSQL only supports function return value [@ 1] (no OUT or INOUT arguments)
  postgresql.call.procasfunc:This Statement [{0}] defines a procedure call (needs ?= call <stmt> to be considered a
function.
Index: src/interfaces/jdbc/org/postgresql/core/Encoding.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/core/Encoding.java,v
retrieving revision 1.8
diff -c -p -r1.8 Encoding.java
*** src/interfaces/jdbc/org/postgresql/core/Encoding.java    2002/11/14 05:35:45    1.8
--- src/interfaces/jdbc/org/postgresql/core/Encoding.java    2002/11/25 22:17:47
*************** public class Encoding
*** 72,82 ****
      }

      /*
!      * Get an Encoding for from the given database encoding and
       * the encoding passed in by the user.
       */
!     public static Encoding getEncoding(String databaseEncoding,
!                                        String passedEncoding)
      {
          if (passedEncoding != null)
          {
--- 72,82 ----
      }

      /*
!      * Get an Encoding from the given database encoding and
       * the encoding passed in by the user.
+      * Return null if cannot find a suitable one.
       */
!     public static Encoding getEncoding(String databaseEncoding, String passedEncoding)
      {
          if (passedEncoding != null)
          {
*************** public class Encoding
*** 86,121 ****
              }
              else
              {
!                 return defaultEncoding();
              }
          }
          else
          {
!             return encodingForDatabaseEncoding(databaseEncoding);
!         }
!     }
!
!     /*
!      * Get an Encoding matching the given database encoding.
!      */
!     private static Encoding encodingForDatabaseEncoding(String databaseEncoding)
!     {
!         // If the backend encoding is known and there is a suitable
!         // encoding in the JVM we use that. Otherwise we fall back
!         // to the default encoding of the JVM.
!
!         if (encodings.containsKey(databaseEncoding))
!         {
!             String[] candidates = (String[]) encodings.get(databaseEncoding);
!             for (int i = 0; i < candidates.length; i++)
              {
!                 if (isAvailable(candidates[i]))
                  {
!                     return new Encoding(candidates[i]);
                  }
              }
          }
-         return defaultEncoding();
      }

      /*
--- 86,116 ----
              }
              else
              {
!                 // Requested encoding not available in the JVM
!                 return null;
              }
          }
          else
          {
!             // Get an Encoding matching the given database encoding.
!             // If the backend encoding is known and there is a suitable
!             // encoding in the JVM we return that.
!
!             if (encodings.containsKey(databaseEncoding))
              {
!                 String[] candidates = (String[]) encodings.get(databaseEncoding);
!                 for (int i = 0; i < candidates.length; i++)
                  {
!                     if (isAvailable(candidates[i]))
!                     {
!                         return new Encoding(candidates[i]);
!                     }
                  }
              }
+
+             // Bakend encoding UNKNOWN or not available in the JVM
+             return null;
          }
      }

      /*
*************** public class Encoding
*** 144,150 ****
          }
          catch (UnsupportedEncodingException e)
          {
!             throw new PSQLException("postgresql.stream.encoding", e);
          }
      }

--- 139,146 ----
          }
          catch (UnsupportedEncodingException e)
          {
!             // This will never happen as we made sure that the encoding is valid when the connection was created
!             throw new PSQLException("postgresql.stream.encoding", PSQLException.data_exception, e);
          }
      }

*************** public class Encoding
*** 169,175 ****
          }
          catch (UnsupportedEncodingException e)
          {
!             throw new PSQLException("postgresql.stream.encoding", e);
          }
      }

--- 165,172 ----
          }
          catch (UnsupportedEncodingException e)
          {
!             // This will never happen as we made sure that the encoding is valid when the connection was created
!             throw new PSQLException("postgresql.stream.encoding", PSQLException.data_exception, e);
          }
      }

*************** public class Encoding
*** 199,205 ****
          }
          catch (UnsupportedEncodingException e)
          {
!             throw new PSQLException("postgresql.res.encoding", e);
          }
      }

--- 196,203 ----
          }
          catch (UnsupportedEncodingException e)
          {
!             // This will never happen as we made sure that the encoding is valid when the connection was created
!             throw new PSQLException("postgresql.res.encoding", PSQLException.data_exception, e);
          }
      }

Index: src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java,v
retrieving revision 1.17
diff -c -p -r1.17 QueryExecutor.java
*** src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java    2002/11/14 05:35:45    1.17
--- src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java    2002/11/25 22:17:47
*************** public class QueryExecutor
*** 61,67 ****

          if (pg_stream == null)
          {
!             throw new PSQLException("postgresql.con.closed");
          }

          synchronized (pg_stream)
--- 61,67 ----

          if (pg_stream == null)
          {
!             throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection);
          }

          synchronized (pg_stream)
*************** public class QueryExecutor
*** 120,126 ****
                          l_endQuery = true;
                          break;
                      default:
!                         throw new PSQLException("postgresql.con.type",
                                                  new Character((char) c));
                  }

--- 120,126 ----
                          l_endQuery = true;
                          break;
                      default:
!                         throw new PSQLException("postgresql.con.type", PSQLException.connection_failure,
                                                  new Character((char) c));
                  }

*************** public class QueryExecutor
*** 145,151 ****
              for (int i = 0 ; i < m_binds.length ; ++i)
              {
                  if (m_binds[i] == null)
!                     throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
                  pg_stream.Send(connection.getEncoding().encode(m_sqlFrags[i]));
                  pg_stream.Send(connection.getEncoding().encode(m_binds[i].toString()));
              }
--- 145,151 ----
              for (int i = 0 ; i < m_binds.length ; ++i)
              {
                  if (m_binds[i] == null)
!                     throw new PSQLException("postgresql.prep.param", PSQLException.parameter_mismatch, new Integer(i
+1)); 
                  pg_stream.Send(connection.getEncoding().encode(m_sqlFrags[i]));
                  pg_stream.Send(connection.getEncoding().encode(m_binds[i].toString()));
              }
*************** public class QueryExecutor
*** 156,162 ****
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.con.ioerror", e);
          }
      }

--- 156,162 ----
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.con.ioerror", PSQLException.comm_link_error, e);
          }
      }

*************** public class QueryExecutor
*** 168,174 ****
      private void receiveTuple(boolean isBinary) throws SQLException
      {
          if (fields == null)
!             throw new PSQLException("postgresql.con.tuple");
          Object tuple = pg_stream.ReceiveTuple(fields.length, isBinary);
          if (isBinary)
              binaryCursor = true;
--- 168,174 ----
      private void receiveTuple(boolean isBinary) throws SQLException
      {
          if (fields == null)
!             throw new PSQLException("postgresql.con.tuple", PSQLException.connection_failure);
          Object tuple = pg_stream.ReceiveTuple(fields.length, isBinary);
          if (isBinary)
              binaryCursor = true;
*************** public class QueryExecutor
*** 199,205 ****
          }
          catch (NumberFormatException nfe)
          {
!             throw new PSQLException("postgresql.con.fathom", status);
          }
      }

--- 199,205 ----
          }
          catch (NumberFormatException nfe)
          {
!             throw new PSQLException("postgresql.con.fathom", PSQLException.connection_failure, status);
          }
      }

*************** public class QueryExecutor
*** 209,215 ****
      private void receiveFields() throws SQLException
      {
          if (fields != null)
!             throw new PSQLException("postgresql.con.multres");

          int size = pg_stream.ReceiveIntegerR(2);
          fields = new Field[size];
--- 209,215 ----
      private void receiveFields() throws SQLException
      {
          if (fields != null)
!             throw new PSQLException("postgresql.con.multres", PSQLException.connection_failure);

          int size = pg_stream.ReceiveIntegerR(2);
          fields = new Field[size];
Index: src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java,v
retrieving revision 1.11
diff -c -p -r1.11 Fastpath.java
*** src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java    2002/09/06 21:23:05    1.11
--- src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java    2002/11/25 22:17:47
*************** public class Fastpath
*** 81,87 ****
              }
              catch (IOException ioe)
              {
!                 throw new PSQLException("postgresql.fp.send", new Integer(fnid), ioe);
              }

              // Now handle the result
--- 81,89 ----
              }
              catch (IOException ioe)
              {
!                 throw new PSQLException("postgresql.fp.send",
!                                         PSQLException.comm_link_error,
!                                         new Integer(fnid), ioe);
              }

              // Now handle the result
Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java,v
retrieving revision 1.13
diff -c -p -r1.13 AbstractJdbc1Connection.java
*** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java    2002/11/14 05:35:45    1.13
--- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java    2002/11/25 22:17:47
*************** public abstract class AbstractJdbc1Conne
*** 104,110 ****
          // This occasionally occurs when the client uses the properties version
          // of getConnection(), and is a common question on the email lists
          if (info.getProperty("user") == null)
!             throw new PSQLException("postgresql.con.user");

          this_driver = (org.postgresql.Driver)d;
          this_url = url;
--- 104,110 ----
          // This occasionally occurs when the client uses the properties version
          // of getConnection(), and is a common question on the email lists
          if (info.getProperty("user") == null)
!             throw new PSQLException("postgresql.con.user", PSQLException.connection_rejected);

          this_driver = (org.postgresql.Driver)d;
          this_url = url;
*************** public abstract class AbstractJdbc1Conne
*** 164,174 ****
              // Added by Peter Mount <peter@retep.org.uk>
              // ConnectException is thrown when the connection cannot be made.
              // we trap this an return a more meaningful message for the end user
!             throw new PSQLException ("postgresql.con.refused");
          }
          catch (IOException e)
          {
!             throw new PSQLException ("postgresql.con.failed", e);
          }

          // Now we need to construct and send a startup packet
--- 164,174 ----
              // Added by Peter Mount <peter@retep.org.uk>
              // ConnectException is thrown when the connection cannot be made.
              // we trap this an return a more meaningful message for the end user
!             throw new PSQLException ("postgresql.con.refused", PSQLException.connection_rejected);
          }
          catch (IOException e)
          {
!             throw new PSQLException ("postgresql.con.failed", PSQLException.unable_to_connect, e);
          }

          // Now we need to construct and send a startup packet
*************** public abstract class AbstractJdbc1Conne
*** 199,205 ****
                          // The most common one to be thrown here is:
                          // "User authentication failed"
                          //
!                         throw new PSQLException("postgresql.con.misc", pg_stream.ReceiveString(encoding));

                      case 'R':
                          // Get the type of request
--- 199,206 ----
                          // The most common one to be thrown here is:
                          // "User authentication failed"
                          //
!                         throw new PSQLException("postgresql.con.misc", PSQLException.connection_rejected,
!                                                 pg_stream.ReceiveString(encoding));

                      case 'R':
                          // Get the type of request
*************** public abstract class AbstractJdbc1Conne
*** 237,248 ****
                              case AUTH_REQ_KRB4:
                                  if (org.postgresql.Driver.logDebug)
                                      org.postgresql.Driver.debug("postgresql: KRB4");
!                                 throw new PSQLException("postgresql.con.kerb4");

                              case AUTH_REQ_KRB5:
                                  if (org.postgresql.Driver.logDebug)
                                      org.postgresql.Driver.debug("postgresql: KRB5");
!                                 throw new PSQLException("postgresql.con.kerb5");

                              case AUTH_REQ_PASSWORD:
                                  if (org.postgresql.Driver.logDebug)
--- 238,249 ----
                              case AUTH_REQ_KRB4:
                                  if (org.postgresql.Driver.logDebug)
                                      org.postgresql.Driver.debug("postgresql: KRB4");
!                                 throw new PSQLException("postgresql.con.kerb4", PSQLException.connection_rejected);

                              case AUTH_REQ_KRB5:
                                  if (org.postgresql.Driver.logDebug)
                                      org.postgresql.Driver.debug("postgresql: KRB5");
!                                 throw new PSQLException("postgresql.con.kerb5", PSQLException.connection_rejected);

                              case AUTH_REQ_PASSWORD:
                                  if (org.postgresql.Driver.logDebug)
*************** public abstract class AbstractJdbc1Conne
*** 274,285 ****
                                  break;

                              default:
!                                 throw new PSQLException("postgresql.con.auth", new Integer(areq));
                          }
                          break;

                      default:
!                         throw new PSQLException("postgresql.con.authfail");
                  }
              }
              while (areq != AUTH_REQ_OK);
--- 275,287 ----
                                  break;

                              default:
!                                 throw new PSQLException("postgresql.con.auth", PSQLException.connection_rejected,
!                                                         new Integer(areq));
                          }
                          break;

                      default:
!                         throw new PSQLException("postgresql.con.authfail", PSQLException.connection_rejected);
                  }
              }
              while (areq != AUTH_REQ_OK);
*************** public abstract class AbstractJdbc1Conne
*** 287,293 ****
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.con.failed", e);
          }


--- 289,295 ----
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.con.failed", PSQLException.unable_to_connect, e);
          }


*************** public abstract class AbstractJdbc1Conne
*** 303,314 ****
                      ckey = pg_stream.ReceiveIntegerR(4);
                      break;
                  case 'E':
!                     throw new PSQLException("postgresql.con.backend", pg_stream.ReceiveString(encoding));
                  case 'N':
                      addWarning(pg_stream.ReceiveString(encoding));
                      break;
                  default:
!                     throw new PSQLException("postgresql.con.setup");
              }
          }
          while (beresp == 'N');
--- 305,317 ----
                      ckey = pg_stream.ReceiveIntegerR(4);
                      break;
                  case 'E':
!                     throw new PSQLException("postgresql.con.backend", PSQLException.unable_to_connect,
!                                             pg_stream.ReceiveString(encoding));
                  case 'N':
                      addWarning(pg_stream.ReceiveString(encoding));
                      break;
                  default:
!                     throw new PSQLException("postgresql.con.setup", PSQLException.unable_to_connect);
              }
          }
          while (beresp == 'N');
*************** public abstract class AbstractJdbc1Conne
*** 325,333 ****
                      addWarning(pg_stream.ReceiveString(encoding));
                      break;
                  case 'E':
!                     throw new PSQLException("postgresql.con.backend", pg_stream.ReceiveString(encoding));
                  default:
!                     throw new PSQLException("postgresql.con.setup");
              }
          }
          while (beresp == 'N');
--- 328,337 ----
                      addWarning(pg_stream.ReceiveString(encoding));
                      break;
                  case 'E':
!                     throw new PSQLException("postgresql.con.backend", PSQLException.unable_to_connect,
!                                             pg_stream.ReceiveString(encoding));
                  default:
!                     throw new PSQLException("postgresql.con.setup", PSQLException.unable_to_connect);
              }
          }
          while (beresp == 'N');
*************** public abstract class AbstractJdbc1Conne
*** 355,367 ****

          if (! resultSet.next())
          {
!             throw new PSQLException("postgresql.con.failed", "failed getting backend encoding");
          }
          String version = resultSet.getString(1);
          dbVersionNumber = extractVersionNumber(version);

          String dbEncoding = resultSet.getString(2);
!         encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
          //In 7.3 we are forced to do a second roundtrip to handle the case
          //where a database may not be running in autocommit mode
          //jdbc by default assumes autocommit is on until setAutoCommit(false)
--- 359,372 ----

          if (! resultSet.next())
          {
!             throw new PSQLException("postgresql.con.failed", PSQLException.unable_to_connect,
!                                     "failed getting backend encoding");
          }
          String version = resultSet.getString(1);
          dbVersionNumber = extractVersionNumber(version);

          String dbEncoding = resultSet.getString(2);
!
          //In 7.3 we are forced to do a second roundtrip to handle the case
          //where a database may not be running in autocommit mode
          //jdbc by default assumes autocommit is on until setAutoCommit(false)
*************** public abstract class AbstractJdbc1Conne
*** 377,386 ****

              //set encoding to be unicode
              encoding = Encoding.getEncoding("UNICODE", null);

              if (!acRset.next())
              {
!                 throw new PSQLException("postgresql.con.failed", "failed getting autocommit status");
              }
              //if autocommit is currently off we need to turn it on
              //note that we will be in a transaction because the select above
--- 382,396 ----

              //set encoding to be unicode
              encoding = Encoding.getEncoding("UNICODE", null);
+             if (info.getProperty("charSet") != null)
+             {
+                 addWarning("Obsolete charSet connection property ignored");
+             }

              if (!acRset.next())
              {
!                 throw new PSQLException("postgresql.con.failed", PSQLException.unable_to_connect,
!                                         "failed getting autocommit status");
              }
              //if autocommit is currently off we need to turn it on
              //note that we will be in a transaction because the select above
*************** public abstract class AbstractJdbc1Conne
*** 391,396 ****
--- 401,424 ----
                  ExecSQL("set autocommit = on; commit;");
              }
          }
+         else
+         {
+             // Try setting the encoding to the requested encoding or backend encoding
+             encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
+
+             if (encoding == null)
+             {
+                 if (info.getProperty("charSet") != null)
+                 {
+                     addWarning("Requested encoding not available in the JVM - using JVM default encoding");
+                 }
+                 else
+                 {
+                     addWarning("Backend encoding unknown or not available in the JVM - using JVM default encoding");
+                 }
+                 encoding = Encoding.defaultEncoding();
+             }
+         }

          // Initialise object handling
          initObjectTypes();
*************** public abstract class AbstractJdbc1Conne
*** 477,483 ****
      {
          if (isClosed())
          {
!             throw new PSQLException("postgresql.con.closed");
          }
          return new QueryExecutor(new String[] {sql}, EMPTY_OBJECT_ARRAY, stat, pg_stream,
(java.sql.Connection)this).execute();
      }
--- 505,511 ----
      {
          if (isClosed())
          {
!             throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection);
          }
          return new QueryExecutor(new String[] {sql}, EMPTY_OBJECT_ARRAY, stat, pg_stream,
(java.sql.Connection)this).execute();
      }
*************** public abstract class AbstractJdbc1Conne
*** 500,506 ****
      {
          if (isClosed())
          {
!             throw new PSQLException("postgresql.con.closed");
          }
          return new QueryExecutor(p_sqlFragments, p_binds, stat, pg_stream, (java.sql.Connection)this).execute();
      }
--- 528,534 ----
      {
          if (isClosed())
          {
!             throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection);
          }
          return new QueryExecutor(p_sqlFragments, p_binds, stat, pg_stream, (java.sql.Connection)this).execute();
      }
*************** public abstract class AbstractJdbc1Conne
*** 695,701 ****
          }
          catch (Exception ex)
          {
!             throw new PSQLException("postgresql.con.creobj", type, ex);
          }

          // should never be reached
--- 723,729 ----
          }
          catch (Exception ex)
          {
!             throw new PSQLException("postgresql.con.creobj", PSQLException.connection_failure, type, ex);
          }

          // should never be reached
*************** public abstract class AbstractJdbc1Conne
*** 744,750 ****
                  return ((Serialize)x).storeObject(o);

              // Thow an exception because the type is unknown
!             throw new PSQLException("postgresql.con.strobj");

          }
          catch (SQLException sx)
--- 772,778 ----
                  return ((Serialize)x).storeObject(o);

              // Thow an exception because the type is unknown
!             throw new PSQLException("postgresql.con.strobj", PSQLException.data_exception);

          }
          catch (SQLException sx)
*************** public abstract class AbstractJdbc1Conne
*** 1117,1123 ****
                      isolationLevelSQL += "SERIALIZABLE";
                      break;
                  default:
!                     throw new PSQLException("postgresql.con.isolevel",
                                              new Integer(isolationLevel));
              }
          }
--- 1145,1151 ----
                      isolationLevelSQL += "SERIALIZABLE";
                      break;
                  default:
!                     throw new PSQLException("postgresql.con.isolevel", PSQLException.inv_transaction_state,
                                              new Integer(isolationLevel));
              }
          }
*************** public abstract class AbstractJdbc1Conne
*** 1154,1160 ****
                  break;

              default:
!                 throw new PSQLException("postgresql.con.isolevel", new Integer(isolationLevel));
          }
          return sb.toString();
      }
--- 1182,1189 ----
                  break;

              default:
!                 throw new PSQLException("postgresql.con.isolevel", PSQLException.inv_transaction_state,
!                                         new Integer(isolationLevel));
          }
          return sb.toString();
      }
Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java,v
retrieving revision 1.7
diff -c -p -r1.7 AbstractJdbc1ResultSet.java
*** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java    2002/10/19 22:10:36    1.7
--- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java    2002/11/25 22:17:48
*************** public abstract class AbstractJdbc1Resul
*** 60,66 ****
      public boolean next() throws SQLException
      {
          if (rows == null)
!             throw new PSQLException("postgresql.con.closed");

          if (++current_row >= rows.size())
              return false;
--- 60,66 ----
      public boolean next() throws SQLException
      {
          if (rows == null)
!             throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection);

          if (++current_row >= rows.size())
              return false;
Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java,v
retrieving revision 1.14
diff -c -p -r1.14 AbstractJdbc1Statement.java
*** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java    2002/11/20 07:34:32    1.14
--- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java    2002/11/25 22:17:48
*************** public abstract class AbstractJdbc1State
*** 1378,1384 ****
                  }
                  else
                  {
!                     throw new PSQLException("postgresql.prep.type");
                  }
                  break;
              case Types.BINARY:
--- 1378,1384 ----
                  }
                  else
                  {
!                     throw new PSQLException("postgresql.prep.type", PSQLException.inv_parameter_type);
                  }
                  break;
              case Types.BINARY:
*************** public abstract class AbstractJdbc1State
*** 1389,1395 ****
                  setString(parameterIndex, ((PGobject)x).getValue(), PG_TEXT);
                  break;
              default:
!                 throw new PSQLException("postgresql.prep.type");
          }
      }

--- 1389,1395 ----
                  setString(parameterIndex, ((PGobject)x).getValue(), PG_TEXT);
                  break;
              default:
!                 throw new PSQLException("postgresql.prep.type", PSQLException.inv_parameter_type);
          }
      }

*************** public abstract class AbstractJdbc1State
*** 1798,1804 ****
      protected void bind(int paramIndex, Object s, String type) throws SQLException
      {
          if (paramIndex < 1 || paramIndex > m_binds.length)
!             throw new PSQLException("postgresql.prep.range");
          if (paramIndex == 1 && isFunction) // need to registerOut instead
              throw new PSQLException ("postgresql.call.funcover");
          m_binds[paramIndex - 1] = s;
--- 1798,1804 ----
      protected void bind(int paramIndex, Object s, String type) throws SQLException
      {
          if (paramIndex < 1 || paramIndex > m_binds.length)
!             throw new PSQLException("postgresql.prep.range", PSQLException.parameter_mismatch);
          if (paramIndex == 1 && isFunction) // need to registerOut instead
              throw new PSQLException ("postgresql.call.funcover");
          m_binds[paramIndex - 1] = s;
Index: src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v
retrieving revision 1.2
diff -c -p -r1.2 AbstractJdbc2Connection.java
*** src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java    2002/09/06 21:23:06    1.2
--- src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java    2002/11/25 22:17:48
*************** public abstract class AbstractJdbc2Conne
*** 64,74 ****
              // Added by Peter Mount <peter@retep.org.uk>
              // ConnectException is thrown when the connection cannot be made.
              // we trap this an return a more meaningful message for the end user
!             throw new PSQLException ("postgresql.con.refused");
          }
          catch (IOException e)
          {
!             throw new PSQLException ("postgresql.con.failed", e);
          }

          // Now we need to construct and send a cancel packet
--- 64,74 ----
              // Added by Peter Mount <peter@retep.org.uk>
              // ConnectException is thrown when the connection cannot be made.
              // we trap this an return a more meaningful message for the end user
!             throw new PSQLException ("postgresql.con.refused", PSQLException.connection_rejected);
          }
          catch (IOException e)
          {
!             throw new PSQLException ("postgresql.con.failed", PSQLException.unable_to_connect, e);
          }

          // Now we need to construct and send a cancel packet
*************** public abstract class AbstractJdbc2Conne
*** 82,88 ****
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.con.failed", e);
          }
          finally
          {
--- 82,88 ----
          }
          catch (IOException e)
          {
!             throw new PSQLException("postgresql.con.failed", PSQLException.comm_link_error, e);
          }
          finally
          {
Index: src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v
retrieving revision 1.10
diff -c -p -r1.10 AbstractJdbc2ResultSet.java
*** src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java    2002/11/04 06:42:33    1.10
--- src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java    2002/11/25 22:17:48
*************** public abstract class AbstractJdbc2Resul
*** 399,405 ****
      public Ref getRef(int i) throws SQLException
      {
          //The backend doesn't yet have SQL3 REF types
!         throw new PSQLException("postgresql.psqlnotimp");
      }


--- 399,405 ----
      public Ref getRef(int i) throws SQLException
      {
          //The backend doesn't yet have SQL3 REF types
!         throw new PSQLException("postgresql.psqlnotimp", PSQLException.feature_not_supported);
      }


*************** public abstract class AbstractJdbc2Resul
*** 491,497 ****

      public void setFetchDirection(int direction) throws SQLException
      {
!         throw new PSQLException("postgresql.psqlnotimp");
      }


--- 491,497 ----

      public void setFetchDirection(int direction) throws SQLException
      {
!         throw new PSQLException("postgresql.psqlnotimp", PSQLException.feature_not_supported);
      }


*************** public abstract class AbstractJdbc2Resul
*** 750,756 ****
          }
          catch (IOException ie)
          {
!             throw new PSQLException("postgresql.updateable.ioerror" + ie);
          }

          updateValue(columnIndex, theData);
--- 750,756 ----
          }
          catch (IOException ie)
          {
!             throw new PSQLException("postgresql.updateable.ioerror", ie);
          }

          updateValue(columnIndex, theData);
*************** public abstract class AbstractJdbc2Resul
*** 784,790 ****
          }
          catch (IOException ie)
          {
!             throw new PSQLException("postgresql.updateable.ioerror" + ie);
          }
          updateValue(columnIndex, theData);

--- 784,790 ----
          }
          catch (IOException ie)
          {
!             throw new PSQLException("postgresql.updateable.ioerror", ie);
          }
          updateValue(columnIndex, theData);

*************** public abstract class AbstractJdbc2Resul
*** 832,838 ****
          }
          catch (IOException ie)
          {
!             throw new PSQLException("postgresql.updateable.ioerror" + ie);
          }
          updateValue(columnIndex, theData);
      }
--- 832,838 ----
          }
          catch (IOException ie)
          {
!             throw new PSQLException("postgresql.updateable.ioerror", ie);
          }
          updateValue(columnIndex, theData);
      }
Index: src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v
retrieving revision 1.9
diff -c -p -r1.9 AbstractJdbc2Statement.java
*** src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java    2002/11/20 07:34:32    1.9
--- src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java    2002/11/25 22:17:48
*************** public abstract class AbstractJdbc2State
*** 128,134 ****

      public int getFetchDirection() throws SQLException
      {
!         throw new PSQLException("postgresql.psqlnotimp");
      }

      public int getFetchSize() throws SQLException
--- 128,134 ----

      public int getFetchDirection() throws SQLException
      {
!         throw new PSQLException("postgresql.psqlnotimp", PSQLException.feature_not_supported);
      }

      public int getFetchSize() throws SQLException
Index: src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java,v
retrieving revision 1.2
diff -c -p -r1.2 AbstractJdbc3DatabaseMetaData.java
*** src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java    2002/09/06 21:23:06    1.2
--- src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java    2002/11/25 22:17:49
*************** public abstract class AbstractJdbc3Datab
*** 323,329 ****
       */
      public int getSQLStateType() throws SQLException
      {
!         throw org.postgresql.Driver.notImplemented();
      }

      /**
--- 323,329 ----
       */
      public int getSQLStateType() throws SQLException
      {
!         return DatabaseMetaData.sqlStateXOpen;
      }

      /**
Index: src/interfaces/jdbc/org/postgresql/util/PSQLException.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/util/PSQLException.java,v
retrieving revision 1.7
diff -c -p -r1.7 PSQLException.java
*** src/interfaces/jdbc/org/postgresql/util/PSQLException.java    2001/11/19 22:33:39    1.7
--- src/interfaces/jdbc/org/postgresql/util/PSQLException.java    2002/11/25 22:17:51
*************** public class PSQLException extends SQLEx
*** 11,16 ****
--- 11,33 ----
      private String message;

      /*
+      * PSQLState constants
+      *
+      * Using the constants make the code more legible.
+      */
+
+     public static final PSQLState parameter_mismatch = new PSQLState("07001");
+     public static final PSQLState inv_parameter_type = new PSQLState("07006");
+     public static final PSQLState unable_to_connect = new PSQLState("08001");
+     public static final PSQLState inexistent_connection = new PSQLState("08003");
+     public static final PSQLState connection_rejected = new PSQLState("08004");
+     public static final PSQLState connection_failure = new PSQLState("08006");
+     public static final PSQLState comm_link_error = new PSQLState("08S01");
+     public static final PSQLState feature_not_supported = new PSQLState("0A000");
+     public static final PSQLState data_exception = new PSQLState("22000");
+     public static final PSQLState inv_transaction_state = new PSQLState("25000");
+
+     /*
       * This provides the same functionality to SQLException
       * @param error Error string
       */
*************** public class PSQLException extends SQLEx
*** 21,26 ****
--- 38,54 ----
      }

      /*
+      * Like the above, but sets SQLState
+      * @param error Error string
+      * @param sqlstate PSQLState constant
+      */
+     public PSQLException(String error, PSQLState sqlstate)
+     {
+         super("", sqlstate.toString());
+         translate(error, null);
+     }
+
+     /*
       * A more generic entry point.
       * @param error Error string or standard message id
       * @param args Array of arguments
*************** public class PSQLException extends SQLEx
*** 74,84 ****
--- 102,155 ----
      }

      /*
+      * Like the above, but sets the SQLState
+      */
+     public PSQLException(String error, PSQLState sqlstate, Exception ex)
+     {
+         super("", sqlstate.toString());
+
+         Object[] argv = new Object[1];
+
+         try
+         {
+             ByteArrayOutputStream baos = new ByteArrayOutputStream();
+             PrintWriter pw = new PrintWriter(baos);
+             pw.println("Exception: " + ex.toString() + "\nStack Trace:\n");
+             ex.printStackTrace(pw);
+             pw.println("End of Stack Trace");
+             pw.flush();
+             argv[0] = baos.toString();
+             pw.close();
+             baos.close();
+         }
+         catch (Exception ioe)
+         {
+             argv[0] = ex.toString() + "\nIO Error on stack trace generation! " + ioe.toString();
+         }
+
+         translate(error, argv);
+     }
+
+     /*
       * Helper version for 2 args
       */
      public PSQLException(String error, Object arg1, Object arg2)
      {
          super();
+         Object[] argv = new Object[2];
+         argv[0] = arg1;
+         argv[1] = arg2;
+         translate(error, argv);
+     }
+
+     /*
+      * Like the above, but sets SQLState
+      * @param error Error string
+      * @param sqlstate PSQLState constant
+      */
+     public PSQLException(String error, PSQLState sqlstate, Object arg1, Object arg2)
+     {
+         super("", sqlstate.toString());
          Object[] argv = new Object[2];
          argv[0] = arg1;
          argv[1] = arg2;

В списке pgsql-patches по дате отправления:

Предыдущее
От: Fernando Nasser
Дата:
Сообщение: JDBC Issue warning if could not find encoding
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Resultmap for FreeBSD 4.7