An example output plugin can be found in the
<link linkend="test-decoding">
<filename>contrib/test_decoding</filename>
</link>
subdirectory of the PostgreSQL source tree.
PostgreSQLのソースコードのサブディレクトリ
contrib/test_decoding
にサンプル出力プラグインがあります。
An output plugin is loaded by dynamically loading a shared library with
the output plugin's name as the library base name. The normal library
search path is used to locate the library. To provide the required output
plugin callbacks and to indicate that the library is actually an output
plugin it needs to provide a function named
<function>_PG_output_plugin_init</function>. This function is passed a
struct that needs to be filled with the callback function pointers for
individual actions.
出力プラグインは、出力プラグインの名前をライブラリのベース名として持つ共有ライブラリを動的にロードすることによってロードされます。
必要な出力プラグインコールバックを提供し、そのライブラリが実際に出力プラグインであることを示すために、_PG_output_plugin_init
という名前の関数を作成しなければなりません。
この関数には、各々のアクションに対応するコールバック関数へのポインタを持つ構造体が渡されます。
typedef struct OutputPluginCallbacks { LogicalDecodeStartupCB startup_cb; LogicalDecodeBeginCB begin_cb; LogicalDecodeChangeCB change_cb; LogicalDecodeTruncateCB truncate_cb; LogicalDecodeCommitCB commit_cb; LogicalDecodeMessageCB message_cb; LogicalDecodeFilterByOriginCB filter_by_origin_cb; LogicalDecodeShutdownCB shutdown_cb; LogicalDecodeFilterPrepareCB filter_prepare_cb; LogicalDecodeBeginPrepareCB begin_prepare_cb; LogicalDecodePrepareCB prepare_cb; LogicalDecodeCommitPreparedCB commit_prepared_cb; LogicalDecodeRollbackPreparedCB rollback_prepared_cb; LogicalDecodeStreamStartCB stream_start_cb; LogicalDecodeStreamStopCB stream_stop_cb; LogicalDecodeStreamAbortCB stream_abort_cb; LogicalDecodeStreamPrepareCB stream_prepare_cb; LogicalDecodeStreamCommitCB stream_commit_cb; LogicalDecodeStreamChangeCB stream_change_cb; LogicalDecodeStreamMessageCB stream_message_cb; LogicalDecodeStreamTruncateCB stream_truncate_cb; } OutputPluginCallbacks; typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb);
The <function>begin_cb</function>, <function>change_cb</function>
and <function>commit_cb</function> callbacks are required,
while <function>startup_cb</function>, <function>truncate_cb</function>,
<function>message_cb</function>, <function>filter_by_origin_cb</function>,
and <function>shutdown_cb</function> are optional.
If <function>truncate_cb</function> is not set but a
<command>TRUNCATE</command> is to be decoded, the action will be ignored.
コールバック関数のbegin_cb
、change_cb
、および、commit_cb
は必須ですが、startup_cb
、truncate_cb
、message_cb
、filter_by_origin_cb
、および、shutdown_cb
は必須ではありません。
truncate_cb
が設定されていないけれども、TRUNCATE
がデコードされることになった場合、この動作は無視されます。
An output plugin may also define functions to support streaming of large,
in-progress transactions. The <function>stream_start_cb</function>,
<function>stream_stop_cb</function>, <function>stream_abort_cb</function>,
<function>stream_commit_cb</function>, and <function>stream_change_cb</function>
are required, while <function>stream_message_cb</function> and
<function>stream_truncate_cb</function> are optional. The
<function>stream_prepare_cb</function> is also required if the output
plugin also support two-phase commits.
出力プラグインは、大きな継続中(in-progress)トランザクションのストリーミングをサポートする関数を定義することもできます。
stream_start_cb
、stream_stop_cb
、stream_abort_cb
、stream_commit_cb
、stream_change_cb
は必須ですが、stream_message_cb
とstream_truncate_cb
は必須ではありません。
出力プラグインが2相コミットもサポートする場合は、stream_prepare_cb
も必須です。
An output plugin may also define functions to support two-phase commits,
which allows actions to be decoded on the <command>PREPARE TRANSACTION</command>.
The <function>begin_prepare_cb</function>, <function>prepare_cb</function>,
<function>commit_prepared_cb</function> and <function>rollback_prepared_cb</function>
callbacks are required, while <function>filter_prepare_cb</function> is optional.
The <function>stream_prepare_cb</function> is also required if the output plugin
also supports the streaming of large in-progress transactions.
出力プラグインは、PREPARE TRANSACTION
でアクションをデコードできるようにする2相コミットをサポートする関数を定義することもできます。
begin_prepare_cb
、prepare_cb
、commit_prepared_cb
、rollback_prepared_cb
コールバックは必須ですが、filter_prepare_cb
は必須ではありません。
出力プラグインが大きな進行中のトランザクションのストリーミングもサポートしている場合は、stream_prepare_cb
も必須です。
To decode, format and output changes, output plugins can use most of the
backend's normal infrastructure, including calling output functions. Read
only access to relations is permitted as long as only relations are
accessed that either have been created by <command>initdb</command> in
the <literal>pg_catalog</literal> schema, or have been marked as user
provided catalog tables using
更新データをデコード、整形、出力するために、出力関数を呼び出すことを含め、出力プラグインはバックエンドの通常のインフラストラクチャのほとんどを利用できます。
テーブルは、initdb
で作られ、pg_catalog
スキーマに含まれているか、以下のコマンドでユーザ定義のカタログテーブルであると印が付けられている限り、読み込み専用のアクセスが許可されます。
ALTER TABLE user_catalog_table SET (user_catalog_table = true); CREATE TABLE another_catalog_table(data text) WITH (user_catalog_table = true);
Note that access to user catalog tables or regular system catalog tables
in the output plugins has to be done via the <literal>systable_*</literal>
scan APIs only. Access via the <literal>heap_*</literal> scan APIs will
error out. Additionally, any actions leading to transaction ID assignment
are prohibited. That, among others, includes writing to tables, performing
DDL changes, and calling <literal>pg_current_xact_id()</literal>.
出力プラグイン内のユーザカタログテーブルまたは通常のシステムカタログテーブルへのアクセスは、systable_*
スキャンAPIを介してのみ行う必要があることに注意してください。
heap_*
スキャンAPIを介したアクセスはエラーになります。
さらに、トランザクションIDの割り当てにつながるアクションは禁止されています。
これには、テーブルへの書き込み、DDL変更の実行、pg_current_xact_id()
の呼び出しなどが含まれます。
Output plugin callbacks can pass data to the consumer in nearly arbitrary
formats. For some use cases, like viewing the changes via SQL, returning
data in a data type that can contain arbitrary data (e.g., <type>bytea</type>) is
cumbersome. If the output plugin only outputs textual data in the
server's encoding, it can declare that by
setting <literal>OutputPluginOptions.output_type</literal>
to <literal>OUTPUT_PLUGIN_TEXTUAL_OUTPUT</literal> instead
of <literal>OUTPUT_PLUGIN_BINARY_OUTPUT</literal> in
the <link linkend="logicaldecoding-output-plugin-startup">startup
callback</link>. In that case, all the data has to be in the server's encoding
so that a <type>text</type> datum can contain it. This is checked in assertion-enabled
builds.
出力プラグインコールバックは、かなり自由な形式で消費者にデータを渡すことができます。
SQLで変更データを見るような場合、任意のかたちでデータを返すことのできるデータ型(たとえばbytea
)は扱いにくいです。
出力プラグインがサーバエンコーディングのテキストデータのみを含むことにするには、起動コールバックで、OutputPluginOptions.output_type
にOUTPUT_PLUGIN_BINARY_OUTPUT
ではなく、OUTPUT_PLUGIN_TEXTUAL_OUTPUT
を設定することによって宣言できます。
この場合、text
datumが格納することができるように、すべてのデータはサーバエンコーディングでエンコードされていなければなりません。
An output plugin gets notified about changes that are happening via various callbacks it needs to provide. 出力プラグインには、必要に応じて発生した更新に関する通知が様々なコールバックを通じて送られます。
Concurrent transactions are decoded in commit order, and only changes
belonging to a specific transaction are decoded between
the <literal>begin</literal> and <literal>commit</literal>
callbacks. Transactions that were rolled back explicitly or implicitly
never get
decoded. Successful savepoints are
folded into the transaction containing them in the order they were
executed within that transaction. A transaction that is prepared for
a two-phase commit using <command>PREPARE TRANSACTION</command> will
also be decoded if the output plugin callbacks needed for decoding
them are provided. It is possible that the current prepared transaction
which is being decoded is aborted concurrently via a
<command>ROLLBACK PREPARED</command> command. In that case, the logical
decoding of this transaction will be aborted too. All the changes of such
a transaction are skipped once the abort is detected and the
<function>prepare_cb</function> callback is invoked. Thus even in case of
a concurrent abort, enough information is provided to the output plugin
for it to properly deal with <command>ROLLBACK PREPARED</command> once
that is decoded.
同時に実行されたトランザクションは、コミットした順番にデコードされます。
指定したトランザクションに含まれる更新だけがbegin
とcommit
の間のコールバックによってデコードされます。
明示的あるいは暗黙的にロールバックされたトランザクションは、決してデコードされません。
成功したセーブポイントは、実行された順番にセーブポイントが実行されたトランザクションの中に折り込まれます。
PREPARE TRANSACTION
を使用して2相コミット用に準備されたトランザクションも、デコードに必要な出力プラグインコールバックが提供されていればデコードされます。
ROLLBACK PREPARED
コマンドを使用して、現在準備されているトランザクションが同時にアボートされる可能性があります。
その場合、このトランザクションのロジカルデコーディングもアボートされます。
そのようなトランザクションのすべての変更は、アボートが検出され、prepare_cb
コールバックが呼び出されるとスキップされます。
このように、同時にアボートされた場合でも、デコードされたROLLBACK PREPARED
を適切に処理するために十分な情報が出力プラグインに提供されます。
Only transactions that have already safely been flushed to disk will be
decoded. That can lead to a <command>COMMIT</command> not immediately being decoded in a
directly following <literal>pg_logical_slot_get_changes()</literal>
when <varname>synchronous_commit</varname> is set
to <literal>off</literal>.
ディスクに安全にフラッシュされたトランザクションだけがデコードされます。
そのため、synchronous_commit
がoff
の場合には、直後に呼び出されたpg_logical_slot_get_changes()
がそのCOMMIT
をデコードしないことがあります。
The optional <function>startup_cb</function> callback is called whenever
a replication slot is created or asked to stream changes, independent
of the number of changes that are ready to be put out.
ストリームに投入可能な更新の数に関係なく、レプリケーションスロットが作られるか、ストリームの変更がリクエストされた場合にオプションのstartup_cb
コールバック呼び出されます。
typedef void (*LogicalDecodeStartupCB) (struct LogicalDecodingContext *ctx, OutputPluginOptions *options, bool is_init);
The <literal>is_init</literal> parameter will be true when the
replication slot is being created and false
otherwise. <parameter>options</parameter> points to a struct of options
that output plugins can set:
is_init
パラメータは、レプリケーションスロットが作られる際にはtrue、それ以外ではfalseになります。
options
は、出力プラグインが書き込む以下の構造体を指します。
typedef struct OutputPluginOptions { OutputPluginOutputType output_type; bool receive_rewrites; } OutputPluginOptions;
<literal>output_type</literal> has to either be set to
<literal>OUTPUT_PLUGIN_TEXTUAL_OUTPUT</literal>
or <literal>OUTPUT_PLUGIN_BINARY_OUTPUT</literal>. See also
<xref linkend="logicaldecoding-output-mode"/>.
If <literal>receive_rewrites</literal> is true, the output plugin will
also be called for changes made by heap rewrites during certain DDL
operations. These are of interest to plugins that handle DDL
replication, but they require special handling.
output_type
はOUTPUT_PLUGIN_TEXTUAL_OUTPUT
かOUTPUT_PLUGIN_BINARY_OUTPUT
のどちらかです。
47.6.3も参照してください。
receive_rewrites
が真なら、何らかDDL操作時のヒープ書き換えで生じた変更に対して、出力プラグインも呼ばれます。
これはDDLレプリケーションを処理するプラグインを対象としていますが、これらは特別な処理を必要とします。
The startup callback should validate the options present in
<literal>ctx->output_plugin_options</literal>. If the output plugin
needs to have a state, it can
use <literal>ctx->output_plugin_private</literal> to store it.
開始コールバックでは、ctx->output_plugin_options
で指定されるオプションを検証しましょう。
出力プラグインが状態を持つ必要がある場合には、ctx->output_plugin_private
を利用できます。
The optional <function>shutdown_cb</function> callback is called
whenever a formerly active replication slot is not used anymore and can
be used to deallocate resources private to the output plugin. The slot
isn't necessarily being dropped, streaming is just being stopped.
以前アクティブだったレプリケーションスロットが使われなくなったら、いつでもshutdown_cb
コールバックが呼び出され、出力プラグインのプライベートリソースが解放されます。
スロットは削除される必要はありません。単にストリームが停止します。
typedef void (*LogicalDecodeShutdownCB) (struct LogicalDecodingContext *ctx);
The required <function>begin_cb</function> callback is called whenever a
start of a committed transaction has been decoded. Aborted transactions
and their contents never get decoded.
必須であるbegin_cb
コールバックは、コミットしたトランザクションの開始がデコードされる際に必ず呼び出されます。
アボートしたトランザクションとその内容は決してデコードされません。
typedef void (*LogicalDecodeBeginCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn);
The <parameter>txn</parameter> parameter contains meta information about
the transaction, like the time stamp at which it has been committed and
its XID.
txn
引数は、コミット時のタイムスタンプやトランザクションIDなどのトランザクションに関するメタ情報を含みます。
The required <function>commit_cb</function> callback is called whenever
a transaction commit has been
decoded. The <function>change_cb</function> callbacks for all modified
rows will have been called before this, if there have been any modified
rows.
必須であるcommit_cb
コールバックは、トランザクションのコミットがデコードされる際に必ず呼び出されます。
行が更新された場合は、それぞれの行に対してchange_cb
コールバックが、commit_cb
の前に呼び出されます。
typedef void (*LogicalDecodeCommitCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn);
The required <function>change_cb</function> callback is called for every
individual row modification inside a transaction, may it be
an <command>INSERT</command>, <command>UPDATE</command>,
or <command>DELETE</command>. Even if the original command modified
several rows at once the callback will be called individually for each
row. The <function>change_cb</function> callback may access system or
user catalog tables to aid in the process of outputting the row
modification details. In case of decoding a prepared (but yet
uncommitted) transaction or decoding of an uncommitted transaction, this
change callback might also error out due to simultaneous rollback of
this very same transaction. In that case, the logical decoding of this
aborted transaction is stopped gracefully.
トランザクション内のINSERT
、UPDATE
、DELETE
の更新に対して、必須コールバックであるchange_cb
が呼び出されます。
元の更新コマンドが複数の行を一度に更新する場合は、それぞれの行に対してこのコールバックが呼び出されます。
change_cb
コールバックは、システムまたはユーザカタログテーブルにアクセスして、行変更の詳細を出力する処理を支援することができます。
準備された(まだコミットされていない)トランザクションをデコードする場合、またはコミットされていないトランザクションをデコードする場合、この変更コールバックは、まったく同じトランザクションが同時にロールバックされるためにエラーになることもあります。
この場合、このアボートされたトランザクションのロジカルデコーディングは正常に停止されます。
typedef void (*LogicalDecodeChangeCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change);
The <parameter>ctx</parameter> and <parameter>txn</parameter> parameters
have the same contents as for the <function>begin_cb</function>
and <function>commit_cb</function> callbacks, but additionally the
relation descriptor <parameter>relation</parameter> points to the
relation the row belongs to and a struct
<parameter>change</parameter> describing the row modification are passed
in.
ctx
とtxn
は、begin_cb
、commit_cb
コールバックでは同じ内容になります。
これに加えてrelation
は行が属するリレーションを指定し、行の変更を記述するchange
パラメータが渡されます。
Only changes in user defined tables that are not unlogged
(see <xref linkend="sql-createtable-unlogged"/>) and not temporary
(see <xref linkend="sql-createtable-temporary"/>) can be extracted using
logical decoding.
ユーザ定義テーブルでは、ログを取らないテーブル(UNLOGGED
参照)ではなく、一時テーブル(TEMPORARY
またはTEMP
参照)でもないテーブルが、ロジカルデコーディングを使って更新データを取得できます。
The optional <function>truncate_cb</function> callback is called for a
<command>TRUNCATE</command> command.
オプションのtruncate_cb
コールバックは、TRUNCATE
コマンドに対して呼ばれます。
typedef void (*LogicalDecodeTruncateCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change);
The parameters are analogous to the <function>change_cb</function>
callback. However, because <command>TRUNCATE</command> actions on
tables connected by foreign keys need to be executed together, this
callback receives an array of relations instead of just a single one.
See the description of the <xref linkend="sql-truncate"/> statement for
details.
パラメータはchange_cb
コールバックと似ています。
しかしながら、外部キーで結びついたテーブル群のTRUNCATE
動作は一緒に実行される必要があるため、このコールバックは単一リレーションではなく、リレーションの配列を受け取ります。
詳しくはTRUNCATE文の説明を参照してください。
The optional <function>filter_by_origin_cb</function> callback
is called to determine whether data that has been replayed
from <parameter>origin_id</parameter> is of interest to the
output plugin.
オプションのfilter_by_origin_cb
コールバックは、origin_id
からリプレイされたデータが出力プラグインの対象となるかどうかを判定するために呼び出されます。
typedef bool (*LogicalDecodeFilterByOriginCB) (struct LogicalDecodingContext *ctx, RepOriginId origin_id);
The <parameter>ctx</parameter> parameter has the same contents
as for the other callbacks. No information but the origin is
available. To signal that changes originating on the passed in
node are irrelevant, return true, causing them to be filtered
away; false otherwise. The other callbacks will not be called
for transactions and changes that have been filtered away.
ctx
パラメータは、他のコールバックと同じ内容を持ちます。
オリジンの情報だけが得られます。
渡されたノードで発生した変更が無関係であることを伝えるには、trueを返します。
これにより、その変更は無視されることになります。
無視されたトランザクション変更に関わる他のコールバックは呼び出されません。
This is useful when implementing cascading or multidirectional replication solutions. Filtering by the origin allows to prevent replicating the same changes back and forth in such setups. While transactions and changes also carry information about the origin, filtering via this callback is noticeably more efficient. これは、カスケード、あるいは双方向レプリケーションソリューションを実装する際に有用です。 オリジンでフィルタすることにより、そのような構成で、同じ変更のレプリケーションが往復するのを防ぐことができます。 トランザクションや変更もオリジンに関する情報を持っていますが、このコールバックでフィルタするほうがずっと効率的です。
The optional <function>message_cb</function> callback is called whenever
a logical decoding message has been decoded.
オプションのmessage_cb
コールバックは、ロジカルデコーディングメッセージがデコードされる度に呼び出されます。
typedef void (*LogicalDecodeMessageCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size message_size, const char *message);
The <parameter>txn</parameter> parameter contains meta information about
the transaction, like the time stamp at which it has been committed and
its XID. Note however that it can be NULL when the message is
non-transactional and the XID was not assigned yet in the transaction
which logged the message. The <parameter>lsn</parameter> has WAL
location of the message. The <parameter>transactional</parameter> says
if the message was sent as transactional or not. Similar to the change
callback, in case of decoding a prepared (but yet uncommitted)
transaction or decoding of an uncommitted transaction, this message
callback might also error out due to simultaneous rollback of
this very same transaction. In that case, the logical decoding of this
aborted transaction is stopped gracefully.
The <parameter>prefix</parameter> is arbitrary null-terminated prefix
which can be used for identifying interesting messages for the current
plugin. And finally the <parameter>message</parameter> parameter holds
the actual message of <parameter>message_size</parameter> size.
txn
パラメータは、コミット時のタイムスタンプとXIDのような、トランザクションに関するメタ情報を含んでいます。
ただし、そのメッセージがトランザクション扱いではなく、メッセージをログしたトランザクションにXIDが割り当てられてない場合はNULLになることに注意してください。
lsn
は、メッセージに対応するWALの位置です。
transactional
は、メッセージがトランザクションとして送られたものかどうかを表しています。
変更コールバックと同様に、準備された(まだコミットされていない)トランザクションをデコードする場合、またはコミットされていないトランザクションをデコードする場合、このメッセージコールバックも、まったく同じトランザクションの同時ロールバックのためにエラーになることがあります。
この場合、アボートされたトランザクションのロジカルデコーディングは正常に停止されます。
prefix
はnull終端された任意の接頭辞で、現在のプラグインが興味のあるメッセージを特定するために利用できます。
最後に、message
パラメータは、大きさがmessage_size
の、実際のメッセージを保持します。
Extra care should be taken to ensure that the prefix the output plugin considers interesting is unique. Using name of the extension or the output plugin itself is often a good choice. 出力プラグインが利用を考慮している接頭辞が一意になるように、特に注意を払ってください。 拡張の名前か、出力プラグインの名前を使うのが良い場合が多いです。
The optional <function>filter_prepare_cb</function> callback
is called to determine whether data that is part of the current
two-phase commit transaction should be considered for decoding
at this prepare stage or later as a regular one-phase transaction at
<command>COMMIT PREPARED</command> time. To signal that
decoding should be skipped, return <literal>true</literal>;
<literal>false</literal> otherwise. When the callback is not
defined, <literal>false</literal> is assumed (i.e. no filtering, all
transactions using two-phase commit are decoded in two phases as well).
オプションのfilter_prepare_cb
コールバックは、現在の2相コミットトランザクションの一部であるデータを、この準備段階でデコードするか、またはCOMMIT PREPARED
時に通常の1相トランザクションとしてデコードするかを決定するために呼び出されます。
デコードをスキップするように合図するには、true
を返します。
そうでなければfalse
を返します。
コールバックが定義されていない場合、false
が想定されます(すなわち、フィルタリングなしで、2相コミットを使用するすべてのトランザクションも同様に2相でデコードされます)。
typedef bool (*LogicalDecodeFilterPrepareCB) (struct LogicalDecodingContext *ctx, TransactionId xid, const char *gid);
The <parameter>ctx</parameter> parameter has the same contents as for
the other callbacks. The parameters <parameter>xid</parameter>
and <parameter>gid</parameter> provide two different ways to identify
the transaction. The later <command>COMMIT PREPARED</command> or
<command>ROLLBACK PREPARED</command> carries both identifiers,
providing an output plugin the choice of what to use.
ctx
パラメータは他のコールバックと同じ内容です。
パラメータxid
とgid
は、トランザクションを識別するための2つの異なる方法を提供します。
後のCOMMIT PREPARED
またはROLLBACK PREPARED
は両方の識別子を持ち、出力プラグインに何を使用するかの選択を提供します。
The callback may be invoked multiple times per transaction to decode
and must provide the same static answer for a given pair of
<parameter>xid</parameter> and <parameter>gid</parameter> every time
it is called.
このコールバックは、デコードするトランザクションごとに複数回呼び出すことができ、呼び出されるたびにxid
とgid
の与えられたペアに対して同じ静的な答えを提供しなければなりません。
The required <function>begin_prepare_cb</function> callback is called
whenever the start of a prepared transaction has been decoded. The
<parameter>gid</parameter> field, which is part of the
<parameter>txn</parameter> parameter, can be used in this callback to
check if the plugin has already received this <command>PREPARE</command>
in which case it can either error out or skip the remaining changes of
the transaction.
必須であるbegin_prepare_cb
コールバックは、準備されたトランザクションの開始がデコードされるたびに呼び出されます。
txn
パラメータの一部であるgid
フィールドをこのコールバックで使用して、プラグインがこのPREPARE
を既に受信しているかどうかをチェックできます。
この場合、エラーになるか、トランザクションの残りの変更をスキップできます。
typedef void (*LogicalDecodeBeginPrepareCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn);
The required <function>prepare_cb</function> callback is called whenever
a transaction which is prepared for two-phase commit has been
decoded. The <function>change_cb</function> callback for all modified
rows will have been called before this, if there have been any modified
rows. The <parameter>gid</parameter> field, which is part of the
<parameter>txn</parameter> parameter, can be used in this callback.
必須であるprepare_cb
コールバックは、2相コミット用に準備されたトランザクションがデコードされるたびに呼び出されます。
修正された行がある場合、すべての修正された行に対するchange_cb
コールバックはこの前に呼び出されています。
txn
パラメータの一部であるgid
フィールドは、このコールバックで使用できます。
typedef void (*LogicalDecodePrepareCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn);
The required <function>commit_prepared_cb</function> callback is called
whenever a transaction <command>COMMIT PREPARED</command> has been decoded.
The <parameter>gid</parameter> field, which is part of the
<parameter>txn</parameter> parameter, can be used in this callback.
必須であるcommit_prepared_cb
コールバックは、トランザクションCOMMIT PREPARED
がデコードされるたびに呼び出されます。
txn
パラメータの一部であるgid
フィールドは、このコールバックで使用できます。
typedef void (*LogicalDecodeCommitPreparedCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn);
The required <function>rollback_prepared_cb</function> callback is called
whenever a transaction <command>ROLLBACK PREPARED</command> has been
decoded. The <parameter>gid</parameter> field, which is part of the
<parameter>txn</parameter> parameter, can be used in this callback. The
parameters <parameter>prepare_end_lsn</parameter> and
<parameter>prepare_time</parameter> can be used to check if the plugin
has received this <command>PREPARE TRANSACTION</command> in which case
it can apply the rollback, otherwise, it can skip the rollback operation. The
<parameter>gid</parameter> alone is not sufficient because the downstream
node can have a prepared transaction with same identifier.
必須であるrollback_prepared_cb
コールバックは、トランザクションROLLBACK PREPARED
がデコードされるたびに呼び出されます。
txn
パラメータの一部であるgid
フィールドは、このコールバックで使用できます。
パラメータprepare_end_lsn
とprepare_time
は、プラグインがこのPREPARE TRANSACTION
を受信したかどうかをチェックするために使用できます。
この場合、プラグインはロールバックを適用できます。
そうでない場合は、ロールバック操作をスキップできます。
gid
だけでは十分ではありません。
なぜなら、下流ノードは同じ識別子を持つ準備されたトランザクションを持つことができるからです。
typedef void (*LogicalDecodeRollbackPreparedCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr prepare_end_lsn, TimestampTz prepare_time);
The required <function>stream_start_cb</function> callback is called when
opening a block of streamed changes from an in-progress transaction.
必須であるstream_start_cb
コールバックは、進行中のトランザクションからストリーム化された変更ブロックを開くときに呼び出されます。
typedef void (*LogicalDecodeStreamStartCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn);
The required <function>stream_stop_cb</function> callback is called when
closing a block of streamed changes from an in-progress transaction.
必須であるstream_stop_cb
コールバックは、進行中のトランザクションからのストリーミング変更ブロックを閉じるときに呼び出されます。
typedef void (*LogicalDecodeStreamStopCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn);
The required <function>stream_abort_cb</function> callback is called to
abort a previously streamed transaction.
必須であるstream_abort_cb
コールバックは、以前にストリームされたトランザクションを中止するために呼び出されます。
typedef void (*LogicalDecodeStreamAbortCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr abort_lsn);
The <function>stream_prepare_cb</function> callback is called to prepare
a previously streamed transaction as part of a two-phase commit. This
callback is required when the output plugin supports both the streaming
of large in-progress transactions and two-phase commits.
stream_prepare_cb
コールバックは、2相コミットの一部としてストリーミングされているトランザクションを準備するために呼び出されます。
このコールバックは、出力プラグインが大きな進行中のトランザクションと2相コミットの両方をストリーミングする場合に必要です。
typedef void (*LogicalDecodeStreamPrepareCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn);
The required <function>stream_commit_cb</function> callback is called to
commit a previously streamed transaction.
必須であるstream_commit_cb
コールバックは、以前にストリーミングされたトランザクションをコミットするために呼び出されます。
typedef void (*LogicalDecodeStreamCommitCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn);
The required <function>stream_change_cb</function> callback is called
when sending a change in a block of streamed changes (demarcated by
<function>stream_start_cb</function> and <function>stream_stop_cb</function> calls).
The actual changes are not displayed as the transaction can abort at a later
point in time and we don't decode changes for aborted transactions.
必須であるstream_change_cb
コールバックは、ストリーム化された変更のブロック(stream_start_cb
とstream_stop_cb
呼び出しで区切られます)で変更を送信するときに呼び出されます。
実際の変更は表示されません。
なぜなら、トランザクションは後の時点でアボートする可能性があり、アボートされたトランザクションの変更はデコードされないからです。
typedef void (*LogicalDecodeStreamChangeCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change);
The optional <function>stream_message_cb</function> callback is called when
sending a generic message in a block of streamed changes (demarcated by
<function>stream_start_cb</function> and <function>stream_stop_cb</function> calls).
The message contents for transactional messages are not displayed as the transaction
can abort at a later point in time and we don't decode changes for aborted
transactions.
オプションのstream_message_cb
コールバックは、ストリーム化された変更のブロック(stream_start_cb
とstream_stop_cb
コールで区切られた)で汎用メッセージを送信するときに呼び出されます。
トランザクションメッセージのメッセージ内容は表示されません。
なぜなら、トランザクションは後の時点でアボートする可能性があり、アボートされたトランザクションの変更はデコードされないからです。
typedef void (*LogicalDecodeStreamMessageCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size message_size, const char *message);
The optional <function>stream_truncate_cb</function> callback is called
for a <command>TRUNCATE</command> command in a block of streamed changes
(demarcated by <function>stream_start_cb</function> and
<function>stream_stop_cb</function> calls).
オプションのstream_truncate_cb
コールバックは、ストリーム化された変更のブロック(stream_start_cb
とstream_stop_cb
呼び出しで区切られます)内のTRUNCATE
コマンドに対して呼び出されます。
typedef void (*LogicalDecodeStreamTruncateCB) (struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change);
The parameters are analogous to the <function>stream_change_cb</function>
callback. However, because <command>TRUNCATE</command> actions on
tables connected by foreign keys need to be executed together, this
callback receives an array of relations instead of just a single one.
See the description of the <xref linkend="sql-truncate"/> statement for
details.
パラメータはstream_change_cb
コールバックに類似しています。
ただし、外部キーで接続されたテーブルに対するTRUNCATE
アクションは一緒に実行する必要があるため、このコールバックは単一のリレーションではなくリレーションの配列を受け取ります。
詳細はTRUNCATE文の説明を参照してください。
To actually produce output, output plugins can write data to
the <literal>StringInfo</literal> output buffer
in <literal>ctx->out</literal> when inside
the <function>begin_cb</function>, <function>commit_cb</function>,
or <function>change_cb</function> callbacks. Before writing to the output
buffer, <function>OutputPluginPrepareWrite(ctx, last_write)</function> has
to be called, and after finishing writing to the
buffer, <function>OutputPluginWrite(ctx, last_write)</function> has to be
called to perform the write. The <parameter>last_write</parameter>
indicates whether a particular write was the callback's last write.
begin_cb
、commit_cb
、change_cb
コールバックにおいて、出力プラグインは実際にデータ出力するためにctx->out
のStringInfo
出力バッファに書き込みます。
出力バッファに書き込む前に、OutputPluginPrepareWrite(ctx, last_write)
を呼び出します。
また、書き込みバッファにデータを書き終えたら、OutputPluginWrite(ctx, last_write)
を呼び出してデータの書き込みを実施します。
last_write
引数により、その書き込みがコールバックの最終的な書き込みであるかどうかを指定します。
The following example shows how to output data to the consumer of an output plugin: 以下の例では、出力プラグインにおいて消費者に向けてデータを出力する方法を示します。
OutputPluginPrepareWrite(ctx, true); appendStringInfo(ctx->out, "BEGIN %u", txn->xid); OutputPluginWrite(ctx, true);