Class CobolEsqlBackendPostgresql
- All Implemented Interfaces:
CobolEsqlBackendInterface
CobolEsqlBackendInterface 実装。AbstractCobolEsqlBackend の DB 依存フックを
PostgreSQL の流儀(明示 BEGIN によるトランザクション管理、サーバカーソル + FETCH FORWARD
による先読み、SQLSTATE をそのまま使うエラー変換)で実装する。
ServiceLoader 経由で発見されるため public であり、
META-INF/services/jp.osscons.opensourcecobol.libcobj.sql.CobolEsqlBackendInterface に
登録されている。
-
Field Summary
Fields inherited from class jp.osscons.opensourcecobol.libcobj.sql.AbstractCobolEsqlBackend
EMPTY_RESULT, LOG -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected Stringパース済みの接続情報から JDBC URL 文字列を組み立てる。protected voidcloseCursorImpl(Connection c, String cursorName) カーソルをクローズする(CLOSEなど、どの SQL を発行するかは DB ごとに実装する)。 SQL の発行と、このカーソルに紐づく資源や内部状態(あれば)の解放を行う。protected void接続を閉じる直前の commit。AbstractCobolEsqlBackend.disconnect(CobolDataStorage)だけが呼ぶ。protected void現在のトランザクションを commit し、以降の SQL が新しいトランザクションで実行される状態にする。 埋め込み SQL では、COBOL プログラムがCOMMIT/ROLLBACKを書くまで更新は確定 しない。つまり COMMIT した直後から次のトランザクションが始まっている必要があり、その状態を 作るところまでが本フックの責務になる。実現手段は DB の流儀に委ねる。例: PostgreSQL はautoCommit(true)のままCOMMITと次のBEGINを発行し、autoCommit=false流儀の DB はc.commit()だけでよい(次のトランザクションは 最初の SQL で暗黙に始まる)。protected void接続直後の DB 別初期化(autoCommit モード・初回トランザクション開始など)。protected voidfetchOccursImpl(Connection c, String cursorName, int occursSize, int occursMax, AbstractCobolField[] resultParams, CobolDataStorage sqlca) カーソルから複数行を取得し、OCCURS 配列へ書き込む。行数・NULL 処理を含めsqlcaを更新する。protected booleanfetchRowImpl(Connection c, String cursorName, AbstractCobolField[] out, CobolDataStorage sqlca) カーソルから次の 1 行を取得し、outへ書き込む。指標変数なしの NULL があればsqlcaにECPG_MISSING_INDICATORを設定する。id()実装ごとに決まっている ID(小文字)を返す。例:"postgresql"/"mysql"。protected SqlErrorMappingJDBC ドライバが投げたSQLExceptionを、COBOL 側が見る (SQLCODE, SQLSTATE) の組へ 読み替える。例外オブジェクトごと受け取るため、getSQLState()に加えてgetErrorCode()(DB 固有のエラー番号)も判断材料にできる。protected voidすべてのカーソルがまとめて無効になるタイミングで呼ばれる通知フック。既定では何もしない。protected voidopenCursorImpl(Connection c, String cursorName, String query, AbstractCobolField[] params) カーソルをオープンする(DECLAREなど、どの SQL を発行するかは DB ごとに実装する)。 ここでは SQL の発行だけを行い、オープン済みかどうかの記録は本クラス側で更新する。protected voidrepositionForCurrentOf(Connection c, String cursorName, CobolDataStorage sqlca) WHERE CURRENT OF を実行する前に、COBOL プログラムから見た現在行までカーソルを戻す (PostgreSQL では、先読みした分だけFETCH BACKWARDして先読みバッファを捨てる)。protected void現在のトランザクションを rollback し、以降の SQL が新しいトランザクションで実行される状態に する。AbstractCobolEsqlBackend.commitTransaction(Connection)と対になるフックで、担当する範囲も同じ。 例: PostgreSQL はROLLBACKと次のBEGINを発行し、autoCommit=false流儀の DB はc.rollback()だけでよい。Methods inherited from class jp.osscons.opensourcecobol.libcobj.sql.AbstractCobolEsqlBackend
closeCursor, collapseWhitespace, commit, connect, declareCursor, declareCursorWithParams, disconnect, driverClass, exec, executePrepared, execWhereCurrentOf, execWithParams, execWithParamsWhereCurrentOf, fetchCursor, fetchCursorOccurs, getOrCreatePreparedStatement, openCursor, openCursorWithParams, prepare, rollback, selectInto, selectIntoOccurs, setResultFromException, writeOccursRows
-
Constructor Details
-
CobolEsqlBackendPostgresql
public CobolEsqlBackendPostgresql()
-
-
Method Details
-
id
Description copied from interface:CobolEsqlBackendInterface実装ごとに決まっている ID(小文字)を返す。例:"postgresql"/"mysql"。ServiceLoaderが見つけた実装の中から 1 つを選ぶときに、環境変数OCDB_DB_TYPEの値(小文字化済み)と突き合わせるキー。ログやデバッグ表示にも使う。- Returns:
- DB 種別の ID
-
buildJdbcUrl
Description copied from class:AbstractCobolEsqlBackendパース済みの接続情報から JDBC URL 文字列を組み立てる。- Specified by:
buildJdbcUrlin classAbstractCobolEsqlBackend- Parameters:
s- DB 非依存にパース済みの接続情報- Returns:
- JDBC URL
-
configureConnection
Description copied from class:AbstractCobolEsqlBackend接続直後の DB 別初期化(autoCommit モード・初回トランザクション開始など)。- Specified by:
configureConnectionin classAbstractCobolEsqlBackend- Parameters:
c- 確立した JDBC 接続- Throws:
SQLException- データベースアクセスエラー
-
commitTransaction
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:
commitTransactionin classAbstractCobolEsqlBackend- Parameters:
c- JDBC 接続- Throws:
SQLException- データベースアクセスエラー
-
commitBeforeClose
Description copied from class:AbstractCobolEsqlBackend接続を閉じる直前の commit。AbstractCobolEsqlBackend.disconnect(CobolDataStorage)だけが呼ぶ。AbstractCobolEsqlBackend.commitTransaction(Connection)と違い、次のトランザクションが始まる状態を作る必要は ない。直後に接続を閉じるので、開始しても空のまま破棄されるだけである。明示BEGIN流儀の DB は本フックを上書きしてBEGINを省けば、無駄な往復と紛らわしいログを 1 回減らせる。 既定はAbstractCobolEsqlBackend.commitTransaction(Connection)へ委譲するので、暗黙にトランザクションが始まる DB (autoCommit=false流儀)は実装しなくてよい。- Overrides:
commitBeforeClosein classAbstractCobolEsqlBackend- Parameters:
c- JDBC 接続- Throws:
SQLException- データベースアクセスエラー
-
rollbackTransaction
Description copied from class:AbstractCobolEsqlBackend現在のトランザクションを rollback し、以降の SQL が新しいトランザクションで実行される状態に する。AbstractCobolEsqlBackend.commitTransaction(Connection)と対になるフックで、担当する範囲も同じ。 例: PostgreSQL はROLLBACKと次のBEGINを発行し、autoCommit=false流儀の DB はc.rollback()だけでよい。- Specified by:
rollbackTransactionin classAbstractCobolEsqlBackend- 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:
openCursorImplin classAbstractCobolEsqlBackend- 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 があればsqlcaにECPG_MISSING_INDICATORを設定する。- Specified by:
fetchRowImplin classAbstractCobolEsqlBackend- 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:
fetchOccursImplin classAbstractCobolEsqlBackend- Parameters:
c- JDBC 接続cursorName- カーソル名occursSize- OCCURS 要素 1 つあたりのバイトサイズoccursMax- 取得する行の最大数resultParams- 結果パラメータフィールド(列ごとに 1 つ)sqlca- SQLCA データストレージ- Throws:
SQLException- データベースアクセスエラー
-
closeCursorImpl
Description copied from class:AbstractCobolEsqlBackendカーソルをクローズする(CLOSEなど、どの SQL を発行するかは DB ごとに実装する)。 SQL の発行と、このカーソルに紐づく資源や内部状態(あれば)の解放を行う。- Specified by:
closeCursorImplin classAbstractCobolEsqlBackend- Parameters:
c- JDBC 接続cursorName- カーソル名- Throws:
SQLException- データベースアクセスエラー
-
repositionForCurrentOf
protected void repositionForCurrentOf(Connection c, String cursorName, CobolDataStorage sqlca) throws SQLException Description copied from class:AbstractCobolEsqlBackendWHERE CURRENT OF を実行する前に、COBOL プログラムから見た現在行までカーソルを戻す (PostgreSQL では、先読みした分だけFETCH BACKWARDして先読みバッファを捨てる)。- Specified by:
repositionForCurrentOfin classAbstractCobolEsqlBackend- 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:
onCursorsInvalidatedin classAbstractCobolEsqlBackend
-
mapSqlException
Description copied from class:AbstractCobolEsqlBackendJDBC ドライバが投げたSQLExceptionを、COBOL 側が見る (SQLCODE, SQLSTATE) の組へ 読み替える。例外オブジェクトごと受け取るため、getSQLState()に加えてgetErrorCode()(DB 固有のエラー番号)も判断材料にできる。SQLCODE(整数)と SQLSTATE(文字列)の両方を 1 つのフックで返すのは、DB ごとに異なる値を ECPG が定める値へ揃えるため。整数だけ変換して SQLSTATE をドライバの値のまま通すと、SQLSTATE で分岐する COBOL プログラムが DB ごとに違う値を見ることになる。
- Specified by:
mapSqlExceptionin classAbstractCobolEsqlBackend- Parameters:
e- JDBC ドライバが投げた SQL 例外- Returns:
- ECPG の SQLCODE と SQLSTATE の組(
SqlErrorMapping)
-