round-trip to get the results it needs. However, it's often possible to
adjust the client design to exchange the required information server-side.
Read-modify-write cycles are especially good candidates; for example:
- <programlisting>
+<programlisting>
BEGIN;
SELECT x FROM mytable WHERE id = 42 FOR UPDATE;
-- result: x=2
-- client adds 1 to x:
UPDATE mytable SET x = 3 WHERE id = 42;
COMMIT;
- </programlisting>
+</programlisting>
could be much more efficiently done with:
- <programlisting>
+<programlisting>
UPDATE mytable SET x = x + 1 WHERE id = 42;
- </programlisting>
+</programlisting>
</para>
<para>
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.
- <programlisting>
- typedef void (*LogicalDecodeBeginPrepareCB) (struct LogicalDecodingContext *ctx,
- ReorderBufferTXN *txn);
- </programlisting>
+<programlisting>
+typedef void (*LogicalDecodeBeginPrepareCB) (struct LogicalDecodingContext *ctx,
+ ReorderBufferTXN *txn);
+</programlisting>
</para>
</sect3>
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.
- <programlisting>
- typedef void (*LogicalDecodePrepareCB) (struct LogicalDecodingContext *ctx,
- ReorderBufferTXN *txn,
- XLogRecPtr prepare_lsn);
- </programlisting>
+<programlisting>
+typedef void (*LogicalDecodePrepareCB) (struct LogicalDecodingContext *ctx,
+ ReorderBufferTXN *txn,
+ XLogRecPtr prepare_lsn);
+</programlisting>
</para>
</sect3>
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.
- <programlisting>
- typedef void (*LogicalDecodeCommitPreparedCB) (struct LogicalDecodingContext *ctx,
- ReorderBufferTXN *txn,
- XLogRecPtr commit_lsn);
- </programlisting>
+<programlisting>
+typedef void (*LogicalDecodeCommitPreparedCB) (struct LogicalDecodingContext *ctx,
+ ReorderBufferTXN *txn,
+ XLogRecPtr commit_lsn);
+</programlisting>
</para>
</sect3>
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.
- <programlisting>
- typedef void (*LogicalDecodeRollbackPreparedCB) (struct LogicalDecodingContext *ctx,
- ReorderBufferTXN *txn,
- XLogRecPtr prepare_end_lsn,
- TimestampTz prepare_time);
- </programlisting>
+<programlisting>
+typedef void (*LogicalDecodeRollbackPreparedCB) (struct LogicalDecodingContext *ctx,
+ ReorderBufferTXN *txn,
+ XLogRecPtr prepare_end_lsn,
+ TimestampTz prepare_time);
+</programlisting>
</para>
</sect3>