Postgresは拡張可能なデータベースシステムです。クエリーから呼び出すことができる、独自の関数をバックエンドに追加することができます。独自の型さえも追加することができます。こういった独特な機構がありますので、JavaでもこれをAPIの拡張セットを用意してサポートします。実際、標準ドライバの中核でも、ラージオブジェクトなどの実装のためにこの拡張を使用しています。
いくつかの拡張APIにアクセスするには、org.postgresql.Connectionクラスの追加メソッドのいくつかを使用しなければなりません。この場合、Driver.getConnection()からの戻り値をキャストしなければなりません。例えば:
Connection db = Driver.getConnection(url, username, password); // ... // later on Fastpath fp = ((org.postgresql.Connection)db).getFastpathAPI();
public class Connection extends Object implements Connection java.lang.Object | +----org.postgresql.Connection
ここには、拡張APIにアクセスするために使用される追加メソッドがあります。java.sql.Connectionで定義されたメソッドは示しません。
public Fastpath getFastpathAPI() throws SQLException
現在の接続用のFastpath APIを返します。主にLargeObject APIで使用されます。
この関数を使用する最善の方法は次のようなものです:
import org.postgresql.fastpath.*; ... Fastpath fp = ((org.postgresql.Connection)myconn).getFastpathAPI();ここで、myconnは開いているPostgreSQLへのConnectionオブジェクトです。
戻り値:. PostgreSQLバックエンドにある関数へのアクセスを可能にするFastpathオブジェクト。
例外:. SQLExceptionがFastpathの初回の初期化時に投げられる可能性があります
public LargeObjectManager getLargeObjectAPI() throws SQLException現在の接続用のラージオブジェクトAPIを返します。
この関数を使用する最善の方法は次のようなものです:
import org.postgresql.largeobject.*; ... LargeObjectManager lo = ((org.postgresql.Connection)myconn).getLargeObjectAPI();ここで、myconnは開いているPostgreSQLへのConnectionオブジェクトです。
戻り値:. APIを実装したLargeObjectオブジェクト
例外:. SQLExceptionがLargeObjectの初回の初期化時に投げられる可能性があります
public void addDataType(String type, String name)これによってクライアントのコードが、多くのPostgreSQL独特のデータ型のためのハンドラを追加することができます。通常、ドライバで認識されないデータ型は、PGobjectのインスタンスとしてResultSet.getObject()から返されます。このメソッドを使って、PGobjectを拡張したクラスを書くことや、ドライバに型名と使用するクラス名を通知することができます。欠点は、接続を確立する度にこのメソッドを呼び出さなければならないことです。
この関数を使用する最善の方法は次のようなものです:
... ((org.postgresql.Connection)myconn).addDataType("mytype","my.class.name"); ...ここで、myconnは開いているPostgreSQLへのConnectionオブジェクトです。取り扱うクラスはorg.postgresql.util.PGobjectを継承する必要があります。
public class Fastpath extends Object java.lang.Object | +----org.postgresql.fastpath.Fastpath
Fastpathはlibpq Cインタフェース内に存在するAPIで、これによってクライアントマシンはデータベースバックエンドにある関数を実行することができます。ほとんどのクライアントコードでは、このメソッドを使用する必要がありません。しかし、ラージオブジェクトAPIにて使用しますので、用意されています。
使用するためには、次の行のようにorg.postgresql.fastpathパッケージをインポートしなければなりません。
import org.postgresql.fastpath.*;そして、FastPathオブジェクトを入手したい時に次のコードを書きます:
Fastpath fp = ((org.postgresql.Connection)conn).getFastpathAPI();これはデータベース接続に関連づいた、コマンドを発行する際に使用するインスタンスを返します。getFastpathAPI()はJDBCの標準メソッドではないので、Connectionオブジェクトをorg.postgresql.Connectionオブジェクトにキャストすることが必要です。Fastpathインスタンスを所有すれば、fastpath()メソッドを使用してバックエンドの関数を実行することができます。
参照:. FastpathFastpathArg, LargeObject
public Object fastpath(int fnid, boolean resulttype, FastpathArg args[]) throws SQLException
関数呼び出しをPostgreSQLバックエンドに送ります。
パラメータ:. fnid - 関数 ID resulttype - 結果が整数ならば真、その他の場合は偽 args - fastpath に渡す FastpathArguments
戻り値:. データが無い場合、null、整数の結果ならば Integer 型、さもなくば byte[]
public Object fastpath(String name, boolean resulttype, FastpathArg args[]) throws SQLException
名前によって PostgreSQL バックエンドに関数呼び出しを送ります。
Note: プロシージャ名の関数IDへの割り当ては、通常は事前にaddfunction()を呼び出して、存在しなければなりません。関数IDはバックエンドのバージョンによって異なりますので、このメソッドの呼び出しは推奨されています。このメソッドの使用例についてはorg.postgresql.LargeObjectを参照して下さい。
パラメータ:. name - 関数名 resulttype - 結果が整数ならば真、さもなくば偽 args - fastpath に渡す FastpathArguments オブジェクト
戻り値:. データが無ければnull、整数の結果であればInteger 型、さもなくばbyte[]
参照:. LargeObject
public int getInteger(String name, FastpathArg args[]) throws SQLException
この簡易メソッドは結果の値が整数であることを仮定しています。
パラメータ:. name - 関数名 args - 関数への引数
戻り値:. 整数の結果
例外:. SQLExceptionはデータベースアクセスエラーが発生した、または、結果が無い場合
public byte[] getData(String name, FastpathArg args[]) throws SQLException
この簡易メソッドは結果の値がバイナリデータであると仮定しています。
パラメータ:. name - 関数名 args - 関数への引数
戻り値:. 結果を持つbyte[] 配列
例外:. SQLExceptionはデータベースアクセスエラーが発生した、または、結果が無い場合
public void addFunction(String name, int fnid)
これは関数を検索テーブルに追加します。ユーザコードはaddFunctionsメソッドを使用しなければなりません。このメソッドは oid を直接記述しておらず問い合わせに基づいたものです。関数のoidは静的のままであることは保証されていませんし、同一のバージョンのサーバ間でさえも異なります。
public void addFunctions(ResultSet rs) throws SQLException
このメソッドは2つのカラムを持つResultSetを引数としてとります。カラム1は関数名、カラム2はoidを持ちます。ResultSet全体を読み取り、その値を関数テーブル中に読み込みます。
Important: このメソッドを呼び出した後にResultSetをclose()することを忘れないで下さい。
関数名の検索に関する実装時の注意書き: PostgreSQLは関数IDとIDに対応する名前をpg_procテーブルに保存します。ローカルに処理速度を上げるために、要求に応じてこのテーブルに関数を問い合わせるのではなくHashtableが使用されています。また、関数の必須項目のみがこのテーブルに登録されていますので、接続を維持しておくことでできるだけ処理速度を向上させます。
org.postgresql.LargeObjectクラスはその起動時に問い合わせを行ない、この段階で返されたResultSetをaddFunctions()メソッドに渡します。これを行なった後、LargeObject APIはその関数を名前で参照します。
手作業によるoidへの変換ができるとは考えないで下さい。いいですか。これらは現時点のものです。開発を通して変更されます。(V7.0でもこの問題について議論が何回かありました。)ですから、これは将来の不当な問題を防ぐために実装されています。
参照:. LargeObjectManager
public int getID(String name) throws SQLException
このメソッドは名前に関連付けられた関数IDを返します。addFunction()もしくはaddFunctions()がこの名前を使って呼び出されていなければ、SQLExceptionが投げられます。
public class FastpathArg extends Object java.lang.Object | +----org.postgresql.fastpath.FastpathArg
各fastpath呼び出しは引数の配列、引数の数、呼び出される関数に依存する型を必要とします。このクラスはこの能力を提供するために必要なメソッドを実装します。
このクラスの使用例については、org.postgresql.LargeObjectパッケージを参照して下さい。
参照:. Fastpath, LargeObjectManager, LargeObject
public FastpathArg(int value)
整数値からなる引数で構築します。
パラメータ:. value - 設定する整数値
public FastpathArg(byte bytes[])
byte型の配列からなる引数で構築します。
パラメータ:. bytes - 保存する配列
public FastpathArg(byte buf[], int off, int len)
byte型の配列の一部からなる引数で構築します。
パラメータ:.
元となる配列
配列内のオフセット
含めるべきデータ長
public FastpathArg(String s)
文字列からなる引数で構築します。
PostgreSQLは、幾何的な特徴をテーブルに保存できるデータ型の集合を持ちます。これらは1つの点、線、多角形を扱います。Javaではorg.postgresql.geometricパッケージを使用してこれらの型をサポートします。ここにはorg.postgresql.util.PGobjectクラスを継承したクラスがあります。どのように独自のデータ型ハンドラを実装するのかについての詳細はこのクラスを参照して下さい。
org.postgresql.geometric.PGboxクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGbox public class PGbox extends PGobject implements Serializable, Cloneable このクラスはPostgreSQLにおけるboxデータ型を表します。 変数 public PGpoint point[] ボックスの角を示す2つの点があります。 コンストラクタ public PGbox(double x1, double y1, double x2, double y2) パラメータ: x1 - 1番目のx座標 y1 - 1番目のy座標 x2 - 2番目のx座標 y2 - 2番目のy座標 public PGbox(PGpoint p1, PGpoint p2) パラメータ: p1 - 1番目の点 p2 - 2番目の点 public PGbox(String s) throws SQLException パラメータ: s - PostgreSQL構文によるボックス定義 例外: SQLException 定義が無効であった場合 public PGbox() 必須のコンストラクタ メソッド public void setValue(String value) throws SQLException このメソッドはこのオブジェクトの値を設定します。 これはサブクラスでオーバライドしなければなりませんが、 サブクラスからも呼び出されます。 パラメータ: value - このオブジェクトの値の文字列表現 例外: SQLException 値がこの型では無効であった場合 オーバライド: PGobjectクラスのsetValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つのボックスが同一ならば真 オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするために オーバライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待された構文で表したPGbox オーバライド: PGobjectクラスのgetValue org.postgresql.geometric.PGcircleクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGcircle public class PGcircle extends PGobject implements Serializable, Cloneable このクラスは、PostgreSQLの点と半径からなるcircleデータ型を表します。 変数 public PGpoint center 中心点です。 public double radius 半径です。 コンストラクタ public PGcircle(double x, double y, double r) パラメータ: x - 中心座標 y - 中心座標 r - 円の半径 public PGcircle(PGpoint c, double r) パラメータ: c - 円の中心を示すPGpoint r - 円の半径 public PGcircle(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した円の定義 例外: SQLException 変換に失敗した場合 public PGcircle() ドライバによって使用されるコンストラクタ メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した円の定義 例外: SQLException 変換に失敗した場合 オーバライド: PGobjectクラスのsetValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの円が同一ならば真 (訳注: 原文ではboxesだがcirclesとして訳。) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待される構文で表したPGcircle オーバライド: PGobjectクラスのgetValue org.postgresql.geometric.PGlineクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGline このクラスは2点から構成される線を実装します。今のところまだ、 線はバックエンド内で実装されていませんが、このクラスはバックエ ンドでの実装がなされればすぐに使えることを保証します。 変数 public PGpoint point[] 2つの点があります。 コンストラクタ public PGline(double x1, double y1, double x2, double y2) パラメータ: x1 - 1番目の座標 y1 - 1番目の座標 x2 - 2番目の座標 y2 - 2番目の座標 public PGline(PGpoint p1, PGpoint p2) パラメータ: p1 - 1番目の点 p2 - 2番目の点 public PGline(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した線の定義 (訳注: 原文ではcircleだがlineとして訳。) 例外: SQLException 変換に失敗した場合 public PGline() ドライバで必要とされます。 メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した線分の定義 例外: SQLException 変換に失敗した場合 オーバライド: PGobject クラスの setValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの線が同一ならば真 (訳注: 原文ではboxesだがlinesとして訳。) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待される構文で表したPGline オーバライド: PGobjectクラスのgetValue org.postgresql.geometric.PGlsegクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGlseg public class PGlseg extends PGobject implements Serializable, Cloneable 2つの点からなるlseg(線分)を実装します。 変数 public PGpoint point[] 2つの点があります。 コンストラクタ public PGlseg(double x1, double y1, double x2, double y2) パラメータ: x1 - 1 番目の座標 y1 - 1 番目の座標 x2 - 2 番目の座標 y2 - 2 番目の座標 public PGlseg(PGpoint p1, PGpoint p2) パラメータ: p1 - 1番目の点 p2 - 2番目の点 public PGlseg(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した線分の定義 (訳注: 原文ではcircleだがline segmentとして訳。) 例外: SQLException 変換に失敗した場合 public PGlseg() ドライバによって必要とされます。 メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した線分の定義 例外: SQLException 変換に失敗した場合 オーバライド: PGobjectクラスのsetValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの線分が同一ならば真 (訳注: 原文ではboxesだがline segmentsとして訳。) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待される構文で表したPGlseg オーバライド: PGobjectクラスのgetValue org.postgresql.geometric.PGpathクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpath public class PGpath extends PGobject implements Serializable, Cloneable 経路(閉じている可能性がある複数の線分)を実装します 変数 public boolean open 開いた経路ならば真、閉じた経路ならば偽。 public PGpoint points[] この経路を定義する点。 コンストラクタ public PGpath(PGpoint points[], boolean open) パラメータ: points - 経路を定義するPGpoint open - 開いた経路ならば真、閉じた経路ならば偽 public PGpath() ドライバで必要とされます。 public PGpath(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した経路の定義 (訳注: 原文ではcircleだがpathとして訳。) 例外: SQLException 変換に失敗した場合 メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した経路の定義 例外: SQLException 変換に失敗した場合 オーバライド: PGobjectクラスのsetValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの経路が同一ならば真 (訳注: 原文ではboxesだがpathesとして訳。) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() PostgreSQLで期待される構文で表した経路を返します。 (訳注: 原文ではpolygonだがpathとして訳。) オーバライド: PGobjectクラスのgetValue public boolean isOpen() 開いた経路ならば真を返します。 public boolean isClosed() 閉じた経路ならば偽を返します。 public void closePath() 閉じた経路として印をつけます。 public void openPath() 開いた経路として印をつけます。 org.postgresql.geometric.PGpointクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpoint public class PGpoint extends PGobject implements Serializable, Cloneable これは、その座標をdouble型で使用している点を除き、 java.awt.Pointのある版を実装したものです。 PostgreSQLのpoint データ型に割り当てます。 変数 public double x 点のX座標 public double y 点のY座標 コンストラクタ public PGpoint(double x, double y) パラメータ: x - 座標値 y - 座標値 public PGpoint(String value) throws SQLException 主に、その定義に点を含む、他の幾何データ型から呼び出されます。 パラメータ: value - PostgreSQLの構文で表された点の定義 public PGpoint() ドライバで必要とされます。 メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した点の定義 例外: SQLException 変換に失敗した場合 オーバライド: PGobjectクラスのsetValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの点が同一ならば真 (訳注: 原文ではboxesだがpointsとして訳。) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待される構文で表したPGpoint オーバライド: PGobjectクラスのgetValue public void translate(int x, int y) 点を指定した量分移動します。 パラメータ: x - x座標に加える整数量 y - y座標に加える整数量 public void translate(double x, double y) 点を指定した量分移動します。 パラメータ: x - x座標に加える double 型で示された量 y - y座標に加える double 型で示された量 public void move(int x, int y) 点を指定座標に移動します。 パラメータ: x - 座標(整数) y - 座標(整数) public void move(double x, double y) 点を指定座標に移動します。 パラメータ: x - 座標(double 型) y - 座標(double 型) public void setLocation(int x, int y) 点を指定座標に移動します。この記述については java.awt.Pointを参照して下さい。 パラメータ: x - 座標(整数) y - 座標(整数) 参照: Point public void setLocation(Point p) 点を与えられたjava.awt.Pointに移動します。この記述につ いてはjava.awt.Pointを参照して下さい。 パラメータ: p - 移動先を示すPoint 参照: Point org.postgresql.geometric.PGpolygonクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpolygon public class PGpolygon extends PGobject implements Serializable, Cloneable PostgreSQL の polygon データ型を実装します。 変数 public PGpoint points[] 多角形を定義する点。 コンストラクタ public PGpolygon(PGpoint points[]) PGpointの配列を使用して多角形を生成します。 パラメータ: points - 多角形を定義する点 public PGpolygon(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した多角形の定義 (訳注: 原文ではcircleだがpolygonとして訳。) 例外: SQLException 変換に失敗した場合 public PGpolygon() ドライバで必要とされます。 メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQLの構文で表した多角形の定義 例外: SQLException 変換に失敗した場合 オーバライド: PGobject クラスの setValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの多角形が同一ならば真 (訳注: 原文ではboxesだがpolygonsとして訳。) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待される構文で表したPGpolygon オーバライド: PGobjectクラスのgetValue
ラージオブジェクトは標準JDBC仕様でサポートされています。しかし、そのインタフェースには制限があり、また、PostgreSQLで用意されるAPIでは、ローカルファイル同様にオブジェクトの内容にランダムアクセスを行なうことができます。
org.postgresql.largeobjectパッケージはJavaに対し、libpq Cインタフェ ースにあるラージオブジェクトAPIを提供します。ラージオブジェクトの生成、オープン、削除を扱うLargeObjectManager、及び、個別のオブジェクトを扱うLargeObjectという 2つのクラスから構成されています。
public class LargeObject extends Object java.lang.Object | +----org.postgresql.largeobject.LargeObject
このクラスはPostgreSQLのラージオブジェクトインタフェースを実装します。
インタフェースの実行に必要な基本的なメソッド、及び、このオブジェクト用のInputStreamとOutputStreamクラスの組合せを提供するためのメソッドを提供します。
通常クライアントコードでは、ラージオブジェクトにアクセスするためにResultSet のメソッドgetAsciiStream、getBinaryStream、またはgetUnicodeStream、もしくはPreparedStatementのメソッドsetAsciiStream、setBinaryStream、またはsetUnicodeStreamを使用します。
しかし、もっと低レベルなラージオブジェクトへのアクセスが必要となることがあります。これはJDBC仕様ではサポートされていません。
どのようにラージオブジェクトへのアクセスを得るかやどうやって生成するかについてはorg.postgresql.largeobject.LargeObjectManagerを参照して下さい。
参照:. LargeObjectManager
ファイルの先頭からシークすることを示します
現在位置からシークすることを示します
ファイルの終端からシークすることを示します
public int getOID()
LargeObjectのOID
public void close() throws SQLException
オブジェクトを閉じます。このメソッドを呼び出した後にそのオブジェクトのメソッドを呼び出してはいけません。
public byte[] read(int len) throws SQLException
オブジェクトからデータを一部読みとり、byte[]型の配列として返します。
public void read(byte buf[], int off, int len) throws SQLException
オブジェクトからデータの一部分を既存の配列に読み込みます。
パラメータ:.
コピー先の配列
配列内のオフセット
読みとるバイト数
public void write(byte buf[]) throws SQLException
配列をオブジェクトに書き込む
public void write(byte buf[], int off, int len) throws SQLException
配列の一部のデータをオブジェクトに書き込む
パラメータ:.
コピー元となる配列
配列内のオフセット
書き込むバイト数
public class LargeObjectManager extends Object java.lang.Object | +----org.postgresql.largeobject.LargeObjectManager
クライアントコードにて、ラージオブジェクトの生成、オープン、削除を可能にするためのメソッドを提供します。オブジェクトを開くと、org.postgresql.largeobject.LargeObjectのインスタンスが返され、そのインスタンスのメソッドを使ってラージオブジェクトにアクセスできます。
このクラスはorg.postgresql.Connectionによってのみ作成できます。このクラスへのアクセスを得るには、次のようなコードの一部を使用します:
import org.postgresql.largeobject.*; Connection conn; LargeObjectManager lobj; // ... 接続を開くコード ... lobj = ((org.postgresql.Connection)myconn).getLargeObjectAPI();
通常クライアントコードでは、ラージオブジェクトにアクセスするためにResultSet のメソッドgetAsciiStream、getBinaryStream、またはgetUnicodeStream、もしくはPreparedStatementのメソッドsetAsciiStream、setBinaryStream、またはsetUnicodeStream を使用します。しかし、もっと低レベルなラージオブジェクトへのアクセスが必要となることがあります。これはJDBC仕様ではサポートされていません。
どのようにラージオブジェクトの内容を扱うのかについては、org.postgresql.largeobject.LargeObjectを参照して下さい。
このモードはオブジェクトに書き込みを行なう予定であることを示します。
このモードはオブジェクトに読み取りを行なう予定であることを示します。
このモードがデフォルトです。オブジェクトに読み取り、及び、書き込みを行なう予定であることを示します。
public LargeObject open(int oid) throws SQLException
既存のラージオブジェクトを、そのOIDに基づいて開きます。このメソッドは (デフォルトである)READとWRITEアクセスが要求されているものと仮定します。
public LargeObject open(int oid, int mode) throws SQLException
既存のラージオブジェクトを、そのOIDに基づいて開きます。そして、アクセスモードのセットを許します。
public int create() throws SQLException
ラージオブジェクトを作成し、そのOIDを返します。新しいオブジェクトの属性のデフォルトはREADWRITEです。
public int create(int mode) throws SQLException
ラージオブジェクトを作成し、そのOIDを返します。そして、アクセスモードをセットします。
public void delete(int oid) throws SQLException
ラージオブジェクトを削除します。
public void unlink(int oid) throws SQLException
ラージオブジェクトを削除します。deleteメソッドと同一です。これはC API同様に"unlink"を使用するために用意されています。
PostgreSQLはごく普通のSQLデータベースではありません。他のほとんどのデータベースよりも拡張性があり、特有のオブジェクト指向機能をサポートしています。
他のテーブルにある行を参照するテーブルを持つことができるということはこ の結果の1つです。例えば:
test=> create table users (username name,fullname text); CREATE test=> create table server (servername name,adminuser users); CREATE test=> insert into users values ('peter','Peter Mount'); INSERT 2610132 1 test=> insert into server values ('maidast',2610132::users); INSERT 2610133 1 test=> select * from users; username|fullname --------+-------------- peter |Peter Mount (1 row) test=> select * from server; servername|adminuser ----------+--------- maidast | 2610132 (1 row)わかりますか。上の例では、テーブルの名前をフィールドとして持つことができ、行のoidがそのフィールドに埋め込まれていることを示しています。
Javaではこれをどう扱わなければならないでしょうか?
Javaではjava.io.Serializableインタフェースを実装するクラスならばストリームにオブジェクトを保存することができます。オブジェクト直列化として知られるこの処理は、複雑なオブジェクトをデータベースに保存することに使用することができます。
さて、JDBCでは、それらを保存する際にLargeObjectを使用しなければなりません。しかし、これらのオブジェクトに問い合わせを行なうことができません。
org.postgresql.util.Serializeクラスが行なうことは、オブジェクトをテーブルとして保存する手段、及び、テーブルからオブジェクトを取り出す手段を提供することです。ほとんどの場合では、このクラスを直接アクセスする必要はなく、PreparedStatement.setObject()とResultSet.getObject()メソッドを使うことになります。これらのメソッドはオブジェクトのクラス名をデータベース内のテーブル名で照合します。合うものがあれば、そのオブジェクトは直列化されたオブジェクトとみなし、そのテーブルから取り出します。その処理の際にそのオブジェクトが直列化された別のオブジェクトを持つ場合、再帰的にそのツリーを辿ります。
複雑に見えますか?実際は、私が述べたことよりは簡単です。説明することが難しいだけです。
このクラスにアクセスする機会は、create()メソッド群を使用する時だけです。これらはドライバから使用されるものではありませんが、直列化要求のあったJavaのオブジェクトやクラスに基づいた1つ以上の"create table"文をデータベースに対して発行します。
さて、これが最後ですが、もし対象とするオブジェクトが:
public int oid;という行を含むのならば、テーブルからオブジェクトを取り出す際に、そこにテーブル内のoidが設定されます。そして、オブジェクトが変更され、再度直列化されると、既存のエントリは更新されます。
oid変数がなければ、オブジェクトが直列化された時に常に挿入され、そして、テーブルに既存のエントリは全て保存されます。
直列化前にoid変数を0にすると、そのオブジェクトは挿入されるようになります。これにより、あるオブジェクトをデータベース内に複数持たせることができます。
org.postgresql.util.Serializeクラス java.lang.Object | +----org.postgresql.util.Serialize public class Serialize extends Object このクラスは、Javaのオブジェクトを保存するためにPostgreSQLのオブジェ クト指向機能を使用します。このクラスでは、Javaのクラス名をデータベー ス内のテーブルに対応させることでそれを行ないます。この新しいテーブル 各エントリはこのクラスの直列化されたインスタンスを表します。各エント リはOID(オブジェクト識別子)を持ちますので、このOIDを別のテーブルに 持たせることができます。このクラスはここで示すには複雑過ぎますので、 より詳細については主文書にて記載させる予定です。 コンストラクタ public Serialize(Connection c, String type) throws SQLException このメソッドは、PostgreSQLのテーブルからあるJavaオブジェクト を直列化または復号化するために使用できる、インスタンスを生成 します。 メソッド public Object fetch(int oid) throws SQLException 指定したOIDのオブジェクトをテーブルから入手します。 パラメータ: oid - オブジェクトのoid 戻り値: oid に対応するオブジェクト 例外: SQLException エラー時 public int store(Object o) throws SQLException テーブルにオブジェクトを保存し、その OID を返します。 そのオブジェクトがOIDという名前の整数型変数をもち、それが0よ り大きい場合、その値がOIDとして使われ、テーブルは更新されま す。OID変数が0ならば、新しい行が作成され、行のOIDがそのオブ ジェクトに設定されます。これにより、データベース内のオブジェ クトの値が更新可能になります。オブジェクトがOIDという整数型 変数を持たない場合、オブジェクトは保存されます。が、その後に そのオブジェクトを取り出し、修正し、再度保存した場合に、その 新しい状態はテーブルに追加され、古いエントリを上書きしません。 パラメータ: o - 保存するオブジェクト(Serializableを実装する必 要があります) 戻り値: 保存したオブジェクトのoid 例外: SQLException エラー時 public static void create(Connection con, Object o) throws SQLException このメソッドはドライバで使われませんが、Serializableを実装し た指定Javaオブジェクトに対応するテーブルを作成します。オブ ジェクトの直列化を行なう前に使用しなければなりません。 パラメータ: c - データベースへのConnectionオブジェクト o - テーブルに基づくオブジェクト Throws: SQLException エラー時 Returns: oidに対応したオブジェクト (訳注: 間違いです。シグネチャではvoidです。) Throws: SQLException エラー時 public int store(Object o) throws SQLException (訳注: 前述されています。) テーブルにオブジェクトを保存し、その OID を返します。 そのオブジェクトがOIDという名前の整数型変数をもち、それが0よ り大きい場合、その値がOIDとして使われ、テーブルは更新されま す。OID変数が0ならば、新しい行が作成され、行のOIDがそのオブ ジェクトに設定されます。これにより、データベース内のオブジェ クトの値が更新可能になります。オブジェクトがOIDという整数型 変数を持たない場合、オブジェクトは保存されます。が、その後に そのオブジェクトを取り出し、修正し、再度保存した場合に、その 新しい状態はテーブルに追加され、古いエントリを上書きしません。 パラメータ: o - 保存するオブジェクト(Serializableを実装する必 要があります) 戻り値: 保存したオブジェクトのoid 例外: SQLException エラー時 public static void create(Connection con, Object o) throws SQLException (訳注: 前述されています。) このメソッドはドライバで使われませんが、Serializableを実装し た指定Javaオブジェクトに対応するテーブルを作成します。オブ ジェクトの直列化を行なう前に使用しなければなりません。 パラメータ: c - データベースへのConnectionオブジェクト o - テーブルに基づくオブジェクト Throws: SQLException エラー時 public static void create(Connection con, Class c) throws SQLException (訳注: 前述されています。) このメソッドはドライバで使われませんが、Serializableを実装し た指定Javaオブジェクトに対応するテーブルを作成します。オブ ジェクトの直列化を行なう前に使用しなければなりません。 パラメータ: c - データベースへのConnectionオブジェクト o - テーブルに基づくオブジェクト Throws: SQLException エラー時 public static String toPostgreSQL(String name) throws SQLException Javaのクラス名を「 . 」を「 _ 」に置換してPostgreSQLテーブル に変換します。この理由は、クラス名は「 _ 」を持つことができな いからです。他の制限として、(パッケージを含めた)完全なクラ ス名は31文字を越えられないことがあります。(これはPostgreSQL による制限です。) パラメータ: name - クラス名 戻り値: PostgreSQLのテーブル名 例外: SQLException エラー時 public static String toClassName(String name) throws SQLException PostgreSQLのテーブルを「 _ 」を「 . 」に置換してJavaのクラス 名に変換します。 パラメータ: name - PostgreSQLテーブル名 戻り値: クラス名 例外: SQLException エラー時 ユーティリティクラス org.postgresql.utilパッケージには主ドライバやその他の拡張機能の内部で 使用されるクラスがあります。 org.postgresql.util.PGmoneyクラス java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.util.PGmoney public class PGmoney extends PGobject implements Serializable, Cloneable PostgreSQLmoney型を取り扱うクラスを実装したものです。 変数 public double val フィールドの値。 コンストラクタ public PGmoney(double value) パラメータ: value - フィールドの値 public PGmoney(String value) throws SQLException (訳注: 間違いと思われます。PGpoint(String value)の説明が書いてあります。) 主に、その定義にpoint型を持っている他の幾何データ型から呼 び出されます。 パラメータ: value - PostgreSQLの構文で表した点の定義 public PGmoney() ドライバで必要とされます。 メソッド public void setValue(String s) throws SQLException パラメータ: s - PostgreSQL構文によるこの金額の定義 (訳注: 原文ではpointだがmoneyとして訳) 例外: SQLException 変換失敗時 オーバライド: PGobjectクラスのsetValue public boolean equals(Object obj) パラメータ: obj - 比較するオブジェクト 戻り値: 2つの金額が同一ならば真 (訳注: 原文ではboxesだがmoneysとして訳) オーバライド: PGobjectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: PGobjectクラスのclone public String getValue() 戻り値: PostgreSQLで期待される構文で表したPGmoney (訳注: 原文ではPGpointだがPGmoneyとして訳) オーバライド: PGobjectクラスのgetValue org.postgresql.util.PGobjectクラス java.lang.Object | +----org.postgresql.util.PGobject public class PGobject extends Object implements Serializable, Cloneable このクラスはJDBCの標準では未知のデータ型を記述するために使用されます。 org.postgresql.Connectionへの呼び出しでは、指定した型に関連付けられた、 このクラスを継承したクラスを使用することができます。 これはorg.postgresql.geometricパッケージが動作する方法です。 ResultSet.getObject()はそのハンドラを使って認識できなかった型の場合、 全てこのクラスを返します。これにより任意のPostgreSQLのデータ型がサポー トされます。 コンストラクタ public PGobject() オブジェクトを作成する時にorg.postgresql.Connection.getObject() から呼び出されます。 メソッド public final void setType(String type) このメソッドはこのオブジェクトの型を設定します。 サブクラスで継承されてはなりませんので、finalメソッドです。 パラメータ: type - オブジェクトの型を示す文字列 public void setValue(String value) throws SQLException このオブジェクトに値を設定します。オーバライドされなければ なりません。 パラメータ: value - そのオブジェクトの値の文字列表現 例外: SQLException 値がこの型で無効だった場合 public final String getType() このオブジェクトが有効である間に変更することができないよう に、finalとします。 戻り値: このオブジェクトの型名 public String getValue() オブジェクトの値をPostgreSQLで要求された形式で返すために、 これはオーバライドされなければなりません。 戻り値: オブジェクトの値 public boolean equals(Object obj) オブジェクトの比較ができるように、オーバライドされなけれ ばなりません。 パラメータ: obj - 比較するオブジェクト 戻り値: 2つのオブジェクトが同一ならば真 (訳注: 原文ではboxesだがobjectsとして訳) オーバライド: Objectクラスのequals public Object clone() このメソッドはオブジェクトの複製を可能にするためにオーバ ライドする必要があります。 オーバライド: Objectクラスのclone public String toString() ここで定義されています。ユーザのコードでオーバライドする 必要はありません。 戻り値: PostgreSQLで期待される構文を使ったこのオブジェクトの値 オーバライド: ObjectクラスのtoString org.postgresql.util.PGtokenizerクラス java.lang.Object | +----org.postgresql.util.PGtokenizer public class PGtokenizer extends Object このクラスはPostgreSQLのテキスト出力のトークン化に使用されます。 以前はStringTokenizer を使用していましたが、幾何データ型で使 用される、入れ子状の '(' ')' '[' ']' '<' 及び '>' を扱う必要が ありました。 主に幾何クラスにて使用されますが、PostgreSQLから生成されるど のようなカスタムデータ型の出力の解析にも使用できます。 参照: PGbox, PGcircle, PGlseg, PGpath, PGpoint, PGpolygon コンストラクタ public PGtokenizer(String string, char delim) トークン化機構を生成します。 パラメータ: string - トークン化する文字列 delim - トークンをわける1つの文字 メソッド public int tokenize(String string, char delim) 新しい文字列と区切り文字でトークン化機構をリセット します。 パラメータ: string - トークン化する文字列 delim - トークンをわける1つの文字 public int getSize() 戻り値: 利用可能なトークン数 public String getToken(int n) パラメータ: n - トークン番号 ( 0 ... getSize()-1 ) 戻り値: トークンの値 public PGtokenizer tokenizeToken(int n, char delim) トークンの1つに基づく新しいトークン化機構を返します。 幾何データ型(通常はPGpoint)はこれを使用して入れ子状の トークンを処理します。 パラメータ: n - トークン番号 ( 0 ... getSize()-1 ) delim - 使用する区切り文字 戻り値: トークンに基づく新しいPGtokenizerインスタンス public static String remove(String s, String l, String t) 文字列の前/後ろの文字列を削除します。 パラメータ: s - 元となる文字列 l - 前から削除する文字列 t - 後ろから削除する文字列 文字列: 前/後ろの文字列を削除した文字列 public void remove(String l, String t) 全てのトークンから前/後ろの文字列を削除します。 パラメータ: l - 前から削除する文字列 t - 後ろから削除する文字列 public static String removePara(String s) 文字列の始めと終りにある ( と ) を削除します。 パラメータ: s - 削除対象文字列 戻り値: ( と ) を削除した文字列 public void removePara() 全てのトークンの始めと終りにある ( と ) を削除します。 戻り値: ( と ) を削除した文字列 (訳注: シグネチャは void です。) public static String removeBox(String s) 文字列の始めと終りにある [ と ] を削除します。 パラメータ: s - 削除対象文字列 戻り値: [ と ] を削除した文字列 public void removeBox() 全てのトークンの始めと終りにある [ と ] を削除します。 戻り値: [ と ] を削除した文字列 (訳注: 間違いです。シグネチャは void です。) public static String removeAngle(String s) 文字列の始めと終りにある < と > を削除します。 パラメータ: s - 削除対象文字列 戻り値: < と > を削除した文字列 public void removeAngle() 全てのトークンの始めと終りにある < と > を削除します。 戻り値: < と > を削除した文字列 (訳注: シグネチャは void です。) org.postgresql.util.Serializeクラス このクラスは上のオブジェクト直列化の節にて説明されました。 org.postgresql.util.UnixCryptクラス java.lang.Object | +----org.postgresql.util.UnixCrypt public class UnixCrypt extends Object このクラスはネットワークに暗号化パスワードを送信する能力を提供します。 暗号化、及び Unixの暗号化パスワードと比較する静的メソッドを持ちます。 元となったソースについては、次のJohn Dumas氏のJava暗号ページを参照 して下さい。 http://www.zeh.com/local/jfd/crypt.html メソッド public static final String crypt(String salt, String original) 指定された平文パスワードと "ソルト" でパスワードを暗号化します。 パラメータ: salt - 暗号化エンジンを多くの異なった方法で繰り返させ るために使用するソルトを表した2文字の文字列。新 しく暗号を生成したい場合は、この値を乱数化しな ければなりません。 original - 暗号化対象のパスワード 戻り値: 2文字のソルトとそれに続く暗号化パスワードからなる文字列 public static final String crypt(String original) 指定平文パスワードを暗号化します。このメソッドは 'java.util.Random'クラスを使用して乱数化されたソルトを 生成します。 パラメータ: original - 暗号化対象パスワード 戻り値: 2文字のソルトとそれに続く暗号化パスワードからなる文字列 public static final boolean matches(String encryptedPassword, String enteredPassword) 引数enteredPasswordを暗号化し、引数encryptedPasswordと 照合します。 パラメータ: encryptedPassword - 暗号化されたパスワード。最初の 2 文字はソルトと仮定されます。この文字列はUnix の/etc/passwdファイルにあるものと同一のものです。 enteredPassword - ユーザが入力した(または別の方法 で入手した)パスワード 戻り値: パスワードが正しいとみなされた場合、真