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

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.largeobject;
  2. import java.io.*;
  3. import java.lang.*;
  4. import java.net.*;
  5. import java.util.*;
  6. import java.sql.*;
  7. import postgresql.fastpath.*;
  8. import postgresql.util.*;
  9. /**
  10.  * This class implements the large object interface to postgresql.
  11.  *
  12.  * <p>It provides methods that allow client code to create, open and delete
  13.  * large objects from the database. When opening an object, an instance of
  14.  * postgresql.largeobject.LargeObject is returned, and its methods then allow
  15.  * access to the object.
  16.  *
  17.  * <p>This class can only be created by postgresql.Connection
  18.  *
  19.  * <p>To get access to this class, use the following segment of code:
  20.  * <br><pre>
  21.  * import postgresql.largeobject.*;
  22.  *
  23.  * Connection  conn;
  24.  * LargeObjectManager lobj;
  25.  *
  26.  * ... code that opens a connection ...
  27.  *
  28.  * lobj = ((postgresql.Connection)myconn).getLargeObjectAPI();
  29.  * </pre>
  30.  *
  31.  * <p>Normally, client code would use the getAsciiStream, getBinaryStream,
  32.  * or getUnicodeStream methods in ResultSet, or setAsciiStream, 
  33.  * setBinaryStream, or setUnicodeStream methods in PreparedStatement to
  34.  * access Large Objects.
  35.  *
  36.  * <p>However, sometimes lower level access to Large Objects are required,
  37.  * that are not supported by the JDBC specification.
  38.  *
  39.  * <p>Refer to postgresql.largeobject.LargeObject on how to manipulate the
  40.  * contents of a Large Object.
  41.  *
  42.  * @see postgresql.largeobject.LargeObject
  43.  * @see postgresql.ResultSet#getAsciiStream
  44.  * @see postgresql.ResultSet#getBinaryStream
  45.  * @see postgresql.ResultSet#getUnicodeStream
  46.  * @see postgresql.PreparedStatement#setAsciiStream
  47.  * @see postgresql.PreparedStatement#setBinaryStream
  48.  * @see postgresql.PreparedStatement#setUnicodeStream
  49.  * @see java.sql.ResultSet#getAsciiStream
  50.  * @see java.sql.ResultSet#getBinaryStream
  51.  * @see java.sql.ResultSet#getUnicodeStream
  52.  * @see java.sql.PreparedStatement#setAsciiStream
  53.  * @see java.sql.PreparedStatement#setBinaryStream
  54.  * @see java.sql.PreparedStatement#setUnicodeStream
  55.  */
  56. public class LargeObjectManager
  57. {
  58.   // the fastpath api for this connection
  59.   private Fastpath fp;
  60.   
  61.   /**
  62.    * This mode indicates we want to write to an object
  63.    */
  64.   public static final int WRITE   = 0x00020000;
  65.   
  66.   /**
  67.    * This mode indicates we want to read an object
  68.    */
  69.   public static final int READ    = 0x00040000;
  70.   
  71.   /**
  72.    * This mode is the default. It indicates we want read and write access to
  73.    * a large object
  74.    */
  75.   public static final int READWRITE = READ | WRITE;
  76.   
  77.   /**
  78.    * This prevents us being created by mere mortals
  79.    */
  80.   private LargeObjectManager()
  81.   {
  82.   }
  83.   
  84.   /**
  85.    * Constructs the LargeObject API.
  86.    *
  87.    * <p><b>Important Notice</b>
  88.    * <br>This method should only be called by postgresql.Connection
  89.    *
  90.    * <p>There should only be one LargeObjectManager per Connection. The
  91.    * postgresql.Connection class keeps track of the various extension API's
  92.    * and it's advised you use those to gain access, and not going direct.
  93.    */
  94.   public LargeObjectManager(postgresql.Connection conn) throws SQLException
  95.   {
  96.     // We need Fastpath to do anything
  97.     this.fp = conn.getFastpathAPI();
  98.     
  99.     // Now get the function oid's for the api
  100.     //
  101.     // This is an example of Fastpath.addFunctions();
  102.     //
  103.     java.sql.ResultSet res = (java.sql.ResultSet)conn.createStatement().executeQuery("select proname, oid from pg_proc" +
  104.       " where proname = 'lo_open'" +
  105.       "    or proname = 'lo_close'" +
  106.       "    or proname = 'lo_creat'" +
  107.       "    or proname = 'lo_unlink'" +
  108.       "    or proname = 'lo_lseek'" +
  109.       "    or proname = 'lo_tell'" +
  110.       "    or proname = 'loread'" +
  111.       "    or proname = 'lowrite'");
  112.     
  113.     if(res==null)
  114.       throw new PSQLException("postgresql.lo.init");
  115.     
  116.     fp.addFunctions(res);
  117.     res.close();
  118.     DriverManager.println("Large Object initialised");
  119.   }
  120.   
  121.   /**
  122.    * This opens an existing large object, based on its OID. This method
  123.    * assumes that READ and WRITE access is required (the default).
  124.    *
  125.    * @param oid of large object
  126.    * @return LargeObject instance providing access to the object
  127.    * @exception SQLException on error
  128.    */
  129.   public LargeObject open(int oid) throws SQLException
  130.   {
  131.     return new LargeObject(fp,oid,READWRITE);
  132.   }
  133.   
  134.   /**
  135.    * This opens an existing large object, based on its OID
  136.    *
  137.    * @param oid of large object
  138.    * @param mode mode of open
  139.    * @return LargeObject instance providing access to the object
  140.    * @exception SQLException on error
  141.    */
  142.   public LargeObject open(int oid,int mode) throws SQLException
  143.   {
  144.     return new LargeObject(fp,oid,mode);
  145.   }
  146.   
  147.   /**
  148.    * This creates a large object, returning its OID.
  149.    *
  150.    * <p>It defaults to READWRITE for the new object's attributes.
  151.    *
  152.    * @return oid of new object
  153.    * @exception SQLException on error
  154.    */
  155.   public int create() throws SQLException
  156.   {
  157.     FastpathArg args[] = new FastpathArg[1];
  158.     args[0] = new FastpathArg(READWRITE);
  159.     return fp.getInteger("lo_creat",args);
  160.   }
  161.   
  162.   /**
  163.    * This creates a large object, returning its OID
  164.    *
  165.    * @param mode a bitmask describing different attributes of the new object
  166.    * @return oid of new object
  167.    * @exception SQLException on error
  168.    */
  169.   public int create(int mode) throws SQLException
  170.   {
  171.     FastpathArg args[] = new FastpathArg[1];
  172.     args[0] = new FastpathArg(mode);
  173.     return fp.getInteger("lo_creat",args);
  174.   }
  175.   
  176.   /**
  177.    * This deletes a large object.
  178.    *
  179.    * @param oid describing object to delete
  180.    * @exception SQLException on error
  181.    */
  182.   public void delete(int oid) throws SQLException
  183.   {
  184.     FastpathArg args[] = new FastpathArg[1];
  185.     args[0] = new FastpathArg(oid);
  186.     fp.fastpath("lo_unlink",false,args);
  187.   }
  188.   
  189.   /**
  190.    * This deletes a large object.
  191.    *
  192.    * <p>It is identical to the delete method, and is supplied as the C API uses
  193.    * unlink.
  194.    *
  195.    * @param oid describing object to delete
  196.    * @exception SQLException on error
  197.    */
  198.   public void unlink(int oid) throws SQLException
  199.   {
  200.     delete(oid);
  201.   }
  202.   
  203. }