Class CobolEsqlBackendPostgresql

java.lang.Object
jp.osscons.opensourcecobol.libcobj.sql.AbstractCobolEsqlBackend
jp.osscons.opensourcecobol.libcobj.sql.CobolEsqlBackendPostgresql
All Implemented Interfaces:
CobolEsqlBackendInterface

public final class CobolEsqlBackendPostgresql extends AbstractCobolEsqlBackend
PostgreSQL 向けの CobolEsqlBackendInterface 実装。AbstractCobolEsqlBackend の DB 依存フックを PostgreSQL の流儀(明示 BEGIN によるトランザクション管理、サーバカーソル + FETCH FORWARD による先読み、SQLSTATE をそのまま使うエラー変換)で実装する。

ServiceLoader 経由で発見されるため public であり、 META-INF/services/jp.osscons.opensourcecobol.libcobj.sql.CobolEsqlBackendInterface に 登録されている。

  • Constructor Details

    • CobolEsqlBackendPostgresql

      public CobolEsqlBackendPostgresql()
  • Method Details

    • id

      public String id()
      Description copied from interface: CobolEsqlBackendInterface
      実装ごとに決まっている ID(小文字)を返す。例: "postgresql" / "mysql"

      ServiceLoader が見つけた実装の中から 1 つを選ぶときに、環境変数 OCDB_DB_TYPE の値(小文字化済み)と突き合わせるキー。ログやデバッグ表示にも使う。

      Returns:
      DB 種別の ID
    • buildJdbcUrl

      protected String buildJdbcUrl(DbSpec s)
      Description copied from class: AbstractCobolEsqlBackend
      パース済みの接続情報から JDBC URL 文字列を組み立てる。
      Specified by:
      buildJdbcUrl in class AbstractCobolEsqlBackend
      Parameters:
      s - DB 非依存にパース済みの接続情報
      Returns:
      JDBC URL
    • configureConnection

      protected void configureConnection(Connection c) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      接続直後の DB 別初期化(autoCommit モード・初回トランザクション開始など)。
      Specified by:
      configureConnection in class AbstractCobolEsqlBackend
      Parameters:
      c - 確立した JDBC 接続
      Throws:
      SQLException - データベースアクセスエラー
    • commitTransaction

      protected void commitTransaction(Connection c) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      現在のトランザクションを commit し、以降の SQL が新しいトランザクションで実行される状態にする。 埋め込み SQL では、COBOL プログラムが COMMIT / ROLLBACK を書くまで更新は確定 しない。つまり COMMIT した直後から次のトランザクションが始まっている必要があり、その状態を 作るところまでが本フックの責務になる。実現手段は DB の流儀に委ねる。例: PostgreSQL は autoCommit(true) のまま COMMIT と次の BEGIN を発行し、 autoCommit=false 流儀の DB は c.commit() だけでよい(次のトランザクションは 最初の SQL で暗黙に始まる)。

      本フックは「commit してトランザクションを継続する」公開操作(AbstractCobolEsqlBackend.commit(CobolDataStorage)) のためのもの。「commit して接続を閉じる」経路(AbstractCobolEsqlBackend.disconnect(CobolDataStorage))は AbstractCobolEsqlBackend.commitBeforeClose(Connection) を通る。

      Specified by:
      commitTransaction in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      Throws:
      SQLException - データベースアクセスエラー
    • commitBeforeClose

      protected void commitBeforeClose(Connection c) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      接続を閉じる直前の commit。AbstractCobolEsqlBackend.disconnect(CobolDataStorage) だけが呼ぶ。

      AbstractCobolEsqlBackend.commitTransaction(Connection) と違い、次のトランザクションが始まる状態を作る必要は ない。直後に接続を閉じるので、開始しても空のまま破棄されるだけである。明示 BEGIN 流儀の DB は本フックを上書きして BEGIN を省けば、無駄な往復と紛らわしいログを 1 回減らせる。 既定は AbstractCobolEsqlBackend.commitTransaction(Connection) へ委譲するので、暗黙にトランザクションが始まる DB (autoCommit=false 流儀)は実装しなくてよい。

      Overrides:
      commitBeforeClose in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      Throws:
      SQLException - データベースアクセスエラー
    • rollbackTransaction

      protected void rollbackTransaction(Connection c) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      現在のトランザクションを rollback し、以降の SQL が新しいトランザクションで実行される状態に する。AbstractCobolEsqlBackend.commitTransaction(Connection) と対になるフックで、担当する範囲も同じ。 例: PostgreSQL は ROLLBACK と次の BEGIN を発行し、autoCommit=false 流儀の DB は c.rollback() だけでよい。
      Specified by:
      rollbackTransaction in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      Throws:
      SQLException - データベースアクセスエラー
    • openCursorImpl

      protected void openCursorImpl(Connection c, String cursorName, String query, AbstractCobolField[] params) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      カーソルをオープンする(DECLARE など、どの SQL を発行するかは DB ごとに実装する)。 ここでは SQL の発行だけを行い、オープン済みかどうかの記録は本クラス側で更新する。
      Specified by:
      openCursorImpl in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      cursorName - カーソル名
      query - このカーソルに紐づく SQL クエリ
      params - バインドする有効なホスト変数パラメータ。OPEN ... USING を最優先し、なければ DECLARE 時のパラメータへフォールバックする解決は基底が済ませている(どちらも無ければ null
      Throws:
      SQLException - データベースアクセスエラー
    • fetchRowImpl

      protected boolean fetchRowImpl(Connection c, String cursorName, AbstractCobolField[] out, CobolDataStorage sqlca) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      カーソルから次の 1 行を取得し、out へ書き込む。指標変数なしの NULL があれば sqlcaECPG_MISSING_INDICATOR を設定する。
      Specified by:
      fetchRowImpl in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      cursorName - カーソル名
      out - 列の値を受け取る出力ホスト変数
      sqlca - 指標変数なしの NULL をフラグするための SQLCA ストレージ
      Returns:
      行が取得できた場合 true、これ以上行がなければ false
      Throws:
      SQLException - データベースアクセスエラー
    • fetchOccursImpl

      protected void fetchOccursImpl(Connection c, String cursorName, int occursSize, int occursMax, AbstractCobolField[] resultParams, CobolDataStorage sqlca) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      カーソルから複数行を取得し、OCCURS 配列へ書き込む。行数・NULL 処理を含め sqlca を更新する。
      Specified by:
      fetchOccursImpl in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      cursorName - カーソル名
      occursSize - OCCURS 要素 1 つあたりのバイトサイズ
      occursMax - 取得する行の最大数
      resultParams - 結果パラメータフィールド(列ごとに 1 つ)
      sqlca - SQLCA データストレージ
      Throws:
      SQLException - データベースアクセスエラー
    • closeCursorImpl

      protected void closeCursorImpl(Connection c, String cursorName) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      カーソルをクローズする(CLOSE など、どの SQL を発行するかは DB ごとに実装する)。 SQL の発行と、このカーソルに紐づく資源や内部状態(あれば)の解放を行う。
      Specified by:
      closeCursorImpl in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      cursorName - カーソル名
      Throws:
      SQLException - データベースアクセスエラー
    • repositionForCurrentOf

      protected void repositionForCurrentOf(Connection c, String cursorName, CobolDataStorage sqlca) throws SQLException
      Description copied from class: AbstractCobolEsqlBackend
      WHERE CURRENT OF を実行する前に、COBOL プログラムから見た現在行までカーソルを戻す (PostgreSQL では、先読みした分だけ FETCH BACKWARD して先読みバッファを捨てる)。
      Specified by:
      repositionForCurrentOf in class AbstractCobolEsqlBackend
      Parameters:
      c - JDBC 接続
      cursorName - カーソル名
      sqlca - SQLCA データストレージ
      Throws:
      SQLException - データベースアクセスエラー
    • onCursorsInvalidated

      protected void onCursorsInvalidated()
      Description copied from class: AbstractCobolEsqlBackend
      すべてのカーソルがまとめて無効になるタイミングで呼ばれる通知フック。既定では何もしない。

      呼ばれるのは (1) COMMIT/ROLLBACK でトランザクションが終わった直後、(2) DISCONNECT で 接続を閉じる直前、の 2 とおり。カーソルごとに JDBC の ResultSet/Statement を 自前で持つバックエンドは、本フックでそれらをすべて閉じること。閉じ忘れると COMMIT/ROLLBACK の たびに資源が残り続ける。カーソルごとの内部状態(先読みバッファなど)を持つバックエンドも、 ここで捨てる。どちらも持たないバックエンドは、既定のまま何もしなくてよい。

      カーソルを 1 本ずつ閉じる CLOSE は、このフックを通らない。その場合の解放は AbstractCobolEsqlBackend.closeCursorImpl(java.sql.Connection, java.lang.String) 側で行うこと。

      Overrides:
      onCursorsInvalidated in class AbstractCobolEsqlBackend
    • mapSqlException

      protected SqlErrorMapping mapSqlException(SQLException e)
      Description copied from class: AbstractCobolEsqlBackend
      JDBC ドライバが投げた SQLException を、COBOL 側が見る (SQLCODE, SQLSTATE) の組へ 読み替える。例外オブジェクトごと受け取るため、getSQLState() に加えて getErrorCode()(DB 固有のエラー番号)も判断材料にできる。

      SQLCODE(整数)と SQLSTATE(文字列)の両方を 1 つのフックで返すのは、DB ごとに異なる値を ECPG が定める値へ揃えるため。整数だけ変換して SQLSTATE をドライバの値のまま通すと、SQLSTATE で分岐する COBOL プログラムが DB ごとに違う値を見ることになる。

      Specified by:
      mapSqlException in class AbstractCobolEsqlBackend
      Parameters:
      e - JDBC ドライバが投げた SQL 例外
      Returns:
      ECPG の SQLCODE と SQLSTATE の組(SqlErrorMapping