returned to indicate
success or failure of the transfer. Its status will be
<literal>PGRES_COMMAND_OK</literal> for success or
<literal>PGRES_FATAL_ERROR</literal> if some problem was encountered.
At this point further SQL commands can be issued via
<xref linkend="libpq-PQexec"/>. (It is not possible to execute other SQL
commands using the same connection while the <command>COPY</command>
operation is in progress.)
</para>
<para>
If a <command>COPY</command> command is issued via
<xref linkend="libpq-PQexec"/> in a string that could contain additional
commands, the application must continue fetching results via
<xref linkend="libpq-PQgetResult"/> after completing the <command>COPY</command>
sequence. Only when <xref linkend="libpq-PQgetResult"/> returns
<symbol>NULL</symbol> is it certain that the <xref linkend="libpq-PQexec"/>
command string is done and it is safe to issue more commands.
</para>
<para>
The functions of this section should be executed only after obtaining
a result status of <literal>PGRES_COPY_OUT</literal> or
<literal>PGRES_COPY_IN</literal> from <xref linkend="libpq-PQexec"/> or
<xref linkend="libpq-PQgetResult"/>.
</para>
<para>
A <structname>PGresult</structname> object bearing one of these status values
carries some additional data about the <command>COPY</command> operation
that is starting. This additional data is available using functions
that are also used in connection with query results:
<variablelist>
<varlistentry id="libpq-PQnfields-1">
<term><function>PQnfields</function><indexterm
><primary>PQnfields</primary><secondary>with COPY</secondary></indexterm></term>
<listitem>
<para>
Returns the number of columns (fields) to be copied.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-PQbinaryTuples-1">
<term><function>PQbinaryTuples</function><indexterm
><primary>PQbinaryTuples</primary><secondary>with COPY</secondary></indexterm></term>
<listitem>
<para>
0 indicates the overall copy format is textual (rows separated by
newlines, columns separated by separator characters, etc.). 1
indicates the overall copy format is binary. See <xref
linkend="sql-copy"/> for more information.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-PQfformat-1">
<term><function>PQfformat</function><indexterm
><primary>PQfformat</primary><secondary>with COPY</secondary></indexterm></term>
<listitem>
<para>
Returns the format code (0 for text, 1 for binary) associated with
each column of the copy operation. The per-column format codes
will always be zero when the overall copy format is textual, but
the binary format can support both text and binary columns.
(However, as of the current implementation of <command>COPY</command>,
only binary columns appear in a binary copy; so the per-column
formats always match the overall format at present.)
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<sect2 id="libpq-copy-send">
<title>Functions for Sending <command>COPY</command> Data</title>
<para>
These functions are used to send data during <literal>COPY FROM
STDIN</literal>. They will fail if called when the connection is not in
<literal>COPY_IN</literal> state.
</para>
<variablelist>
<varlistentry id="libpq-PQputCopyData">
<term><function>PQputCopyData</function><indexterm><primary>PQputCopyData</primary></indexterm></term>
<listitem>
<para>
Sends data to the server during <literal>COPY_IN</literal> state.
<synopsis>
int PQputCopyData(PGconn *conn,
const char *buffer,
int nbytes);
</synopsis>
</para>
<para>
Transmits the <command>COPY</command> data in the specified
<parameter>buffer</parameter>,