blobtest.java
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. package example;
  2. import java.io.*;
  3. import java.sql.*;
  4. import postgresql.largeobject.*;
  5. /**
  6.  * This test attempts to create a blob in the database, then to read
  7.  * it back.
  8.  *
  9.  * Important note: You will notice we import the postgresql.largeobject
  10.  * package, but don't import the postgresql package. The reason for this is
  11.  * that importing postgresql can confuse javac (we have conflicting class names
  12.  * in postgresql.* and java.sql.*). This doesn't cause any problems, as long
  13.  * as no code imports postgresql.
  14.  *
  15.  * Under normal circumstances, code using any jdbc driver only needs to import
  16.  * java.sql, so this isn't a problem.
  17.  *
  18.  * It's only if you use the non jdbc facilities, do you have to take this into
  19.  * account.
  20.  *
  21.  */
  22. public class blobtest
  23. {
  24.   Connection db;
  25.   Statement s;
  26.   LargeObjectManager lobj;
  27.   
  28.   public blobtest(String args[]) throws ClassNotFoundException, FileNotFoundException, IOException, SQLException
  29.   {
  30.     String url = args[0];
  31.     String usr = args[1];
  32.     String pwd = args[2];
  33.     
  34.     // Load the driver
  35.     Class.forName("postgresql.Driver");
  36.     
  37.     // Connect to database
  38.     System.out.println("Connecting to Database URL = " + url);
  39.     db = DriverManager.getConnection(url, usr, pwd);
  40.     System.out.println("Connected...Now creating a statement");
  41.     s = db.createStatement();
  42.     
  43.     // Now run tests using postgresql's own Large object api
  44.     // NOTE: The methods shown in this example are _NOT_ JDBC, but are
  45.     // an implementation of the calls found in libpq. Unless you need to
  46.     // use this functionality, look at the jdbc tests on how to access blobs.
  47.     ownapi();
  48.     
  49.     // Now run tests using JDBC methods
  50.     //jdbcapi(db,s);
  51.     
  52.     // Finally close the database
  53.     System.out.println("Now closing the connection");
  54.     s.close();
  55.     db.close();
  56.     
  57.   }
  58.   
  59.   /**
  60.    * Now this is an extension to JDBC, unique to postgresql. Here we fetch
  61.    * an PGlobj object, which provides us with access to postgresql's
  62.    * large object api.
  63.    */
  64.   public void ownapi() throws FileNotFoundException, IOException, SQLException
  65.   {
  66.     System.out.println("n----------------------------------------------------------------------nTesting postgresql large object apin");
  67.     
  68.     // Internally, the driver provides JDBC compliant methods to access large
  69.     // objects, however the unique methods available to postgresql makes things 
  70.     System.out.println("Gaining access to large object api");
  71.     lobj = ((postgresql.Connection)db).getLargeObjectAPI();
  72.     
  73.     int oid = ownapi_test1();
  74.     ownapi_test2(oid);
  75.     //ownapi_test3(oid);
  76.     System.out.println("nnOID="+oid);
  77.   }
  78.   
  79.   private int ownapi_test1() throws FileNotFoundException, IOException, SQLException
  80.   {
  81.     System.out.println("Test 1 Creating a large objectn");
  82.     
  83.     // Ok, test 1 is to create a large object. To do this, we use the create
  84.     // method.
  85.     System.out.println("Creating a large object");
  86.     int oid = lobj.create(LargeObjectManager.READ|LargeObjectManager.WRITE);
  87.     DriverManager.println("got large object oid="+oid);
  88.     
  89.     LargeObject obj = lobj.open(oid,LargeObjectManager.WRITE);
  90.     DriverManager.println("got large object obj="+obj);
  91.     
  92.     // Now open a test file - this class will do
  93.     System.out.println("Opening test source object");
  94.     FileInputStream fis = new FileInputStream("example/blobtest.java");
  95.     
  96.     // copy the data
  97.     System.out.println("Copying file to large object");
  98.     byte buf[] = new byte[2048];
  99.     int s,tl=0;
  100.     while((s=fis.read(buf,0,2048))>0) {
  101.       System.out.println("Block size="+s+" offset="+tl);
  102.       //System.out.write(buf);
  103.       obj.write(buf,0,s);
  104.       tl+=s;
  105.     }
  106.     DriverManager.println("Copied "+tl+" bytes");
  107.     
  108.     // Close the object
  109.     System.out.println("Closing object");
  110.     obj.close();
  111.     
  112.     return oid;
  113.   }
  114.   
  115.   private void ownapi_test2(int oid) throws FileNotFoundException, IOException, SQLException
  116.   {
  117.     System.out.println("Test 2 Reading a large object and save as a filen");
  118.     
  119.     // Now open the large object
  120.     System.out.println("Opening large object "+oid);
  121.     LargeObject obj = lobj.open(oid,LargeObjectManager.READ);
  122.     DriverManager.println("got obj="+obj);
  123.     
  124.     // Now open a test file - this class will do
  125.     System.out.println("Opening test destination object");
  126.     FileOutputStream fos = new FileOutputStream("blob_testoutput");
  127.     
  128.     // copy the data
  129.     System.out.println("Copying large object to file");
  130.     byte buf[] = new byte[512];
  131.     int s=obj.size();
  132.     int tl=0;
  133.     while(s>0) {
  134.       int rs = buf.length;
  135.       if(s<rs) rs=s;
  136.       obj.read(buf,0,rs);
  137.       fos.write(buf,0,rs);
  138.       tl+=rs;
  139.       s-=rs;
  140.     }
  141.     DriverManager.println("Copied "+tl+"/"+obj.size()+" bytes");
  142.     
  143.     // Close the object
  144.     System.out.println("Closing object");
  145.     obj.close();
  146.   }
  147.   
  148.   private void ownapi_test3(int oid) throws SQLException
  149.   {
  150.     System.out.println("Test 3 Deleting a large objectn");
  151.     
  152.     // Now open the large object
  153.     System.out.println("Deleting large object "+oid);
  154.     lobj.unlink(oid);
  155.   }
  156.   
  157.   //=========================================================================
  158.   
  159.   public static void instructions()
  160.   {
  161.     System.err.println("java example.blobtest jdbc-url user password [debug]");
  162.     System.err.println("nExamples:n");
  163.     System.err.println("java -Djdbc.driver=postgresql.Driver example.blobtest jdbc:postgresql:test postgres passwordnThis will run the tests on the database test on the local host.n");
  164.     System.err.println("java -Djdbc.driver=postgresql.Driver example.blobtest jdbc:postgresql:test postgres password debugnThis is the same as above, but will output debug information.n");
  165.     
  166.     System.err.println("This example tests the binary large object api of the driver.nThis allows images or java objects to be stored in the database, and retrievednusing both postgresql's own api, and the standard JDBC api.");
  167.   }
  168.   
  169.   public static void main(String args[])
  170.   {
  171.     System.out.println("PostgreSQL blobtest v6.3 rev 1n");
  172.     
  173.     if(args.length<3) {
  174.       instructions();
  175.       System.exit(1);
  176.     }
  177.     
  178.     // This line outputs debug information to stderr. To enable this, simply
  179.     // add an extra parameter to the command line
  180.     if(args.length>3)
  181.       DriverManager.setLogStream(System.err);
  182.     
  183.     // Now run the tests
  184.     try {
  185.       blobtest test = new blobtest(args);
  186.     } catch(Exception ex) {
  187.       System.err.println("Exception caught.n"+ex);
  188.       ex.printStackTrace();
  189.     }
  190.   }
  191. }