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

数据库系统

开发平台:

Unix_Linux

  1. <Chapter Id="jdbc">
  2. <Title>JDBC Interface</Title>
  3. <para>
  4. <note>
  5. <title>Author</title>
  6. <para>
  7. Written by <ulink url="peter@retep.org.uk">Peter T. Mount</ulink>, the
  8. author of the <acronym>JDBC</acronym> driver.
  9. </para>
  10. </note>
  11. </para>
  12. <para>
  13. <acronym>JDBC</acronym> is a core <acronym>API</acronym> of Java 1.1 and later.
  14. It provides a standard set of
  15. interfaces to <acronym>SQL</acronym>-compliant databases.
  16. </para>
  17. <para>
  18. <application>Postgres</application> provides 
  19. a type 4 <acronym>JDBC</acronym> Driver. Type 4 indicates that the driver
  20. is written in Pure Java, and communicates in the database's own network
  21. protocol. Because of this, the driver is platform independent. Once compiled,
  22. the driver can be used on any platform.
  23. </para>
  24. <sect1>
  25. <title>Building the <acronym>JDBC</acronym> Interface</title>
  26. <sect2>
  27. <title>Compiling the Driver</title>
  28. <para>
  29. The driver's source is located in the <filename>src/interfaces/jdbc</filename>
  30.  directory of the
  31. source tree. To compile simply change directory to that directory, and type:
  32. <programlisting>
  33. % make
  34. </programlisting>
  35. </para>
  36. <para>
  37. Upon completion, you will find the archive <filename>postgresql.jar</filename>
  38.  in the current
  39. directory. This is the <acronym>JDBC</acronym> driver.
  40. <note>
  41. <para>
  42. You must use <application>make</application>,
  43. not <application>javac</application>, 
  44. as the driver uses some dynamic
  45. loading techniques for performance reasons, 
  46. and <application>javac</application> cannot cope.
  47. The <filename>Makefile</filename> will generate the jar archive.
  48. </para>
  49. </note>
  50. </para>
  51. </sect2>
  52. <sect2>
  53. <title>Installing the Driver</title>
  54. <para>
  55. To use the driver, the jar archive postgresql.jar needs to be included in
  56. the CLASSPATH.
  57. </para>
  58. <para>
  59. Example:
  60. </para>
  61. <para>
  62. I have an application that uses the <acronym>JDBC</acronym> driver to access a large database
  63. containing astronomical objects. I have the application and the jdbc driver
  64. installed in the /usr/local/lib directory, and the java jdk installed in /usr/local/jdk1.1.6.
  65. </para>
  66. <para>
  67. To run the application, I would use:
  68. </para>
  69. <para>
  70. export CLASSPATH = 
  71.         /usr/local/lib/finder.jar:/usr/local/lib/postgresql.jar:.
  72. java uk.org.retep.finder.Main
  73. </para>
  74. <para>
  75. Loading the driver is covered later on in this chapter.
  76. </para>
  77. </sect2>
  78. </sect1>
  79. <sect1>
  80. <title>Preparing the Database for <acronym>JDBC</acronym></title>
  81. <para>
  82. Because Java can only use TCP/IP connections, the <application>Postgres</application> postmaster
  83. must be running with the -i flag.
  84. </para>
  85. <para>
  86. Also, the <filename>pg_hba.conf</filename> file must be configured. It's located in the PGDATA
  87. directory. In a default installation, this file permits access only by UNIX
  88. domain sockets. For the <acronym>JDBC</acronym> driver to connect to the same localhost, you need
  89. to add something like:
  90. </para>
  91. <para>
  92. host         all         127.0.0.1     255.255.255.255   password
  93. </para>
  94. <para>
  95. Here access to all databases are possible from the local machine 
  96. with <acronym>JDBC</acronym>.
  97. </para>
  98. <para>
  99. The <acronym>JDBC</acronym> Driver supports trust, ident, 
  100. password and crypt authentication methods.
  101. </para>
  102. </sect1>
  103. <sect1>
  104. <title>Using the Driver</title>
  105. <para>
  106. This section is not intended as a complete guide to 
  107. <acronym>JDBC</acronym> programming, but
  108. should help to get you started. For more information refer to the standard
  109. <acronym>JDBC</acronym> <acronym>API</acronym> documentation.
  110. </para>
  111. <para>
  112. Also, take a look at the examples included with the source. The basic
  113. example is used here.
  114. </para>
  115. </sect1>
  116. <sect1>
  117. <title>Importing <acronym>JDBC</acronym></title>
  118. <para>
  119. Any source that uses <acronym>JDBC</acronym>
  120. needs to import the java.sql package, using:
  121. <programlisting>
  122. import java.sql.*;
  123. </programlisting>
  124. <important>
  125. <para>
  126. Do not import the postgresql package. If you do, your source will not
  127. compile, as javac will get confused.
  128. </para>
  129. </important>
  130. </para>
  131. </sect1>
  132. <sect1>
  133. <title>Loading the Driver</title>
  134. <para>
  135. Before you can connect to a database, you need to load the driver. There
  136. are two methods available, and it depends on your code to the best one to use.
  137. </para>
  138. <para>
  139. In the first method, your code implicitly loads the driver using the
  140. Class.forName() method. For <application>Postgres</application>, you would use:
  141. <programlisting>
  142. Class.forName("postgresql.Driver");
  143. </programlisting>
  144. This will load the driver, and while loading, the driver will automatically
  145. register itself with <acronym>JDBC</acronym>.
  146. </para>
  147. <para>
  148. Note: The <function>forName()</function> method
  149.  can throw a ClassNotFoundException, so you will
  150. need to catch it if the driver is not available.
  151. </para>
  152. <para>
  153. This is the most common method to use, but restricts your code to use just
  154. <application>Postgres</application>. 
  155. If your code may access another database in the future, and you
  156. don't use our extensions, then the second method is advisable.
  157. </para>
  158. <para>
  159. The second method passes the driver as a parameter to the JVM as it starts,
  160. using the -D argument.
  161. </para>
  162. <para>
  163. Example:
  164. <programlisting>
  165. % java -Djdbc.drivers=postgresql.Driver example.ImageViewer
  166. </programlisting>
  167. </para>
  168. <para>
  169. In this example, the JVM will attempt to load the driver as part of it's
  170. initialisation. Once done, the ImageViewer is started.
  171. </para>
  172. <para>
  173. Now, this method is the better one to use because it allows your code to
  174. be used with other databases, without recompiling the code. The only thing
  175. that would also change is the URL, which is covered next.
  176. </para>
  177. <para>
  178. One last thing. When your code then tries to open a Connection, and you get
  179. a <literal>No driver available</literal> SQLException being thrown,
  180.  this is probably
  181. caused by the driver not being in the classpath, or the value in the parameter
  182. not being correct.
  183. </para>
  184. </sect1>
  185. <sect1>
  186. <title>Connecting to the Database</title>
  187. <para>
  188. With <acronym>JDBC</acronym>, a database is represented by a URL 
  189. (Uniform Resource Locator).
  190. With <application>Postgres</application>, this takes one of the following
  191. forms:
  192. <itemizedlist>
  193. <listitem>
  194. <para>
  195. jdbc:postgresql:<replaceable class="parameter">database</replaceable>
  196. </para>
  197. </listitem>
  198. <listitem>
  199. <para>
  200. jdbc:postgresql://<replaceable class="parameter">host</replaceable>/<replaceable class="parameter">database</replaceable>
  201. </para>
  202. </listitem>
  203. <listitem>
  204. <para>
  205. jdbc:postgresql://<replaceable class="parameter">host</replaceable>:<replaceable class="parameter">port</replaceable>/<replaceable class="parameter">database</replaceable>
  206. </para>
  207. </listitem>
  208. </itemizedlist>
  209. where:
  210. <variablelist>
  211. <varlistentry>
  212. <term>
  213. <replaceable class="parameter">host</replaceable>
  214. </term>
  215. <listitem>
  216. <para>
  217. The hostname of the server. Defaults to "localhost".
  218. </para>
  219. </listitem>
  220. </varlistentry>
  221. <varlistentry>
  222. <term>
  223. <replaceable class="parameter">port</replaceable>
  224. </term>
  225. <listitem>
  226. <para>
  227. The port number the server is listening on. Defaults to the Postgres
  228. standard port number (5432).
  229. </para>
  230. </listitem>
  231. </varlistentry>
  232. <varlistentry>
  233. <term>
  234. <replaceable class="parameter">database</replaceable>
  235. </term>
  236. <listitem>
  237. <para>
  238. The database name.
  239. </para>
  240. </listitem>
  241. </varlistentry>
  242. </variablelist>
  243. </para>
  244. <para>
  245. To connect, you need to get a Connection instance from 
  246. <acronym>JDBC</acronym>. To do this,
  247. you would use the DriverManager.getConnection() method:
  248. </para>
  249. <para>
  250. Connection db = DriverManager.getConnection(url,user,pwd);
  251. </para>
  252. </sect1>
  253. <sect1>
  254. <title>Issuing a Query and Processing the Result</title>
  255. <para>
  256. Any time you want to issue SQL statements to the database, you require a
  257. Statement instance. Once you have a Statement, you can use the executeQuery()
  258. method to issue a query. This will return a ResultSet instance, which contains
  259. the entire result.
  260. </para>
  261. <sect2>
  262. <title>Using the Statement Interface</title>
  263. <para>
  264. The following must be considered when using the Statement interface:
  265. <itemizedlist>
  266. <listitem>
  267. <para>
  268. You can use a Statement instance as many times as you want. You could
  269. create one as soon as you open the connection, and use it for the connections
  270. lifetime. You have to remember that only one ResultSet can exist per Statement.
  271. </para>
  272. </listitem>
  273. <listitem>
  274. <para>
  275. If you need to perform a query while processing a ResultSet, you can
  276. simply create and use another Statement.
  277. </para>
  278. </listitem>
  279. <listitem>
  280. <para>
  281. If you are using Threads, and several are using the database, you must
  282. use a separate Statement for each thread. Refer to the sections covering
  283. Threads and Servlets later in this document if you are thinking of using them,
  284. as it covers some important points.
  285. </para>
  286. </listitem>
  287. </itemizedlist>
  288. </para>
  289. </sect2>
  290. <sect2>
  291. <title>Using the ResultSet Interface</title>
  292. <para>
  293. The following must be considered when using the ResultSet interface:
  294. <itemizedlist>
  295. <listitem>
  296. <para>
  297. Before reading any values, you must call <function>next()</function>. This returns true if
  298. there is a result, but more importantly, it prepares the row for processing.
  299. </para>
  300. </listitem>
  301. <listitem>
  302. <para>
  303. Under the <acronym>JDBC</acronym> spec, you should access a field only once. It's safest
  304. to stick to this rule, although at the current time, the <application>Postgres</application> driver
  305. will allow you to access a field as many times as you want.
  306. </para>
  307. </listitem>
  308. <listitem>
  309. <para>
  310. You must close a ResultSet by calling <function>close()</function> once you have finished with it.
  311. </para>
  312. </listitem>
  313. <listitem>
  314. <para>
  315. Once you request another query with the Statement used to create a
  316. ResultSet, the currently open instance is closed.
  317. </para>
  318. </listitem>
  319. </itemizedlist>
  320. </para>
  321. <para>
  322. An example is as follows:
  323. <programlisting>
  324. Statement st = db.createStatement();
  325. ResultSet rs = st.executeQuery("select * from mytable");
  326. while(rs.next()) {
  327.     System.out.print("Column 1 returned ");
  328.     System.out.println(rs.getString(1));
  329. }
  330. rs.close();
  331. st.close();
  332. </programlisting>
  333. </para>
  334. </sect2>
  335. </sect1>
  336. <sect1>
  337. <title>Performing Updates</title>
  338. <para>
  339. To perform an update (or any other SQL statement that does not return a
  340. result), you simply use the executeUpdate() method:
  341. <programlisting>
  342. st.executeUpdate("create table basic (a int2, b int2)");
  343. </programlisting>
  344. </para>
  345. </sect1>
  346. <sect1>
  347. <title>Closing the Connection</title>
  348. <para>
  349. To close the database connection, simply call the close() method to the Connection:
  350. <programlisting>
  351. db.close();
  352. </programlisting>
  353. </para>
  354. </sect1>
  355. <sect1>
  356. <title>Using Large Objects</title>
  357. <para>
  358. In <application>Postgres</application>, 
  359. large objects (also known as <firstterm>blobs</firstterm>) are used to hold data in
  360. the database that cannot be stored in a normal SQL table. They are stored as a
  361. Table/Index pair, and are refered to from your own tables, by an OID value.
  362. </para>
  363. <para>
  364. Now, there are you methods of using Large Objects. The first is the
  365. standard <acronym>JDBC</acronym> way, and is documented here. The other, uses our own extension
  366. to the api, which presents the libpq large object <acronym>API</acronym> to Java, providing even
  367. better access to large objects than the standard. Internally, the driver uses
  368. the extension to provide large object support.
  369. </para>
  370. <para>
  371. In <acronym>JDBC</acronym>, the standard way to access them is using the getBinaryStream()
  372. method in ResultSet, and setBinaryStream() method in PreparedStatement. These
  373. methods make the large object appear as a Java stream, allowing you to use the
  374. java.io package, and others, to manipulate the object.
  375. </para>
  376. <para>
  377. For example, suppose
  378. you have a table containing the file name of an image, and a large object
  379. containing that image:
  380. <programlisting>
  381. create table images (imgname name,imgoid oid);
  382. </programlisting>
  383. </para>
  384. <para>
  385. To insert an image, you would use:
  386. <programlisting>
  387. File file = new File("myimage.gif");
  388. FileInputStream fis = new FileInputStream(file);
  389. PreparedStatement ps = conn.prepareStatement("insert into images values (?,?)");
  390. ps.setString(1,file.getName());
  391. ps.setBinaryStream(2,fis,file.length());
  392. ps.executeUpdate();
  393. ps.close();
  394. fis.close();
  395. </programlisting>
  396. </para>
  397. <para>
  398. Now in this example, setBinaryStream transfers a set number of bytes from a
  399. stream into a large object, and stores the OID into the field holding a
  400. reference to it.
  401. </para>
  402. <para>
  403. Retrieving an image is even easier (I'm using PreparedStatement here, but
  404. Statement can equally be used):
  405. <programlisting>
  406. PreparedStatement ps = con.prepareStatement("select oid from images where name=?");
  407. ps.setString(1,"myimage.gif");
  408. ResultSet rs = ps.executeQuery();
  409. if(rs!=null) {
  410.     while(rs.next()) {
  411.         InputStream is = rs.getBinaryInputStream(1);
  412.         // use the stream in some way here
  413.         is.close();
  414.     }
  415.     rs.close();
  416. }
  417. ps.close();
  418. </programlisting>
  419. </para>
  420. <para>
  421. Now here you can see where the Large Object is retrieved as an InputStream.
  422. You'll also notice that we close the stream before processing the next row in
  423. the result. This is part of the <acronym>JDBC</acronym> Specification, which states that any
  424. InputStream returned is closed when ResultSet.next() or ResultSet.close() is called.
  425. </para>
  426. </sect1>
  427. <sect1>
  428. <title><application>Postgres</application> Extensions to the <acronym>JDBC</acronym> <acronym>API</acronym></title>
  429. <para>
  430. <application>Postgres</application> is an extensible database system. 
  431. You can add your own functions
  432. to the backend, which can then be called from queries, or even add your own
  433. data types.
  434. </para>
  435. <para>
  436. Now, as these are facilities unique to us, we support them from Java, with
  437. a set of extension <acronym>API</acronym>'s. Some features within 
  438. the core of the standard driver
  439. actually use these extensions to implement Large Objects, etc.
  440. <!--
  441. ************************************************************
  442. Nothing marked up from here on. It looks like it will be tricky:
  443. what do we want to do with the class inheritance diagrams?
  444. - thomas 1998-10-23
  445. ************************************************************
  446. -->
  447. <programlisting>
  448. Accessing the extensions
  449. To access some of the extensions, you need to use some extra methods 
  450. in the postgresql.Connection class. In this case, you would need to 
  451. case the return value of Driver.getConnection().
  452. For example:
  453.     Connection db = Driver.getConnection(url,user,pass);
  454.     // later on
  455.     Fastpath fp = ((postgresql.Connection)db).getFastpathAPI();
  456. Class postgresql.Connection
  457.                                 
  458. java.lang.Object
  459.    |
  460.    +----postgresql.Connection
  461.    public class Connection extends Object implements Connection
  462. These are the extra methods used to gain access to our extensions. I 
  463. have not listed the methods defined by java.sql.Connection.
  464.  public Fastpath getFastpathAPI() throws SQLException
  465.           This returns the Fastpath <acronym>API</acronym> for the current connection.
  466.           NOTE: This is not part of <acronym>JDBC</acronym>, but allows access to 
  467. functions on the postgresql backend itself.
  468.           It is primarily used by the LargeObject <acronym>API</acronym>
  469.           The best way to use this is as follows:
  470.  import postgresql.fastpath.*;
  471.  ...
  472.  Fastpath fp = ((postgresql.Connection)myconn).getFastpathAPI();
  473.           where myconn is an open Connection to postgresql.
  474.         Returns:
  475.                 Fastpath object allowing access to functions on the 
  476. postgresql backend.
  477.         Throws: SQLException
  478.                 by Fastpath when initialising for first time
  479.           
  480.  public LargeObjectManager getLargeObjectAPI() throws SQLException
  481.           This returns the LargeObject <acronym>API</acronym> for the current connection.
  482.           NOTE: This is not part of <acronym>JDBC</acronym>, but allows access to 
  483. functions on the postgresql backend itself.
  484.    
  485.           The best way to use this is as follows:
  486.  import postgresql.largeobject.*;
  487.  ...
  488.  LargeObjectManager lo = 
  489. ((postgresql.Connection)myconn).getLargeObjectAPI();
  490.           where myconn is an open Connection to postgresql.
  491.         Returns:
  492.                 LargeObject object that implements the <acronym>API</acronym>
  493.         Throws: SQLException
  494.                 by LargeObject when initialising for first time
  495.  public void addDataType(String type,
  496.                          String name)
  497.           This allows client code to add a handler for one of 
  498. postgresql's more unique data types. Normally, a data type not known 
  499. by the driver is returned by ResultSet.getObject() as a PGobject 
  500. instance.
  501. This method allows you to write a class that extends PGobject, and 
  502. tell the driver the type name, and class name to use.
  503. The down side to this, is that you must call this method each time a 
  504. connection is made.
  505.           NOTE: This is not part of <acronym>JDBC</acronym>, but an extension.
  506.           The best way to use this is as follows:
  507.  ...
  508.  ((postgresql.Connection)myconn).addDataType("mytype","my.class.name"-
  509. );
  510.  ...
  511.           where myconn is an open Connection to postgresql.
  512.           The handling class must extend postgresql.util.PGobject
  513.         See Also:
  514.                 PGobject
  515. Fastpath
  516. Fastpath is an <acronym>API</acronym> that exists within the libpq C interface, and 
  517. allows a client machine to execute a function on the database backend. 
  518. Most client code will not need to use this method, but it's provided 
  519. because the Large Object <acronym>API</acronym> uses it.
  520. To use, you need to import the postgresql.fastpath package, using the 
  521. line:
  522.      import postgresql.fastpath.*;
  523. Then, in your code, you need to get a FastPath object:
  524.      Fastpath fp = ((postgresql.Connection)conn).getFastpathAPI();
  525. This will return an instance associated with the database connection 
  526. that you can use to issue commands. The casing of Connection to 
  527. postgresql.Connection is required, as the getFastpathAPI() is one of 
  528. our own methods, not <acronym>JDBC</acronym>'s.
  529. Once you have a Fastpath instance, you can use the fastpath() methods 
  530. to execute a backend function.
  531. Class postgresql.fastpath.Fastpath
  532. java.lang.Object
  533.    |
  534.    +----postgresql.fastpath.Fastpath
  535.    public class Fastpath
  536.    extends Object
  537.    This class implements the Fastpath api.
  538.    This is a means of executing functions imbeded in the postgresql 
  539. backend from within a java application.
  540.    It is based around the file src/interfaces/libpq/fe-exec.c
  541.    See Also:
  542.           FastpathFastpathArg, LargeObject
  543. Methods
  544.  public Object fastpath(int fnid,
  545.                         boolean resulttype,
  546.                         FastpathArg args[]) throws SQLException
  547.           Send a function call to the PostgreSQL backend
  548.           
  549.         Parameters:
  550.                 fnid - Function id
  551.                 resulttype - True if the result is an integer, false 
  552. for
  553.                 other results
  554.                 args - FastpathArguments to pass to fastpath
  555.         Returns:
  556.                 null if no data, Integer if an integer result, or 
  557. byte[]
  558.                 otherwise
  559.          
  560.         Throws: SQLException
  561.                 if a database-access error occurs.
  562.  public Object fastpath(String name,
  563.                         boolean resulttype,
  564.                         FastpathArg args[]) throws SQLException
  565.           Send a function call to the PostgreSQL backend by name. 
  566. Note:
  567.           the mapping for the procedure name to function id needs to 
  568. exist, usually to an earlier call to addfunction(). This is the 
  569. prefered method to call, as function id's can/may change between 
  570. versions of the backend. For an example of how this works, refer to 
  571. postgresql.LargeObject
  572.         Parameters:
  573.                 name - Function name
  574.                 resulttype - True if the result is an integer, false 
  575. for
  576.                 other results
  577.                 args - FastpathArguments to pass to fastpath
  578.         Returns:
  579.                 null if no data, Integer if an integer result, or 
  580. byte[]
  581.                 otherwise
  582.         Throws: SQLException
  583.                 if name is unknown or if a database-access error 
  584. occurs.
  585.         See Also:
  586.                 LargeObject
  587.           
  588.  public int getInteger(String name,
  589.                        FastpathArg args[]) throws SQLException
  590.           This convenience method assumes that the return value is an 
  591. Integer
  592.         Parameters:
  593.                 name - Function name
  594.                 args - Function arguments
  595.         Returns:
  596.                 integer result
  597.         Throws: SQLException
  598.                 if a database-access error occurs or no result
  599.  public byte[] getData(String name,
  600.                        FastpathArg args[]) throws SQLException
  601.           This convenience method assumes that the return value is 
  602. binary data
  603.         Parameters:
  604.                 name - Function name
  605.                 args - Function arguments
  606.         Returns:
  607.                 byte[] array containing result
  608.         Throws: SQLException
  609.                 if a database-access error occurs or no result
  610.  public void addFunction(String name,
  611.                          int fnid)
  612.           This adds a function to our lookup table.
  613.           User code should use the addFunctions method, which is based 
  614. upon a query, rather than hard coding the oid. The oid for a function 
  615. is not guaranteed to remain static, even on different servers of the 
  616. same version.
  617.         Parameters:
  618.                 name - Function name
  619.                 fnid - Function id
  620.  public void addFunctions(ResultSet rs) throws SQLException
  621.                        
  622.           This takes a ResultSet containing two columns. Column 1 
  623. contains the function name, Column 2 the oid.
  624.           It reads the entire ResultSet, loading the values into the 
  625. function table.
  626.           REMEMBER to close() the resultset after calling this!!
  627.           Implementation note about function name lookups:
  628.           
  629.           PostgreSQL stores the function id's and their corresponding 
  630. names in the pg_proc table. To speed things up locally, instead of 
  631. querying each function from that table when required, a Hashtable is 
  632. used. Also, only the function's required are entered into this table, 
  633. keeping connection times as fast as possible.
  634.           The postgresql.LargeObject class performs a query upon it's 
  635. startup, and passes the returned ResultSet to the addFunctions() 
  636. method here.
  637.        
  638.           Once this has been done, the LargeObject api refers to the 
  639. functions by name.
  640.           
  641.           Dont think that manually converting them to the oid's will 
  642. work. Ok, they will for now, but they can change during development 
  643. (there was some discussion about this for V7.0), so this is 
  644. implemented to prevent any unwarranted headaches in the future.
  645.         Parameters:
  646.                 rs - ResultSet
  647.         Throws: SQLException
  648.                 if a database-access error occurs.
  649.           
  650.         See Also:
  651.                 LargeObjectManager
  652.  public int getID(String name) throws SQLException
  653.           
  654.           This returns the function id associated by its name
  655.           
  656.           If addFunction() or addFunctions() have not been called for 
  657. this name, then an SQLException is thrown.
  658.         Parameters:
  659.                 name - Function name to lookup
  660.         Returns:
  661.                 Function ID for fastpath call
  662.         Throws: SQLException
  663.                 is function is unknown.
  664. Class postgresql.fastpath.FastpathArg
  665. java.lang.Object
  666.    |
  667.    +----postgresql.fastpath.FastpathArg
  668.    public class FastpathArg extends Object
  669.         
  670.    Each fastpath call requires an array of arguments, the number and 
  671. type dependent on the function being called.
  672.    This class implements methods needed to provide this capability.
  673.    For an example on how to use this, refer to the 
  674. postgresql.largeobject package
  675.    See Also:
  676.           Fastpath, LargeObjectManager, LargeObject
  677. Constructors
  678.  public FastpathArg(int value)
  679.  
  680.           Constructs an argument that consists of an integer value
  681.         Parameters:
  682.                 value - int value to set
  683.  public FastpathArg(byte bytes[])
  684.           
  685.           Constructs an argument that consists of an array of bytes
  686.         Parameters:
  687.                 bytes - array to store
  688.  public FastpathArg(byte buf[],
  689.                     int off,
  690.                     int len)
  691.            Constructs an argument that consists of part of a byte 
  692. array
  693.         Parameters:
  694.                 buf - source array
  695.                 off - offset within array
  696.                 len - length of data to include
  697.  public FastpathArg(String s)
  698.           
  699.           Constructs an argument that consists of a String.
  700.       
  701.         Parameters:
  702.                 s - String to store
  703. Geometric Data Types
  704. PostgreSQL has a set of datatypes that can store geometric features 
  705. into a table. These range from single points, lines, and polygons.
  706. We support these types in Java with the postgresql.geometric package.
  707. It contains classes that extend the postgresql.util.PGobject class. 
  708. Refer to that class for details on how to implement your own data type 
  709. handlers.
  710. Class postgresql.geometric.PGbox
  711. java.lang.Object
  712.    |
  713.    +----postgresql.util.PGobject
  714.            |
  715.            +----postgresql.geometric.PGbox
  716.    public class PGbox extends PGobject implements Serializable, 
  717. Cloneable
  718.    This represents the box datatype within postgresql.
  719. Variables
  720.  public PGpoint point[]
  721.           These are the two corner points of the box.
  722. Constructors
  723.  public PGbox(double x1,
  724.               double y1,
  725.               double x2,
  726.               double y2)
  727.         Parameters:
  728.                 x1 - first x coordinate
  729.                 y1 - first y coordinate
  730.                 x2 - second x coordinate
  731.                 y2 - second y coordinate
  732.  public PGbox(PGpoint p1,
  733.               PGpoint p2)
  734.         Parameters:
  735.                 p1 - first point
  736.                 p2 - second point
  737.  public PGbox(String s) throws SQLException
  738.                             
  739.         Parameters:
  740.                 s - Box definition in PostgreSQL syntax
  741.         Throws: SQLException
  742.                 if definition is invalid
  743.                 
  744.  public PGbox()
  745.           Required constructor
  746.               
  747. Methods
  748.  public void setValue(String value) throws SQLException
  749.                 
  750.           This method sets the value of this object. It should be 
  751. overidden, but still called by subclasses.
  752.                             
  753.         Parameters:
  754.                 value - a string representation of the value of the 
  755. object
  756.         Throws: SQLException
  757.                 thrown if value is invalid for this type
  758.         Overrides:
  759.                 setValue in class PGobject
  760.  public boolean equals(Object obj)
  761.         Parameters:
  762.                 obj - Object to compare with
  763.                 
  764.         Returns:
  765.                 true if the two boxes are identical
  766.           
  767.         Overrides:
  768.                 equals in class PGobject
  769.  public Object clone()
  770.         
  771.           This must be overidden to allow the object to be cloned
  772.         Overrides:
  773.                 clone in class PGobject
  774.    
  775.  public String getValue()
  776.         
  777.         Returns:
  778.                 the PGbox in the syntax expected by postgresql
  779.         Overrides:
  780.                 getValue in class PGobject
  781. Class postgresql.geometric.PGcircle
  782. java.lang.Object
  783.    |
  784.    +----postgresql.util.PGobject
  785.            |
  786.            +----postgresql.geometric.PGcircle
  787.         
  788.    public class PGcircle extends PGobject implements Serializable, 
  789. Cloneable
  790.                
  791.    This represents postgresql's circle datatype, consisting of a point 
  792. and a radius
  793. Variables
  794.  public PGpoint center
  795.            
  796.           This is the centre point
  797.  
  798. public double radius
  799.            
  800.           This is the radius
  801.    
  802. Constructors   
  803.  public PGcircle(double x,
  804.                  double y,
  805.                  double r)
  806.           
  807.         Parameters:
  808.                x - coordinate of centre
  809.                 y - coordinate of centre
  810.                 r - radius of circle
  811.  public PGcircle(PGpoint c,
  812.                  double r)
  813.           
  814.         Parameters:
  815.                 c - PGpoint describing the circle's centre
  816.                 r - radius of circle
  817.  public PGcircle(String s) throws SQLException
  818.         Parameters:
  819.                 s - definition of the circle in PostgreSQL's syntax.
  820.         Throws: SQLException
  821.                 on conversion failure
  822.  public PGcircle()
  823.           This constructor is used by the driver.
  824.             
  825. Methods   
  826.  public void setValue(String s) throws SQLException
  827.         Parameters:
  828.                 s - definition of the circle in PostgreSQL's syntax.
  829.         Throws: SQLException
  830.                 on conversion failure
  831.         Overrides:
  832.                 setValue in class PGobject
  833.  public boolean equals(Object obj)
  834.         Parameters:
  835.                 obj - Object to compare with
  836.             
  837.         Returns:
  838.                 true if the two boxes are identical
  839.         Overrides:
  840.                 equals in class PGobject
  841.  public Object clone()
  842.           This must be overidden to allow the object to be cloned
  843.         Overrides:
  844.                 clone in class PGobject
  845.  public String getValue()
  846.         Returns:
  847.                 the PGcircle in the syntax expected by postgresql
  848.         
  849.         Overrides:
  850.                 getValue in class PGobject
  851. Class postgresql.geometric.PGline
  852. java.lang.Object
  853.    |
  854.    +----postgresql.util.PGobject
  855.            |
  856.            +----postgresql.geometric.PGline
  857.    public class PGline extends PGobject implements Serializable, 
  858. Cloneable
  859.    This implements a line consisting of two points. Currently line is 
  860. not yet implemented in the backend, but this class ensures that when 
  861. it's done were ready for it.
  862. Variables
  863.    
  864.  public PGpoint point[]
  865.      
  866.           These are the two points.
  867. Constructors
  868.  public PGline(double x1,
  869.                double y1,
  870.                double x2,
  871.                double y2)
  872.         Parameters:
  873.                 x1 - coordinate for first point
  874.                 y1 - coordinate for first point
  875.                 x2 - coordinate for second point
  876.                 y2 - coordinate for second point
  877.  public PGline(PGpoint p1,
  878.                PGpoint p2)
  879.      
  880.         Parameters:
  881.                 p1 - first point
  882.                 p2 - second point
  883.  public PGline(String s) throws SQLException
  884.                
  885.         Parameters:
  886.                 s - definition of the circle in PostgreSQL's syntax.
  887.         Throws: SQLException
  888.                 on conversion failure
  889.  public PGline()
  890.           reuired by the driver
  891.                
  892. Methods
  893.  public void setValue(String s) throws SQLException
  894.         Parameters:
  895.                 s - Definition of the line segment in PostgreSQL's 
  896. syntax
  897.         Throws: SQLException
  898.                 on conversion failure
  899.         Overrides:
  900.                 setValue in class PGobject
  901.                 
  902.  public boolean equals(Object obj)
  903.         Parameters:
  904.                 obj - Object to compare with
  905.                
  906.         Returns:
  907.                 true if the two boxes are identical
  908.    
  909.         Overrides:
  910.                 equals in class PGobject
  911.  public Object clone()
  912.         
  913.           This must be overidden to allow the object to be cloned
  914.         Overrides:
  915.                 clone in class PGobject
  916.  public String getValue()
  917.    
  918.         Returns:
  919.                 the PGline in the syntax expected by postgresql
  920.         
  921.         Overrides:
  922.                 getValue in class PGobject
  923. Class postgresql.geometric.PGlseg
  924.              
  925. java.lang.Object
  926.    |
  927.    +----postgresql.util.PGobject
  928.            |
  929.            +----postgresql.geometric.PGlseg
  930.           
  931.    public class PGlseg extends PGobject implements Serializable, 
  932. Cloneable
  933.  
  934.    This implements a lseg (line segment) consisting of two points
  935. Variables
  936.  public PGpoint point[]
  937.            
  938.           These are the two points.
  939. Constructors
  940.    
  941.  public PGlseg(double x1,
  942.                double y1,
  943.                double x2,
  944.                double y2)
  945.      
  946.         Parameters:
  947.                 x1 - coordinate for first point
  948.                 y1 - coordinate for first point
  949.                 x2 - coordinate for second point
  950.                 y2 - coordinate for second point
  951.  public PGlseg(PGpoint p1,
  952.                PGpoint p2)
  953.            
  954.         Parameters:
  955.                 p1 - first point
  956.                 p2 - second point
  957.    
  958.  public PGlseg(String s) throws SQLException
  959.         Parameters:
  960.                 s - definition of the circle in PostgreSQL's syntax.
  961.         Throws: SQLException
  962.                 on conversion failure
  963.  public PGlseg()
  964.           reuired by the driver
  965.                
  966. Methods    
  967.    
  968.  public void setValue(String s) throws SQLException
  969.    
  970.         Parameters:
  971.                 s - Definition of the line segment in PostgreSQL's 
  972. syntax
  973.         Throws: SQLException
  974.                 on conversion failure
  975.      
  976.         Overrides:
  977.                 setValue in class PGobject
  978.                 
  979.  public boolean equals(Object obj)
  980.         Parameters:
  981.                 obj - Object to compare with
  982.                
  983.         Returns:
  984.                 true if the two boxes are identical
  985.    
  986.         Overrides:
  987.                 equals in class PGobject
  988.    
  989.  public Object clone()
  990.           This must be overidden to allow the object to be cloned
  991.         Overrides:
  992.                clone in class PGobject
  993.  public String getValue()
  994.         Returns:
  995.                 the PGlseg in the syntax expected by postgresql
  996.         
  997.         Overrides:
  998.                 getValue in class PGobject
  999. Class postgresql.geometric.PGpath
  1000.                                 
  1001. java.lang.Object
  1002.    |
  1003.    +----postgresql.util.PGobject
  1004.            |
  1005.            +----postgresql.geometric.PGpath
  1006.           
  1007.    public class PGpath extends PGobject implements Serializable, 
  1008. Cloneable
  1009.                
  1010.    This implements a path (a multiple segmented line, which may be 
  1011. closed)
  1012.            
  1013. Variables
  1014.  public boolean open
  1015.                
  1016.           True if the path is open, false if closed
  1017.  public PGpoint points[]
  1018.           The points defining this path
  1019. Constructors   
  1020.  public PGpath(PGpoint points[],
  1021.                boolean open)
  1022.           
  1023.         Parameters:
  1024.                 points - the PGpoints that define the path
  1025.                 open - True if the path is open, false if closed
  1026.  public PGpath()
  1027.           Required by the driver
  1028.  public PGpath(String s) throws SQLException
  1029.         Parameters:
  1030.                 s - definition of the circle in PostgreSQL's syntax.
  1031.         Throws: SQLException
  1032.                 on conversion failure
  1033. Methods
  1034.  public void setValue(String s) throws SQLException
  1035.    
  1036.         Parameters:
  1037.                 s - Definition of the path in PostgreSQL's syntax
  1038.            
  1039.         Throws: SQLException
  1040.                 on conversion failure
  1041.         Overrides:
  1042.                 setValue in class PGobject
  1043.  public boolean equals(Object obj)
  1044.         Parameters:
  1045.                 obj - Object to compare with
  1046.         Returns:
  1047.                 true if the two boxes are identical
  1048.         Overrides:
  1049.                 equals in class PGobject
  1050.  public Object clone()
  1051.           This must be overidden to allow the object to be cloned
  1052.         Overrides:
  1053.                 clone in class PGobject
  1054.  public String getValue()
  1055.           This returns the polygon in the syntax expected by 
  1056. postgresql
  1057.         Overrides:
  1058.                 getValue in class PGobject
  1059.  public boolean isOpen()
  1060.      This returns true if the path is open
  1061.  public boolean isClosed()
  1062.      This returns true if the path is closed
  1063.  public void closePath()
  1064.      Marks the path as closed
  1065.  public void openPath()
  1066.      Marks the path as open
  1067. Class postgresql.geometric.PGpoint
  1068.                                 
  1069. java.lang.Object
  1070.    |
  1071.    +----postgresql.util.PGobject
  1072.            |
  1073.            +----postgresql.geometric.PGpoint
  1074.           
  1075.    public class PGpoint extends PGobject implements Serializable, 
  1076. Cloneable
  1077.    This implements a version of java.awt.Point, except it uses double 
  1078. to represent the coordinates.
  1079.    It maps to the point datatype in postgresql.
  1080. Variables
  1081.  public double x
  1082.           The X coordinate of the point
  1083.  public double y
  1084.           The Y coordinate of the point
  1085. Constructors
  1086.  public PGpoint(double x,
  1087.                 double y)
  1088.         Parameters:
  1089.                 x - coordinate
  1090.                 y - coordinate
  1091.  public PGpoint(String value) throws SQLException
  1092.      
  1093.           This is called mainly from the other geometric types, when a 
  1094. point is imbeded within their definition.
  1095.              
  1096.         Parameters:
  1097.                 value - Definition of this point in PostgreSQL's 
  1098. syntax
  1099.    
  1100.  public PGpoint()
  1101.           
  1102.           Required by the driver
  1103. Methods
  1104.  public void setValue(String s) throws SQLException
  1105.         Parameters:
  1106.                 s - Definition of this point in PostgreSQL's syntax
  1107.         Throws: SQLException
  1108.                 on conversion failure
  1109.         Overrides:
  1110.                 setValue in class PGobject
  1111.           
  1112.  public boolean equals(Object obj)
  1113.         Parameters:
  1114.                 obj - Object to compare with
  1115.         Returns:
  1116.                 true if the two boxes are identical
  1117.         Overrides:
  1118.                 equals in class PGobject
  1119.  public Object clone()
  1120.                 
  1121.           This must be overidden to allow the object to be cloned
  1122.         Overrides:
  1123.                 clone in class PGobject
  1124.           
  1125.  public String getValue()       
  1126.     
  1127.         Returns:
  1128.                 the PGpoint in the syntax expected by postgresql
  1129.         Overrides:
  1130.                 getValue in class PGobject
  1131.           
  1132.  public void translate(int x,
  1133.                        int y)
  1134.           Translate the point with the supplied amount.
  1135.         Parameters:
  1136.                 x - integer amount to add on the x axis
  1137.                 y - integer amount to add on the y axis
  1138.  public void translate(double x,
  1139.                        double y)
  1140.           
  1141.           Translate the point with the supplied amount.
  1142.  
  1143.         Parameters:
  1144.                 x - double amount to add on the x axis
  1145.                 y - double amount to add on the y axis
  1146.  public void move(int x,
  1147.                   int y)
  1148.                 
  1149.           Moves the point to the supplied coordinates.
  1150.         Parameters:
  1151.                 x - integer coordinate
  1152.                 y - integer coordinate
  1153. public void move(double x,
  1154.                   double y)
  1155.           
  1156.           Moves the point to the supplied coordinates.
  1157.         Parameters:
  1158.                 x - double coordinate
  1159.                 y - double coordinate
  1160.  public void setLocation(int x,
  1161.                          int y)
  1162.           Moves the point to the supplied coordinates. refer to
  1163.           java.awt.Point for description of this
  1164.         Parameters:
  1165.                 x - integer coordinate
  1166.                 y - integer coordinate
  1167.         See Also:
  1168.                 Point
  1169.  public void setLocation(Point p)
  1170.           Moves the point to the supplied java.awt.Point refer to
  1171.           java.awt.Point for description of this
  1172.         Parameters:
  1173.                 p - Point to move to
  1174.         See Also:
  1175.                 Point
  1176. Class postgresql.geometric.PGpolygon
  1177.                                 
  1178. java.lang.Object
  1179.    |
  1180.    +----postgresql.util.PGobject
  1181.            |
  1182.            +----postgresql.geometric.PGpolygon
  1183.    public class PGpolygon extends PGobject implements Serializable, 
  1184. Cloneable
  1185.                
  1186.    This implements the polygon datatype within PostgreSQL.
  1187. Variables
  1188.  public PGpoint points[]
  1189.           The points defining the polygon
  1190.                                 
  1191. Constructors
  1192.  public PGpolygon(PGpoint points[])
  1193.           Creates a polygon using an array of PGpoints
  1194.         Parameters:
  1195.                 points - the points defining the polygon
  1196.  public PGpolygon(String s) throws SQLException
  1197.                  
  1198.         Parameters:
  1199.                 s - definition of the circle in PostgreSQL's syntax.
  1200.         Throws: SQLException
  1201.                 on conversion failure
  1202.  public PGpolygon()
  1203.           Required by the driver
  1204. Methods
  1205.  public void setValue(String s) throws SQLException
  1206.         Parameters:
  1207.                 s - Definition of the polygon in PostgreSQL's syntax
  1208.         Throws: SQLException
  1209.                 on conversion failure
  1210.         Overrides:
  1211.                 setValue in class PGobject
  1212.  public boolean equals(Object obj)
  1213.      
  1214.         Parameters:
  1215.                 obj - Object to compare with
  1216.                                 
  1217.         Returns:
  1218.                 true if the two boxes are identical
  1219.         Overrides:
  1220.                 equals in class PGobject
  1221.  public Object clone()
  1222.         
  1223.           This must be overidden to allow the object to be cloned
  1224.         Overrides:
  1225.                 clone in class PGobject
  1226.                  
  1227.  public String getValue()
  1228.         Returns:
  1229.                 the PGpolygon in the syntax expected by postgresql
  1230.         Overrides:
  1231.                 getValue in class PGobject
  1232. Large Objects
  1233. Large objects are supported in the standard <acronym>JDBC</acronym> specification. 
  1234. However, that interface is limited, and the api provided by PostgreSQL 
  1235. allows for random access to the objects contents, as if it was a local 
  1236. file.
  1237. The postgresql.largeobject package profides to Java the libpq C 
  1238. interface's large object <acronym>API</acronym>. It consists of two classes, 
  1239. LargeObjectManager, which deals with creating, opening and deleting 
  1240. large obejects, and LargeObject which deals with an individual object.
  1241. Class postgresql.largeobject.LargeObject
  1242. java.lang.Object
  1243.    |
  1244.    +----postgresql.largeobject.LargeObject
  1245. public class LargeObject extends Object
  1246. This class implements the large object interface to postgresql.
  1247.    It provides the basic methods required to run the interface, plus a 
  1248. pair of methods that provide InputStream and OutputStream classes for 
  1249. this object.
  1250.    Normally, client code would use the getAsciiStream, 
  1251. getBinaryStream, or getUnicodeStream methods in ResultSet, or 
  1252. setAsciiStream, setBinaryStream, or setUnicodeStream methods in 
  1253. PreparedStatement to access Large Objects.
  1254.    However, sometimes lower level access to Large Objects are 
  1255. required, that are not supported by the <acronym>JDBC</acronym> specification.
  1256.    Refer to postgresql.largeobject.LargeObjectManager on how to gain 
  1257. access to a Large Object, or how to create one.
  1258.    See Also:
  1259.           LargeObjectManager
  1260. Variables
  1261.  public static final int SEEK_SET
  1262.           Indicates a seek from the begining of a file
  1263.  public static final int SEEK_CUR
  1264.           Indicates a seek from the current position
  1265.  public static final int SEEK_END
  1266.           Indicates a seek from the end of a file
  1267. Methods
  1268.  public int getOID()
  1269.         Returns:
  1270.                 the OID of this LargeObject
  1271.  public void close() throws SQLException
  1272.           This method closes the object. You must not call methods in 
  1273. this object after this is called.
  1274.     Throws: SQLException
  1275.                 if a database-access error occurs.
  1276.  public byte[] read(int len) throws SQLException
  1277.           Reads some data from the object, and return as a byte[] 
  1278. array
  1279.         Parameters:
  1280.                 len - number of bytes to read
  1281.         Returns:
  1282.                 byte[] array containing data read
  1283.         Throws: SQLException
  1284.                 if a database-access error occurs.
  1285.  public void read(byte buf[],
  1286.                   int off,
  1287.                   int len) throws SQLException
  1288.           Reads some data from the object into an existing array
  1289.         Parameters:
  1290.                 buf - destination array
  1291.                 off - offset within array
  1292.                 len - number of bytes to read
  1293.         Throws: SQLException
  1294.                 if a database-access error occurs.
  1295.  public void write(byte buf[]) throws SQLException
  1296.           Writes an array to the object
  1297.         Parameters:
  1298.                 buf - array to write
  1299.         Throws: SQLException
  1300.                 if a database-access error occurs.
  1301.  public void write(byte buf[],
  1302.                    int off,
  1303.                    int len) throws SQLException
  1304.           Writes some data from an array to the object
  1305.         Parameters:
  1306.                 buf - destination array
  1307.                 off - offset within array
  1308.                 len - number of bytes to write
  1309.         Throws: SQLException
  1310.                 if a database-access error occurs.
  1311.  public void seek(int pos,
  1312.                   int ref) throws SQLException
  1313.           Sets the current position within the object.
  1314.           This is similar to the fseek() call in the standard C 
  1315. library.It allows you to have random access to the large object.
  1316.         Parameters:
  1317.                 pos - position within object
  1318.                 ref - Either SEEK_SET, SEEK_CUR or SEEK_END
  1319.         Throws: SQLException
  1320.                 if a database-access error occurs.
  1321.  public void seek(int pos) throws SQLException
  1322.           Sets the current position within the object.
  1323.           This is similar to the fseek() call in the standard C 
  1324. library.It allows you to have random access to the large object.
  1325.         Parameters:
  1326.                 pos - position within object from begining
  1327.         Throws: SQLException
  1328.                 if a database-access error occurs.
  1329.  public int tell() throws SQLException
  1330.         Returns:
  1331.                 the current position within the object
  1332.         Throws: SQLException
  1333.                 if a database-access error occurs.
  1334.  public int size() throws SQLException
  1335.           This method is inefficient, as the only way to find out the 
  1336. size of the object is to seek to the end, record the current position, 
  1337. then return to the original position.
  1338.           A better method will be found in the future.
  1339.         Returns:
  1340.                 the size of the large object
  1341.         Throws: SQLException
  1342.                 if a database-access error occurs.
  1343.  public InputStream getInputStream() throws SQLException
  1344.           Returns an InputStream from this object.
  1345.           This InputStream can then be used in any method that 
  1346. requires an InputStream.
  1347.         Throws: SQLException
  1348.                 if a database-access error occurs.
  1349.  public OutputStream getOutputStream() throws SQLException
  1350.           Returns an OutputStream to this object
  1351.           This OutputStream can then be used in any method that 
  1352. requires an OutputStream.
  1353.         Throws: SQLException
  1354.                 if a database-access error occurs.
  1355. Class postgresql.largeobject.LargeObjectManager
  1356.                                 
  1357. java.lang.Object
  1358.    |
  1359.    +----postgresql.largeobject.LargeObjectManager
  1360. public class LargeObjectManager extends Object
  1361. This class implements the large object interface to postgresql.
  1362.         
  1363.    It provides methods that allow client code to create, open and 
  1364. delete large objects from the database. When opening an object, an 
  1365. instance of postgresql.largeobject.LargeObject is returned, and its 
  1366. methods then allow access to the object.
  1367. This class can only be created by postgresql.Connection
  1368. To get access to this class, use the following segment of code:
  1369.  import postgresql.largeobject.*;
  1370.  Connection  conn;
  1371.  LargeObjectManager lobj;
  1372.  ... code that opens a connection ...
  1373.  lobj = ((postgresql.Connection)myconn).getLargeObjectAPI();
  1374. Normally, client code would use the getAsciiStream, getBinaryStream, 
  1375. or getUnicodeStream methods in ResultSet, or setAsciiStream, 
  1376. setBinaryStream, or setUnicodeStream methods in PreparedStatement to 
  1377. access Large Objects.
  1378.    However, sometimes lower level access to Large Objects are 
  1379. required, that are not supported by the <acronym>JDBC</acronym> specification.
  1380.    Refer to postgresql.largeobject.LargeObject on how to manipulate 
  1381. the contents of a Large Object.
  1382.    See Also:
  1383.           LargeObject
  1384. Variables
  1385.  public static final int WRITE
  1386.           This mode indicates we want to write to an object
  1387.  public static final int READ
  1388.           This mode indicates we want to read an object
  1389.  public static final int READWRITE
  1390.           This mode is the default. It indicates we want read and 
  1391. write access to a large object
  1392. Methods
  1393.  public LargeObject open(int oid) throws SQLException
  1394.           
  1395.           This opens an existing large object, based on its OID. This
  1396.           method assumes that READ and WRITE access is required (the 
  1397. default).
  1398.         Parameters:
  1399.                 oid - of large object
  1400.         Returns:
  1401.                 LargeObject instance providing access to the object
  1402.         Throws: SQLException
  1403.                 on error
  1404.  public LargeObject open(int oid,
  1405.                          int mode) throws SQLException
  1406.           
  1407.           This opens an existing large object, based on its OID
  1408.   
  1409.         Parameters:
  1410.                 oid - of large object
  1411.                 mode - mode of open
  1412.         Returns:
  1413.                 LargeObject instance providing access to the object
  1414.         Throws: SQLException
  1415.                 on error
  1416.  public int create() throws SQLException
  1417.           This creates a large object, returning its OID.
  1418.           It defaults to READWRITE for the new object's attributes.
  1419.         Returns:
  1420.                 oid of new object
  1421.         Throws: SQLException
  1422.                 on error
  1423.  public int create(int mode) throws SQLException
  1424.           This creates a large object, returning its OID
  1425.         Parameters:
  1426.                 mode - a bitmask describing different attributes of 
  1427. the
  1428.                 new object
  1429.         Returns:
  1430.                 oid of new object
  1431.         Throws: SQLException
  1432.                 on error
  1433.  public void delete(int oid) throws SQLException
  1434.           
  1435.           This deletes a large object.
  1436.           
  1437.         Parameters:
  1438.                 oid - describing object to delete
  1439.         Throws: SQLException
  1440.                 on error
  1441.  public void unlink(int oid) throws SQLException
  1442.           This deletes a large object.
  1443.           It is identical to the delete method, and is supplied as the 
  1444. C <acronym>API</acronym> uses unlink.
  1445.         Parameters:
  1446.                 oid - describing object to delete
  1447.         Throws: SQLException
  1448.                 on error
  1449. Object Serialisation
  1450. PostgreSQL is not a normal SQL Database. It is far more extensible 
  1451. than most other databases, and does support Object Oriented features 
  1452. that are unique to it. 
  1453. One of the consequences of this, is that you can have one table refer 
  1454. to a row in another table. For example:
  1455. test=> create table users (username name,fullname text);
  1456. CREATE
  1457. test=> create table server (servername name,adminuser users);
  1458. CREATE
  1459. test=> insert into users values ('peter','Peter Mount');
  1460. INSERT 2610132 1
  1461. test=> insert into server values ('maidast',2610132::users);
  1462. INSERT 2610133 1
  1463. test=> select * from users;
  1464. username|fullname      
  1465. --------+--------------
  1466. peter   |Peter Mount   
  1467. (1 row)
  1468. test=> select * from server;
  1469. servername|adminuser
  1470. ----------+---------
  1471. maidast   |  2610132
  1472. (1 row)
  1473. Ok, the above example shows that we can use a table name as a field, 
  1474. and the row's oid value is stored in that field.
  1475. What does this have to do with Java?
  1476. In Java, you can store an object to a Stream as long as it's class 
  1477. implements the java.io.Serializable interface. This process, known as 
  1478. Object Serialization, can be used to store complex objects into the 
  1479. database.
  1480. Now, under <acronym>JDBC</acronym>, you would have to use a LargeObject to store them. 
  1481. However, you cannot perform queries on those objects.
  1482. What the postgresql.util.Serialize class does, is provide a means of 
  1483. storing an object as a table, and to retrieve that object from a 
  1484. table. In most cases, you would not need to access this class direct, 
  1485. but you would use the PreparedStatement.setObject() and 
  1486. ResultSet.getObject() methods. Those methods will check the objects 
  1487. class name against the table's in the database. If a match is found, 
  1488. it assumes that the object is a Serialized object, and retrieves it 
  1489. from that table. As it does so, if the object contains other 
  1490. serialized objects, then it recurses down the tree.
  1491. Sound's complicated? In fact, it's simpler than what I wrote - it's 
  1492. just difficult to explain.
  1493. The only time you would access this class, is to use the create() 
  1494. methods. These are not used by the driver, but issue one or more 
  1495. "create table" statements to the database, based on a Java Object or 
  1496. Class that you want to serialize.
  1497. Oh, one last thing. If your object contains a line like:
  1498.      public int oid;
  1499. then, when the object is retrieved from the table, it is set to the 
  1500. oid within the table. Then, if the object is modified, and re-
  1501. serialized, the existing entry is updated.
  1502. If the oid variable is not present, then when the object is 
  1503. serialized, it is always inserted into the table, and any existing 
  1504. entry in the table is preserved.
  1505. Setting oid to 0 before serialization, will also cause the object to 
  1506. be inserted. This enables an object to be duplicated in the database.
  1507. Class postgresql.util.Serialize
  1508. java.lang.Object
  1509.    |
  1510.    +----postgresql.util.Serialize
  1511.    public class Serialize extends Object
  1512.    This class uses PostgreSQL's object oriented features to store Java 
  1513. Objects. It does this by mapping a Java Class name to a table in the 
  1514. database. Each entry in this new table then represents a Serialized 
  1515. instance of this class. As each entry has an OID (Object IDentifier), 
  1516. this OID can be included in another table. This is too complex to show 
  1517. here, and will be documented in the main documents in more detail.
  1518. Constructors
  1519.  public Serialize(Connection c,
  1520.                   String type) throws SQLException
  1521.           This creates an instance that can be used to serialize 
  1522. ordeserialize a Java object from a PostgreSQL table.
  1523. Methods
  1524.  public Object fetch(int oid) throws SQLException
  1525.           This fetches an object from a table, given it's OID
  1526.         Parameters:
  1527.                 oid - The oid of the object
  1528.         Returns:
  1529.                 Object relating to oid
  1530.         Throws: SQLException
  1531.                 on error
  1532.  public int store(Object o) throws SQLException
  1533.           This stores an object into a table, returning it's OID.
  1534.           If the object has an int called OID, and it is > 0, then 
  1535. that value is used for the OID, and the table will be updated. If the 
  1536. value of OID is 0, then a new row will be created, and the value of 
  1537. OID will be set in the object. This enables an object's value in the 
  1538. database to be updateable. If the object has no int called OID, then 
  1539. the object is stored. However if the object is later retrieved, 
  1540. amended and stored again, it's new state will be appended to the 
  1541. table, and will not overwrite the old entries.
  1542.         Parameters:
  1543.                 o - Object to store (must implement Serializable)
  1544.         Returns:
  1545.                 oid of stored object
  1546.         Throws: SQLException
  1547.                 on error
  1548.  
  1549.  public static void create(Connection con,
  1550.                            Object o) throws SQLException
  1551.           This method is not used by the driver, but it creates a 
  1552. table, given a Serializable Java Object. It should be used before 
  1553. serializing any objects.
  1554.         Parameters:
  1555.                 c - Connection to database
  1556.                 o - Object to base table on
  1557.         Throws: SQLException
  1558.                 on error
  1559.                    Returns:
  1560.                 Object relating to oid
  1561.         Throws: SQLException
  1562.                 on error
  1563.  public int store(Object o) throws SQLException
  1564.           This stores an object into a table, returning it's OID.
  1565.           If the object has an int called OID, and it is > 0, then 
  1566. that value is used for the OID, and the table will be updated. If the 
  1567. value of OID is 0, then a new row will be created, and the value of 
  1568. OID will be set in the object. This enables an object's value in the 
  1569. database to be updateable. If the object has no int called OID, then 
  1570. the object is stored. However if the object is later retrieved, 
  1571. amended and stored again, it's new state will be appended to the 
  1572. table, and will not overwrite the old entries.
  1573.         Parameters:
  1574.                 o - Object to store (must implement Serializable)
  1575.         Returns:
  1576.                 oid of stored object
  1577.         Throws: SQLException
  1578.                 on error
  1579.  
  1580.  public static void create(Connection con,
  1581.                            Object o) throws SQLException
  1582.           This method is not used by the driver, but it creates a 
  1583. table, given a Serializable Java Object. It should be used before 
  1584. serializing any objects.
  1585.         Parameters:
  1586.                 c - Connection to database
  1587.                 o - Object to base table on
  1588.         Throws: SQLException
  1589.                 on error
  1590.                 
  1591.  public static void create(Connection con,
  1592.                            Class c) throws SQLException
  1593.           This method is not used by the driver, but it creates a 
  1594. table, given a Serializable Java Object. It should be used before 
  1595. serializing any objects.
  1596.         Parameters:
  1597.                 c - Connection to database
  1598.                 o - Class to base table on
  1599.         Throws: SQLException
  1600.                 on error
  1601.  public static String toPostgreSQL(String name) throws SQLException
  1602.           
  1603.           This converts a Java Class name to a postgresql table, by
  1604.           replacing . with _
  1605.           Because of this, a Class name may not have _ in the name.
  1606.           Another limitation, is that the entire class name (including
  1607.           packages) cannot be longer than 31 characters (a limit 
  1608. forced by PostgreSQL).
  1609.         Parameters:
  1610.                 name - Class name
  1611.         Returns:
  1612.                 PostgreSQL table name
  1613.         Throws: SQLException
  1614.                 on error
  1615.           
  1616.  public static String toClassName(String name) throws SQLException
  1617.           This converts a postgresql table to a Java Class name, by
  1618.           replacing _ with .
  1619.         Parameters:
  1620.                 name - PostgreSQL table name
  1621.   
  1622.         Returns:
  1623.                 Class name
  1624.         Throws: SQLException
  1625.                 on error
  1626. Utility Classes
  1627. The postgresql.util package contains classes used by the internals of 
  1628. the main driver, and the other extensions.
  1629. Class postgresql.util.PGmoney
  1630.                                 
  1631. java.lang.Object
  1632.    |
  1633.    +----postgresql.util.PGobject
  1634.            |
  1635.            +----postgresql.util.PGmoney
  1636.    public class PGmoney extends PGobject implements Serializable, 
  1637. Cloneable
  1638.                
  1639.    This implements a class that handles the PostgreSQL money type
  1640. Variables
  1641.  public double val
  1642.                                 
  1643.           The value of the field
  1644. Constructors
  1645.            
  1646.  public PGmoney(double value)
  1647.    
  1648.         Parameters:
  1649.                 value - of field
  1650.                
  1651.  public PGmoney(String value) throws SQLException
  1652.    
  1653.           This is called mainly from the other geometric types, when a 
  1654. point is imbeded within their definition.
  1655.         Parameters:
  1656.                 value - Definition of this point in PostgreSQL's 
  1657. syntax
  1658.  public PGmoney()
  1659.           Required by the driver
  1660. Methods
  1661.  public void setValue(String s) throws SQLException
  1662.         Parameters:
  1663.                 s - Definition of this point in PostgreSQL's syntax
  1664.         Throws: SQLException
  1665.                 on conversion failure
  1666.         Overrides:
  1667.                 setValue in class PGobject
  1668.  public boolean equals(Object obj)
  1669.         Parameters:
  1670.                 obj - Object to compare with
  1671.                                 
  1672.         Returns:
  1673.                 true if the two boxes are identical
  1674.         Overrides:
  1675.                 equals in class PGobject
  1676.  public Object clone()
  1677.                 
  1678.           This must be overidden to allow the object to be cloned
  1679.         Overrides:
  1680.                 clone in class PGobject
  1681.  public String getValue()
  1682.         Returns:
  1683.                 the PGpoint in the syntax expected by postgresql
  1684.         Overrides:
  1685.                 getValue in class PGobject
  1686. Class postgresql.util.PGobject
  1687. java.lang.Object
  1688.    |
  1689.    +----postgresql.util.PGobject
  1690.    public class PGobject extends Object implements Serializable, 
  1691. Cloneable
  1692.                
  1693.    This class is used to describe data types that are unknown by <acronym>JDBC</acronym> 
  1694. Standard.
  1695.     A call to postgresql.Connection permits a class that extends this 
  1696. class to be associated with a named type. This is how the 
  1697. postgresql.geometric package operates.
  1698.     ResultSet.getObject() will return this class for any type that is 
  1699. not recognised on having it's own handler. Because of this, any 
  1700. postgresql data type is supported.
  1701. Constructors
  1702.  public PGobject()
  1703.           This is called by postgresql.Connection.getObject() to 
  1704. create the object.
  1705. Methods
  1706.  public final void setType(String type)
  1707.           This method sets the type of this object.
  1708.           It should not be extended by subclasses, hence its final
  1709.         Parameters:
  1710.                 type - a string describing the type of the object
  1711.  public void setValue(String value) throws SQLException
  1712.           This method sets the value of this object. It must be 
  1713. overidden.
  1714.         Parameters:
  1715.                 value - a string representation of the value of the
  1716.                 object
  1717.         Throws: SQLException
  1718.                 thrown if value is invalid for this type
  1719.     
  1720.  public final String getType()
  1721.           As this cannot change during the life of the object, it's 
  1722. final.
  1723.         Returns:
  1724.                 the type name of this object
  1725.  public String getValue()
  1726.           This must be overidden, to return the value of the object, 
  1727. in the form required by postgresql.
  1728.         Returns:
  1729.                 the value of this object
  1730.  public boolean equals(Object obj)
  1731.           This must be overidden to allow comparisons of objects
  1732.         Parameters:
  1733.                 obj - Object to compare with
  1734.         Returns:
  1735.                 true if the two boxes are identical
  1736.         Overrides:
  1737.                 equals in class Object
  1738.  public Object clone()
  1739.           This must be overidden to allow the object to be cloned
  1740.         Overrides:
  1741.                 clone in class Object
  1742.  public String toString()
  1743.           This is defined here, so user code need not overide it.
  1744.           
  1745.         Returns:
  1746.                 the value of this object, in the syntax expected by 
  1747. postgresql
  1748.         Overrides:
  1749.                 toString in class Object
  1750. Class postgresql.util.PGtokenizer
  1751. java.lang.Object
  1752.    |
  1753.    +----postgresql.util.PGtokenizer
  1754.    public class PGtokenizer extends Object
  1755.    This class is used to tokenize the text output of postgres.
  1756.    We could have used StringTokenizer to do this, however, we needed 
  1757. to handle nesting of '(' ')' '[' ']' '<' and '>' as these are used by 
  1758. the geometric data types.
  1759.    It's mainly used by the geometric classes, but is useful in parsing 
  1760. any output from custom data types output from postgresql.
  1761.                  
  1762.    See Also:
  1763.           PGbox, PGcircle, PGlseg, PGpath, PGpoint, PGpolygon
  1764.           
  1765. Constructors
  1766.  public PGtokenizer(String string,
  1767.                     char delim)
  1768.           Create a tokeniser.
  1769.         Parameters:
  1770.                 string - containing tokens
  1771.                 delim - single character to split the tokens
  1772. Methods
  1773.         
  1774.  public int tokenize(String string,
  1775.                      char delim)
  1776.           This resets this tokenizer with a new string and/or 
  1777. delimiter.
  1778.         Parameters:
  1779.                 string - containing tokens
  1780.                 delim - single character to split the tokens
  1781.  public int getSize()
  1782.         Returns:
  1783.                 the number of tokens available
  1784.  public String getToken(int n)
  1785.         Parameters:
  1786.                 n - Token number ( 0 ... getSize()-1 )
  1787.         Returns:
  1788.                 The token value
  1789.  public PGtokenizer tokenizeToken(int n,
  1790.                                   char delim)
  1791.           This returns a new tokenizer based on one of our tokens. The 
  1792. geometric datatypes use this to process nested tokens (usually 
  1793. PGpoint).
  1794.         Parameters:
  1795.                 n - Token number ( 0 ... getSize()-1 )
  1796.                 delim - The delimiter to use
  1797.         Returns:
  1798.                 A new instance of PGtokenizer based on the token
  1799.  public static String remove(String s,
  1800.                              String l,
  1801.                              String t)
  1802.           This removes the lead/trailing strings from a string
  1803.         Parameters:
  1804.                 s - Source string
  1805.                 l - Leading string to remove
  1806.                 t - Trailing string to remove
  1807.                 
  1808.         Returns:
  1809.                 String without the lead/trailing strings
  1810.  public void remove(String l,
  1811.                     String t)
  1812.           This removes the lead/trailing strings from all tokens
  1813.         Parameters:
  1814.                 l - Leading string to remove
  1815.                 t - Trailing string to remove
  1816.  public static String removePara(String s)
  1817.           Removes ( and ) from the beginning and end of a string
  1818.         Parameters:
  1819.                 s - String to remove from
  1820.         Returns:
  1821.                 String without the ( or )
  1822.  public void removePara()
  1823.           Removes ( and ) from the beginning and end of all tokens
  1824.         Returns:
  1825.                 String without the ( or )
  1826.  public static String removeBox(String s)
  1827.    
  1828.           Removes [ and ] from the beginning and end of a string
  1829.         Parameters:
  1830.                 s - String to remove from
  1831.    
  1832.         Returns:
  1833.                 String without the [ or ]
  1834.  public void removeBox()
  1835.           Removes [ and ] from the beginning and end of all tokens
  1836.         Returns:
  1837.                 String without the [ or ]
  1838.  public static String removeAngle(String s)
  1839.           Removes < and > from the beginning and end of a string
  1840.         Parameters:
  1841.                 s - String to remove from
  1842.         Returns:
  1843.                 String without the < or >
  1844.  public void removeAngle()
  1845.           Removes < and > from the beginning and end of all tokens
  1846.         Returns:
  1847.                 String without the < or >
  1848. Class postgresql.util.Serialize
  1849. This was documented earlier under Object Serialisation.
  1850. Class postgresql.util.UnixCrypt
  1851.               
  1852. java.lang.Object
  1853.    |
  1854.    +----postgresql.util.UnixCrypt
  1855.    public class UnixCrypt extends Object
  1856.    This class provides us with the ability to encrypt passwords when 
  1857. sent over the network stream
  1858.    Contains static methods to encrypt and compare passwords with Unix 
  1859. encrypted passwords.
  1860.    See John Dumas's Java Crypt page for the original source.
  1861.    http://www.zeh.com/local/jfd/crypt.html
  1862. Methods
  1863.  public static final String crypt(String salt,
  1864.                                   String original)
  1865.           Encrypt a password given the cleartext password and a 
  1866. "salt".
  1867.    
  1868.         Parameters:
  1869.                 salt - A two-character string representing the salt 
  1870. used
  1871.                 to iterate the encryption engine in lots of different
  1872.                 ways. If you are generating a new encryption then this
  1873.                 value should be randomised.
  1874.                 original - The password to be encrypted.
  1875.         Returns:
  1876.                 A string consisting of the 2-character salt followed 
  1877. by
  1878.                 the encrypted password.
  1879.               
  1880.  public static final String crypt(String original)
  1881.           Encrypt a password given the cleartext password. This method 
  1882. generates a random salt using the 'java.util.Random' class.
  1883.         Parameters:
  1884.                 original - The password to be encrypted.
  1885.    
  1886.         Returns: 
  1887.                 A string consisting of the 2-character salt followed 
  1888. by
  1889.                 the encrypted password.
  1890.                
  1891.  public static final boolean matches(String encryptedPassword,
  1892.                                      String enteredPassword)
  1893.                  
  1894.           Check that enteredPassword encrypts to encryptedPassword.
  1895.                
  1896.         Parameters:
  1897.                 encryptedPassword - The encryptedPassword. The first 
  1898. two characters are assumed to be the salt. This string would be the 
  1899. same as one found in a Unix /etc/passwd file.
  1900.                 enteredPassword - The password as entered by the user 
  1901. (or otherwise aquired).
  1902.         Returns:
  1903.                 true if the password should be considered correct.
  1904. Using the driver in a multi Threaded or Servlet environment
  1905. A problem with many <acronym>JDBC</acronym> drivers, is that only one thread can use a 
  1906. Connection at any one time - otherwise a thread could send a query 
  1907. while another one is receiving results, and this would be a bad thing 
  1908. for the database engine.
  1909. PostgreSQL 6.4, brings thread safety to the entire driver. Standard 
  1910. <acronym>JDBC</acronym> was thread safe in 6.3.x, but the Fastpath <acronym>API</acronym> wasn't.
  1911. So, if your application uses multiple threads (which most decent ones 
  1912. would), then you don't have to worry about complex schemes to ensure 
  1913. only one uses the database at any time.
  1914. If a thread attempts to use the connection while another is using it, 
  1915. it will wait until the other thread has finished it's current 
  1916. operation.
  1917. If it's a standard SQL statement, then the operation is sending the 
  1918. statement, and retrieving any ResultSet (in full).
  1919. If it's a Fastpath call (ie: reading a block from a LargeObject), then 
  1920. it's the time to send, and retrieve that block.
  1921. This is fine for applications & applets, but can cause a performance 
  1922. problem with servlets.
  1923. With servlets, you can have a heavy load on the connection. If you 
  1924. have several threads performing queries, then each one will pause, 
  1925. which may not be what you are after.
  1926. To solve this, you would be advised to create a pool of Connections.
  1927. When ever a thread needs to use the database, it asks a manager class 
  1928. for a Connection. It hands a free connection to the thread, and marks 
  1929. it as busy. If a free connection is not available, it opens one.
  1930. Once the thread has finished with it, it returns it to the manager, 
  1931. who can then either close it, or add it to the pool. The manager would 
  1932. also check that the connection is still alive, and remove it from the 
  1933. pool if it's dead.
  1934. So, with servlets, it's up to you to use either a single connection, 
  1935. or a pool. The plus side for a pool is that threads will not be hit by 
  1936. the bottle neck caused by a single network connection. The down side, 
  1937. is that it increases the load on the server, as a backend is created 
  1938. for each Connection.
  1939. It's up to you, and your applications requirements.
  1940. </programlisting>
  1941. </para>
  1942. </sect1>
  1943. <sect1>
  1944. <title>Further Reading</title>
  1945. <para>
  1946. If you have not yet read it, I'd advise you read the <acronym>JDBC</acronym>
  1947.  <acronym>API</acronym> 
  1948. Documentation (supplied with Sun's <acronym>JDK</acronym>),
  1949.  and the <acronym>JDBC</acronym> Specification. 
  1950. Both are available on 
  1951. <ulink url="http://www.javasoft.com">JavaSoft's web site</ulink>.
  1952. </para>
  1953. <para>
  1954. <ulink url="http://www.retep.org.uk">My own web site</ulink>
  1955.  contains updated information not included in this 
  1956. document, and also includes precompiled drivers for v6.4, and earlier.
  1957. </para>
  1958. </sect1>
  1959. </chapter>