From f0a8151feff44823881c3c4e1e7aca4f9bd690d5 Mon Sep 17 00:00:00 2001 From: Zhao Junwang Date: Sat, 27 Jan 2024 09:53:31 +0800 Subject: [PATCH v8 09/10] change CopyToGetFormat to CopyToSendCopyBegin and export more api Signed-off-by: Zhao Junwang --- src/backend/commands/copyto.c | 65 ++++++++++--------- src/include/commands/copyapi.h | 12 ++-- .../test_copy_format/test_copy_format.c | 7 +- 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index b5d8678394..e2a4964015 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -66,11 +66,6 @@ static void CopyAttributeOutCSV(CopyToState cstate, const char *string, /* Low-level communications functions */ static void SendCopyBegin(CopyToState cstate); static void SendCopyEnd(CopyToState cstate); -static void CopySendData(CopyToState cstate, const void *databuf, int datasize); -static void CopySendString(CopyToState cstate, const char *str); -static void CopySendChar(CopyToState cstate, char c); -static void CopySendInt32(CopyToState cstate, int32 val); -static void CopySendInt16(CopyToState cstate, int16 val); /* * CopyToRoutine implementations. @@ -90,10 +85,20 @@ CopyToTextProcessOption(CopyToState cstate, DefElem *defel) return false; } -static int16 -CopyToTextGetFormat(CopyToState cstate) +static void +CopyToTextSendCopyBegin(CopyToState cstate) { - return 0; + StringInfoData buf; + int natts = list_length(cstate->attnumlist); + int16 format = 0; + int i; + + pq_beginmessage(&buf, PqMsg_CopyOutResponse); + pq_sendbyte(&buf, format); /* overall format */ + pq_sendint16(&buf, natts); + for (i = 0; i < natts; i++) + pq_sendint16(&buf, format); /* per-column formats */ + pq_endmessage(&buf); } static void @@ -230,10 +235,20 @@ CopyToBinaryProcessOption(CopyToState cstate, DefElem *defel) return false; } -static int16 -CopyToBinaryGetFormat(CopyToState cstate) +static void +CopyToBinarySendCopyBegin(CopyToState cstate) { - return 1; + StringInfoData buf; + int natts = list_length(cstate->attnumlist); + int16 format = 1; + int i; + + pq_beginmessage(&buf, PqMsg_CopyOutResponse); + pq_sendbyte(&buf, format); /* overall format */ + pq_sendint16(&buf, natts); + for (i = 0; i < natts; i++) + pq_sendint16(&buf, format); /* per-column formats */ + pq_endmessage(&buf); } static void @@ -315,7 +330,7 @@ CopyToBinaryEnd(CopyToState cstate) CopyToRoutine CopyToRoutineText = { .CopyToProcessOption = CopyToTextProcessOption, - .CopyToGetFormat = CopyToTextGetFormat, + .CopyToSendCopyBegin = CopyToTextSendCopyBegin, .CopyToStart = CopyToTextStart, .CopyToOneRow = CopyToTextOneRow, .CopyToEnd = CopyToTextEnd, @@ -328,7 +343,7 @@ CopyToRoutine CopyToRoutineText = { */ CopyToRoutine CopyToRoutineCSV = { .CopyToProcessOption = CopyToTextProcessOption, - .CopyToGetFormat = CopyToTextGetFormat, + .CopyToSendCopyBegin = CopyToTextSendCopyBegin, .CopyToStart = CopyToTextStart, .CopyToOneRow = CopyToTextOneRow, .CopyToEnd = CopyToTextEnd, @@ -336,7 +351,7 @@ CopyToRoutine CopyToRoutineCSV = { CopyToRoutine CopyToRoutineBinary = { .CopyToProcessOption = CopyToBinaryProcessOption, - .CopyToGetFormat = CopyToBinaryGetFormat, + .CopyToSendCopyBegin = CopyToBinarySendCopyBegin, .CopyToStart = CopyToBinaryStart, .CopyToOneRow = CopyToBinaryOneRow, .CopyToEnd = CopyToBinaryEnd, @@ -349,17 +364,7 @@ CopyToRoutine CopyToRoutineBinary = { static void SendCopyBegin(CopyToState cstate) { - StringInfoData buf; - int natts = list_length(cstate->attnumlist); - int16 format = cstate->opts.to_routine->CopyToGetFormat(cstate); - int i; - - pq_beginmessage(&buf, PqMsg_CopyOutResponse); - pq_sendbyte(&buf, format); /* overall format */ - pq_sendint16(&buf, natts); - for (i = 0; i < natts; i++) - pq_sendint16(&buf, format); /* per-column formats */ - pq_endmessage(&buf); + cstate->opts.to_routine->CopyToSendCopyBegin(cstate); cstate->copy_dest = COPY_DEST_FRONTEND; } @@ -382,19 +387,19 @@ SendCopyEnd(CopyToState cstate) * NB: no data conversion is applied by these functions *---------- */ -static void +void CopySendData(CopyToState cstate, const void *databuf, int datasize) { appendBinaryStringInfo(cstate->fe_msgbuf, databuf, datasize); } -static void +void CopySendString(CopyToState cstate, const char *str) { appendBinaryStringInfo(cstate->fe_msgbuf, str, strlen(str)); } -static void +void CopySendChar(CopyToState cstate, char c) { appendStringInfoCharMacro(cstate->fe_msgbuf, c); @@ -464,7 +469,7 @@ CopyToStateFlush(CopyToState cstate) /* * CopySendInt32 sends an int32 in network byte order */ -static inline void +inline void CopySendInt32(CopyToState cstate, int32 val) { uint32 buf; @@ -476,7 +481,7 @@ CopySendInt32(CopyToState cstate, int32 val) /* * CopySendInt16 sends an int16 in network byte order */ -static inline void +inline void CopySendInt16(CopyToState cstate, int16 val) { uint16 buf; diff --git a/src/include/commands/copyapi.h b/src/include/commands/copyapi.h index 22accc83ab..0a05b24c54 100644 --- a/src/include/commands/copyapi.h +++ b/src/include/commands/copyapi.h @@ -67,7 +67,7 @@ extern CopyFromRoutine CopyFromRoutineBinary; typedef struct CopyToStateData *CopyToState; typedef bool (*CopyToProcessOption_function) (CopyToState cstate, DefElem *defel); -typedef int16 (*CopyToGetFormat_function) (CopyToState cstate); +typedef void (*CopyToSendCopyBegin_function) (CopyToState cstate); typedef void (*CopyToStart_function) (CopyToState cstate, TupleDesc tupDesc); typedef void (*CopyToOneRow_function) (CopyToState cstate, TupleTableSlot *slot); typedef void (*CopyToEnd_function) (CopyToState cstate); @@ -84,10 +84,9 @@ typedef struct CopyToRoutine CopyToProcessOption_function CopyToProcessOption; /* - * Called when COPY TO is started. This will return a format as int16 - * value. It's used for the CopyOutResponse message. + * Called when COPY TO is started. */ - CopyToGetFormat_function CopyToGetFormat; + CopyToSendCopyBegin_function CopyToSendCopyBegin; /* Called when COPY TO is started. This will send a header. */ CopyToStart_function CopyToStart; @@ -384,6 +383,11 @@ typedef struct CopyToStateData void *opaque; /* private space */ } CopyToStateData; +extern void CopySendData(CopyToState cstate, const void *databuf, int datasize); +extern void CopySendString(CopyToState cstate, const char *str); +extern void CopySendChar(CopyToState cstate, char c); +extern void CopySendInt32(CopyToState cstate, int32 val); +extern void CopySendInt16(CopyToState cstate, int16 val); extern void CopyToStateFlush(CopyToState cstate); #endif /* COPYAPI_H */ diff --git a/src/test/modules/test_copy_format/test_copy_format.c b/src/test/modules/test_copy_format/test_copy_format.c index 5e1b40e881..d833f22bbf 100644 --- a/src/test/modules/test_copy_format/test_copy_format.c +++ b/src/test/modules/test_copy_format/test_copy_format.c @@ -71,11 +71,10 @@ CopyToProcessOption(CopyToState cstate, DefElem *defel) return true; } -static int16 -CopyToGetFormat(CopyToState cstate) +static void +CopyToSendCopyBegin(CopyToState cstate) { ereport(NOTICE, (errmsg("CopyToGetFormat"))); - return 0; } static void @@ -99,7 +98,7 @@ CopyToEnd(CopyToState cstate) static const CopyToRoutine CopyToRoutineTestCopyFormat = { .type = T_CopyToRoutine, .CopyToProcessOption = CopyToProcessOption, - .CopyToGetFormat = CopyToGetFormat, + .CopyToSendCopyBegin = CopyToSendCopyBegin, .CopyToStart = CopyToStart, .CopyToOneRow = CopyToOneRow, .CopyToEnd = CopyToEnd, -- 2.41.0