summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2000-06-15 04:12:41 +0000
committerBruce Momjian2000-06-15 04:12:41 +0000
commitc545ec54f8139e7f02e39a138fc5f21ebdc33b7b (patch)
tree9c2a97b57fe003b2556246be2005f0a0a2c1c163
parent3a82b67b22ab61812b06e4051b003e3854d55b99 (diff)
Backpatch jdbc fixes into 7.0.X.
-rw-r--r--src/interfaces/jdbc/CHANGELOG16
-rw-r--r--src/interfaces/jdbc/Makefile4
-rw-r--r--src/interfaces/jdbc/example/basic.java11
-rw-r--r--src/interfaces/jdbc/org/postgresql/Connection.java40
-rw-r--r--src/interfaces/jdbc/org/postgresql/ResultSet.java29
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java6
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java20
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java6
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java64
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java1
10 files changed, 156 insertions, 41 deletions
diff --git a/src/interfaces/jdbc/CHANGELOG b/src/interfaces/jdbc/CHANGELOG
index 2998ab33a2c..347cce5f941 100644
--- a/src/interfaces/jdbc/CHANGELOG
+++ b/src/interfaces/jdbc/CHANGELOG
@@ -1,3 +1,19 @@
+Tue Jun 06 12:00:00 BST 2000 [email protected]
+ - Added org/postgresql/DriverClass.java to the list of files removed
+ by make clean (it's dynamically built)
+ - Fixed Statement, so that the update count is valid when an SQL
+ DELETE operation is done.
+ - While fixing the update count, made it easier to get the OID of
+ the last insert as well. Example is in example/basic.java
+
+Tue Jun 06 08:37:00 BST 2000 [email protected]
+ - Removed a hardwired 8K limit on query strings
+ - Added some missing org.'s in Connection that prevented
+ the use of the geometric types.
+
+Thu Jun 01 07:26:00 BST 2000 [email protected]
+ - Removed timezone in getTimestamp() methods in ResultSet.
+
Mon May 15 22:30:00 BST 2000 [email protected]
- Fixed the message Makefile produces after compiling. It still said
about the old Driver class, not the new package. Spotted by
diff --git a/src/interfaces/jdbc/Makefile b/src/interfaces/jdbc/Makefile
index ce3030b4e9d..c525ae1f0ba 100644
--- a/src/interfaces/jdbc/Makefile
+++ b/src/interfaces/jdbc/Makefile
@@ -4,7 +4,7 @@
# Makefile for Java JDBC interface
#
# IDENTIFICATION
-# $Id: Makefile,v 1.22 2000/05/15 21:32:51 peter Exp $
+# $Id: Makefile,v 1.22.2.1 2000/06/15 04:12:23 momjian Exp $
#
#-------------------------------------------------------------------------
@@ -181,7 +181,7 @@ clean:
$(FIND) . -name "*.class" -exec $(RM) {} \;
$(FIND) . -name "*.html" -exec $(RM) {} \;
-$(RM) -rf stock example/corba/stock.built
- -$(RM) postgresql.jar
+ -$(RM) postgresql.jar org/postgresql/DriverClass.java
-$(RM) -rf Package-postgresql *output
#######################################################################
diff --git a/src/interfaces/jdbc/example/basic.java b/src/interfaces/jdbc/example/basic.java
index 326c49c0f17..5e23e26512b 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.4 2000/04/26 05:32:00 peter Exp $
+ * $Id: basic.java,v 1.4.2.1 2000/06/15 04:12:24 momjian Exp $
*
* This example tests the basic components of the JDBC driver, and shows
* how even the simplest of queries can be implemented.
@@ -83,10 +83,19 @@ public class basic
st.executeUpdate("insert into basic values (2,1)");
st.executeUpdate("insert into basic values (3,1)");
+ // This shows how to get the oid of a just inserted row
+ st.executeUpdate("insert into basic values (4,1)");
+ int insertedOID = ((org.postgresql.ResultSet)st.getResultSet()).getInsertedOID();
+ System.out.println("Inserted row with oid "+insertedOID);
+
// Now change the value of b from 1 to 8
st.executeUpdate("update basic set b=8");
System.out.println("Updated "+st.getUpdateCount()+" rows");
+ // Now delete 2 rows
+ st.executeUpdate("delete from basic where a<3");
+ System.out.println("deleted "+st.getUpdateCount()+" rows");
+
// For large inserts, a PreparedStatement is more efficient, because it
// supports the idea of precompiling the SQL statement, and to store
// directly, a Java object into any column. PostgreSQL doesnt support
diff --git a/src/interfaces/jdbc/org/postgresql/Connection.java b/src/interfaces/jdbc/org/postgresql/Connection.java
index 045ddec0fcf..69d9d052ff3 100644
--- a/src/interfaces/jdbc/org/postgresql/Connection.java
+++ b/src/interfaces/jdbc/org/postgresql/Connection.java
@@ -10,7 +10,7 @@ import org.postgresql.largeobject.*;
import org.postgresql.util.*;
/**
- * $Id: Connection.java,v 1.1 2000/04/26 05:39:32 peter Exp $
+ * $Id: Connection.java,v 1.1.2.1 2000/06/15 04:12:28 momjian Exp $
*
* This abstract class is used by org.postgresql.Driver to open either the JDBC1 or
* JDBC2 versions of the Connection class.
@@ -317,11 +317,14 @@ public abstract class Connection
int fqp = 0;
boolean hfr = false;
String recv_status = null, msg;
- int update_count = 1;
+ int update_count = 1;
+ int insert_oid = 0;
SQLException final_error = null;
- if (sql.length() > 8192)
- throw new PSQLException("postgresql.con.toolong",sql);
+ // Commented out as the backend can now handle queries
+ // larger than 8K. Peter June 6 2000
+ //if (sql.length() > 8192)
+ //throw new PSQLException("postgresql.con.toolong",sql);
try
{
pg_stream.SendChar('Q');
@@ -357,12 +360,19 @@ public abstract class Connection
recv_status = pg_stream.ReceiveString(8192);
// Now handle the update count correctly.
- if(recv_status.startsWith("INSERT") || recv_status.startsWith("UPDATE")) {
+ if(recv_status.startsWith("INSERT") || recv_status.startsWith("UPDATE") || recv_status.startsWith("DELETE")) {
try {
update_count = Integer.parseInt(recv_status.substring(1+recv_status.lastIndexOf(' ')));
} catch(NumberFormatException nfe) {
throw new PSQLException("postgresql.con.fathom",recv_status);
}
+ if(recv_status.startsWith("INSERT")) {
+ try {
+ insert_oid = Integer.parseInt(recv_status.substring(1+recv_status.indexOf(' '),recv_status.lastIndexOf(' ')));
+ } catch(NumberFormatException nfe) {
+ throw new PSQLException("postgresql.con.fathom",recv_status);
+ }
+ }
}
if (fields != null)
hfr = true;
@@ -423,7 +433,7 @@ public abstract class Connection
if (final_error != null)
throw final_error;
- return getResultSet(this, fields, tuples, recv_status, update_count);
+ return getResultSet(this, fields, tuples, recv_status, update_count, insert_oid);
}
}
@@ -701,14 +711,14 @@ public abstract class Connection
// the full class name of the handling class.
//
private static final String defaultObjectTypes[][] = {
- {"box", "postgresql.geometric.PGbox"},
- {"circle", "postgresql.geometric.PGcircle"},
- {"line", "postgresql.geometric.PGline"},
- {"lseg", "postgresql.geometric.PGlseg"},
- {"path", "postgresql.geometric.PGpath"},
- {"point", "postgresql.geometric.PGpoint"},
- {"polygon", "postgresql.geometric.PGpolygon"},
- {"money", "postgresql.util.PGmoney"}
+ {"box", "org.postgresql.geometric.PGbox"},
+ {"circle", "org.postgresql.geometric.PGcircle"},
+ {"line", "org.postgresql.geometric.PGline"},
+ {"lseg", "org.postgresql.geometric.PGlseg"},
+ {"path", "org.postgresql.geometric.PGpath"},
+ {"point", "org.postgresql.geometric.PGpoint"},
+ {"polygon", "org.postgresql.geometric.PGpolygon"},
+ {"money", "org.postgresql.util.PGmoney"}
};
// This initialises the objectTypes hashtable
@@ -725,7 +735,7 @@ public abstract class Connection
* This returns a resultset. It must be overridden, so that the correct
* version (from jdbc1 or jdbc2) are returned.
*/
- protected abstract java.sql.ResultSet getResultSet(org.postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount) throws SQLException;
+ protected abstract java.sql.ResultSet getResultSet(org.postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount,int insertOID) throws SQLException;
public abstract void close() throws SQLException;
diff --git a/src/interfaces/jdbc/org/postgresql/ResultSet.java b/src/interfaces/jdbc/org/postgresql/ResultSet.java
index e601e239eba..cec62614ca4 100644
--- a/src/interfaces/jdbc/org/postgresql/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/ResultSet.java
@@ -19,6 +19,7 @@ public abstract class ResultSet
protected Field fields[]; // The field descriptions
protected String status; // Status of the result
protected int updateCount; // How many rows did we get back?
+ protected int insertOID; // The oid of an inserted row
protected int current_row; // Our pointer to where we are at
protected byte[][] this_row; // the current row result
protected Connection connection; // the connection which we returned from
@@ -40,17 +41,35 @@ public abstract class ResultSet
* @param updateCount the number of rows affected by the operation
* @param cursor the positioned update/delete cursor name
*/
- public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount)
+ public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount,int insertOID)
{
this.connection = conn;
this.fields = fields;
this.rows = tuples;
this.status = status;
this.updateCount = updateCount;
+ this.insertOID = insertOID;
this.this_row = null;
this.current_row = -1;
}
+
+ /**
+ * Create a new ResultSet - Note that we create ResultSets to
+ * represent the results of everything.
+ *
+ * @param fields an array of Field objects (basically, the
+ * ResultSet MetaData)
+ * @param tuples Vector of the actual data
+ * @param status the status string returned from the back end
+ * @param updateCount the number of rows affected by the operation
+ * @param cursor the positioned update/delete cursor name
+ */
+ public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount)
+ {
+ this(conn,fields,tuples,status,updateCount,0);
+ }
+
/**
* We at times need to know if the resultSet we are working
* with is the result of an UPDATE, DELETE or INSERT (in which
@@ -149,6 +168,14 @@ public abstract class ResultSet
}
/**
+ * returns the OID of the last inserted row
+ */
+ public int getInsertedOID()
+ {
+ return insertOID;
+ }
+
+ /**
* This is part of the JDBC API, but is required by org.postgresql.Field
*/
public abstract void close() throws SQLException;
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java b/src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java
index d178fa74ad9..ca03fb7d9f2 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java
@@ -17,7 +17,7 @@ import org.postgresql.largeobject.*;
import org.postgresql.util.*;
/**
- * $Id: Connection.java,v 1.1 2000/04/17 20:07:48 peter Exp $
+ * $Id: Connection.java,v 1.1.2.1 2000/06/15 04:12:36 momjian Exp $
*
* A Connection represents a session with a specific database. Within the
* context of a Connection, SQL statements are executed and results are
@@ -378,9 +378,9 @@ public class Connection extends org.postgresql.Connection implements java.sql.Co
* This overides the method in org.postgresql.Connection and returns a
* ResultSet.
*/
- protected java.sql.ResultSet getResultSet(org.postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount) throws SQLException
+ protected java.sql.ResultSet getResultSet(org.postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount,int insertOID) throws SQLException
{
- return new org.postgresql.jdbc1.ResultSet((org.postgresql.jdbc1.Connection)conn,fields,tuples,status,updateCount);
+ return new org.postgresql.jdbc1.ResultSet((org.postgresql.jdbc1.Connection)conn,fields,tuples,status,updateCount,insertOID);
}
}
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
index 6bd748e1252..497e401bde8 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
@@ -69,9 +69,25 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
* @param updateCount the number of rows affected by the operation
* @param cursor the positioned update/delete cursor name
*/
+ public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount,int insertOID)
+ {
+ super(conn,fields,tuples,status,updateCount,insertOID);
+ }
+
+ /**
+ * Create a new ResultSet - Note that we create ResultSets to
+ * represent the results of everything.
+ *
+ * @param fields an array of Field objects (basically, the
+ * ResultSet MetaData)
+ * @param tuples Vector of the actual data
+ * @param status the status string returned from the back end
+ * @param updateCount the number of rows affected by the operation
+ * @param cursor the positioned update/delete cursor name
+ */
public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount)
{
- super(conn,fields,tuples,status,updateCount);
+ super(conn,fields,tuples,status,updateCount,0);
}
/**
@@ -437,7 +453,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
if(s==null)
return null;
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzz");
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return new Timestamp(df.parse(s).getTime());
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java
index 62b3f6f4459..327933f400f 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java
@@ -17,7 +17,7 @@ import org.postgresql.largeobject.*;
import org.postgresql.util.*;
/**
- * $Id: Connection.java,v 1.1 2000/04/17 20:07:50 peter Exp $
+ * $Id: Connection.java,v 1.1.2.1 2000/06/15 04:12:41 momjian Exp $
*
* A Connection represents a session with a specific database. Within the
* context of a Connection, SQL statements are executed and results are
@@ -378,9 +378,9 @@ public class Connection extends org.postgresql.Connection implements java.sql.Co
* This overides the method in org.postgresql.Connection and returns a
* ResultSet.
*/
- protected java.sql.ResultSet getResultSet(org.postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount) throws SQLException
+ protected java.sql.ResultSet getResultSet(org.postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount, int insertOID) throws SQLException
{
- return new org.postgresql.jdbc2.ResultSet((org.postgresql.jdbc2.Connection)conn,fields,tuples,status,updateCount);
+ return new org.postgresql.jdbc2.ResultSet((org.postgresql.jdbc2.Connection)conn,fields,tuples,status,updateCount,insertOID);
}
// *****************
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
index e3d1693629f..85cb3c1f434 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
@@ -70,12 +70,28 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
* @param updateCount the number of rows affected by the operation
* @param cursor the positioned update/delete cursor name
*/
- public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount)
+ public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount,int insertOID)
{
- super(conn,fields,tuples,status,updateCount);
+ super(conn,fields,tuples,status,updateCount,insertOID);
}
/**
+ * Create a new ResultSet - Note that we create ResultSets to
+ * represent the results of everything.
+ *
+ * @param fields an array of Field objects (basically, the
+ * ResultSet MetaData)
+ * @param tuples Vector of the actual data
+ * @param status the status string returned from the back end
+ * @param updateCount the number of rows affected by the operation
+ * @param cursor the positioned update/delete cursor name
+ */
+ public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount)
+ {
+ super(conn,fields,tuples,status,updateCount,0);
+ }
+
+ /**
* A ResultSet is initially positioned before its first row,
* the first call to next makes the first row the current row;
* the second call makes the second row the current row, etc.
@@ -331,6 +347,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
} catch (NumberFormatException e) {
throw new PSQLException ("postgresql.res.badbigdec",s);
}
+ if (scale==-1) return val;
try
{
return val.setScale(scale);
@@ -439,7 +456,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
if(s==null)
return null;
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzz");
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return new Timestamp(df.parse(s).getTime());
@@ -723,7 +740,8 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
case Types.BIGINT:
return new Long(getLong(columnIndex));
case Types.NUMERIC:
- return getBigDecimal(columnIndex, ((field.mod-4) & 0xffff));
+ return getBigDecimal
+ (columnIndex, (field.mod==-1)?-1:((field.mod-4) & 0xffff));
case Types.REAL:
return new Float(getFloat(columnIndex));
case Types.DOUBLE:
@@ -783,15 +801,34 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
public boolean absolute(int index) throws SQLException
{
- // Peter: Added because negative indices read from the end of the
- // ResultSet
- if(index<0)
- index=rows.size()+index;
-
- if (index==0 || index > rows.size())
+ // index is 1-based, but internally we use 0-based indices
+ int internalIndex;
+
+ if (index==0)
+ throw new SQLException("Cannot move to index of 0");
+
+ //if index<0, count from the end of the result set, but check
+ //to be sure that it is not beyond the first index
+ if (index<0)
+ if (index>=-rows.size())
+ internalIndex=rows.size()+index;
+ else {
+ beforeFirst();
+ return false;
+ }
+
+ //must be the case that index>0,
+ //find the correct place, assuming that
+ //the index is not too large
+ if (index<=rows.size())
+ internalIndex = index-1;
+ else {
+ afterLast();
return false;
-
- this_row = (byte [][])rows.elementAt(index);
+ }
+
+ current_row=internalIndex;
+ this_row = (byte [][])rows.elementAt(internalIndex);
return true;
}
@@ -1022,7 +1059,8 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
// Peter: Implemented in 7.0
public boolean relative(int rows) throws SQLException
{
- return absolute(current_row+rows);
+ //have to add 1 since absolute expects a 1-based index
+ return absolute(current_row+1+rows);
}
public boolean rowDeleted() throws SQLException
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java
index b96041c7268..1da970fa88c 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java
@@ -417,5 +417,4 @@ public class Statement implements java.sql.Statement
throw org.postgresql.Driver.notImplemented();
}
-
}