the
application because the internal representation of the
<literal>FILE</literal> pointers differ. Specifically,
multithreaded/single-threaded, release/debug, and static/dynamic
flags should be the same for the library and all applications using
that library.
</para>
</note>
</listitem>
<listitem>
<para>
<function>ECPGget_PGconn(const char *<replaceable>connection_name</replaceable>)
</function> returns the library database connection handle identified by the given name.
If <replaceable>connection_name</replaceable> is set to <literal>NULL</literal>, the current
connection handle is returned. If no connection handle can be identified, the function returns
<literal>NULL</literal>. The returned connection handle can be used to call any other functions
from <application>libpq</application>, if necessary.
</para>
<note>
<para>
It is a bad idea to manipulate database connection handles made from <application>ecpg</application> directly
with <application>libpq</application> routines.
</para>
</note>
</listitem>
<listitem>
<para>
<function>ECPGtransactionStatus(const char *<replaceable>connection_name</replaceable>)</function>
returns the current transaction status of the given connection identified by <replaceable>connection_name</replaceable>.
See <xref linkend="libpq-status"/> and libpq's <xref linkend="libpq-PQtransactionStatus"/> for details about the returned status codes.
</para>
</listitem>
<listitem>
<para>
<function>ECPGstatus(int <replaceable>lineno</replaceable>,
const char* <replaceable>connection_name</replaceable>)</function>
returns true if you are connected to a database and false if not.
<replaceable>connection_name</replaceable> can be <literal>NULL</literal>
if a single connection is being used.
</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="ecpg-lo">
<title>Large Objects</title>
<para>
Large objects are not directly supported by ECPG, but ECPG
application can manipulate large objects through the libpq large
object functions, obtaining the necessary <type>PGconn</type>
object by calling the <function>ECPGget_PGconn()</function>
function. (However, use of
the <function>ECPGget_PGconn()</function> function and touching
<type>PGconn</type> objects directly should be done very carefully
and ideally not mixed with other ECPG database access calls.)
</para>
<para>
For more details about the <function>ECPGget_PGconn()</function>, see
<xref linkend="ecpg-library"/>. For information about the large
object function interface, see <xref linkend="largeobjects"/>.
</para>
<para>
Large object functions have to be called in a transaction block, so
when autocommit is off, <command>BEGIN</command> commands have to
be issued explicitly.
</para>
<para>
<xref linkend="ecpg-lo-example"/> shows an example program that
illustrates how to create, write, and read a large object in an
ECPG application.
</para>
<example id="ecpg-lo-example">
<title>ECPG Program Accessing Large Objects</title>
<programlisting><![CDATA[
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
#include <libpq/libpq-fs.h>
EXEC SQL WHENEVER SQLERROR STOP;
int
main(void)
{
PGconn *conn;
Oid loid;
int fd;
char buf[256];
int buflen = 256;
char buf2[256];
int rc;
memset(buf, 1, buflen);
EXEC SQL CONNECT TO testdb AS con1;
EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT;
conn = ECPGget_PGconn("con1");
printf("conn = %p\n", conn);
/* create */
loid = lo_create(conn, 0);
if (loid < 0)
printf("lo_create() failed: %s", PQerrorMessage(conn));
printf("loid = %d\n", loid);
/* write test */
fd = lo_open(conn,