mirror of
https://github.com/postgres/postgres.git
synced 2026-04-15 05:56:48 -04:00
The bug was that any insert or update would fail if the returned oid was larger than a signed int. Since OIDs are unsigned int's it was a bug that the code used a java signed int to deal with the values. The bug would result in the error message: "Unable to fathom update count". While fixing the bug, it became apparent that other code made a similar assumption about OIDs being signed ints. Therefore some methods that returned or took OIDs are arguements also needed to be changed. Since we are so close to the 7.2 release I have added new methods that return longs and deprecated the old methods returning ints. Therefore all old code should still work without requiring a code change to cast from long to int. Also note that the methods below are PostgreSQL specific extensions to the JDBC api are are not part of the spec from Sun, thus it is unlikely that they are used much or at all. The deprecated methods are: ResultSet.getInsertedOID() Statement.getInsertedOID() Serialize.store() Connection.putObject() and are replaced by: ResultSet.getLastOID() Statement.getLastOID() Serialize.storeObject() Connection.storeObject() All the deprecated methods returned int, while their replacements return long This patch also fixes two comments in MD5Digest that the author Jeremy Wohl submitted. --Barry
219 lines
6.6 KiB
Java
219 lines
6.6 KiB
Java
package example;
|
|
|
|
import java.io.*;
|
|
import java.sql.*;
|
|
import java.text.*;
|
|
|
|
/*
|
|
*
|
|
* $Id: basic.java,v 1.11 2001/11/25 23:26:56 barry Exp $
|
|
*
|
|
* This example tests the basic components of the JDBC driver, and shows
|
|
* how even the simplest of queries can be implemented.
|
|
*
|
|
* To use this example, you need a database to be in existence. This example
|
|
* will create a table called basic.
|
|
*
|
|
* Note: This will only work with post 7.0 drivers.
|
|
*
|
|
*/
|
|
|
|
public class basic
|
|
{
|
|
Connection db; // The connection to the database
|
|
Statement st; // Our statement to run queries with
|
|
|
|
public basic(String args[]) throws ClassNotFoundException, FileNotFoundException, IOException, SQLException
|
|
{
|
|
String url = args[0];
|
|
String usr = args[1];
|
|
String pwd = args[2];
|
|
|
|
// Load the driver
|
|
Class.forName("org.postgresql.Driver");
|
|
|
|
// Connect to database
|
|
System.out.println("Connecting to Database URL = " + url);
|
|
db = DriverManager.getConnection(url, usr, pwd);
|
|
|
|
System.out.println("Connected...Now creating a statement");
|
|
st = db.createStatement();
|
|
|
|
// Clean up the database (in case we failed earlier) then initialise
|
|
cleanup();
|
|
|
|
// Now run tests using JDBC methods
|
|
doexample();
|
|
|
|
// Clean up the database
|
|
cleanup();
|
|
|
|
// Finally close the database
|
|
System.out.println("Now closing the connection");
|
|
st.close();
|
|
db.close();
|
|
|
|
//throw postgresql.Driver.notImplemented();
|
|
}
|
|
|
|
/*
|
|
* This drops the table (if it existed). No errors are reported.
|
|
*/
|
|
public void cleanup()
|
|
{
|
|
try
|
|
{
|
|
st.executeUpdate("drop table basic");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// We ignore any errors here
|
|
}
|
|
}
|
|
|
|
/*
|
|
* This performs the example
|
|
*/
|
|
public void doexample() throws SQLException
|
|
{
|
|
System.out.println("\nRunning tests:");
|
|
|
|
// First we need a table to store data in
|
|
st.executeUpdate("create table basic (a int2, b int2)");
|
|
|
|
// Now insert some data, using the Statement
|
|
st.executeUpdate("insert into basic values (1,1)");
|
|
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
|
|
// updated for 7.1
|
|
st.executeUpdate("insert into basic values (4,1)");
|
|
long insertedOID = ((org.postgresql.Statement)st).getLastOID();
|
|
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
|
|
// precompiling, but does support setting a column to the value of a
|
|
// Java object (like Date, String, etc).
|
|
//
|
|
// Also, this is the only way of writing dates in a datestyle independent
|
|
// manner. (DateStyles are PostgreSQL's way of handling different methods
|
|
// of representing dates in the Date data type.)
|
|
PreparedStatement ps = db.prepareStatement("insert into basic values (?,?)");
|
|
for (int i = 2;i < 5;i++)
|
|
{
|
|
ps.setInt(1, 4); // "column a" = 5
|
|
ps.setInt(2, i); // "column b" = i
|
|
ps.executeUpdate(); // executeUpdate because insert returns no data
|
|
}
|
|
ps.close(); // Always close when we are done with it
|
|
|
|
// Finally perform a query on the table
|
|
System.out.println("performing a query");
|
|
ResultSet rs = st.executeQuery("select a, b from basic");
|
|
if (rs != null)
|
|
{
|
|
// Now we run through the result set, printing out the result.
|
|
// Note, we must call .next() before attempting to read any results
|
|
while (rs.next())
|
|
{
|
|
int a = rs.getInt("a"); // This shows how to get the value by name
|
|
int b = rs.getInt(2); // This shows how to get the value by column
|
|
System.out.println(" a=" + a + " b=" + b);
|
|
}
|
|
rs.close(); // again, you must close the result when done
|
|
}
|
|
|
|
// 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)
|
|
{
|
|
// First find out the column numbers.
|
|
//
|
|
// It's best to do this here, as calling the methods with the column
|
|
// numbers actually performs this call each time they are called. This
|
|
// really speeds things up on large queries.
|
|
//
|
|
int col_a = rs.findColumn("a");
|
|
int col_b = rs.findColumn("b");
|
|
|
|
// Now we run through the result set, printing out the result.
|
|
// Again, we must call .next() before attempting to read any results
|
|
while (rs.next())
|
|
{
|
|
int a = rs.getInt(col_a); // This shows how to get the value by name
|
|
int b = rs.getInt(col_b); // This shows how to get the value by column
|
|
System.out.println(" a=" + a + " b=" + b);
|
|
}
|
|
rs.close(); // again, you must close the result when done
|
|
}
|
|
|
|
// 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");
|
|
while (rs.next())
|
|
{
|
|
int a = rs.getInt("a"); // This shows how to get the value by name
|
|
int b = rs.getInt(2); // This shows how to get the value by column
|
|
System.out.println(" a=" + a + " b=" + b);
|
|
}
|
|
rs.close(); // again, you must close the result when done
|
|
|
|
// The last thing to do is to drop the table. This is done in the
|
|
// cleanup() method.
|
|
}
|
|
|
|
/*
|
|
* Display some instructions on how to run the example
|
|
*/
|
|
public static void instructions()
|
|
{
|
|
System.out.println("\nThis example tests the basic components of the JDBC driver, demonstrating\nhow to build simple queries in java.\n");
|
|
System.out.println("Useage:\n java example.basic jdbc:postgresql:database user password [debug]\n\nThe debug field can be anything. It's presence will enable DriverManager's\ndebug trace. Unless you want to see screens of items, don't put anything in\nhere.");
|
|
System.exit(1);
|
|
}
|
|
|
|
/*
|
|
* This little lot starts the test
|
|
*/
|
|
public static void main(String args[])
|
|
{
|
|
System.out.println("PostgreSQL basic test v6.3 rev 1\n");
|
|
|
|
if (args.length < 3)
|
|
instructions();
|
|
|
|
// This line outputs debug information to stderr. To enable this, simply
|
|
// add an extra parameter to the command line
|
|
if (args.length > 3)
|
|
DriverManager.setLogStream(System.err);
|
|
|
|
// Now run the tests
|
|
try
|
|
{
|
|
basic test = new basic(args);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.err.println("Exception caught.\n" + ex);
|
|
ex.printStackTrace();
|
|
}
|
|
}
|
|
}
|