diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index df6ea33ff14..6b40a379ee5 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -163,7 +163,7 @@ static pg_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate, /* Low-level communications functions */ -static int CopyGetData(CopyFromState cstate, void *databuf, +int CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread); static inline bool CopyGetInt32(CopyFromState cstate, int32 *val); static inline bool CopyGetInt16(CopyFromState cstate, int16 *val); @@ -245,7 +245,7 @@ ReceiveCopyBinaryHeader(CopyFromState cstate) * * NB: no data conversion is applied here. */ -static int +int CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread) { int bytesread = 0; diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index af2aab18234..fb9013e8622 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -82,10 +82,10 @@ static void CopyToBinaryEnd(CopyToState cstate); /* Low-level communications functions */ static void SendCopyBegin(CopyToState cstate); static void SendCopyEnd(CopyToState cstate); -static void CopySendData(CopyToState cstate, const void *databuf, int datasize); +/* exported for custom formats, see copyapi.h */ static void CopySendString(CopyToState cstate, const char *str); static void CopySendChar(CopyToState cstate, char c); -static void CopySendEndOfRow(CopyToState cstate); + static void CopySendTextLikeEndOfRow(CopyToState cstate); static void CopySendInt32(CopyToState cstate, int32 val); static void CopySendInt16(CopyToState cstate, int16 val); @@ -513,7 +513,7 @@ 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); @@ -531,7 +531,7 @@ CopySendChar(CopyToState cstate, char c) appendStringInfoCharMacro(cstate->fe_msgbuf, c); } -static void +void CopySendEndOfRow(CopyToState cstate) { StringInfo fe_msgbuf = cstate->fe_msgbuf; diff --git a/src/include/commands/copyapi.h b/src/include/commands/copyapi.h index f1924424df8..361a707fdef 100644 --- a/src/include/commands/copyapi.h +++ b/src/include/commands/copyapi.h @@ -145,4 +145,17 @@ extern void RegisterCopyCustomFormat(const char *name, const CopyToRoutine *to, extern const CopyCustomFormatEntry *GetCopyCustomFormatRoutines(const char *name); +/* + * Low-level I/O for custom formats. + * + * A format implementation has to move bytes to and from whatever the COPY is + * attached to (a file, a PROGRAM, the frontend, or a callback), and only these + * know how to do that. Without them an extension can register a format but + * cannot implement one. + */ +extern void CopySendData(CopyToState cstate, const void *databuf, int datasize); +extern void CopySendEndOfRow(CopyToState cstate); +extern int CopyGetData(CopyFromState cstate, void *databuf, + int minread, int maxread); + #endif /* COPYAPI_H */