jsoncdc

This Release
jsoncdc 0.1.0
Date
Status
Testing
Latest Unstable
jsoncdc 0.0.12 —
Other Releases
Abstract
Translates Postgres WAL to JSON
Description
A Rust plugin for Postgres Change Data Capture.
Released By
kungfury
License
Apache PostgreSQL
Resources
Special Files

Extensions

jsoncdc 0.1.0
Translates Postgres WAL to JSON

Documentation

PULL_REQUEST_TEMPLATE
PULL_REQUEST_TEMPLATE
CONTRIBUTING
CONTRIBUTING
ISSUE_TEMPLATE
ISSUE_TEMPLATE

README

JSONCDC

JSONCDC provides change data capture for Postgres, translating the Postgres write ahead log to JSON.

It is written in Rust and, being short, is a good skeleton project for other would be plugin authors who’d like to use Rust to write Postgres extensions.

Our library Requires rust stable 1.1 or greater.

Copyright and License

Copyright © 2016 Alex Newman, Jason Dusek Copyright © 2018 Instructure, Inc.

JSONCDC is available under multiple licenses:

  • the same license as Postgres itself (licenses/postgres),

  • the Apache 2.0 license (licenses/apache).

Status

JSONCDC is presently installable with pgxn, from the testing channel: pgxn install jsoncdc --testing.

Usage

A basic demo:

SELECT * FROM pg_create_logical_replication_slot('jsoncdc', 'jsoncdc');
--- Wait for some transactions, and then:
SELECT * FROM pg_logical_slot_get_changes('jsoncdc', NULL, NULL);

The output format of jsoncdc is very regular, consisting of begin, table, insert, update, delete and message clauses as JSON objects, one per line:

{ "begin": <xid> }
{ "schema": <column names and type>, "table": <name of table> }
...inserts, updates and deletes for this table...
{ "schema": <column names and type>, "table": <name of next table> }
...inserts, updates and deletes for next table...
{ "prefix": <prefix>, "message": <message>, "transactional": <true|false> }
...messages may be mixed in at any point; they don't belong to a table...
{ "commit": <xid>, "t": <timestamp with timezone> }

With pg_recvlogical and a little shell, you can leverage this very regular formatting to get each transaction batched into a separate file:

pg_recvlogical -S jsoncdc -d postgres:/// --start -f - |
while read -r line
do
  case "$line" in
    '{ "begin": '*)                # Close and reopen FD 9 for each new XID
      fields=( $line )
      xid="${fields[2]}"
      exec 9>&-
      exec 9> "txn-${xid}.json" ;;
  esac
  printf '%s\n' "$line" >&9       # Use printf because echo is non-portable
done