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

mpeg/mp3

开发平台:

C/C++

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