diff --git a/src/interfaces/jdbc/example/ImageViewer.java b/src/interfaces/jdbc/example/ImageViewer.java index 9540bfa67edaafc5c19adf39638db0c36aea39de..f61a8870e7be88c0e336b4bd0ed838bef5806a5b 100644 --- a/src/interfaces/jdbc/example/ImageViewer.java +++ b/src/interfaces/jdbc/example/ImageViewer.java @@ -291,7 +291,6 @@ public class ImageViewer implements ItemListener public void run() { - // Now the real import stuff if (name != null && dir != null) { diff --git a/src/interfaces/jdbc/example/Unicode.java b/src/interfaces/jdbc/example/Unicode.java index 0d84c719a509ae9038dea8607d865c3eb6eefbf2..2312742235ba8224a2fcee0ef3afecfcb59b8671 100644 --- a/src/interfaces/jdbc/example/Unicode.java +++ b/src/interfaces/jdbc/example/Unicode.java @@ -214,21 +214,21 @@ public class Unicode { switch (mode) { - case CREATE: - log("Exception creating database", sqle); - break; - case INSERT: - log("Exception inserting block " + blockNum, sqle); - break; - case SELECT: - log("Exception selecting block " + blockNum, sqle); - break; - case LIKE: - log("Exception doing LIKE on block " + blockNum, sqle); - break; - default: - log("Exception", sqle); - break; + case CREATE: + log("Exception creating database", sqle); + break; + case INSERT: + log("Exception inserting block " + blockNum, sqle); + break; + case SELECT: + log("Exception selecting block " + blockNum, sqle); + break; + case LIKE: + log("Exception doing LIKE on block " + blockNum, sqle); + break; + default: + log("Exception", sqle); + break; } } catch (ClassNotFoundException cnfe) diff --git a/src/interfaces/jdbc/example/basic.java b/src/interfaces/jdbc/example/basic.java index 61b35abc4590579f8183e579ef8bf60216d13e5b..f01cb9cb8c572ea4e8962343581feefc85d88389 100644 --- a/src/interfaces/jdbc/example/basic.java +++ b/src/interfaces/jdbc/example/basic.java @@ -6,7 +6,7 @@ import java.text.*; /* * - * $Id: basic.java,v 1.9 2001/11/19 22:43:13 momjian Exp $ + * $Id: basic.java,v 1.10 2001/11/19 23:16:44 momjian Exp $ * * This example tests the basic components of the JDBC driver, and shows * how even the simplest of queries can be implemented. @@ -137,6 +137,7 @@ public class basic // Now run the query again, showing a more efficient way of getting the // result if you don't know what column number a value is in + System.out.println("performing another query"); rs = st.executeQuery("select * from basic where b>1"); if (rs != null) @@ -163,6 +164,7 @@ public class basic // Now test maxrows by setting it to 3 rows + st.setMaxRows(3); System.out.println("performing a query limited to " + st.getMaxRows()); rs = st.executeQuery("select a, b from basic"); diff --git a/src/interfaces/jdbc/example/blobtest.java b/src/interfaces/jdbc/example/blobtest.java index bfa0cc42959d2981236d0bd42cd99181dcdb36e8..271026250dd63ee646675e9d9f84b13e8ea65326 100644 --- a/src/interfaces/jdbc/example/blobtest.java +++ b/src/interfaces/jdbc/example/blobtest.java @@ -61,7 +61,6 @@ public class blobtest System.out.println("Now closing the connection"); s.close(); db.close(); - } /* @@ -171,7 +170,6 @@ public class blobtest lobj.unlink(oid); } - //======================================================================= // This tests the Blob interface of the JDBC 2.0 specification public void jdbc2api(int oid) throws SQLException, IOException { @@ -218,8 +216,6 @@ public class blobtest db.setAutoCommit(false); } - //======================================================================= - public static void instructions() { System.err.println("java example.blobtest jdbc-url user password [debug]"); diff --git a/src/interfaces/jdbc/example/corba/StockClient.java b/src/interfaces/jdbc/example/corba/StockClient.java index 3ccb28c7fd84cecda877635e93477999dd0a03bd..519bf49f97dde6660a384232512e931c876a63eb 100644 --- a/src/interfaces/jdbc/example/corba/StockClient.java +++ b/src/interfaces/jdbc/example/corba/StockClient.java @@ -9,7 +9,7 @@ import org.omg.CosNaming.*; * * It has no GUI, just a text frontend to keep it simple. * - * $Id: StockClient.java,v 1.3 2001/11/19 22:43:13 momjian Exp $ + * $Id: StockClient.java,v 1.4 2001/11/19 23:16:45 momjian Exp $ */ public class StockClient { @@ -116,29 +116,29 @@ public class StockClient int i = getMenu("Main", 5); switch (i) { - case 0: - run = false; - break; + case 0: + run = false; + break; - case 1: - displayItem(); - break; + case 1: + displayItem(); + break; - case 2: - bookOut(); - break; + case 2: + bookOut(); + break; - case 3: - bookIn(); - break; + case 3: + bookIn(); + break; - case 4: - order(0); - break; + case 4: + order(0); + break; - case 5: - displayAll(); - break; + case 5: + displayAll(); + break; } } } diff --git a/src/interfaces/jdbc/example/datestyle.java b/src/interfaces/jdbc/example/datestyle.java index 6e503552b70d21a98e03c8443f1468fce93ddfa4..4cf40159ca128b4b4143bb870be96e15b764c615 100644 --- a/src/interfaces/jdbc/example/datestyle.java +++ b/src/interfaces/jdbc/example/datestyle.java @@ -9,7 +9,6 @@ import java.text.*; * * To use this example, you need a database to be in existence. This example * will create a table called datestyle. - * */ public class datestyle @@ -105,7 +104,6 @@ public class datestyle ps.setDate(1, standard); ps.executeUpdate(); ps.close(); - } /* diff --git a/src/interfaces/jdbc/example/metadata.java b/src/interfaces/jdbc/example/metadata.java index 6cd2802456c478a285323068df7b657e05b42a60..468af6b959894f43e1770ebbf11aae3321e7313b 100644 --- a/src/interfaces/jdbc/example/metadata.java +++ b/src/interfaces/jdbc/example/metadata.java @@ -218,7 +218,6 @@ public class metadata { if (line.startsWith("\\d")) { - if (line.startsWith("\\d ")) { // Display details about a table diff --git a/src/interfaces/jdbc/example/psql.java b/src/interfaces/jdbc/example/psql.java index 697198ce3a6195f0849cc68462b76f82d3ef1a82..a5af214d57438c2a094d0750595d4990b6a3baf3 100644 --- a/src/interfaces/jdbc/example/psql.java +++ b/src/interfaces/jdbc/example/psql.java @@ -50,7 +50,7 @@ public class psql // Now the main loop. int tt = 0, lineno = 1; while (tt != StreamTokenizer.TT_EOF && ! done) - { // done added by CWJ to permit \q command + { System.out.print("[" + lineno + "] "); System.out.flush(); @@ -72,7 +72,6 @@ public class psql System.out.println("Now closing the connection"); st.close(); db.close(); - } /* diff --git a/src/interfaces/jdbc/example/threadsafe.java b/src/interfaces/jdbc/example/threadsafe.java index ceb1ef8f6f5d3694aebebd782c77d2edcfefd2e3..cca7be75beec695d903e8868091c0fe601315100 100644 --- a/src/interfaces/jdbc/example/threadsafe.java +++ b/src/interfaces/jdbc/example/threadsafe.java @@ -53,7 +53,6 @@ public class threadsafe System.out.println("Now closing the connection"); st.close(); db.close(); - } /* @@ -108,7 +107,6 @@ public class threadsafe System.out.println("Waiting for threads to run"); while (thread1.isAlive() || thread2.isAlive() || thread3.isAlive()) thread0.yield(); - } finally { diff --git a/src/interfaces/jdbc/org/postgresql/Connection.java b/src/interfaces/jdbc/org/postgresql/Connection.java index 239e4dc7d24fc6b51a2574c4f34e8f7195c0b5e8..93bfa677811a5c0d0bd3236ac67fd76db0b88c34 100644 --- a/src/interfaces/jdbc/org/postgresql/Connection.java +++ b/src/interfaces/jdbc/org/postgresql/Connection.java @@ -11,7 +11,7 @@ import org.postgresql.util.*; import org.postgresql.core.*; /* - * $Id: Connection.java,v 1.36 2001/11/19 22:33:37 momjian Exp $ + * $Id: Connection.java,v 1.37 2001/11/19 23:16:45 momjian Exp $ * * This abstract class is used by org.postgresql.Driver to open either the JDBC1 or * JDBC2 versions of the Connection class. @@ -115,7 +115,7 @@ public abstract class Connection this_url = url; PG_DATABASE = database; PG_USER = info.getProperty("user"); - PG_PASSWORD = info.getProperty("password",""); + PG_PASSWORD = info.getProperty("password", ""); PG_PORT = port; PG_HOST = host; PG_STATUS = CONNECTION_BAD; @@ -168,88 +168,88 @@ public abstract class Connection int beresp = pg_stream.ReceiveChar(); switch (beresp) { - case 'E': - // An error occured, so pass the error message to the - // user. - // - // The most common one to be thrown here is: - // "User authentication failed" - // - throw new SQLException(pg_stream.ReceiveString(encoding)); - - case 'R': - // Get the type of request - areq = pg_stream.ReceiveIntegerR(4); - - // Get the crypt password salt if there is one - if (areq == AUTH_REQ_CRYPT) - { - byte[] rst = new byte[2]; - rst[0] = (byte)pg_stream.ReceiveChar(); - rst[1] = (byte)pg_stream.ReceiveChar(); - salt = new String(rst, 0, 2); - DriverManager.println("Crypt salt=" + salt); - } - - // Or get the md5 password salt if there is one - if (areq == AUTH_REQ_MD5) - { - byte[] rst = new byte[4]; - rst[0] = (byte)pg_stream.ReceiveChar(); - rst[1] = (byte)pg_stream.ReceiveChar(); - rst[2] = (byte)pg_stream.ReceiveChar(); - rst[3] = (byte)pg_stream.ReceiveChar(); - salt = new String(rst, 0, 4); - DriverManager.println("MD5 salt=" + salt); - } - - // now send the auth packet - switch (areq) - { - case AUTH_REQ_OK: - break; - - case AUTH_REQ_KRB4: - DriverManager.println("postgresql: KRB4"); - throw new PSQLException("postgresql.con.kerb4"); - - case AUTH_REQ_KRB5: - DriverManager.println("postgresql: KRB5"); - throw new PSQLException("postgresql.con.kerb5"); - - case AUTH_REQ_PASSWORD: - DriverManager.println("postgresql: PASSWORD"); - pg_stream.SendInteger(5 + PG_PASSWORD.length(), 4); - pg_stream.Send(PG_PASSWORD.getBytes()); - pg_stream.SendInteger(0, 1); - pg_stream.flush(); - break; - - case AUTH_REQ_CRYPT: - DriverManager.println("postgresql: CRYPT"); - String crypted = UnixCrypt.crypt(salt, PG_PASSWORD); - pg_stream.SendInteger(5 + crypted.length(), 4); - pg_stream.Send(crypted.getBytes()); - pg_stream.SendInteger(0, 1); - pg_stream.flush(); - break; - - case AUTH_REQ_MD5: - DriverManager.println("postgresql: MD5"); - byte[] digest = MD5Digest.encode(PG_USER, PG_PASSWORD, salt); - pg_stream.SendInteger(5 + digest.length, 4); - pg_stream.Send(digest); - pg_stream.SendInteger(0, 1); - pg_stream.flush(); + case 'E': + // An error occured, so pass the error message to the + // user. + // + // The most common one to be thrown here is: + // "User authentication failed" + // + throw new SQLException(pg_stream.ReceiveString(encoding)); + + case 'R': + // Get the type of request + areq = pg_stream.ReceiveIntegerR(4); + + // Get the crypt password salt if there is one + if (areq == AUTH_REQ_CRYPT) + { + byte[] rst = new byte[2]; + rst[0] = (byte)pg_stream.ReceiveChar(); + rst[1] = (byte)pg_stream.ReceiveChar(); + salt = new String(rst, 0, 2); + DriverManager.println("Crypt salt=" + salt); + } + + // Or get the md5 password salt if there is one + if (areq == AUTH_REQ_MD5) + { + byte[] rst = new byte[4]; + rst[0] = (byte)pg_stream.ReceiveChar(); + rst[1] = (byte)pg_stream.ReceiveChar(); + rst[2] = (byte)pg_stream.ReceiveChar(); + rst[3] = (byte)pg_stream.ReceiveChar(); + salt = new String(rst, 0, 4); + DriverManager.println("MD5 salt=" + salt); + } + + // now send the auth packet + switch (areq) + { + case AUTH_REQ_OK: + break; + + case AUTH_REQ_KRB4: + DriverManager.println("postgresql: KRB4"); + throw new PSQLException("postgresql.con.kerb4"); + + case AUTH_REQ_KRB5: + DriverManager.println("postgresql: KRB5"); + throw new PSQLException("postgresql.con.kerb5"); + + case AUTH_REQ_PASSWORD: + DriverManager.println("postgresql: PASSWORD"); + pg_stream.SendInteger(5 + PG_PASSWORD.length(), 4); + pg_stream.Send(PG_PASSWORD.getBytes()); + pg_stream.SendInteger(0, 1); + pg_stream.flush(); + break; + + case AUTH_REQ_CRYPT: + DriverManager.println("postgresql: CRYPT"); + String crypted = UnixCrypt.crypt(salt, PG_PASSWORD); + pg_stream.SendInteger(5 + crypted.length(), 4); + pg_stream.Send(crypted.getBytes()); + pg_stream.SendInteger(0, 1); + pg_stream.flush(); + break; + + case AUTH_REQ_MD5: + DriverManager.println("postgresql: MD5"); + byte[] digest = MD5Digest.encode(PG_USER, PG_PASSWORD, salt); + pg_stream.SendInteger(5 + digest.length, 4); + pg_stream.Send(digest); + pg_stream.SendInteger(0, 1); + pg_stream.flush(); + break; + + default: + throw new PSQLException("postgresql.con.auth", new Integer(areq)); + } break; default: - throw new PSQLException("postgresql.con.auth", new Integer(areq)); - } - break; - - default: - throw new PSQLException("postgresql.con.authfail"); + throw new PSQLException("postgresql.con.authfail"); } } while (areq != AUTH_REQ_OK); @@ -265,28 +265,28 @@ public abstract class Connection int beresp = pg_stream.ReceiveChar(); switch (beresp) { - case 'K': - pid = pg_stream.ReceiveInteger(4); - ckey = pg_stream.ReceiveInteger(4); - break; - case 'E': - case 'N': - throw new SQLException(pg_stream.ReceiveString(encoding)); - default: - throw new PSQLException("postgresql.con.setup"); + case 'K': + pid = pg_stream.ReceiveInteger(4); + ckey = pg_stream.ReceiveInteger(4); + break; + case 'E': + case 'N': + throw new SQLException(pg_stream.ReceiveString(encoding)); + default: + throw new PSQLException("postgresql.con.setup"); } // Expect ReadyForQuery packet beresp = pg_stream.ReceiveChar(); switch (beresp) { - case 'Z': - break; - case 'E': - case 'N': - throw new SQLException(pg_stream.ReceiveString(encoding)); - default: - throw new PSQLException("postgresql.con.setup"); + case 'Z': + break; + case 'E': + case 'N': + throw new SQLException(pg_stream.ReceiveString(encoding)); + default: + throw new PSQLException("postgresql.con.setup"); } firstWarning = null; @@ -958,15 +958,15 @@ public abstract class Connection isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL "; switch (isolationLevel) { - case java.sql.Connection.TRANSACTION_READ_COMMITTED: - isolationLevelSQL += "READ COMMITTED"; - break; - case java.sql.Connection.TRANSACTION_SERIALIZABLE: - isolationLevelSQL += "SERIALIZABLE"; - break; - default: - throw new PSQLException("postgresql.con.isolevel", - new Integer(isolationLevel)); + case java.sql.Connection.TRANSACTION_READ_COMMITTED: + isolationLevelSQL += "READ COMMITTED"; + break; + case java.sql.Connection.TRANSACTION_SERIALIZABLE: + isolationLevelSQL += "SERIALIZABLE"; + break; + default: + throw new PSQLException("postgresql.con.isolevel", + new Integer(isolationLevel)); } } ExecSQL(isolationLevelSQL); @@ -993,16 +993,16 @@ public abstract class Connection switch (isolationLevel) { - case java.sql.Connection.TRANSACTION_READ_COMMITTED: - sb.append(" READ COMMITTED"); - break; + case java.sql.Connection.TRANSACTION_READ_COMMITTED: + sb.append(" READ COMMITTED"); + break; - case java.sql.Connection.TRANSACTION_SERIALIZABLE: - sb.append(" SERIALIZABLE"); - break; + case java.sql.Connection.TRANSACTION_SERIALIZABLE: + sb.append(" SERIALIZABLE"); + break; - default: - throw new PSQLException("postgresql.con.isolevel", new Integer(isolationLevel)); + default: + throw new PSQLException("postgresql.con.isolevel", new Integer(isolationLevel)); } return sb.toString(); } @@ -1166,6 +1166,5 @@ public abstract class Connection } return pgType; } - } diff --git a/src/interfaces/jdbc/org/postgresql/PG_Stream.java b/src/interfaces/jdbc/org/postgresql/PG_Stream.java index 488edecdf0228befcb2b8680b8433ab0fddd5355..9a85df8a256d3f90e437de7d0e4630c890447bd8 100644 --- a/src/interfaces/jdbc/org/postgresql/PG_Stream.java +++ b/src/interfaces/jdbc/org/postgresql/PG_Stream.java @@ -10,7 +10,7 @@ import org.postgresql.core.*; import org.postgresql.util.*; /* - * $Id: PG_Stream.java,v 1.15 2001/11/19 22:33:37 momjian Exp $ + * $Id: PG_Stream.java,v 1.16 2001/11/19 23:16:45 momjian Exp $ * * This class is used by Connection & PGlobj for communicating with the * backend. @@ -371,5 +371,4 @@ public class PG_Stream pg_input.close(); connection.close(); } - } diff --git a/src/interfaces/jdbc/org/postgresql/PostgresqlDataSource.java b/src/interfaces/jdbc/org/postgresql/PostgresqlDataSource.java index 65c110be21bcf3ea59b1c6ccefb62c6161826684..3b37f790cf58b301db2afa0a3b2fe36f68e0229c 100644 --- a/src/interfaces/jdbc/org/postgresql/PostgresqlDataSource.java +++ b/src/interfaces/jdbc/org/postgresql/PostgresqlDataSource.java @@ -40,7 +40,7 @@ * * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved. * -* $Id: PostgresqlDataSource.java,v 1.4 2001/11/19 22:33:37 momjian Exp $ +* $Id: PostgresqlDataSource.java,v 1.5 2001/11/19 23:16:45 momjian Exp $ */ @@ -133,38 +133,32 @@ public class PostgresqlDataSource */ private int _loginTimeout; - /* * Holds the user's account name. */ private String _user; - /* * Holds the database password. */ private String _password; - /* * Holds the name of the particular database on the server. */ private String _databaseName; - /* * Description of this datasource. */ private String _description = "PostgreSQL DataSource"; - /* * Holds the database server name. If null, this is * assumed to be the localhost. */ private String _serverName; - /* * Holds the port number where a server is listening. * The default value will open a connection with an @@ -172,7 +166,6 @@ public class PostgresqlDataSource */ private int _portNumber = DEFAULT_PORT; - /* * The default port number. Since we open the connection * without specifying the port if it's the default one, @@ -180,7 +173,6 @@ public class PostgresqlDataSource */ private static final int DEFAULT_PORT = 0; - /* * Holds the log writer to which all messages should be * printed. The default writer is obtained from the driver @@ -189,7 +181,6 @@ public class PostgresqlDataSource */ private transient PrintWriter _logWriter; - /* * Each datasource maintains it's own driver, in case of * driver-specific setup (e.g. pools, log writer). @@ -197,9 +188,6 @@ public class PostgresqlDataSource // FIXME // private transient postgresql.Driver _driver; private transient org.postgresql.Driver _driver; - //--------- - - public PostgresqlDataSource() { @@ -233,12 +221,10 @@ public class PostgresqlDataSource // FIXME // _driver = new postgresql.Driver(); _driver = new org.postgresql.Driver(); - //----------- //FIXME // _driver.setLogWriter( _logWriter ); // Method seems to be unavailable. Just commented it out. - //---------- } catch ( SQLException except ) { @@ -282,7 +268,6 @@ public class PostgresqlDataSource // if ( ! ( conn instanceof postgresql.jdbc2.Connection ) ) { if ( ! ( conn instanceof org.postgresql.jdbc2.Connection ) ) { - //-------- if ( _logWriter != null ) _logWriter.println( "DataSource: JDBC 1 connections not supported" ); throw new PSQLException( "postgresql.ds.onlyjdbc2" ); @@ -317,7 +302,6 @@ public class PostgresqlDataSource // FIXME // _driver.setLogWriter( writer ); // Method seems to be unavailable. Commented it out. - //---------- _logWriter = writer; } } @@ -617,7 +601,5 @@ public class PostgresqlDataSource else return null; } - - } diff --git a/src/interfaces/jdbc/org/postgresql/Statement.java b/src/interfaces/jdbc/org/postgresql/Statement.java index 80e5bf79a8e39fbbc37a0a343f9aac6f92595e45..95fd62d9f81fe6666506ebb84dc4e0464cf4cc0c 100644 --- a/src/interfaces/jdbc/org/postgresql/Statement.java +++ b/src/interfaces/jdbc/org/postgresql/Statement.java @@ -269,50 +269,50 @@ public abstract class Statement char c = sql.charAt(i); switch (state) { - case IN_SQLCODE: - if (c == '\'') // start of a string? - state = IN_STRING; - else if (c == '{') // start of an escape code? - if (i + 1 < len) - { - char next = sql.charAt(i + 1); - if (next == 'd') - { - state = ESC_TIMEDATE; - i++; - break; - } - else if (next == 't') + case IN_SQLCODE: + if (c == '\'') // start of a string? + state = IN_STRING; + else if (c == '{') // start of an escape code? + if (i + 1 < len) { - state = ESC_TIMEDATE; - i += (i + 2 < len && sql.charAt(i + 2) == 's') ? 2 : 1; - break; + char next = sql.charAt(i + 1); + if (next == 'd') + { + state = ESC_TIMEDATE; + i++; + break; + } + else if (next == 't') + { + state = ESC_TIMEDATE; + i += (i + 2 < len && sql.charAt(i + 2) == 's') ? 2 : 1; + break; + } } - } - newsql.append(c); - break; - - case IN_STRING: - if (c == '\'') // end of string? - state = IN_SQLCODE; - else if (c == '\\') // a backslash? - state = BACKSLASH; + newsql.append(c); + break; - newsql.append(c); - break; + case IN_STRING: + if (c == '\'') // end of string? + state = IN_SQLCODE; + else if (c == '\\') // a backslash? + state = BACKSLASH; - case BACKSLASH: - state = IN_STRING; + newsql.append(c); + break; - newsql.append(c); - break; + case BACKSLASH: + state = IN_STRING; - case ESC_TIMEDATE: - if (c == '}') - state = IN_SQLCODE; // end of escape code. - else newsql.append(c); - break; + break; + + case ESC_TIMEDATE: + if (c == '}') + state = IN_SQLCODE; // end of escape code. + else + newsql.append(c); + break; } // end switch } diff --git a/src/interfaces/jdbc/org/postgresql/core/BytePoolDim1.java b/src/interfaces/jdbc/org/postgresql/core/BytePoolDim1.java index bc2d64259402d3694342d0b0f1128003f6481568..1badf4f07245f0b61815c4283fc452e0081ea2ea 100644 --- a/src/interfaces/jdbc/org/postgresql/core/BytePoolDim1.java +++ b/src/interfaces/jdbc/org/postgresql/core/BytePoolDim1.java @@ -6,7 +6,6 @@ package org.postgresql.core; */ public class BytePoolDim1 { - /* * The maximum size of the array we manage. */ @@ -47,26 +46,26 @@ public class BytePoolDim1 // for now until the bug can be removed return new byte[size]; /* - // Don't pool if >maxsize - if (size > maxsize){ - return new byte[size]; - } + // Don't pool if >maxsize + if (size > maxsize){ + return new byte[size]; + } - ObjectPool not_usel = notusemap[size]; - ObjectPool in_usel = inusemap[size]; - byte b[] = null; + ObjectPool not_usel = notusemap[size]; + ObjectPool in_usel = inusemap[size]; + byte b[] = null; - // Fetch from the unused pool if available otherwise allocate a new - // now array - if (!not_usel.isEmpty()) { - Object o = not_usel.remove(); - b = (byte[]) o; - } else - b = new byte[size]; - in_usel.add(b); + // Fetch from the unused pool if available otherwise allocate a new + // now array + if (!not_usel.isEmpty()) { + Object o = not_usel.remove(); + b = (byte[]) o; + } else + b = new byte[size]; + in_usel.add(b); - return b; - */ + return b; + */ } /* diff --git a/src/interfaces/jdbc/org/postgresql/core/BytePoolDim2.java b/src/interfaces/jdbc/org/postgresql/core/BytePoolDim2.java index be115b841d02b34af74f1952cb9a0d22ca8972be..df55b30d04f6da436f1aca98c1f6e432870badcd 100644 --- a/src/interfaces/jdbc/org/postgresql/core/BytePoolDim2.java +++ b/src/interfaces/jdbc/org/postgresql/core/BytePoolDim2.java @@ -20,22 +20,22 @@ public class BytePoolDim2 // For now until the bug can be removed return new byte[size][0]; /* - if (size > maxsize){ - return new byte[size][0]; - } - ObjectPool not_usel = notusemap[size]; - ObjectPool in_usel = inusemap[size]; + if (size > maxsize){ + return new byte[size][0]; + } + ObjectPool not_usel = notusemap[size]; + ObjectPool in_usel = inusemap[size]; - byte b[][] = null; + byte b[][] = null; - if (!not_usel.isEmpty()) { - Object o = not_usel.remove(); - b = (byte[][]) o; - } else - b = new byte[size][0]; - in_usel.add(b); - return b; - */ + if (!not_usel.isEmpty()) { + Object o = not_usel.remove(); + b = (byte[][]) o; + } else + b = new byte[size][0]; + in_usel.add(b); + return b; + */ } public void release(byte[][] b) diff --git a/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java b/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java index c066001554d9b5423f4535c5a1614a27b282701b..7e85dcd583bd7c44a13b56225295600aea4a9cf4 100644 --- a/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java +++ b/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java @@ -13,7 +13,7 @@ import org.postgresql.util.PSQLException; *

The lifetime of a QueryExecutor object is from sending the query * until the response has been received from the backend. * - * $Id: QueryExecutor.java,v 1.4 2001/11/19 22:33:37 momjian Exp $ + * $Id: QueryExecutor.java,v 1.5 2001/11/19 23:16:45 momjian Exp $ */ public class QueryExecutor @@ -69,53 +69,53 @@ public class QueryExecutor switch (c) { - case 'A': // Asynchronous Notify - int pid = pg_stream.ReceiveInteger(4); - String msg = pg_stream.ReceiveString(connection.getEncoding()); - break; - case 'B': // Binary Data Transfer - receiveTuple(true); - break; - case 'C': // Command Status - receiveCommandStatus(); - - if (fields != null) - hfr = true; - else - { - sendQuery(" "); - fqp++; - } - break; - case 'D': // Text Data Transfer - receiveTuple(false); - break; - case 'E': // Error Message - throw new SQLException(pg_stream.ReceiveString(connection.getEncoding())); - case 'I': // Empty Query - int t = pg_stream.ReceiveChar(); - if (t != 0) - throw new PSQLException("postgresql.con.garbled"); - - if (fqp > 0) - fqp--; - if (fqp == 0) - hfr = true; - break; - case 'N': // Error Notification - connection.addWarning(pg_stream.ReceiveString(connection.getEncoding())); - break; - case 'P': // Portal Name - String pname = pg_stream.ReceiveString(connection.getEncoding()); - break; - case 'T': // MetaData Field Description - receiveFields(); - break; - case 'Z': // backend ready for query, ignore for now :-) - break; - default: - throw new PSQLException("postgresql.con.type", - new Character((char) c)); + case 'A': // Asynchronous Notify + int pid = pg_stream.ReceiveInteger(4); + String msg = pg_stream.ReceiveString(connection.getEncoding()); + break; + case 'B': // Binary Data Transfer + receiveTuple(true); + break; + case 'C': // Command Status + receiveCommandStatus(); + + if (fields != null) + hfr = true; + else + { + sendQuery(" "); + fqp++; + } + break; + case 'D': // Text Data Transfer + receiveTuple(false); + break; + case 'E': // Error Message + throw new SQLException(pg_stream.ReceiveString(connection.getEncoding())); + case 'I': // Empty Query + int t = pg_stream.ReceiveChar(); + if (t != 0) + throw new PSQLException("postgresql.con.garbled"); + + if (fqp > 0) + fqp--; + if (fqp == 0) + hfr = true; + break; + case 'N': // Error Notification + connection.addWarning(pg_stream.ReceiveString(connection.getEncoding())); + break; + case 'P': // Portal Name + String pname = pg_stream.ReceiveString(connection.getEncoding()); + break; + case 'T': // MetaData Field Description + receiveFields(); + break; + case 'Z': // backend ready for query, ignore for now :-) + break; + default: + throw new PSQLException("postgresql.con.type", + new Character((char) c)); } } return connection.getResultSet(connection, statement, fields, tuples, status, update_count, insert_oid, binaryCursor); @@ -162,7 +162,6 @@ public class QueryExecutor */ private void receiveCommandStatus() throws SQLException { - status = pg_stream.ReceiveString(connection.getEncoding()); try diff --git a/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java b/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java index 5f38d2f8dc98050b44594081faf4be8c31c3e325..5c7850147f2a74827cb7883f5911a3087178b688 100644 --- a/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java +++ b/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java @@ -61,7 +61,6 @@ public class Fastpath // added Oct 7 1998 to give us thread safety synchronized (stream) { - // send the function call try { @@ -105,52 +104,52 @@ public class Fastpath //DriverManager.println("ReceiveChar() = "+in+" '"+((char)in)+"'"); switch (in) { - case 'V': - break; + case 'V': + break; - //------------------------------ - // Function returned properly - // - case 'G': - int sz = stream.ReceiveIntegerR(4); - //DriverManager.println("G: size="+sz); //debug + //------------------------------ + // Function returned properly + // + case 'G': + int sz = stream.ReceiveIntegerR(4); + //DriverManager.println("G: size="+sz); //debug - // Return an Integer if - if (resulttype) - result = new Integer(stream.ReceiveIntegerR(sz)); - else - { - byte buf[] = new byte[sz]; - stream.Receive(buf, 0, sz); - result = buf; - } - break; + // Return an Integer if + if (resulttype) + result = new Integer(stream.ReceiveIntegerR(sz)); + else + { + byte buf[] = new byte[sz]; + stream.Receive(buf, 0, sz); + result = buf; + } + break; - //------------------------------ - // Error message returned - case 'E': - throw new PSQLException("postgresql.fp.error", stream.ReceiveString(conn.getEncoding())); + //------------------------------ + // Error message returned + case 'E': + throw new PSQLException("postgresql.fp.error", stream.ReceiveString(conn.getEncoding())); - //------------------------------ - // Notice from backend - case 'N': - conn.addWarning(stream.ReceiveString(conn.getEncoding())); - break; + //------------------------------ + // Notice from backend + case 'N': + conn.addWarning(stream.ReceiveString(conn.getEncoding())); + break; - //------------------------------ - // End of results - // - // Here we simply return res, which would contain the result - // processed earlier. If no result, this already contains null - case '0': - //DriverManager.println("returning "+result); - return result; + //------------------------------ + // End of results + // + // Here we simply return res, which would contain the result + // processed earlier. If no result, this already contains null + case '0': + //DriverManager.println("returning "+result); + return result; - case 'Z': - break; + case 'Z': + break; - default: - throw new PSQLException("postgresql.fp.protocol", new Character((char)in)); + default: + throw new PSQLException("postgresql.fp.protocol", new Character((char)in)); } } } diff --git a/src/interfaces/jdbc/org/postgresql/geometric/PGpath.java b/src/interfaces/jdbc/org/postgresql/geometric/PGpath.java index a260ab928f5015026f6d61629785afc97d8d12ea..60a4c92488373e78f191e0d4ddeb9324f816006f 100644 --- a/src/interfaces/jdbc/org/postgresql/geometric/PGpath.java +++ b/src/interfaces/jdbc/org/postgresql/geometric/PGpath.java @@ -148,5 +148,4 @@ public class PGpath extends PGobject implements Serializable, Cloneable { open = true; } - } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java index 0bcb39ca6525474d6091d84d00e1c1333b181a89..cf9a46b4f12fb42658d29373a3319b63f5aba52d 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java @@ -13,7 +13,7 @@ import org.postgresql.util.PSQLException; /* * This class provides information about the database as a whole. * - * $Id: DatabaseMetaData.java,v 1.39 2001/11/19 22:33:38 momjian Exp $ + * $Id: DatabaseMetaData.java,v 1.40 2001/11/19 23:16:45 momjian Exp $ * *

Many of the methods here return lists of information in ResultSets. You * can use the normal ResultSet methods such as getString and getInt to @@ -1731,20 +1731,20 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData String relKind; switch (r.getBytes(3)[0]) { - case (byte) 'r': - relKind = "TABLE"; - break; - case (byte) 'i': - relKind = "INDEX"; - break; - case (byte) 'S': - relKind = "SEQUENCE"; - break; - case (byte) 'v': - relKind = "VIEW"; - break; - default: - relKind = null; + case (byte) 'r': + relKind = "TABLE"; + break; + case (byte) 'i': + relKind = "INDEX"; + break; + case (byte) 'S': + relKind = "SEQUENCE"; + break; + case (byte) 'v': + relKind = "VIEW"; + break; + default: + relKind = null; } tuple[0] = null; // Catalog name @@ -2012,17 +2012,17 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData tuple[7] = null; // Buffer length // Decimal digits = scale - // From the source (see e.g. backend/utils/adt/numeric.c, + // From the source (see e.g. backend/utils/adt/numeric.c, // function numeric()) the scale and precision can be calculated // from the typmod value. - if (typname.equals("numeric") || typname.equals("decimal")) - { - int attypmod = r.getInt(8); - tuple[8] = - Integer.toString((attypmod - VARHDRSZ) & 0xffff).getBytes(); + if (typname.equals("numeric") || typname.equals("decimal")) + { + int attypmod = r.getInt(8); + tuple[8] = + Integer.toString((attypmod - VARHDRSZ) & 0xffff).getBytes(); } else - tuple[8] = "0".getBytes(); + tuple[8] = "0".getBytes(); tuple[9] = "10".getBytes(); // Num Prec Radix - assume decimal tuple[10] = Integer.toString(nullFlag.equals("f") ? @@ -2262,7 +2262,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData "a.attnum as KEY_SEQ," + "ic.relname as PK_NAME " + " FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a" + - " WHERE bc.relkind = 'r' " + // -- not indices + " WHERE bc.relkind = 'r' " + // -- not indices " and upper(bc.relname) = upper('" + table + "')" + " and i.indrelid = bc.oid" + " and i.indexrelid = ic.oid" + @@ -2274,115 +2274,135 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData private java.sql.ResultSet getImportedExportedKeys(String catalog, String schema, String primaryTable, String foreignTable) throws SQLException { - Field f[]=new Field[14]; - - f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); - f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); - f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); - f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); - f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); - f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); - f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); - f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); - f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2); - f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2); - f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2); - f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32); - f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32); - f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2); + Field f[] = new Field[14]; + + f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); + f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); + f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); + f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); + f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); + f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); + f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); + f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); + f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2); + f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2); + f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2); + f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32); + f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32); + f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2); java.sql.ResultSet rs = connection.ExecSQL("SELECT c.relname,c2.relname," - + "t.tgconstrname,ic.relname," - + "t.tgdeferrable,t.tginitdeferred," - + "t.tgnargs,t.tgargs,p.proname " - + "FROM pg_trigger t,pg_class c,pg_class c2," - + "pg_class ic,pg_proc p, pg_index i " - + "WHERE t.tgrelid=c.oid AND t.tgconstrrelid=c2.oid " - + "AND t.tgfoid=p.oid AND tgisconstraint " - + ((primaryTable!=null) ? "AND c2.relname='"+primaryTable+"' " : "") - + ((foreignTable!=null) ? "AND c.relname='"+foreignTable+"' " : "") - + "AND i.indrelid=c.oid " - + "AND i.indexrelid=ic.oid AND i.indisprimary " - + "ORDER BY c.relname,c2.relname" - ); + + "t.tgconstrname,ic.relname," + + "t.tgdeferrable,t.tginitdeferred," + + "t.tgnargs,t.tgargs,p.proname " + + "FROM pg_trigger t,pg_class c,pg_class c2," + + "pg_class ic,pg_proc p, pg_index i " + + "WHERE t.tgrelid=c.oid AND t.tgconstrrelid=c2.oid " + + "AND t.tgfoid=p.oid AND tgisconstraint " + + ((primaryTable != null) ? "AND c2.relname='" + primaryTable + "' " : "") + + ((foreignTable != null) ? "AND c.relname='" + foreignTable + "' " : "") + + "AND i.indrelid=c.oid " + + "AND i.indexrelid=ic.oid AND i.indisprimary " + + "ORDER BY c.relname,c2.relname" + ); Vector tuples = new Vector(); - short seq=0; - if (rs.next()) { - boolean hasMore; - do { - byte tuple[][]=new byte[14][0]; - for (int k = 0;k < 14;k++) - tuple[k] = null; - - String fKeyName=rs.getString(3); - boolean foundRule=false; - do { - String proname=rs.getString(9); - if (proname!=null && proname.startsWith("RI_FKey_")) { - int col=-1; - if (proname.endsWith("_upd")) col=9; // UPDATE_RULE - else if (proname.endsWith("_del")) col=10; // DELETE_RULE - if (col>-1) { - String rule=proname.substring(8, proname.length()-4); - int action=importedKeyNoAction; - if ("cascade".equals(rule)) action=importedKeyCascade; - else if ("setnull".equals(rule)) action=importedKeySetNull; - else if ("setdefault".equals(rule)) action=importedKeySetDefault; - tuple[col]=Integer.toString(action).getBytes(); - foundRule=true; + short seq = 0; + if (rs.next()) + { + boolean hasMore; + do + { + byte tuple[][] = new byte[14][0]; + for (int k = 0;k < 14;k++) + tuple[k] = null; + + String fKeyName = rs.getString(3); + boolean foundRule = false; + do + { + String proname = rs.getString(9); + if (proname != null && proname.startsWith("RI_FKey_")) + { + int col = -1; + if (proname.endsWith("_upd")) + col = 9; // UPDATE_RULE + else if (proname.endsWith("_del")) + col = 10; // DELETE_RULE + if (col > -1) + { + String rule = proname.substring(8, proname.length() - 4); + int action = importedKeyNoAction; + if ("cascade".equals(rule)) + action = importedKeyCascade; + else if ("setnull".equals(rule)) + action = importedKeySetNull; + else if ("setdefault".equals(rule)) + action = importedKeySetDefault; + tuple[col] = Integer.toString(action).getBytes(); + foundRule = true; + } } } - } while ((hasMore=rs.next()) && fKeyName.equals(rs.getString(3))); - - if (foundRule) { - tuple[2]=rs.getBytes(2); //PKTABLE_NAME - tuple[6]=rs.getBytes(1); //FKTABLE_NAME - - // Parse the tgargs data - StringBuffer fkeyColumns=new StringBuffer(); - StringBuffer pkeyColumns=new StringBuffer(); - int numColumns=(rs.getInt(7) >> 1) - 2; - String s=rs.getString(8); - int pos=s.lastIndexOf("\\000"); - for(int c=0;c-1) { - int pos2=s.lastIndexOf("\\000", pos-1); - if (pos2>-1) { - if (fkeyColumns.length()>0) fkeyColumns.insert(0, ','); - fkeyColumns.insert(0, s.substring(pos2+4, pos)); //FKCOLUMN_NAME - pos=s.lastIndexOf("\\000", pos2-1); - if (pos>-1) { - if (pkeyColumns.length()>0) pkeyColumns.insert(0, ','); - pkeyColumns.insert(0, s.substring(pos+4, pos2)); //PKCOLUMN_NAME + while ((hasMore = rs.next()) && fKeyName.equals(rs.getString(3))); + + if (foundRule) + { + tuple[2] = rs.getBytes(2); //PKTABLE_NAME + tuple[6] = rs.getBytes(1); //FKTABLE_NAME + + // Parse the tgargs data + StringBuffer fkeyColumns = new StringBuffer(); + StringBuffer pkeyColumns = new StringBuffer(); + int numColumns = (rs.getInt(7) >> 1) - 2; + String s = rs.getString(8); + int pos = s.lastIndexOf("\\000"); + for (int c = 0;c < numColumns;c++) + { + if (pos > -1) + { + int pos2 = s.lastIndexOf("\\000", pos - 1); + if (pos2 > -1) + { + if (fkeyColumns.length() > 0) + fkeyColumns.insert(0, ','); + fkeyColumns.insert(0, s.substring(pos2 + 4, pos)); //FKCOLUMN_NAME + pos = s.lastIndexOf("\\000", pos2 - 1); + if (pos > -1) + { + if (pkeyColumns.length() > 0) + pkeyColumns.insert(0, ','); + pkeyColumns.insert(0, s.substring(pos + 4, pos2)); //PKCOLUMN_NAME + } + } + } } - } + tuple[7] = fkeyColumns.toString().getBytes(); //FKCOLUMN_NAME + tuple[3] = pkeyColumns.toString().getBytes(); //PKCOLUMN_NAME + + tuple[8] = Integer.toString(seq++).getBytes(); //KEY_SEQ + tuple[11] = fKeyName.getBytes(); //FK_NAME + tuple[12] = rs.getBytes(4); //PK_NAME + + // DEFERRABILITY + int deferrability = importedKeyNotDeferrable; + boolean deferrable = rs.getBoolean(5); + boolean initiallyDeferred = rs.getBoolean(6); + if (deferrable) + { + if (initiallyDeferred) + deferrability = importedKeyInitiallyDeferred; + else + deferrability = importedKeyInitiallyImmediate; + } + tuple[13] = Integer.toString(deferrability).getBytes(); + + tuples.addElement(tuple); } } - tuple[7]=fkeyColumns.toString().getBytes(); //FKCOLUMN_NAME - tuple[3]=pkeyColumns.toString().getBytes(); //PKCOLUMN_NAME - - tuple[8]=Integer.toString(seq++).getBytes(); //KEY_SEQ - tuple[11]=fKeyName.getBytes(); //FK_NAME - tuple[12]=rs.getBytes(4); //PK_NAME - - // DEFERRABILITY - int deferrability=importedKeyNotDeferrable; - boolean deferrable=rs.getBoolean(5); - boolean initiallyDeferred=rs.getBoolean(6); - if (deferrable) { - if (initiallyDeferred) - deferrability=importedKeyInitiallyDeferred; - else - deferrability=importedKeyInitiallyImmediate; - } - tuple[13]=Integer.toString(deferrability).getBytes(); - - tuples.addElement(tuple); - } - } while (hasMore); - } + while (hasMore); + } - return new ResultSet(connection, f, tuples, "OK", 1); + return new ResultSet(connection, f, tuples, "OK", 1); } /* @@ -2496,7 +2516,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { - return getImportedExportedKeys(catalog, schema, table, null); + return getImportedExportedKeys(catalog, schema, table, null); } /* @@ -2557,7 +2577,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { - return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignTable); + return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignTable); } /* diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java index 3253c9335a458287accb32cabf2f5c6ad8cae25a..cca7af9bb6a1fdb89335f5c2b7c46ef4b88cc117 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java @@ -617,53 +617,53 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta } switch (targetSqlType) { - case Types.TINYINT: - case Types.SMALLINT: - case Types.INTEGER: - case Types.BIGINT: - case Types.REAL: - case Types.FLOAT: - case Types.DOUBLE: - case Types.DECIMAL: - case Types.NUMERIC: - if (x instanceof Boolean) - set(parameterIndex, ((Boolean)x).booleanValue() ? "1" : "0"); - else - set(parameterIndex, x.toString()); - break; - case Types.CHAR: - case Types.VARCHAR: - case Types.LONGVARCHAR: - setString(parameterIndex, x.toString()); - break; - case Types.DATE: - setDate(parameterIndex, (java.sql.Date)x); - break; - case Types.TIME: - setTime(parameterIndex, (Time)x); - break; - case Types.TIMESTAMP: - setTimestamp(parameterIndex, (Timestamp)x); - break; - case Types.BIT: - if (x instanceof Boolean) - { - set(parameterIndex, ((Boolean)x).booleanValue() ? "TRUE" : "FALSE"); - } - else - { + case Types.TINYINT: + case Types.SMALLINT: + case Types.INTEGER: + case Types.BIGINT: + case Types.REAL: + case Types.FLOAT: + case Types.DOUBLE: + case Types.DECIMAL: + case Types.NUMERIC: + if (x instanceof Boolean) + set(parameterIndex, ((Boolean)x).booleanValue() ? "1" : "0"); + else + set(parameterIndex, x.toString()); + break; + case Types.CHAR: + case Types.VARCHAR: + case Types.LONGVARCHAR: + setString(parameterIndex, x.toString()); + break; + case Types.DATE: + setDate(parameterIndex, (java.sql.Date)x); + break; + case Types.TIME: + setTime(parameterIndex, (Time)x); + break; + case Types.TIMESTAMP: + setTimestamp(parameterIndex, (Timestamp)x); + break; + case Types.BIT: + if (x instanceof Boolean) + { + set(parameterIndex, ((Boolean)x).booleanValue() ? "TRUE" : "FALSE"); + } + else + { + throw new PSQLException("postgresql.prep.type"); + } + break; + case Types.BINARY: + case Types.VARBINARY: + setObject(parameterIndex, x); + break; + case Types.OTHER: + setString(parameterIndex, ((PGobject)x).getValue()); + break; + default: throw new PSQLException("postgresql.prep.type"); - } - break; - case Types.BINARY: - case Types.VARBINARY: - setObject(parameterIndex, x); - break; - case Types.OTHER: - setString(parameterIndex, ((PGobject)x).getValue()); - break; - default: - throw new PSQLException("postgresql.prep.type"); } } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java index b806f67bcb23eb94035b2e45277b99f341bfb6a0..33c7de58627010601b4051d6c1318cb3b7e420c6 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java @@ -394,40 +394,40 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu wasNullFlag = (this_row[columnIndex - 1] == null); if (!wasNullFlag) { - if (binaryCursor) - { - //If the data is already binary then just return it - return this_row[columnIndex - 1]; - } - else if (connection.haveMinimumCompatibleVersion("7.2")) - { - //Version 7.2 supports the bytea datatype for byte arrays - if (fields[columnIndex - 1].getPGType().equals("bytea")) + if (binaryCursor) { - return PGbytea.toBytes(getString(columnIndex)); + //If the data is already binary then just return it + return this_row[columnIndex - 1]; } - else - { - return this_row[columnIndex - 1]; - } - } - else - { - //Version 7.1 and earlier supports LargeObjects for byte arrays - // Handle OID's as BLOBS - if ( fields[columnIndex - 1].getOID() == 26) + else if (connection.haveMinimumCompatibleVersion("7.2")) { - LargeObjectManager lom = connection.getLargeObjectAPI(); - LargeObject lob = lom.open(getInt(columnIndex)); - byte buf[] = lob.read(lob.size()); - lob.close(); - return buf; + //Version 7.2 supports the bytea datatype for byte arrays + if (fields[columnIndex - 1].getPGType().equals("bytea")) + { + return PGbytea.toBytes(getString(columnIndex)); + } + else + { + return this_row[columnIndex - 1]; + } } else { - return this_row[columnIndex - 1]; + //Version 7.1 and earlier supports LargeObjects for byte arrays + // Handle OID's as BLOBS + if ( fields[columnIndex - 1].getOID() == 26) + { + LargeObjectManager lom = connection.getLargeObjectAPI(); + LargeObject lob = lom.open(getInt(columnIndex)); + byte buf[] = lob.read(lob.size()); + lob.close(); + return buf; + } + else + { + return this_row[columnIndex - 1]; + } } - } } return null; } @@ -447,10 +447,13 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu return null; // length == 10: SQL Date // length > 10: SQL Timestamp, assumes PGDATESTYLE=ISO - try { - return java.sql.Date.valueOf((s.length() == 10) ? s : s.substring(0,10)); - } catch (NumberFormatException e) { - throw new PSQLException("postgresql.res.baddate", s); + try + { + return java.sql.Date.valueOf((s.length() == 10) ? s : s.substring(0, 10)); + } + catch (NumberFormatException e) + { + throw new PSQLException("postgresql.res.baddate", s); } } @@ -926,43 +929,43 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu switch (field.getSQLType()) { - case Types.BIT: - return new Boolean(getBoolean(columnIndex)); - case Types.SMALLINT: - return new Integer(getInt(columnIndex)); - case Types.INTEGER: - return new Integer(getInt(columnIndex)); - case Types.BIGINT: - return new Long(getLong(columnIndex)); - case Types.NUMERIC: - return getBigDecimal(columnIndex, ((field.getMod() - 4) & 0xffff)); - case Types.REAL: - return new Float(getFloat(columnIndex)); - case Types.DOUBLE: - return new Double(getDouble(columnIndex)); - case Types.CHAR: - case Types.VARCHAR: - return getString(columnIndex); - case Types.DATE: - return getDate(columnIndex); - case Types.TIME: - return getTime(columnIndex); - case Types.TIMESTAMP: - return getTimestamp(columnIndex); - case Types.BINARY: - case Types.VARBINARY: - return getBytes(columnIndex); - default: - String type = field.getPGType(); - // if the backend doesn't know the type then coerce to String - if (type.equals("unknown")) - { + case Types.BIT: + return new Boolean(getBoolean(columnIndex)); + case Types.SMALLINT: + return new Integer(getInt(columnIndex)); + case Types.INTEGER: + return new Integer(getInt(columnIndex)); + case Types.BIGINT: + return new Long(getLong(columnIndex)); + case Types.NUMERIC: + return getBigDecimal(columnIndex, ((field.getMod() - 4) & 0xffff)); + case Types.REAL: + return new Float(getFloat(columnIndex)); + case Types.DOUBLE: + return new Double(getDouble(columnIndex)); + case Types.CHAR: + case Types.VARCHAR: return getString(columnIndex); - } - else - { - return connection.getObject(field.getPGType(), getString(columnIndex)); - } + case Types.DATE: + return getDate(columnIndex); + case Types.TIME: + return getTime(columnIndex); + case Types.TIMESTAMP: + return getTimestamp(columnIndex); + case Types.BINARY: + case Types.VARBINARY: + return getBytes(columnIndex); + default: + String type = field.getPGType(); + // if the backend doesn't know the type then coerce to String + if (type.equals("unknown")) + { + return getString(columnIndex); + } + else + { + return connection.getObject(field.getPGType(), getString(columnIndex)); + } } } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSetMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSetMetaData.java index 321293b7c85d1f264dccb9fd48f92ce4a42ea680..ee737604a1ecf5bf45250633278556d903f4d662 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSetMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSetMetaData.java @@ -78,17 +78,17 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - case Types.INTEGER: - case Types.FLOAT: - case Types.REAL: - case Types.DOUBLE: - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: - return false; - default: - return true; + case Types.SMALLINT: + case Types.INTEGER: + case Types.FLOAT: + case Types.REAL: + case Types.DOUBLE: + case Types.DATE: + case Types.TIME: + case Types.TIMESTAMP: + return false; + default: + return true; } } @@ -112,10 +112,10 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData // for further expansion. switch (sql_type) { - case Types.OTHER: - return true; - default: - return true; + case Types.OTHER: + return true; + default: + return true; } } @@ -167,18 +167,18 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - case Types.INTEGER: - case Types.FLOAT: - case Types.REAL: - case Types.DOUBLE: - return true; - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: - return false; // I don't know about these? - default: - return false; + case Types.SMALLINT: + case Types.INTEGER: + case Types.FLOAT: + case Types.REAL: + case Types.DOUBLE: + return true; + case Types.DATE: + case Types.TIME: + case Types.TIMESTAMP: + return false; // I don't know about these? + default: + return false; } } @@ -294,26 +294,26 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - return 5; - case Types.INTEGER: - return 10; - case Types.REAL: - return 8; - case Types.FLOAT: - return 16; - case Types.DOUBLE: - return 16; - case Types.VARCHAR: - return 0; - case Types.NUMERIC: - Field f = getField(column); - if (f != null) - return ((0xFFFF0000)&f.getMod()) >> 16; - else + case Types.SMALLINT: + return 5; + case Types.INTEGER: + return 10; + case Types.REAL: + return 8; + case Types.FLOAT: + return 16; + case Types.DOUBLE: + return 16; + case Types.VARCHAR: + return 0; + case Types.NUMERIC: + Field f = getField(column); + if (f != null) + return ((0xFFFF0000)&f.getMod()) >> 16; + else + return 0; + default: return 0; - default: - return 0; } } @@ -331,26 +331,26 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - return 0; - case Types.INTEGER: - return 0; - case Types.REAL: - return 8; - case Types.FLOAT: - return 16; - case Types.DOUBLE: - return 16; - case Types.VARCHAR: - return 0; - case Types.NUMERIC: - Field f = getField(column); - if (f != null) - return (((0x0000FFFF)&f.getMod()) - 4); - else + case Types.SMALLINT: + return 0; + case Types.INTEGER: + return 0; + case Types.REAL: + return 8; + case Types.FLOAT: + return 16; + case Types.DOUBLE: + return 16; + case Types.VARCHAR: + return 0; + case Types.NUMERIC: + Field f = getField(column); + if (f != null) + return (((0x0000FFFF)&f.getMod()) - 4); + else + return 0; + default: return 0; - default: - return 0; } } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java index 56b8a0f15a505fe2dd268a5dd18c9b6763207e35..14948e5b4b07d51f882c11dea3ca27fc3468b4fd 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java @@ -115,64 +115,64 @@ public class Array implements java.sql.Array int i = 0; switch ( getBaseType() ) { - case Types.BIT: - retVal = new boolean[ count ]; - for ( ; count > 0; count-- ) - ((boolean[])retVal)[i++] = ResultSet.toBoolean( arrayContents[(int)index++] ); - break; - case Types.SMALLINT: - case Types.INTEGER: - retVal = new int[ count ]; - for ( ; count > 0; count-- ) - ((int[])retVal)[i++] = ResultSet.toInt( arrayContents[(int)index++] ); - break; - case Types.BIGINT: - retVal = new long[ count ]; - for ( ; count > 0; count-- ) - ((long[])retVal)[i++] = ResultSet.toLong( arrayContents[(int)index++] ); - break; - case Types.NUMERIC: - retVal = new BigDecimal[ count ]; - for ( ; count > 0; count-- ) - ((BigDecimal[])retVal)[i] = ResultSet.toBigDecimal( arrayContents[(int)index++], 0 ); - break; - case Types.REAL: - retVal = new float[ count ]; - for ( ; count > 0; count-- ) - ((float[])retVal)[i++] = ResultSet.toFloat( arrayContents[(int)index++] ); - break; - case Types.DOUBLE: - retVal = new double[ count ]; - for ( ; count > 0; count-- ) - ((double[])retVal)[i++] = ResultSet.toDouble( arrayContents[(int)index++] ); - break; - case Types.CHAR: - case Types.VARCHAR: - retVal = new String[ count ]; - for ( ; count > 0; count-- ) - ((String[])retVal)[i++] = arrayContents[(int)index++]; - break; - case Types.DATE: - retVal = new java.sql.Date[ count ]; - for ( ; count > 0; count-- ) - ((java.sql.Date[])retVal)[i++] = ResultSet.toDate( arrayContents[(int)index++] ); - break; - case Types.TIME: - retVal = new java.sql.Time[ count ]; - for ( ; count > 0; count-- ) - ((java.sql.Time[])retVal)[i++] = ResultSet.toTime( arrayContents[(int)index++] ); - break; - case Types.TIMESTAMP: - retVal = new Timestamp[ count ]; - StringBuffer sbuf = null; - for ( ; count > 0; count-- ) - ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp( arrayContents[(int)index], rs ); - break; + case Types.BIT: + retVal = new boolean[ count ]; + for ( ; count > 0; count-- ) + ((boolean[])retVal)[i++] = ResultSet.toBoolean( arrayContents[(int)index++] ); + break; + case Types.SMALLINT: + case Types.INTEGER: + retVal = new int[ count ]; + for ( ; count > 0; count-- ) + ((int[])retVal)[i++] = ResultSet.toInt( arrayContents[(int)index++] ); + break; + case Types.BIGINT: + retVal = new long[ count ]; + for ( ; count > 0; count-- ) + ((long[])retVal)[i++] = ResultSet.toLong( arrayContents[(int)index++] ); + break; + case Types.NUMERIC: + retVal = new BigDecimal[ count ]; + for ( ; count > 0; count-- ) + ((BigDecimal[])retVal)[i] = ResultSet.toBigDecimal( arrayContents[(int)index++], 0 ); + break; + case Types.REAL: + retVal = new float[ count ]; + for ( ; count > 0; count-- ) + ((float[])retVal)[i++] = ResultSet.toFloat( arrayContents[(int)index++] ); + break; + case Types.DOUBLE: + retVal = new double[ count ]; + for ( ; count > 0; count-- ) + ((double[])retVal)[i++] = ResultSet.toDouble( arrayContents[(int)index++] ); + break; + case Types.CHAR: + case Types.VARCHAR: + retVal = new String[ count ]; + for ( ; count > 0; count-- ) + ((String[])retVal)[i++] = arrayContents[(int)index++]; + break; + case Types.DATE: + retVal = new java.sql.Date[ count ]; + for ( ; count > 0; count-- ) + ((java.sql.Date[])retVal)[i++] = ResultSet.toDate( arrayContents[(int)index++] ); + break; + case Types.TIME: + retVal = new java.sql.Time[ count ]; + for ( ; count > 0; count-- ) + ((java.sql.Time[])retVal)[i++] = ResultSet.toTime( arrayContents[(int)index++] ); + break; + case Types.TIMESTAMP: + retVal = new Timestamp[ count ]; + StringBuffer sbuf = null; + for ( ; count > 0; count-- ) + ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp( arrayContents[(int)index], rs ); + break; - // Other datatypes not currently supported. If you are really using other types ask - // yourself if an array of non-trivial data types is really good database design. - default: - throw org.postgresql.Driver.notImplemented(); + // Other datatypes not currently supported. If you are really using other types ask + // yourself if an array of non-trivial data types is really good database design. + default: + throw org.postgresql.Driver.notImplemented(); } return retVal; } @@ -213,126 +213,126 @@ public class Array implements java.sql.Array fields[0] = new Field(conn, "INDEX", conn.getOID("int2"), 2); switch ( getBaseType() ) { - case Types.BIT: - boolean[] booleanArray = (boolean[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("bool"), 1); - for ( int i = 0; i < booleanArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( (booleanArray[i] ? "YES" : "NO") ); // Value - rows.addElement(tuple); - } - case Types.SMALLINT: - fields[1] = new Field(conn, "VALUE", conn.getOID("int2"), 2); - case Types.INTEGER: - int[] intArray = (int[]) array; - if ( fields[1] == null ) - fields[1] = new Field(conn, "VALUE", conn.getOID("int4"), 4); - for ( int i = 0; i < intArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( Integer.toString(intArray[i]) ); // Value - rows.addElement(tuple); - } - break; - case Types.BIGINT: - long[] longArray = (long[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("int8"), 8); - for ( int i = 0; i < longArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( Long.toString(longArray[i]) ); // Value - rows.addElement(tuple); - } - break; - case Types.NUMERIC: - BigDecimal[] bdArray = (BigDecimal[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("numeric"), -1); - for ( int i = 0; i < bdArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( bdArray[i].toString() ); // Value - rows.addElement(tuple); - } - break; - case Types.REAL: - float[] floatArray = (float[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("float4"), 4); - for ( int i = 0; i < floatArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( Float.toString(floatArray[i]) ); // Value - rows.addElement(tuple); - } - break; - case Types.DOUBLE: - double[] doubleArray = (double[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("float8"), 8); - for ( int i = 0; i < doubleArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( Double.toString(doubleArray[i]) ); // Value - rows.addElement(tuple); - } - break; - case Types.CHAR: - fields[1] = new Field(conn, "VALUE", conn.getOID("char"), 1); - case Types.VARCHAR: - String[] strArray = (String[]) array; - if ( fields[1] == null ) - fields[1] = new Field(conn, "VALUE", conn.getOID("varchar"), -1); - for ( int i = 0; i < strArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( strArray[i] ); // Value - rows.addElement(tuple); - } - break; - case Types.DATE: - java.sql.Date[] dateArray = (java.sql.Date[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("date"), 4); - for ( int i = 0; i < dateArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( dateArray[i].toString() ); // Value - rows.addElement(tuple); - } - break; - case Types.TIME: - java.sql.Time[] timeArray = (java.sql.Time[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("time"), 8); - for ( int i = 0; i < timeArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( timeArray[i].toString() ); // Value - rows.addElement(tuple); - } - break; - case Types.TIMESTAMP: - java.sql.Timestamp[] timestampArray = (java.sql.Timestamp[]) array; - fields[1] = new Field(conn, "VALUE", conn.getOID("timestamp"), 8); - for ( int i = 0; i < timestampArray.length; i++ ) - { - byte[][] tuple = new byte[2][0]; - tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index - tuple[1] = conn.getEncoding().encode( timestampArray[i].toString() ); // Value - rows.addElement(tuple); - } - break; + case Types.BIT: + boolean[] booleanArray = (boolean[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("bool"), 1); + for ( int i = 0; i < booleanArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( (booleanArray[i] ? "YES" : "NO") ); // Value + rows.addElement(tuple); + } + case Types.SMALLINT: + fields[1] = new Field(conn, "VALUE", conn.getOID("int2"), 2); + case Types.INTEGER: + int[] intArray = (int[]) array; + if ( fields[1] == null ) + fields[1] = new Field(conn, "VALUE", conn.getOID("int4"), 4); + for ( int i = 0; i < intArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( Integer.toString(intArray[i]) ); // Value + rows.addElement(tuple); + } + break; + case Types.BIGINT: + long[] longArray = (long[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("int8"), 8); + for ( int i = 0; i < longArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( Long.toString(longArray[i]) ); // Value + rows.addElement(tuple); + } + break; + case Types.NUMERIC: + BigDecimal[] bdArray = (BigDecimal[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("numeric"), -1); + for ( int i = 0; i < bdArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( bdArray[i].toString() ); // Value + rows.addElement(tuple); + } + break; + case Types.REAL: + float[] floatArray = (float[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("float4"), 4); + for ( int i = 0; i < floatArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( Float.toString(floatArray[i]) ); // Value + rows.addElement(tuple); + } + break; + case Types.DOUBLE: + double[] doubleArray = (double[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("float8"), 8); + for ( int i = 0; i < doubleArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( Double.toString(doubleArray[i]) ); // Value + rows.addElement(tuple); + } + break; + case Types.CHAR: + fields[1] = new Field(conn, "VALUE", conn.getOID("char"), 1); + case Types.VARCHAR: + String[] strArray = (String[]) array; + if ( fields[1] == null ) + fields[1] = new Field(conn, "VALUE", conn.getOID("varchar"), -1); + for ( int i = 0; i < strArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( strArray[i] ); // Value + rows.addElement(tuple); + } + break; + case Types.DATE: + java.sql.Date[] dateArray = (java.sql.Date[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("date"), 4); + for ( int i = 0; i < dateArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( dateArray[i].toString() ); // Value + rows.addElement(tuple); + } + break; + case Types.TIME: + java.sql.Time[] timeArray = (java.sql.Time[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("time"), 8); + for ( int i = 0; i < timeArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( timeArray[i].toString() ); // Value + rows.addElement(tuple); + } + break; + case Types.TIMESTAMP: + java.sql.Timestamp[] timestampArray = (java.sql.Timestamp[]) array; + fields[1] = new Field(conn, "VALUE", conn.getOID("timestamp"), 8); + for ( int i = 0; i < timestampArray.length; i++ ) + { + byte[][] tuple = new byte[2][0]; + tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index + tuple[1] = conn.getEncoding().encode( timestampArray[i].toString() ); // Value + rows.addElement(tuple); + } + break; - // Other datatypes not currently supported. If you are really using other types ask - // yourself if an array of non-trivial data types is really good database design. - default: - throw org.postgresql.Driver.notImplemented(); + // Other datatypes not currently supported. If you are really using other types ask + // yourself if an array of non-trivial data types is really good database design. + default: + throw org.postgresql.Driver.notImplemented(); } return new ResultSet((org.postgresql.jdbc2.Connection)conn, fields, rows, "OK", 1 ); } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java index 0d833a033afc264c66c700a43ad0bcb58978e6b7..50dee09b87c74101b7ac20446e4b794b24422cea 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java @@ -15,7 +15,7 @@ import org.postgresql.util.PSQLException; /* * This class provides information about the database as a whole. * - * $Id: DatabaseMetaData.java,v 1.46 2001/11/19 22:33:39 momjian Exp $ + * $Id: DatabaseMetaData.java,v 1.47 2001/11/19 23:16:46 momjian Exp $ * *

Many of the methods here return lists of information in ResultSets. You * can use the normal ResultSet methods such as getString and getInt to @@ -88,7 +88,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public String getURL() throws SQLException { String url = connection.getURL(); - Driver.debug("getURL "+url); + Driver.debug("getURL " + url); return url; } @@ -101,7 +101,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public String getUserName() throws SQLException { String userName = connection.getUserName(); - Driver.debug("getUserName "+ userName); + Driver.debug("getUserName " + userName); return userName; } @@ -114,7 +114,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public boolean isReadOnly() throws SQLException { boolean isReadOnly = connection.isReadOnly(); - Driver.debug("isReadOnly " +isReadOnly); + Driver.debug("isReadOnly " + isReadOnly); return isReadOnly; } @@ -164,7 +164,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public boolean nullsAreSortedAtEnd() throws SQLException { boolean nullsAreSortedAtEnd = ! connection.haveMinimumServerVersion("7.2"); - Driver.debug("nullsAreSortedAtEnd "+nullsAreSortedAtEnd); + Driver.debug("nullsAreSortedAtEnd " + nullsAreSortedAtEnd); return nullsAreSortedAtEnd; } @@ -209,7 +209,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData } /* - * What is the version string of this JDBC driver? Again, this is + * What is the version string of this JDBC driver? Again, this is * static. * * @return the JDBC driver name. @@ -218,7 +218,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public String getDriverVersion() throws SQLException { String driverVersion = connection.this_driver.getVersion(); - Driver.debug("getDriverVersion "+driverVersion); + Driver.debug("getDriverVersion " + driverVersion); return driverVersion; } @@ -230,7 +230,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public int getDriverMajorVersion() { int majorVersion = connection.this_driver.getMajorVersion(); - Driver.debug("getMajorVersion " +majorVersion); + Driver.debug("getMajorVersion " + majorVersion); return majorVersion; } @@ -242,12 +242,12 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public int getDriverMinorVersion() { int minorVersion = connection.this_driver.getMinorVersion(); - Driver.debug("getMinorVersion " +minorVersion); + Driver.debug("getMinorVersion " + minorVersion); return minorVersion; } /* - * Does the database store tables in a local file? No - it + * Does the database store tables in a local file? No - it * stores them in a file on the server. * * @return true if so @@ -298,7 +298,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public boolean storesUpperCaseIdentifiers() throws SQLException { - Driver.debug("storesUpperCaseIdentifiers "+false); + Driver.debug("storesUpperCaseIdentifiers " + false); return false; } @@ -622,13 +622,13 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public boolean supportsGroupByUnrelated() throws SQLException { boolean supportsGroupByUnrelated = connection.haveMinimumServerVersion("6.4"); - Driver.debug("supportsGroupByUnrelated "+ supportsGroupByUnrelated); + Driver.debug("supportsGroupByUnrelated " + supportsGroupByUnrelated); return supportsGroupByUnrelated; } /* * Can a "GROUP BY" clause add columns not in the SELECT provided - * it specifies all the columns in the SELECT? Does anyone actually + * it specifies all the columns in the SELECT? Does anyone actually * understand what they mean here? * * (I think this is a subset of the previous function. -- petere) @@ -686,7 +686,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData } /* - * Can columns be defined as non-nullable. A JDBC Compliant driver + * Can columns be defined as non-nullable. A JDBC Compliant driver * always returns true. * *

This changed from false to true in v6.2 of the driver, as this @@ -715,12 +715,12 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public boolean supportsMinimumSQLGrammar() throws SQLException { - Driver.debug("supportsMinimumSQLGrammar TRUE"); - return true; + Driver.debug("supportsMinimumSQLGrammar TRUE"); + return true; } /* - * Does this driver support the Core ODBC SQL grammar. We need + * Does this driver support the Core ODBC SQL grammar. We need * SQL-92 conformance for this. * * @return true if so @@ -910,7 +910,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData } /* - * Can a schema name be used in a data manipulation statement? Nope. + * Can a schema name be used in a data manipulation statement? Nope. * * @return true if so * @exception SQLException if a database access error occurs @@ -1831,20 +1831,20 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData String relKind; switch (r.getBytes(3)[0]) { - case (byte) 'r': - relKind = "TABLE"; - break; - case (byte) 'i': - relKind = "INDEX"; - break; - case (byte) 'S': - relKind = "SEQUENCE"; - break; - case (byte) 'v': - relKind = "VIEW"; - break; - default: - relKind = null; + case (byte) 'r': + relKind = "TABLE"; + break; + case (byte) 'i': + relKind = "INDEX"; + break; + case (byte) 'S': + relKind = "SEQUENCE"; + break; + case (byte) 'v': + relKind = "VIEW"; + break; + default: + relKind = null; } tuple[0] = null; // Catalog name @@ -2243,29 +2243,30 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData Vector v = new Vector(); if (tableNamePattern == null) - tableNamePattern = "%"; + tableNamePattern = "%"; - f[0] = new Field(connection,"TABLE_CAT",iVarcharOid,32); - f[1] = new Field(connection,"TABLE_SCHEM",iVarcharOid,32); - f[2] = new Field(connection,"TABLE_NAME",iVarcharOid,32); - f[3] = new Field(connection,"COLUMN_NAME",iVarcharOid,32); - f[4] = new Field(connection,"GRANTOR",iVarcharOid,32); - f[5] = new Field(connection,"GRANTEE",iVarcharOid,32); - f[6] = new Field(connection,"PRIVILEGE",iVarcharOid,32); - f[7] = new Field(connection,"IS_GRANTABLE",iVarcharOid,32); + f[0] = new Field(connection, "TABLE_CAT", iVarcharOid, 32); + f[1] = new Field(connection, "TABLE_SCHEM", iVarcharOid, 32); + f[2] = new Field(connection, "TABLE_NAME", iVarcharOid, 32); + f[3] = new Field(connection, "COLUMN_NAME", iVarcharOid, 32); + f[4] = new Field(connection, "GRANTOR", iVarcharOid, 32); + f[5] = new Field(connection, "GRANTEE", iVarcharOid, 32); + f[6] = new Field(connection, "PRIVILEGE", iVarcharOid, 32); + f[7] = new Field(connection, "IS_GRANTABLE", iVarcharOid, 32); // This is taken direct from the psql source - java.sql.ResultSet r = connection.ExecSQL("SELECT relname, relacl FROM pg_class, pg_user WHERE ( relkind = 'r' OR relkind = 'i') and relname !~ '^pg_' and relname !~ '^xin[vx][0-9]+' and usesysid = relowner and relname like '"+tableNamePattern.toLowerCase()+"' ORDER BY relname"); - while (r.next()) { - byte[][] tuple = new byte[8][0]; - tuple[0] = tuple[1]= "".getBytes(); - DriverManager.println("relname=\""+r.getString(1)+"\" relacl=\""+r.getString(2)+"\""); - - // For now, don't add to the result as relacl needs to be processed. - //v.addElement(tuple); + java.sql.ResultSet r = connection.ExecSQL("SELECT relname, relacl FROM pg_class, pg_user WHERE ( relkind = 'r' OR relkind = 'i') and relname !~ '^pg_' and relname !~ '^xin[vx][0-9]+' and usesysid = relowner and relname like '" + tableNamePattern.toLowerCase() + "' ORDER BY relname"); + while (r.next()) + { + byte[][] tuple = new byte[8][0]; + tuple[0] = tuple[1] = "".getBytes(); + DriverManager.println("relname=\"" + r.getString(1) + "\" relacl=\"" + r.getString(2) + "\""); + + // For now, don't add to the result as relacl needs to be processed. + //v.addElement(tuple); } - return new ResultSet(connection,f,v,"OK",1); + return new ResultSet(connection, f, v, "OK", 1); } /* @@ -2389,7 +2390,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData "a.attnum as KEY_SEQ," + "ic.relname as PK_NAME " + " FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a" + - " WHERE bc.relkind = 'r' " + // -- not indices + " WHERE bc.relkind = 'r' " + // -- not indices " and upper(bc.relname) = upper('" + table + "')" + " and i.indrelid = bc.oid" + " and i.indexrelid = ic.oid" + @@ -2401,112 +2402,132 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData private java.sql.ResultSet getImportedExportedKeys(String catalog, String schema, String primaryTable, String foreignTable) throws SQLException { - Field f[]=new Field[14]; - - f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); - f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); - f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); - f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); - f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); - f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); - f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); - f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); - f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2); - f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2); - f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2); - f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32); - f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32); - f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2); + Field f[] = new Field[14]; + + f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32); + f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32); + f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32); + f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32); + f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32); + f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32); + f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32); + f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32); + f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2); + f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2); + f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2); + f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32); + f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32); + f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2); java.sql.ResultSet rs = connection.ExecSQL("SELECT c.relname,c2.relname," - + "t.tgconstrname,ic.relname," - + "t.tgdeferrable,t.tginitdeferred," - + "t.tgnargs,t.tgargs,p.proname " - + "FROM pg_trigger t,pg_class c,pg_class c2," - + "pg_class ic,pg_proc p, pg_index i " - + "WHERE t.tgrelid=c.oid AND t.tgconstrrelid=c2.oid " - + "AND t.tgfoid=p.oid AND tgisconstraint " - + ((primaryTable!=null) ? "AND c2.relname='"+primaryTable+"' " : "") - + ((foreignTable!=null) ? "AND c.relname='"+foreignTable+"' " : "") - + "AND i.indrelid=c.oid " - + "AND i.indexrelid=ic.oid AND i.indisprimary " - + "ORDER BY c.relname,c2.relname" - ); + + "t.tgconstrname,ic.relname," + + "t.tgdeferrable,t.tginitdeferred," + + "t.tgnargs,t.tgargs,p.proname " + + "FROM pg_trigger t,pg_class c,pg_class c2," + + "pg_class ic,pg_proc p, pg_index i " + + "WHERE t.tgrelid=c.oid AND t.tgconstrrelid=c2.oid " + + "AND t.tgfoid=p.oid AND tgisconstraint " + + ((primaryTable != null) ? "AND c2.relname='" + primaryTable + "' " : "") + + ((foreignTable != null) ? "AND c.relname='" + foreignTable + "' " : "") + + "AND i.indrelid=c.oid " + + "AND i.indexrelid=ic.oid AND i.indisprimary " + + "ORDER BY c.relname,c2.relname" + ); Vector tuples = new Vector(); - short seq=0; - if (rs.next()) { - boolean hasMore; - do { - byte tuple[][]=new byte[14][0]; - for (int k = 0;k < 14;k++) - tuple[k] = null; - - String fKeyName=rs.getString(3); - boolean foundRule=false; - do { - String proname=rs.getString(9); - if (proname!=null && proname.startsWith("RI_FKey_")) { - int col=-1; - if (proname.endsWith("_upd")) col=9; // UPDATE_RULE - else if (proname.endsWith("_del")) col=10; // DELETE_RULE - if (col>-1) { - String rule=proname.substring(8, proname.length()-4); - int action=importedKeyNoAction; - if ("cascade".equals(rule)) action=importedKeyCascade; - else if ("setnull".equals(rule)) action=importedKeySetNull; - else if ("setdefault".equals(rule)) action=importedKeySetDefault; - tuple[col]=Integer.toString(action).getBytes(); - foundRule=true; - } - } - } while ((hasMore=rs.next()) && fKeyName.equals(rs.getString(3))); - - if (foundRule) { - tuple[2]=rs.getBytes(2); //PKTABLE_NAME - tuple[6]=rs.getBytes(1); //FKTABLE_NAME - - // Parse the tgargs data - StringBuffer fkeyColumns=new StringBuffer(); - StringBuffer pkeyColumns=new StringBuffer(); - int numColumns=(rs.getInt(7) >> 1) - 2; - String s=rs.getString(8); - int pos=s.lastIndexOf("\\000"); - for(int c=0;c-1) { - int pos2=s.lastIndexOf("\\000", pos-1); - if (pos2>-1) { - if (fkeyColumns.length()>0) fkeyColumns.insert(0, ','); - fkeyColumns.insert(0, s.substring(pos2+4, pos)); //FKCOLUMN_NAME - pos=s.lastIndexOf("\\000", pos2-1); - if (pos>-1) { - if (pkeyColumns.length()>0) pkeyColumns.insert(0, ','); - pkeyColumns.insert(0, s.substring(pos+4, pos2)); //PKCOLUMN_NAME + short seq = 0; + if (rs.next()) + { + boolean hasMore; + do + { + byte tuple[][] = new byte[14][0]; + for (int k = 0;k < 14;k++) + tuple[k] = null; + + String fKeyName = rs.getString(3); + boolean foundRule = false; + do + { + String proname = rs.getString(9); + if (proname != null && proname.startsWith("RI_FKey_")) + { + int col = -1; + if (proname.endsWith("_upd")) + col = 9; // UPDATE_RULE + else if (proname.endsWith("_del")) + col = 10; // DELETE_RULE + if (col > -1) + { + String rule = proname.substring(8, proname.length() - 4); + int action = importedKeyNoAction; + if ("cascade".equals(rule)) + action = importedKeyCascade; + else if ("setnull".equals(rule)) + action = importedKeySetNull; + else if ("setdefault".equals(rule)) + action = importedKeySetDefault; + tuple[col] = Integer.toString(action).getBytes(); + foundRule = true; + } } } - } - } - tuple[7]=fkeyColumns.toString().getBytes(); //FKCOLUMN_NAME - tuple[3]=pkeyColumns.toString().getBytes(); //PKCOLUMN_NAME - - tuple[8]=Integer.toString(seq++).getBytes(); //KEY_SEQ - tuple[11]=fKeyName.getBytes(); //FK_NAME - tuple[12]=rs.getBytes(4); //PK_NAME - - // DEFERRABILITY - int deferrability=importedKeyNotDeferrable; - boolean deferrable=rs.getBoolean(5); - boolean initiallyDeferred=rs.getBoolean(6); - if (deferrable) { - if (initiallyDeferred) - deferrability=importedKeyInitiallyDeferred; - else - deferrability=importedKeyInitiallyImmediate; - } - tuple[13]=Integer.toString(deferrability).getBytes(); + while ((hasMore = rs.next()) && fKeyName.equals(rs.getString(3))); + + if (foundRule) + { + tuple[2] = rs.getBytes(2); //PKTABLE_NAME + tuple[6] = rs.getBytes(1); //FKTABLE_NAME + + // Parse the tgargs data + StringBuffer fkeyColumns = new StringBuffer(); + StringBuffer pkeyColumns = new StringBuffer(); + int numColumns = (rs.getInt(7) >> 1) - 2; + String s = rs.getString(8); + int pos = s.lastIndexOf("\\000"); + for (int c = 0;c < numColumns;c++) + { + if (pos > -1) + { + int pos2 = s.lastIndexOf("\\000", pos - 1); + if (pos2 > -1) + { + if (fkeyColumns.length() > 0) + fkeyColumns.insert(0, ','); + fkeyColumns.insert(0, s.substring(pos2 + 4, pos)); //FKCOLUMN_NAME + pos = s.lastIndexOf("\\000", pos2 - 1); + if (pos > -1) + { + if (pkeyColumns.length() > 0) + pkeyColumns.insert(0, ','); + pkeyColumns.insert(0, s.substring(pos + 4, pos2)); //PKCOLUMN_NAME + } + } + } + } + tuple[7] = fkeyColumns.toString().getBytes(); //FKCOLUMN_NAME + tuple[3] = pkeyColumns.toString().getBytes(); //PKCOLUMN_NAME + + tuple[8] = Integer.toString(seq++).getBytes(); //KEY_SEQ + tuple[11] = fKeyName.getBytes(); //FK_NAME + tuple[12] = rs.getBytes(4); //PK_NAME + + // DEFERRABILITY + int deferrability = importedKeyNotDeferrable; + boolean deferrable = rs.getBoolean(5); + boolean initiallyDeferred = rs.getBoolean(6); + if (deferrable) + { + if (initiallyDeferred) + deferrability = importedKeyInitiallyDeferred; + else + deferrability = importedKeyInitiallyImmediate; + } + tuple[13] = Integer.toString(deferrability).getBytes(); - tuples.addElement(tuple); + tuples.addElement(tuple); + } } - } while (hasMore); + while (hasMore); } return new ResultSet(connection, f, tuples, "OK", 1); @@ -2565,7 +2586,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { - return getImportedExportedKeys(catalog, schema, null, table); + return getImportedExportedKeys(catalog, schema, null, table); } /* @@ -2623,7 +2644,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { - return getImportedExportedKeys(catalog, schema, table, null); + return getImportedExportedKeys(catalog, schema, table, null); } /* @@ -2684,7 +2705,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public java.sql.ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { - return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignTable); + return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignTable); } /* diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java index daf9650dce436aa4797e499f5e0192ebf0d353df..1575b16661895efde14828cfb3bd5527a23b8616 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java @@ -652,53 +652,53 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta } switch (targetSqlType) { - case Types.TINYINT: - case Types.SMALLINT: - case Types.INTEGER: - case Types.BIGINT: - case Types.REAL: - case Types.FLOAT: - case Types.DOUBLE: - case Types.DECIMAL: - case Types.NUMERIC: - if (x instanceof Boolean) - set(parameterIndex, ((Boolean)x).booleanValue() ? "1" : "0"); - else - set(parameterIndex, x.toString()); - break; - case Types.CHAR: - case Types.VARCHAR: - case Types.LONGVARCHAR: - setString(parameterIndex, x.toString()); - break; - case Types.DATE: - setDate(parameterIndex, (java.sql.Date)x); - break; - case Types.TIME: - setTime(parameterIndex, (Time)x); - break; - case Types.TIMESTAMP: - setTimestamp(parameterIndex, (Timestamp)x); - break; - case Types.BIT: - if (x instanceof Boolean) - { - set(parameterIndex, ((Boolean)x).booleanValue() ? "TRUE" : "FALSE"); - } - else - { + case Types.TINYINT: + case Types.SMALLINT: + case Types.INTEGER: + case Types.BIGINT: + case Types.REAL: + case Types.FLOAT: + case Types.DOUBLE: + case Types.DECIMAL: + case Types.NUMERIC: + if (x instanceof Boolean) + set(parameterIndex, ((Boolean)x).booleanValue() ? "1" : "0"); + else + set(parameterIndex, x.toString()); + break; + case Types.CHAR: + case Types.VARCHAR: + case Types.LONGVARCHAR: + setString(parameterIndex, x.toString()); + break; + case Types.DATE: + setDate(parameterIndex, (java.sql.Date)x); + break; + case Types.TIME: + setTime(parameterIndex, (Time)x); + break; + case Types.TIMESTAMP: + setTimestamp(parameterIndex, (Timestamp)x); + break; + case Types.BIT: + if (x instanceof Boolean) + { + set(parameterIndex, ((Boolean)x).booleanValue() ? "TRUE" : "FALSE"); + } + else + { + throw new PSQLException("postgresql.prep.type"); + } + break; + case Types.BINARY: + case Types.VARBINARY: + setObject(parameterIndex, x); + break; + case Types.OTHER: + setString(parameterIndex, ((PGobject)x).getValue()); + break; + default: throw new PSQLException("postgresql.prep.type"); - } - break; - case Types.BINARY: - case Types.VARBINARY: - setObject(parameterIndex, x); - break; - case Types.OTHER: - setString(parameterIndex, ((PGobject)x).getValue()); - break; - default: - throw new PSQLException("postgresql.prep.type"); } } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java index 804d9a2c770a7b769bf30150c96b54e319de723c..765fb46146e87247100f47b39665157035f6d59b 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java @@ -321,40 +321,40 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu wasNullFlag = (this_row[columnIndex - 1] == null); if (!wasNullFlag) { - if (binaryCursor) - { - //If the data is already binary then just return it - return this_row[columnIndex - 1]; - } - else if (connection.haveMinimumCompatibleVersion("7.2")) - { - //Version 7.2 supports the bytea datatype for byte arrays - if (fields[columnIndex - 1].getPGType().equals("bytea")) + if (binaryCursor) { - return PGbytea.toBytes(getString(columnIndex)); + //If the data is already binary then just return it + return this_row[columnIndex - 1]; } - else + else if (connection.haveMinimumCompatibleVersion("7.2")) { - return this_row[columnIndex - 1]; - } - } - else - { - //Version 7.1 and earlier supports LargeObjects for byte arrays - // Handle OID's as BLOBS - if ( fields[columnIndex - 1].getOID() == 26) - { - LargeObjectManager lom = connection.getLargeObjectAPI(); - LargeObject lob = lom.open(getInt(columnIndex)); - byte buf[] = lob.read(lob.size()); - lob.close(); - return buf; + //Version 7.2 supports the bytea datatype for byte arrays + if (fields[columnIndex - 1].getPGType().equals("bytea")) + { + return PGbytea.toBytes(getString(columnIndex)); + } + else + { + return this_row[columnIndex - 1]; + } } else { - return this_row[columnIndex - 1]; + //Version 7.1 and earlier supports LargeObjects for byte arrays + // Handle OID's as BLOBS + if ( fields[columnIndex - 1].getOID() == 26) + { + LargeObjectManager lom = connection.getLargeObjectAPI(); + LargeObject lob = lom.open(getInt(columnIndex)); + byte buf[] = lob.read(lob.size()); + lob.close(); + return buf; + } + else + { + return this_row[columnIndex - 1]; + } } - } } return null; } @@ -742,44 +742,44 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu switch (field.getSQLType()) { - case Types.BIT: - return new Boolean(getBoolean(columnIndex)); - case Types.SMALLINT: - return new Integer(getInt(columnIndex)); - case Types.INTEGER: - return new Integer(getInt(columnIndex)); - case Types.BIGINT: - return new Long(getLong(columnIndex)); - case Types.NUMERIC: - return getBigDecimal - (columnIndex, (field.getMod() == -1) ? -1 : ((field.getMod() - 4) & 0xffff)); - case Types.REAL: - return new Float(getFloat(columnIndex)); - case Types.DOUBLE: - return new Double(getDouble(columnIndex)); - case Types.CHAR: - case Types.VARCHAR: - return getString(columnIndex); - case Types.DATE: - return getDate(columnIndex); - case Types.TIME: - return getTime(columnIndex); - case Types.TIMESTAMP: - return getTimestamp(columnIndex); - case Types.BINARY: - case Types.VARBINARY: - return getBytes(columnIndex); - default: - String type = field.getPGType(); - // if the backend doesn't know the type then coerce to String - if (type.equals("unknown")) - { + case Types.BIT: + return new Boolean(getBoolean(columnIndex)); + case Types.SMALLINT: + return new Integer(getInt(columnIndex)); + case Types.INTEGER: + return new Integer(getInt(columnIndex)); + case Types.BIGINT: + return new Long(getLong(columnIndex)); + case Types.NUMERIC: + return getBigDecimal + (columnIndex, (field.getMod() == -1) ? -1 : ((field.getMod() - 4) & 0xffff)); + case Types.REAL: + return new Float(getFloat(columnIndex)); + case Types.DOUBLE: + return new Double(getDouble(columnIndex)); + case Types.CHAR: + case Types.VARCHAR: return getString(columnIndex); - } - else - { - return connection.getObject(field.getPGType(), getString(columnIndex)); - } + case Types.DATE: + return getDate(columnIndex); + case Types.TIME: + return getTime(columnIndex); + case Types.TIMESTAMP: + return getTimestamp(columnIndex); + case Types.BINARY: + case Types.VARBINARY: + return getBytes(columnIndex); + default: + String type = field.getPGType(); + // if the backend doesn't know the type then coerce to String + if (type.equals("unknown")) + { + return getString(columnIndex); + } + else + { + return connection.getObject(field.getPGType(), getString(columnIndex)); + } } } @@ -1082,7 +1082,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu if (current_row < 0 || current_row >= rows_size) return 0; - + return current_row + 1; } @@ -1565,10 +1565,13 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu return null; // length == 10: SQL Date // length > 10: SQL Timestamp, assumes PGDATESTYLE=ISO - try { - return java.sql.Date.valueOf((s.length() == 10) ? s : s.substring(0,10)); - } catch (NumberFormatException e) { - throw new PSQLException("postgresql.res.baddate", s); + try + { + return java.sql.Date.valueOf((s.length() == 10) ? s : s.substring(0, 10)); + } + catch (NumberFormatException e) + { + throw new PSQLException("postgresql.res.baddate", s); } } @@ -1578,10 +1581,13 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu return null; // SQL NULL // length == 8: SQL Time // length > 8: SQL Timestamp - try { - return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11,19)); - } catch (NumberFormatException e) { - throw new PSQLException("postgresql.res.badtime",s); + try + { + return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); + } + catch (NumberFormatException e) + { + throw new PSQLException("postgresql.res.badtime", s); } } @@ -1628,7 +1634,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu char sub = resultSet.sbuf.charAt(resultSet.sbuf.length() - 3); if (sub == '+' || sub == '-') { - //we have found timezone info of format +/-HH + //we have found timezone info of format +/-HH resultSet.sbuf.setLength(resultSet.sbuf.length() - 3); if (subsecond) @@ -1639,22 +1645,28 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu { resultSet.sbuf.append("GMT").append(s.substring(s.length() - 3)).append(":00"); } - } else if (sub == ':') { - //we may have found timezone info of format +/-HH:MM, or there is no - //timezone info at all and this is the : preceding the seconds - char sub2 = resultSet.sbuf.charAt(resultSet.sbuf.length()-5); - if (sub2 == '+' || sub2 == '-') + } + else if (sub == ':') + { + //we may have found timezone info of format +/-HH:MM, or there is no + //timezone info at all and this is the : preceding the seconds + char sub2 = resultSet.sbuf.charAt(resultSet.sbuf.length() - 5); + if (sub2 == '+' || sub2 == '-') { - //we have found timezone info of format +/-HH:MM - resultSet.sbuf.setLength(resultSet.sbuf.length()-5); - if (subsecond) + //we have found timezone info of format +/-HH:MM + resultSet.sbuf.setLength(resultSet.sbuf.length() - 5); + if (subsecond) { - resultSet.sbuf.append('0').append("GMT").append(s.substring(s.length()-5)); - } else { - resultSet.sbuf.append("GMT").append(s.substring(s.length()-5)); + resultSet.sbuf.append('0').append("GMT").append(s.substring(s.length() - 5)); } - } else if (subsecond) { - resultSet.sbuf.append('0'); + else + { + resultSet.sbuf.append("GMT").append(s.substring(s.length() - 5)); + } + } + else if (subsecond) + { + resultSet.sbuf.append('0'); } } else if (subsecond) diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java index 1268efeff991b273ac914309cc87ff2a7f90d56b..7539a91c159423737dece07e1e565f13f6b1f1cd 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java @@ -73,17 +73,17 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - case Types.INTEGER: - case Types.FLOAT: - case Types.REAL: - case Types.DOUBLE: - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: - return false; - default: - return true; + case Types.SMALLINT: + case Types.INTEGER: + case Types.FLOAT: + case Types.REAL: + case Types.DOUBLE: + case Types.DATE: + case Types.TIME: + case Types.TIMESTAMP: + return false; + default: + return true; } } @@ -107,10 +107,10 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData // for further expansion. switch (sql_type) { - case Types.OTHER: - return true; - default: - return true; + case Types.OTHER: + return true; + default: + return true; } } @@ -162,18 +162,18 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - case Types.INTEGER: - case Types.FLOAT: - case Types.REAL: - case Types.DOUBLE: - return true; - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: - return false; // I don't know about these? - default: - return false; + case Types.SMALLINT: + case Types.INTEGER: + case Types.FLOAT: + case Types.REAL: + case Types.DOUBLE: + return true; + case Types.DATE: + case Types.TIME: + case Types.TIMESTAMP: + return false; // I don't know about these? + default: + return false; } } @@ -289,26 +289,26 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - return 5; - case Types.INTEGER: - return 10; - case Types.REAL: - return 8; - case Types.FLOAT: - return 16; - case Types.DOUBLE: - return 16; - case Types.VARCHAR: - return 0; - case Types.NUMERIC: - Field f = getField(column); - if (f != null) - return ((0xFFFF0000)&f.getMod()) >> 16; - else + case Types.SMALLINT: + return 5; + case Types.INTEGER: + return 10; + case Types.REAL: + return 8; + case Types.FLOAT: + return 16; + case Types.DOUBLE: + return 16; + case Types.VARCHAR: + return 0; + case Types.NUMERIC: + Field f = getField(column); + if (f != null) + return ((0xFFFF0000)&f.getMod()) >> 16; + else + return 0; + default: return 0; - default: - return 0; } } @@ -326,26 +326,26 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData switch (sql_type) { - case Types.SMALLINT: - return 0; - case Types.INTEGER: - return 0; - case Types.REAL: - return 8; - case Types.FLOAT: - return 16; - case Types.DOUBLE: - return 16; - case Types.VARCHAR: - return 0; - case Types.NUMERIC: - Field f = getField(column); - if (f != null) - return (((0x0000FFFF)&f.getMod()) - 4); - else + case Types.SMALLINT: + return 0; + case Types.INTEGER: + return 0; + case Types.REAL: + return 8; + case Types.FLOAT: + return 16; + case Types.DOUBLE: + return 16; + case Types.VARCHAR: + return 0; + case Types.NUMERIC: + Field f = getField(column); + if (f != null) + return (((0x0000FFFF)&f.getMod()) - 4); + else + return 0; + default: return 0; - default: - return 0; } } diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/BlobTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/BlobTest.java index cd02e801ec7a4df6dd412adbd7d292538fb38fd5..ae436fbf18b4c78c5dd412a40e0a303d5e8f026d 100644 --- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/BlobTest.java +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/BlobTest.java @@ -8,7 +8,7 @@ import java.sql.*; import org.postgresql.largeobject.*; /* - * $Id: BlobTest.java,v 1.4 2001/11/19 22:33:39 momjian Exp $ + * $Id: BlobTest.java,v 1.5 2001/11/19 23:16:46 momjian Exp $ * * Some simple tests based on problems reported by users. Hopefully these will * help prevent previous problems from re-occuring ;-) @@ -108,36 +108,36 @@ public class BlobTest extends TestCase switch (method) { - case LOOP: - buf = new byte[2048]; - t = 0; - while ((s = fis.read(buf, 0, buf.length)) > 0) - { - t += s; - blob.write(buf, 0, s); - } - break; - - case NATIVE_STREAM: - os = blob.getOutputStream(); - s = fis.read(); - while (s > -1) - { - os.write(s); + case LOOP: + buf = new byte[2048]; + t = 0; + while ((s = fis.read(buf, 0, buf.length)) > 0) + { + t += s; + blob.write(buf, 0, s); + } + break; + + case NATIVE_STREAM: + os = blob.getOutputStream(); s = fis.read(); - } - os.close(); - break; - - case JDBC_STREAM: - File f = new File(file); - PreparedStatement ps = con.prepareStatement(JDBC2Tests.insertSQL("testblob", "?")); - ps.setBinaryStream(1, fis, (int) f.length()); - ps.execute(); - break; - - default: - assertTrue("Unknown method in uploadFile", false); + while (s > -1) + { + os.write(s); + s = fis.read(); + } + os.close(); + break; + + case JDBC_STREAM: + File f = new File(file); + PreparedStatement ps = con.prepareStatement(JDBC2Tests.insertSQL("testblob", "?")); + ps.setBinaryStream(1, fis, (int) f.length()); + ps.execute(); + break; + + default: + assertTrue("Unknown method in uploadFile", false); } blob.close(); diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java index 64a5560eac730b9583488832af30eec575ea499b..2c556bfb2d04b520f55fcdaa77b88ce670b33ddf 100644 --- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java @@ -21,7 +21,7 @@ public class ResultSetTest extends TestCase { con = JDBC2Tests.openDB(); Statement stmt = con.createStatement(); - + JDBC2Tests.createTable(con, "testrs", "id integer"); stmt.executeUpdate("INSERT INTO testrs VALUES (1)"); @@ -44,23 +44,23 @@ public class ResultSetTest extends TestCase { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM testrs"); - - assertTrue(rs.absolute(-1)); + + assertTrue(rs.absolute( -1)); assertEquals(6, rs.getRow()); assertTrue(rs.absolute(1)); assertEquals(1, rs.getRow()); - assertTrue(!rs.absolute(-10)); + assertTrue(!rs.absolute( -10)); assertEquals(0, rs.getRow()); - assertTrue(rs.next()); - assertEquals(1, rs.getRow()); + assertTrue(rs.next()); + assertEquals(1, rs.getRow()); assertTrue(!rs.absolute(10)); assertEquals(0, rs.getRow()); assertTrue(rs.previous()); assertEquals(6, rs.getRow()); - + stmt.close(); } } diff --git a/src/interfaces/jdbc/org/postgresql/util/PGtokenizer.java b/src/interfaces/jdbc/org/postgresql/util/PGtokenizer.java index bdbad3d160e5a66326d5028dd428f5bc28a9e930..f5fe685e8084e408ab9e347979a38e03c90a54ac 100644 --- a/src/interfaces/jdbc/org/postgresql/util/PGtokenizer.java +++ b/src/interfaces/jdbc/org/postgresql/util/PGtokenizer.java @@ -77,6 +77,7 @@ public class PGtokenizer // Don't forget the last token ;-) + if (s < string.length()) tokens.addElement(string.substring(s)); diff --git a/src/interfaces/jdbc/org/postgresql/xa/XADataSourceImpl.java b/src/interfaces/jdbc/org/postgresql/xa/XADataSourceImpl.java index 4e8e0d4ba02e36883488b8f7d0305b093b18b055..ae34143cb234ad3cc469f735c172bbb275d72685 100644 --- a/src/interfaces/jdbc/org/postgresql/xa/XADataSourceImpl.java +++ b/src/interfaces/jdbc/org/postgresql/xa/XADataSourceImpl.java @@ -40,7 +40,7 @@ * * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved. * -* $Id: XADataSourceImpl.java,v 1.3 2001/11/19 22:33:39 momjian Exp $ +* $Id: XADataSourceImpl.java,v 1.4 2001/11/19 23:16:46 momjian Exp $ */ @@ -379,6 +379,7 @@ public abstract class XADataSourceImpl // Look for all connections inside a transaction that // should have timed out by now. + timeout = System.currentTimeMillis(); enum = _txConnections.elements(); while ( enum.hasMoreElements() ) diff --git a/src/tools/pgindent/pgjindent b/src/tools/pgindent/pgjindent index 40cbf3d90397a23977c29053924bdac2fde5848c..d4e3777cc869cbe720594d0a4f22f3e07778bc3c 100755 --- a/src/tools/pgindent/pgjindent +++ b/src/tools/pgindent/pgjindent @@ -16,7 +16,7 @@ fi for FILE do - astyle --style=java -b -p -j < "$FILE" >/tmp/$$ 2>/tmp/$$a + astyle --style=java -b -p -j -S < "$FILE" >/tmp/$$ 2>/tmp/$$a if [ "$?" -ne 0 -o -s /tmp/$$a ] then echo "$FILE" cat /tmp/$$a