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

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 the basic methods required to run the interface, plus
  12.  * a pair of methods that provide InputStream and OutputStream classes
  13.  * for this object.
  14.  *
  15.  * <p>Normally, client code would use the getAsciiStream, getBinaryStream,
  16.  * or getUnicodeStream methods in ResultSet, or setAsciiStream, 
  17.  * setBinaryStream, or setUnicodeStream methods in PreparedStatement to
  18.  * access Large Objects.
  19.  *
  20.  * <p>However, sometimes lower level access to Large Objects are required,
  21.  * that are not supported by the JDBC specification.
  22.  *
  23.  * <p>Refer to postgresql.largeobject.LargeObjectManager on how to gain access
  24.  * to a Large Object, or how to create one.
  25.  *
  26.  * @see postgresql.largeobject.LargeObjectManager
  27.  * @see postgresql.ResultSet#getAsciiStream
  28.  * @see postgresql.ResultSet#getBinaryStream
  29.  * @see postgresql.ResultSet#getUnicodeStream
  30.  * @see postgresql.PreparedStatement#setAsciiStream
  31.  * @see postgresql.PreparedStatement#setBinaryStream
  32.  * @see postgresql.PreparedStatement#setUnicodeStream
  33.  * @see java.sql.ResultSet#getAsciiStream
  34.  * @see java.sql.ResultSet#getBinaryStream
  35.  * @see java.sql.ResultSet#getUnicodeStream
  36.  * @see java.sql.PreparedStatement#setAsciiStream
  37.  * @see java.sql.PreparedStatement#setBinaryStream
  38.  * @see java.sql.PreparedStatement#setUnicodeStream
  39.  *
  40.  */
  41. public class LargeObject
  42. {
  43.   /**
  44.    * Indicates a seek from the begining of a file
  45.    */
  46.   public static final int SEEK_SET = 0;
  47.   
  48.   /**
  49.    * Indicates a seek from the current position
  50.    */
  51.   public static final int SEEK_CUR = 1;
  52.   
  53.   /**
  54.    * Indicates a seek from the end of a file
  55.    */
  56.   public static final int SEEK_END = 2;
  57.   
  58.   private Fastpath fp; // Fastpath API to use
  59.   private int oid; // OID of this object
  60.   private int fd; // the descriptor of the open large object
  61.   
  62.   /**
  63.    * This opens a large object.
  64.    *
  65.    * <p>If the object does not exist, then an SQLException is thrown.
  66.    *
  67.    * @param fp FastPath API for the connection to use
  68.    * @param oid of the Large Object to open
  69.    * @param mode Mode of opening the large object
  70.    * (defined in LargeObjectManager)
  71.    * @exception SQLException if a database-access error occurs.
  72.    * @see postgresql.largeobject.LargeObjectManager
  73.    */
  74.   protected LargeObject(Fastpath fp,int oid,int mode) throws SQLException
  75.   {
  76.     this.fp = fp;
  77.     this.oid = oid;
  78.     
  79.     FastpathArg args[] = new FastpathArg[2];
  80.     args[0] = new FastpathArg(oid);
  81.     args[1] = new FastpathArg(mode);
  82.     this.fd = fp.getInteger("lo_open",args);
  83.   }
  84.   
  85.   /**
  86.    * @return the OID of this LargeObject
  87.    */
  88.   public int getOID()
  89.   {
  90.     return oid;
  91.   }
  92.   
  93.   /**
  94.    * This method closes the object. You must not call methods in this
  95.    * object after this is called.
  96.    * @exception SQLException if a database-access error occurs.
  97.    */
  98.   public void close() throws SQLException
  99.   {
  100.     FastpathArg args[] = new FastpathArg[1];
  101.     args[0] = new FastpathArg(fd);
  102.     fp.fastpath("lo_close",false,args); // true here as we dont care!!
  103.   }
  104.   
  105.   /**
  106.    * Reads some data from the object, and return as a byte[] array
  107.    *
  108.    * @param len number of bytes to read
  109.    * @return byte[] array containing data read
  110.    * @exception SQLException if a database-access error occurs.
  111.    */
  112.   public byte[] read(int len) throws SQLException
  113.   {
  114.     FastpathArg args[] = new FastpathArg[2];
  115.     args[0] = new FastpathArg(fd);
  116.     args[1] = new FastpathArg(len);
  117.     return fp.getData("loread",args);
  118.   }
  119.   
  120.   /**
  121.    * Reads some data from the object into an existing array
  122.    *
  123.    * @param buf destination array
  124.    * @param off offset within array
  125.    * @param len number of bytes to read
  126.    * @exception SQLException if a database-access error occurs.
  127.    */
  128.   public void read(byte buf[],int off,int len) throws SQLException
  129.   {
  130.     System.arraycopy(read(len),0,buf,off,len);
  131.   }
  132.   
  133.   /**
  134.    * Writes an array to the object
  135.    *
  136.    * @param buf array to write
  137.    * @exception SQLException if a database-access error occurs.
  138.    */
  139.   public void write(byte buf[]) throws SQLException
  140.   {
  141.     FastpathArg args[] = new FastpathArg[2];
  142.     args[0] = new FastpathArg(fd);
  143.     args[1] = new FastpathArg(buf);
  144.     fp.fastpath("lowrite",false,args);
  145.   }
  146.   
  147.   /**
  148.    * Writes some data from an array to the object
  149.    *
  150.    * @param buf destination array
  151.    * @param off offset within array
  152.    * @param len number of bytes to write
  153.    * @exception SQLException if a database-access error occurs.
  154.    */
  155.   public void write(byte buf[],int off,int len) throws SQLException
  156.   {
  157.     byte data[] = new byte[len];
  158.     System.arraycopy(buf,off,data,0,len);
  159.     write(data);
  160.   }
  161.   
  162.   /**
  163.    * Sets the current position within the object.
  164.    *
  165.    * <p>This is similar to the fseek() call in the standard C library. It
  166.    * allows you to have random access to the large object.
  167.    *
  168.    * @param pos position within object
  169.    * @param ref Either SEEK_SET, SEEK_CUR or SEEK_END
  170.    * @exception SQLException if a database-access error occurs.
  171.    */
  172.   public void seek(int pos,int ref) throws SQLException
  173.   {
  174.     FastpathArg args[] = new FastpathArg[3];
  175.     args[0] = new FastpathArg(fd);
  176.     args[1] = new FastpathArg(pos);
  177.     args[2] = new FastpathArg(ref);
  178.     fp.fastpath("lo_lseek",false,args);
  179.   }
  180.   
  181.   /**
  182.    * Sets the current position within the object.
  183.    *
  184.    * <p>This is similar to the fseek() call in the standard C library. It
  185.    * allows you to have random access to the large object.
  186.    *
  187.    * @param pos position within object from begining
  188.    * @exception SQLException if a database-access error occurs.
  189.    */
  190.   public void seek(int pos) throws SQLException
  191.   {
  192.     seek(pos,SEEK_SET);
  193.   }
  194.   
  195.   /**
  196.    * @return the current position within the object
  197.    * @exception SQLException if a database-access error occurs.
  198.    */
  199.   public int tell() throws SQLException
  200.   {
  201.     FastpathArg args[] = new FastpathArg[1];
  202.     args[0] = new FastpathArg(fd);
  203.     return fp.getInteger("lo_tell",args);
  204.   }
  205.   
  206.   /**
  207.    * This method is inefficient, as the only way to find out the size of
  208.    * the object is to seek to the end, record the current position, then
  209.    * return to the original position.
  210.    *
  211.    * <p>A better method will be found in the future.
  212.    *
  213.    * @return the size of the large object
  214.    * @exception SQLException if a database-access error occurs.
  215.    */
  216.   public int size() throws SQLException
  217.   {
  218.     int cp = tell();
  219.     seek(0,SEEK_END);
  220.     int sz = tell();
  221.     seek(cp,SEEK_SET);
  222.     return sz;
  223.   }
  224.   
  225.   /**
  226.    * Returns an InputStream from this object.
  227.    *
  228.    * <p>This InputStream can then be used in any method that requires an
  229.    * InputStream.
  230.    *
  231.    * @exception SQLException if a database-access error occurs.
  232.    */
  233.   public InputStream getInputStream() throws SQLException
  234.   {
  235.     throw new SQLException("LargeObject:getInputStream not implemented");
  236.   }
  237.   
  238.   /**
  239.    * Returns an OutputStream to this object
  240.    *
  241.    * <p>This OutputStream can then be used in any method that requires an
  242.    * OutputStream.
  243.    *
  244.    * @exception SQLException if a database-access error occurs.
  245.    */
  246.   public OutputStream getOutputStream() throws SQLException
  247.   {
  248.     throw new SQLException("LargeObject:getOutputStream not implemented");
  249.   }
  250. }