8.6. PostgreSQLJDBC APIへの拡張

Postgresは拡張可能なデータベースシステムです。クエリーから呼び出すことができる、独自の関数をバックエンドに追加することができます。独自の型さえも追加することができます。こういった独特な機構がありますので、JavaでもこれをAPIの拡張セットを用意してサポートします。実際、標準ドライバの中核でも、ラージオブジェクトなどの実装のためにこの拡張を使用しています。

8.6.1. 拡張機能へのアクセス

いくつかの拡張APIにアクセスするには、org.postgresql.Connectionクラスの追加メソッドのいくつかを使用しなければなりません。この場合、Driver.getConnection()からの戻り値をキャストしなければなりません。例えば:

Connection db = Driver.getConnection(url, username, password);
// ...
// later on
Fastpath fp = ((org.postgresql.Connection)db).getFastpathAPI();

8.6.1.1. org.postgresql.Connectionクラス

public class Connection extends Object implements Connection

java.lang.Object
   |
   +----org.postgresql.Connection

ここには、拡張APIにアクセスするために使用される追加メソッドがあります。java.sql.Connectionで定義されたメソッドは示しません。

8.6.1.1.1. メソッド

  • 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を継承する必要があります。

8.6.1.2. org.postgresql.Fastpathクラス

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

8.6.1.2.1. メソッド

  • 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: このメソッドを呼び出した後にResultSetclose()することを忘れないで下さい。

    関数名の検索に関する実装時の注意書き: PostgreSQLは関数IDとIDに対応する名前をpg_procテーブルに保存します。ローカルに処理速度を上げるために、要求に応じてこのテーブルに関数を問い合わせるのではなくHashtableが使用されています。また、関数の必須項目のみがこのテーブルに登録されていますので、接続を維持しておくことでできるだけ処理速度を向上させます。

    org.postgresql.LargeObjectクラスはその起動時に問い合わせを行ない、この段階で返されたResultSetaddFunctions()メソッドに渡します。これを行なった後、LargeObject APIはその関数を名前で参照します。

    手作業によるoidへの変換ができるとは考えないで下さい。いいですか。これらは現時点のものです。開発を通して変更されます。(V7.0でもこの問題について議論が何回かありました。)ですから、これは将来の不当な問題を防ぐために実装されています。

    参照:. LargeObjectManager

  • public int getID(String name) throws SQLException

    このメソッドは名前に関連付けられた関数IDを返します。addFunction()もしくはaddFunctions()がこの名前を使って呼び出されていなければ、SQLExceptionが投げられます。

8.6.1.3. org.postgresql.fastpath.FastpathArgクラス

public class FastpathArg extends Object

java.lang.Object
   |
   +----org.postgresql.fastpath.FastpathArg

各fastpath呼び出しは引数の配列、引数の数、呼び出される関数に依存する型を必要とします。このクラスはこの能力を提供するために必要なメソッドを実装します。

このクラスの使用例については、org.postgresql.LargeObjectパッケージを参照して下さい。

参照:. Fastpath, LargeObjectManager, LargeObject

8.6.1.3.1. コンストラクタ

  • public FastpathArg(int value)

    整数値からなる引数で構築します。

    パラメータ:. value - 設定する整数値

  • public FastpathArg(byte bytes[])

    byte型の配列からなる引数で構築します。

    パラメータ:. bytes - 保存する配列

  • public FastpathArg(byte buf[],
                       int off,
                       int len)

    byte型の配列の一部からなる引数で構築します。

    パラメータ:.

    buf

    元となる配列

    off

    配列内のオフセット

    len

    含めるべきデータ長

  • public FastpathArg(String s)

    文字列からなる引数で構築します。

8.6.2. 幾何データ型

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

8.6.3. ラージオブジェクト

ラージオブジェクトは標準JDBC仕様でサポートされています。しかし、そのインタフェースには制限があり、また、PostgreSQLで用意されるAPIでは、ローカルファイル同様にオブジェクトの内容にランダムアクセスを行なうことができます。

org.postgresql.largeobjectパッケージはJavaに対し、libpq Cインタフェ ースにあるラージオブジェクトAPIを提供します。ラージオブジェクトの生成、オープン、削除を扱うLargeObjectManager、及び、個別のオブジェクトを扱うLargeObjectという 2つのクラスから構成されています。

8.6.3.1. org.postgresql.largeobject.LargeObjectクラス

public class LargeObject extends Object

java.lang.Object
   |
   +----org.postgresql.largeobject.LargeObject

このクラスはPostgreSQLのラージオブジェクトインタフェースを実装します。

インタフェースの実行に必要な基本的なメソッド、及び、このオブジェクト用のInputStreamOutputStreamクラスの組合せを提供するためのメソッドを提供します。

通常クライアントコードでは、ラージオブジェクトにアクセスするためにResultSet のメソッドgetAsciiStream、getBinaryStream、またはgetUnicodeStream、もしくはPreparedStatementのメソッドsetAsciiStream、setBinaryStream、またはsetUnicodeStreamを使用します。

しかし、もっと低レベルなラージオブジェクトへのアクセスが必要となることがあります。これはJDBC仕様ではサポートされていません。

どのようにラージオブジェクトへのアクセスを得るかやどうやって生成するかについてはorg.postgresql.largeobject.LargeObjectManagerを参照して下さい。

参照:. LargeObjectManager

8.6.3.1.1. 変数

public static final int SEEK_SET

ファイルの先頭からシークすることを示します

public static final int SEEK_CUR

現在位置からシークすることを示します

public static final int SEEK_END

ファイルの終端からシークすることを示します

8.6.3.1.2. メソッド

  • 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

    オブジェクトからデータの一部分を既存の配列に読み込みます。

    パラメータ:.

    buf

    コピー先の配列

    off

    配列内のオフセット

    len

    読みとるバイト数

  • public void write(byte buf[]) throws SQLException

    配列をオブジェクトに書き込む

  • public void write(byte buf[],
                      int off,
                      int len) throws SQLException

    配列の一部のデータをオブジェクトに書き込む

    パラメータ:.

    buf

    コピー元となる配列

    off

    配列内のオフセット

    len

    書き込むバイト数

8.6.3.2. org.postgresql.largeobject.LargeObjectManagerクラス

                                
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を参照して下さい。

8.6.3.2.1. 変数

public static final int WRITE

このモードはオブジェクトに書き込みを行なう予定であることを示します。

public static final int READ

このモードはオブジェクトに読み取りを行なう予定であることを示します。

public static final int READWRITE

このモードがデフォルトです。オブジェクトに読み取り、及び、書き込みを行なう予定であることを示します。

8.6.3.2.2. メソッド

  • 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"を使用するために用意されています。

8.6.4. オブジェクト直列化

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 - ユーザが入力した(または別の方法
                  で入手した)パスワード

        戻り値:
              パスワードが正しいとみなされた場合、真