Refactor function parse_output_parameters.
authorAmit Kapila <akapila@postgresql.org>
Tue, 6 Apr 2021 02:56:31 +0000 (08:26 +0530)
committerAmit Kapila <akapila@postgresql.org>
Tue, 6 Apr 2021 02:56:31 +0000 (08:26 +0530)
Instead of using multiple parameters in parse_ouput_parameters function
signature, use the struct PGOutputData that encapsulates all pgoutput
options. It will be useful for future work where we need to add other
options in pgoutput.

Author: Euler Taveira
Reviewed-by: Amit Kapila
Discussion: https://postgr.es/m/CADK3HHJ-+9SO7KuRLH=9Wa1rAo60Yreq1GFNkH_kd0=CdaWM+A@mail.gmail.com

src/backend/replication/pgoutput/pgoutput.c
src/include/replication/pgoutput.h

index 1b993fb032dca0bc5c4171eeeccb80902708f65c..6146c5acdb30ef7f3ad8c77921ba601156b6cdfc 100644 (file)
@@ -156,9 +156,7 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb)
 }
 
 static void
-parse_output_parameters(List *options, uint32 *protocol_version,
-                       List **publication_names, bool *binary,
-                       bool *enable_streaming)
+parse_output_parameters(List *options, PGOutputData *data)
 {
    ListCell   *lc;
    bool        protocol_version_given = false;
@@ -166,7 +164,8 @@ parse_output_parameters(List *options, uint32 *protocol_version,
    bool        binary_option_given = false;
    bool        streaming_given = false;
 
-   *binary = false;
+   data->binary = false;
+   data->streaming = false;
 
    foreach(lc, options)
    {
@@ -196,7 +195,7 @@ parse_output_parameters(List *options, uint32 *protocol_version,
                         errmsg("proto_version \"%s\" out of range",
                                strVal(defel->arg))));
 
-           *protocol_version = (uint32) parsed;
+           data->protocol_version = (uint32) parsed;
        }
        else if (strcmp(defel->defname, "publication_names") == 0)
        {
@@ -207,7 +206,7 @@ parse_output_parameters(List *options, uint32 *protocol_version,
            publication_names_given = true;
 
            if (!SplitIdentifierString(strVal(defel->arg), ',',
-                                      publication_names))
+                                      &data->publication_names))
                ereport(ERROR,
                        (errcode(ERRCODE_INVALID_NAME),
                         errmsg("invalid publication_names syntax")));
@@ -220,7 +219,7 @@ parse_output_parameters(List *options, uint32 *protocol_version,
                         errmsg("conflicting or redundant options")));
            binary_option_given = true;
 
-           *binary = defGetBoolean(defel);
+           data->binary = defGetBoolean(defel);
        }
        else if (strcmp(defel->defname, "streaming") == 0)
        {
@@ -230,7 +229,7 @@ parse_output_parameters(List *options, uint32 *protocol_version,
                         errmsg("conflicting or redundant options")));
            streaming_given = true;
 
-           *enable_streaming = defGetBoolean(defel);
+           data->streaming = defGetBoolean(defel);
        }
        else
            elog(ERROR, "unrecognized pgoutput option: %s", defel->defname);
@@ -244,7 +243,6 @@ static void
 pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt,
                 bool is_init)
 {
-   bool        enable_streaming = false;
    PGOutputData *data = palloc0(sizeof(PGOutputData));
 
    /* Create our memory context for private allocations. */
@@ -265,11 +263,7 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt,
    if (!is_init)
    {
        /* Parse the params and ERROR if we see any we don't recognize */
-       parse_output_parameters(ctx->output_plugin_options,
-                               &data->protocol_version,
-                               &data->publication_names,
-                               &data->binary,
-                               &enable_streaming);
+       parse_output_parameters(ctx->output_plugin_options, data);
 
        /* Check if we support requested protocol */
        if (data->protocol_version > LOGICALREP_PROTO_MAX_VERSION_NUM)
@@ -295,7 +289,7 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt,
         * we only allow it with sufficient version of the protocol, and when
         * the output plugin supports it.
         */
-       if (!enable_streaming)
+       if (!data->streaming)
            ctx->streaming = false;
        else if (data->protocol_version < LOGICALREP_PROTO_STREAM_VERSION_NUM)
            ereport(ERROR,
index 4ba052fe38a18759ee5da17322484f65f65fd937..bb383d523eefc9150c0e14dda8a17ed399b3a4f5 100644 (file)
@@ -25,6 +25,7 @@ typedef struct PGOutputData
    List       *publication_names;
    List       *publications;
    bool        binary;
+   bool        streaming;
 } PGOutputData;
 
 #endif                         /* PGOUTPUT_H */