*** ./interfaces/jdbc/org/postgresql/Connection.java.orig Tue Jul 31 22:15:43 2001 --- ./interfaces/jdbc/org/postgresql/Connection.java Wed Aug 1 20:34:17 2001 *************** *** 37,42 **** --- 37,45 ---- */ private Encoding encoding = Encoding.defaultEncoding(); + private String dbVersionLong; + private String dbVersionNumber; + public boolean CONNECTION_OK = true; public boolean CONNECTION_BAD = false; *************** *** 262,279 **** // used, so we denote this with 'UNKNOWN'. final String encodingQuery = ! "select case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN' else getdatabaseencoding() end"; // Set datestyle and fetch db encoding in a single call, to avoid making // more than one round trip to the backend during connection startup. java.sql.ResultSet resultSet = ! ExecSQL("set datestyle to 'ISO'; " + encodingQuery); if (! resultSet.next()) { throw new PSQLException("postgresql.con.failed", "failed getting backend encoding"); } ! dbEncoding = resultSet.getString(1); encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet")); // Initialise object handling --- 265,283 ---- // used, so we denote this with 'UNKNOWN'. final String encodingQuery = ! "case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN' else getdatabaseencoding() end"; // Set datestyle and fetch db encoding in a single call, to avoid making // more than one round trip to the backend during connection startup. java.sql.ResultSet resultSet = ! ExecSQL("set datestyle to 'ISO'; select version(), " + encodingQuery + ";"); if (! resultSet.next()) { throw new PSQLException("postgresql.con.failed", "failed getting backend encoding"); } ! dbVersionLong = resultSet.getString(1); ! dbEncoding = resultSet.getString(2); encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet")); // Initialise object handling *************** *** 904,911 **** if (autoCommit) ExecSQL("end"); else { ! ExecSQL("begin"); ! doIsolationLevel(); } this.autoCommit = autoCommit; } --- 908,914 ---- if (autoCommit) ExecSQL("end"); else { ! ExecSQL("begin; " + getIsolationLevelSQL()); } this.autoCommit = autoCommit; } *************** *** 934,944 **** public void commit() throws SQLException { if (autoCommit) return; ! ExecSQL("commit"); ! autoCommit = true; ! ExecSQL("begin"); ! doIsolationLevel(); ! autoCommit = false; } /** --- 937,943 ---- public void commit() throws SQLException { if (autoCommit) return; ! ExecSQL("commit; begin; " + getIsolationLevelSQL()); } /** *************** *** 952,962 **** public void rollback() throws SQLException { if (autoCommit) return; ! ExecSQL("rollback"); ! autoCommit = true; ! ExecSQL("begin"); ! doIsolationLevel(); ! autoCommit = false; } /** --- 951,957 ---- public void rollback() throws SQLException { if (autoCommit) return; ! ExecSQL("rollback; begin; " + getIsolationLevelSQL()); } /** *************** *** 988,994 **** /** * You can call this method to try to change the transaction * isolation level using one of the TRANSACTION_* values. ! * * Note: setTransactionIsolation cannot be called while * in the middle of a transaction * --- 983,989 ---- /** * You can call this method to try to change the transaction * isolation level using one of the TRANSACTION_* values. ! * * Note: setTransactionIsolation cannot be called while * in the middle of a transaction * *************** *** 999,1027 **** * @see java.sql.DatabaseMetaData#supportsTransactionIsolationLevel */ public void setTransactionIsolation(int level) throws SQLException { ! isolationLevel = level; ! doIsolationLevel(); } /** * Helper method used by setTransactionIsolation(), commit(), rollback() ! * and setAutoCommit(). This sets the current isolation level. ! */ ! protected void doIsolationLevel() throws SQLException { String q = "SET TRANSACTION ISOLATION LEVEL"; switch(isolationLevel) { case java.sql.Connection.TRANSACTION_READ_COMMITTED: ! ExecSQL(q + " READ COMMITTED"); ! return; case java.sql.Connection.TRANSACTION_SERIALIZABLE: ! ExecSQL(q + " SERIALIZABLE"); ! return; default: throw new PSQLException("postgresql.con.isolevel",new Integer(isolationLevel)); } } /** --- 994,1060 ---- * @see java.sql.DatabaseMetaData#supportsTransactionIsolationLevel */ public void setTransactionIsolation(int level) throws SQLException { ! //In 7.1 and later versions of the server it is possible using ! //the "set session" command to set this once for all future txns ! //however in 7.0 and prior versions it is necessary to set it in ! //each transaction, thus adding complexity below. ! //When we decide to drop support for servers older than 7.1 ! //this can be simplified ! isolationLevel = level; ! String isolationLevelSQL; ! switch(isolationLevel) { ! case java.sql.Connection.TRANSACTION_READ_COMMITTED: ! if (haveMinimumServerVersion("7.1")) { ! isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED"; ! } else { ! isolationLevelSQL = getIsolationLevelSQL(); ! } ! break; ! ! case java.sql.Connection.TRANSACTION_SERIALIZABLE: ! if (haveMinimumServerVersion("7.1")) { ! isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE"; ! } else { ! isolationLevelSQL = getIsolationLevelSQL(); ! } ! break; ! ! default: ! throw new PSQLException("postgresql.con.isolevel",new Integer(isolationLevel)); ! } ! ExecSQL(isolationLevelSQL); } /** * Helper method used by setTransactionIsolation(), commit(), rollback() ! * and setAutoCommit(). This returns the SQL string needed to ! * set the isolation level for a transaction. In 7.1 and later it ! * is possible to set a default isolation level that applies to all ! * future transactions, this method is only necesary for 7.0 and older ! * servers, and should be removed when support for these older ! * servers are dropped ! */ ! protected String getIsolationLevelSQL() throws SQLException { ! //7.1 and higher servers have a default specified so ! //no additional SQL is required to set the isolation level ! if (haveMinimumServerVersion("7.1")) { ! return ""; ! } String q = "SET TRANSACTION ISOLATION LEVEL"; switch(isolationLevel) { case java.sql.Connection.TRANSACTION_READ_COMMITTED: ! q = q + " READ COMMITTED"; ! break; case java.sql.Connection.TRANSACTION_SERIALIZABLE: ! q = q + " SERIALIZABLE"; ! break; default: throw new PSQLException("postgresql.con.isolevel",new Integer(isolationLevel)); } + return q; } /** *************** *** 1033,1045 **** */ public void setCatalog(String catalog) throws SQLException { ! if(catalog!=null && !catalog.equals(PG_DATABASE)) { ! close(); ! Properties info=new Properties(); ! info.setProperty("user", PG_USER); ! info.setProperty("password", PG_PASSWORD); ! openConnection(PG_HOST, PG_PORT, info, catalog, this_url, this_driver); ! } } /** --- 1066,1072 ---- */ public void setCatalog(String catalog) throws SQLException { ! //no-op } /** *************** *** 1095,1098 **** --- 1122,1152 ---- return sql; } + /** + * What is the version of the server + * + * @return the database version + * @exception SQLException if a database access error occurs + */ + public String getDBVersionNumber() throws SQLException + { + if(dbVersionNumber == null) { + StringTokenizer versionParts = new StringTokenizer(dbVersionLong); + versionParts.nextToken(); /* "PostgreSQL" */ + dbVersionNumber = versionParts.nextToken(); /* "X.Y.Z" */ + } + return dbVersionNumber; + } + + public boolean haveMinimumServerVersion(String ver) throws SQLException + { + if (getDBVersionNumber().compareTo(ver)>=0) + return true; + else + return false; + } + + + } + *** ./interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java.orig Wed Aug 1 20:14:50 2001 --- ./interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java Wed Aug 1 20:17:53 2001 *************** *** 47,61 **** private static final byte defaultRemarks[]="no remarks".getBytes(); - private boolean haveMinimumServerVersion(String ver) throws SQLException - { - if (getDatabaseProductVersion().compareTo(ver)>=0) - return true; - else - return false; - } - - public DatabaseMetaData(Connection conn) { this.connection = conn; --- 47,52 ---- *************** *** 126,132 **** */ public boolean nullsAreSortedHigh() throws SQLException { ! return haveMinimumServerVersion("7.2"); } /** --- 117,123 ---- */ public boolean nullsAreSortedHigh() throws SQLException { ! return connection.haveMinimumServerVersion("7.2"); } /** *************** *** 159,165 **** */ public boolean nullsAreSortedAtEnd() throws SQLException { ! return ! haveMinimumServerVersion("7.2"); } /** --- 150,156 ---- */ public boolean nullsAreSortedAtEnd() throws SQLException { ! return ! connection.haveMinimumServerVersion("7.2"); } /** *************** *** 182,195 **** */ public String getDatabaseProductVersion() throws SQLException { ! java.sql.ResultSet resultSet = connection.ExecSQL("select version()"); ! resultSet.next(); ! ! StringTokenizer versionParts = new StringTokenizer(resultSet.getString(1)); ! versionParts.nextToken(); /* "PostgreSQL" */ ! String versionNumber = versionParts.nextToken(); /* "X.Y.Z" */ ! ! return versionNumber; } /** --- 173,179 ---- */ public String getDatabaseProductVersion() throws SQLException { ! return connection.getDBVersionNumber(); } /** *************** *** 558,564 **** */ public boolean supportsOrderByUnrelated() throws SQLException { ! return haveMinimumServerVersion("6.4"); } /** --- 542,548 ---- */ public boolean supportsOrderByUnrelated() throws SQLException { ! return connection.haveMinimumServerVersion("6.4"); } /** *************** *** 581,587 **** */ public boolean supportsGroupByUnrelated() throws SQLException { ! return haveMinimumServerVersion("6.4"); } /** --- 565,571 ---- */ public boolean supportsGroupByUnrelated() throws SQLException { ! return connection.haveMinimumServerVersion("6.4"); } /** *************** *** 608,614 **** */ public boolean supportsLikeEscapeClause() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 592,598 ---- */ public boolean supportsLikeEscapeClause() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 749,755 **** */ public boolean supportsOuterJoins() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 733,739 ---- */ public boolean supportsOuterJoins() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 761,767 **** */ public boolean supportsFullOuterJoins() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 745,751 ---- */ public boolean supportsFullOuterJoins() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 976,982 **** */ public boolean supportsSelectForUpdate() throws SQLException { ! return haveMinimumServerVersion("6.5"); } /** --- 960,966 ---- */ public boolean supportsSelectForUpdate() throws SQLException { ! return connection.haveMinimumServerVersion("6.5"); } /** *************** *** 1053,1059 **** */ public boolean supportsCorrelatedSubqueries() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 1037,1043 ---- */ public boolean supportsCorrelatedSubqueries() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 1075,1081 **** */ public boolean supportsUnionAll() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 1059,1065 ---- */ public boolean supportsUnionAll() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 1303,1309 **** */ public int getMaxRowSize() throws SQLException { ! if (haveMinimumServerVersion("7.1")) return 1073741824; // 1 GB else return 8192; // XXX could be altered --- 1287,1293 ---- */ public int getMaxRowSize() throws SQLException { ! if (connection.haveMinimumServerVersion("7.1")) return 1073741824; // 1 GB else return 8192; // XXX could be altered *************** *** 1329,1335 **** */ public int getMaxStatementLength() throws SQLException { ! if (haveMinimumServerVersion("7.0")) return 0; // actually whatever fits in size_t else return 16384; --- 1313,1319 ---- */ public int getMaxStatementLength() throws SQLException { ! if (connection.haveMinimumServerVersion("7.0")) return 0; // actually whatever fits in size_t else return 16384; *** ./interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java.orig Tue Jul 31 22:16:25 2001 --- ./interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java Tue Jul 31 21:29:44 2001 *************** *** 47,61 **** private static final byte defaultRemarks[]="no remarks".getBytes(); - private boolean haveMinimumServerVersion(String ver) throws SQLException - { - if (getDatabaseProductVersion().compareTo(ver)>=0) - return true; - else - return false; - } - - public DatabaseMetaData(Connection conn) { this.connection = conn; --- 47,52 ---- *************** *** 126,132 **** */ public boolean nullsAreSortedHigh() throws SQLException { ! return haveMinimumServerVersion("7.2"); } /** --- 117,123 ---- */ public boolean nullsAreSortedHigh() throws SQLException { ! return connection.haveMinimumServerVersion("7.2"); } /** *************** *** 159,165 **** */ public boolean nullsAreSortedAtEnd() throws SQLException { ! return ! haveMinimumServerVersion("7.2"); } /** --- 150,156 ---- */ public boolean nullsAreSortedAtEnd() throws SQLException { ! return ! connection.haveMinimumServerVersion("7.2"); } /** *************** *** 182,195 **** */ public String getDatabaseProductVersion() throws SQLException { ! java.sql.ResultSet resultSet = connection.ExecSQL("select version()"); ! resultSet.next(); ! ! StringTokenizer versionParts = new StringTokenizer(resultSet.getString(1)); ! versionParts.nextToken(); /* "PostgreSQL" */ ! String versionNumber = versionParts.nextToken(); /* "X.Y.Z" */ ! ! return versionNumber; } /** --- 173,179 ---- */ public String getDatabaseProductVersion() throws SQLException { ! return connection.getDBVersionNumber(); } /** *************** *** 558,564 **** */ public boolean supportsOrderByUnrelated() throws SQLException { ! return haveMinimumServerVersion("6.4"); } /** --- 542,548 ---- */ public boolean supportsOrderByUnrelated() throws SQLException { ! return connection.haveMinimumServerVersion("6.4"); } /** *************** *** 581,587 **** */ public boolean supportsGroupByUnrelated() throws SQLException { ! return haveMinimumServerVersion("6.4"); } /** --- 565,571 ---- */ public boolean supportsGroupByUnrelated() throws SQLException { ! return connection.haveMinimumServerVersion("6.4"); } /** *************** *** 608,614 **** */ public boolean supportsLikeEscapeClause() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 592,598 ---- */ public boolean supportsLikeEscapeClause() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 749,755 **** */ public boolean supportsOuterJoins() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 733,739 ---- */ public boolean supportsOuterJoins() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 761,767 **** */ public boolean supportsFullOuterJoins() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 745,751 ---- */ public boolean supportsFullOuterJoins() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 976,982 **** */ public boolean supportsSelectForUpdate() throws SQLException { ! return haveMinimumServerVersion("6.5"); } /** --- 960,966 ---- */ public boolean supportsSelectForUpdate() throws SQLException { ! return connection.haveMinimumServerVersion("6.5"); } /** *************** *** 1053,1059 **** */ public boolean supportsCorrelatedSubqueries() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 1037,1043 ---- */ public boolean supportsCorrelatedSubqueries() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 1075,1081 **** */ public boolean supportsUnionAll() throws SQLException { ! return haveMinimumServerVersion("7.1"); } /** --- 1059,1065 ---- */ public boolean supportsUnionAll() throws SQLException { ! return connection.haveMinimumServerVersion("7.1"); } /** *************** *** 1303,1309 **** */ public int getMaxRowSize() throws SQLException { ! if (haveMinimumServerVersion("7.1")) return 1073741824; // 1 GB else return 8192; // XXX could be altered --- 1287,1293 ---- */ public int getMaxRowSize() throws SQLException { ! if (connection.haveMinimumServerVersion("7.1")) return 1073741824; // 1 GB else return 8192; // XXX could be altered *************** *** 1329,1335 **** */ public int getMaxStatementLength() throws SQLException { ! if (haveMinimumServerVersion("7.0")) return 0; // actually whatever fits in size_t else return 16384; --- 1313,1319 ---- */ public int getMaxStatementLength() throws SQLException { ! if (connection.haveMinimumServerVersion("7.0")) return 0; // actually whatever fits in size_t else return 16384;