@Override public ChainedLogicalStreamBuilder optionsWithoutMetadata(ChainedLogicalStreamBuilder builder) { return builder .withSlotOption("pretty-print", 1) .withSlotOption("write-in-chunks", 0) .withSlotOption("include-xids", 1) .withSlotOption("include-timestamp", 1); }
@Override public ChainedLogicalStreamBuilder logical() { return new LogicalStreamBuilder(new StartLogicalReplicationCallback() { @Override public PGReplicationStream start(LogicalReplicationOptions options) throws SQLException { ReplicationProtocol protocol = baseConnection.getReplicationProtocol(); return protocol.startLogical(options); } }); }
@Override public ChainedLogicalCreateSlotBuilder withOutputPlugin(String outputPlugin) { this.outputPlugin = outputPlugin; return self(); }
private void createRplStream() throws SQLException { this.stream = this.rplConnection.getReplicationAPI() .replicationStream() .logical() .withSlotName(this.jdbcConfig.getSlotName()) .withSlotOption("include-xids", true) .withSlotOption("skip-empty-xacts", true) .withStatusInterval(5, TimeUnit.SECONDS) .start(); log.info("GetRplStream success,slot:{}", this.slotName); }
private PGReplicationStream startPgReplicationStream(final LogSequenceNumber lsn, Function<ChainedLogicalStreamBuilder, ChainedLogicalStreamBuilder> configurator) throws SQLException { assert lsn != null; ChainedLogicalStreamBuilder streamBuilder = pgConnection() .getReplicationAPI() .replicationStream() .logical() .withSlotName(slotName) .withStartPosition(lsn); streamBuilder = configurator.apply(streamBuilder); if (statusUpdateIntervalMillis != null && statusUpdateIntervalMillis > 0) { streamBuilder.withStatusInterval(statusUpdateIntervalMillis, TimeUnit.MILLISECONDS); } PGReplicationStream stream = streamBuilder.start(); // TODO DBZ-508 get rid of this // Needed by tests when connections are opened and closed in a fast sequence try { Thread.sleep(10); } catch (Exception e) { } stream.forceUpdateStatus(); return stream; }
.createReplicationSlot() .logical() .withSlotName(slotName) .withOutputPlugin(postgresPluginName) .make();
/** * START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [option_value] [, ... ] ) ] */ private String createStartLogicalQuery(LogicalReplicationOptions options) { StringBuilder builder = new StringBuilder(); builder.append("START_REPLICATION SLOT ") .append(options.getSlotName()) .append(" LOGICAL ") .append(options.getStartLSNPosition().asString()); Properties slotOptions = options.getSlotOptions(); if (slotOptions.isEmpty()) { return builder.toString(); } //todo replace on java 8 builder.append(" ("); boolean isFirst = true; for (String name : slotOptions.stringPropertyNames()) { if (isFirst) { isFirst = false; } else { builder.append(", "); } builder.append('\"').append(name).append('\"').append(" ") .append('\'').append(slotOptions.getProperty(name)).append('\''); } builder.append(")"); return builder.toString(); }
@Override public ChainedLogicalCreateSlotBuilder logical() { return new LogicalCreateSlotBuilder(baseConnection); }
@Override public PGReplicationStream start() throws SQLException { return startCallback.start(this); }
@Override public ChainedLogicalStreamBuilder optionsWithoutMetadata(ChainedLogicalStreamBuilder builder) { return builder .withSlotOption("pretty-print", 1) .withSlotOption("write-in-chunks", 1) .withSlotOption("include-xids", 1) .withSlotOption("include-timestamp", 1); }
@Override public ChainedLogicalStreamBuilder tryOnceOptions(ChainedLogicalStreamBuilder builder) { return builder.withSlotOption("include-unchanged-toast", 0); }
@Override public ChainedLogicalStreamBuilder tryOnceOptions(ChainedLogicalStreamBuilder builder) { return builder.withSlotOption("include-unchanged-toast", 0); }
@Override public ChainedLogicalStreamBuilder optionsWithMetadata(ChainedLogicalStreamBuilder builder) { return optionsWithoutMetadata(builder) .withSlotOption("include-not-null", "true"); }
@Override public ChainedLogicalStreamBuilder optionsWithMetadata(ChainedLogicalStreamBuilder builder) { return optionsWithoutMetadata(builder) .withSlotOption("include-not-null", "true"); }
@Override public ChainedLogicalStreamBuilder tryOnceOptions(ChainedLogicalStreamBuilder builder) { return builder.withSlotOption("include-unchanged-toast", 0); }
@Override public ChainedLogicalStreamBuilder optionsWithoutMetadata(ChainedLogicalStreamBuilder builder) { return builder .withSlotOption("pretty-print", 1) .withSlotOption("write-in-chunks", 1) .withSlotOption("include-xids", 1) .withSlotOption("include-timestamp", 1); }
@Override public ChainedLogicalStreamBuilder optionsWithoutMetadata(ChainedLogicalStreamBuilder builder) { return builder .withSlotOption("pretty-print", 1) .withSlotOption("write-in-chunks", 0) .withSlotOption("include-xids", 1) .withSlotOption("include-timestamp", 1); }
@Override public ChainedLogicalStreamBuilder tryOnceOptions(ChainedLogicalStreamBuilder builder) { return builder.withSlotOption("include-unchanged-toast", 0); }
@Override public ChainedLogicalStreamBuilder optionsWithMetadata(ChainedLogicalStreamBuilder builder) { return optionsWithoutMetadata(builder) .withSlotOption("include-not-null", "true"); }
@Override public ChainedLogicalStreamBuilder optionsWithMetadata(ChainedLogicalStreamBuilder builder) { return optionsWithoutMetadata(builder) .withSlotOption("include-not-null", "true"); }