/*
 * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 *
 * openGauss is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * ---------------------------------------------------------------------------------------
 * 
 * libpqwalreceiver.h
 *        libpqwalreceiver init for WalreceiverMain.
 * 
 * 
 * IDENTIFICATION
 *        src/include/replication/libpqwalreceiver.h
 *
 * ---------------------------------------------------------------------------------------
 */
#ifndef LIBPQWALRECEIVER_H
#define LIBPQWALRECEIVER_H

#include "utils/tuplestore.h"

typedef struct LibpqrcvConnectParam {
    char* conninfo;
    XLogRecPtr startpoint;
    char* slotname;
    int channel_identifier;

    /* for logical replication slot */
    bool logical;
    uint32 protoVersion;    /* Logical protocol version */
    List *publicationNames; /* String list of publications */
    bool binary;            /* Ask publisher to use binary */
    bool useSnapshot;       /* Use snapshot or not */
}LibpqrcvConnectParam;

/*
 * Status of walreceiver query execution.
 *
 * We only define statuses that are currently used.
 */
typedef enum {
    WALRCV_ERROR,        /* There was error when executing the query. */
    WALRCV_OK_COMMAND,   /* Query executed utility or replication command. */
    WALRCV_OK_TUPLES,    /* Query returned tuples. */
    WALRCV_OK_COPY_IN,   /* Query started COPY FROM. */
    WALRCV_OK_COPY_OUT,  /* Query started COPY TO. */
    WALRCV_OK_COPY_BOTH, /* Query started COPY BOTH replication protocol. */
} WalRcvExecStatus;

/*
 * Return value for walrcv_query, returns the status of the execution and
 * tuples if any.
 */
typedef struct WalRcvExecResult {
    WalRcvExecStatus status;
    int sqlstate;
    char *err;
    Tuplestorestate *tuplestore;
    TupleDesc tupledesc;
} WalRcvExecResult;

/* Prototypes for interface functions */
extern bool libpqrcv_connect_for_TLI(TimeLineID* timeLineID, char* conninfo);
extern bool libpqrcv_connect(char* conninfo, XLogRecPtr* startpoint, char* slotname, int channel_identifier);
extern bool libpqrcv_receive(int timeout, unsigned char* type, char** buffer, int* len);
extern void libpqrcv_send(const char* buffer, int nbytes);
extern void libpqrcv_disconnect(void);
extern void HaSetRebuildRepInfoError(HaRebuildReason reason);
extern void SetObsRebuildReason(HaRebuildReason reason);
extern void libpqrcv_check_conninfo(const char *conninfo);
extern WalRcvExecResult* libpqrcv_exec(const char *cmd, const int nRetTypes, const Oid *retTypes);

extern void IdentifyRemoteSystem(bool checkRemote);
extern void CreateRemoteReplicationSlot(XLogRecPtr startpoint, const char* slotname, bool isLogical, XLogRecPtr *lsn,
                                        bool useSnapshot = false, CommitSeqNo *csn = NULL);
extern void StartRemoteStreaming(const LibpqrcvConnectParam *options);
extern ServerMode IdentifyRemoteMode();

#endif