<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/libpq++.sgml,v 1.5 2001/06/26 03:55:47 i-kaori Exp $
-->

 <chapter id="libpqplusplus">
  <title><!--libpq++ - C++ Binding Library-->libpq++――C++バインディングライブラリ</title>
<indexterm><primary>libpq++</primary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary>libpq++</secondary></indexterm>
  <para>
   <!--<filename>libpq++</filename> is the C++ API to 
   <productname>Postgres</productname>.
   <filename>libpq++</filename>  is a set of classes that allow
   client programs to connect to the 
   <productname>Postgres</productname> backend server. These connections
   come in two forms: a Database Class and a Large Object class.-->

   <filename>libpq++</filename>は、<productname>Postgres</productname>のためのC++ APIで、<productname>Postgres</productname>バックエンドサーバーへの接続手段をクライアントプログラムに与えるクラスの集合です。これらのバックエンドへの接続は2つの形態を取ります。1つは「データベースクラス」、もう1つは「ラージオブジェクトクラス」です。
  </para>

  <para>
   <!--The Database Class is intended for manipulating a database. You can
   send all sorts of SQL queries to the <productname>Postgres</productname> 
   backend server and retrieve the responses of the server.-->

   「データベースクラス」の目的はデータベースの操作にあります。あらゆる種類のSQLの問い合わせを<productname>Postgres</productname>バックエンドサーバーへ送信し、そしてサーバーの応答を取り出すことができます。<indexterm><primary>libpq++</primary><secondary sortas="でーたべーすくらす">データベースクラス</secondary></indexterm>
  </para>

  <para>
   <!--The Large Object Class is intended for manipulating a large object
   in a database. Although a Large Object instance can send normal
   queries to the <productname>Postgres</productname> backend server 
   it is only intended for simple
   queries that do not return any data. A large object should be seen
   as a file stream. In the future it should behave much like the C++ file
   streams
   <literal>cin</literal>,
   <literal>cout</literal>
   and
   <literal>cerr</literal>.-->

   「ラージオブジェクトクラス」の目的はデータベース内のラージオブジェクトの操作にあります。ラージオブジェクトクラスのインスタンスも、<productname>Postgres</productname>バックエンドサーバーへ通常の問い合わせを送ることはできます。しかしこれは、何もデータを返さない簡単な問い合わせをすることだけが目的です。ラージオブジェクト自体はファイルストリームのように見えるべきものなので、いずれはC++のファイルストリーム、<literal>cin</literal>、<literal>cout</literal>、<literal>cerr</literal>とほぼ同じような動作になるはずです。<indexterm><primary>libpq++</primary><secondary sortas="らーじおぶじぇくとくらす">ラージオブジェクトクラス</secondary></indexterm>
  </para>

  <para>
   <!--This chapter is based on the documentation
   for the <filename>libpq</filename> C library.  Three
   short programs are listed at the end of this section as examples of
   <filename>libpq++</filename> programming 
   (though not necessarily of good programming).
   There are several examples of <filename>libpq++</filename> 
   applications in
   <filename>src/libpq++/examples</filename>, including the source
   code for the three examples in this chapter.-->

   この章は、Cライブラリ<filename>libpq</filename>のドキュメントをベースにしています。このセクションの最後に<filename>libpq++</filename>プログラミングの例として、3つの短いプログラムが書かれています（必ずしもよいプログラム例とはいえませんが）。また<filename>libpq++</filename>アプリケーションの例として、<filename>src/libpq++/examples</filename>にいくつか収録しています。この中には本章のサンプル3つも含まれています。
  </para>

  <sect1 id="libpqpp-init">
   <title><!--Control and Initialization-->制御と初期化</title>
<indexterm><primary>libpq++</primary><secondary sortas="せいぎょとしょきか">制御と初期化</secondary></indexterm>
   <sect2>
    <title><!--Environment Variables-->環境変数</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんきょうへんすう">環境変数</secondary></indexterm>
    <para>
     <!--The following environment variables can be used to set up default
     values for an environment and to avoid hard-coding database names into
     an application program:-->

     以下の環境変数は動作環境のデフォルト値を設定し、アプリケーションプログラムにデータベース名をハードコーディングすることを避けるために使われます。
</para>

     <note>
      <para>
       <!--Refer to <xref linkend="libpq-envars"> for a complete
       list of available connection options.-->

       使用できる接続オプションの全リストは<xref linkend="libpq-envars">を参照してください。
      </para>
     </note>

    <para>
     <!--The following environment variables can be used to select default
     connection parameter values, which will be used by
     <function>PQconnectdb</> or
     <function>PQsetdbLogin</> if no value is directly specified by the calling code.
     These are useful to avoid hard-coding database names into simple
     application programs.-->

     <function>PQconnectdb</>または<function>PQsetdbLogin</>を呼び出すプログラムが接続パラメータの値を直接指定しなかった場合、<function>PQconnectdb</>と<function>PQsetdbLogin</>は以下の環境変数を使って接続パラメータのデフォルト値を決定します。簡単なアプリケーションプログラムにデータベース名をハードコーディングすることを避けるのに便利です。
</para>

     <note>
      <para>
       <!--<filename>libpq++</filename> uses only environment variables or
       <filename>libpq</>'s <function>PQconnectdb</>
       conninfo style strings.-->

       <filename>libpq++</filename>が使用するのは環境変数、あるいは<filename>libpq</>の<function>PQconnectdb</>のconninfo形式文字列のみです。
      </para>
     </note>
	  
     <itemizedlist>
      <listitem>
       <para>
	<!--<envar>PGHOST</envar> sets the default server name.
        If this begins with a slash, it specifies Unix-domain communication
        rather than TCP/IP communication; the value is the name of the
	directory in which the socket file is stored (default "/tmp").-->

        <emphasis><envar>PGHOST</envar></emphasis>――デフォルトサーバー名を設定します。スラッシュで始まる場合は、TCP/IP接続ではなく、UNIXドメインソケットを使用します。値はソケットファイルが格納されているディレクトリ名です（デフォルトでは"/tmp"です）。<indexterm><primary>PGHOST</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGHOST</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGPORT</envar> sets the default TCP port number or Unix-domain
	socket file extension for communicating with the
	<productname>Postgres</productname> backend.-->

        <emphasis><envar>PGPORT</envar></emphasis>――<productname>Postgres</productname>バックエンドと通信するためのデフォルトTCPポート、またはUNIXドメインソケットファイルの拡張子を設定します。<indexterm><primary>PGPORT</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGPORT</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGDATABASE</envar>  sets the default 
	<productname>Postgres</productname> database name.-->

        <emphasis><envar>PGDATABASE</envar></emphasis>――デフォルトの<productname>Postgres</productname>データベース名を設定します。<indexterm><primary>PGDATABASE</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGDATABASE</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGUSER</envar>
	sets the username used to connect to the database and for authentication.-->

        <emphasis><envar>PGUSER</envar></emphasis>――データベースへの接続と認証に使われるユーザー名を設定します<indexterm><primary>PGUSER</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGUSER</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGPASSWORD</envar>
	sets the password used if the backend demands password authentication.-->

        <emphasis><envar>PGPASSWORD</envar></emphasis>――バックエンドがパスワード認証を要求した場合に使われるパスワードを設定します。<indexterm><primary>PGPASSWORD</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGPASSWORD</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGREALM</envar> sets the Kerberos realm to  use  with  
	<productname>Postgres</productname>,
	if  it is different from the local realm.  If
	<envar>PGREALM</envar> is set, <productname>Postgres</productname> 
	applications  will  attempt
	authentication  with  servers for this realm and use
	separate ticket files to avoid conflicts with  local
	ticket  files.   This  environment  variable is only
	used if Kerberos authentication is selected by the backend.-->

        <emphasis><envar>PGREALM</envar></emphasis>――<productname>Postgres</productname>と共に使うKerberosの領域がローカルのものと異なる場合に、その領域を設定します。<envar>PGREALM</envar>が設定されると、<productname>Postgres</productname>アプリケーションは設定された領域のサーバーと認証を行おうとし、別のチケットファイルを使って、ローカルのチケットファイルと競合しないようにします。この環境変数は、バックエンドがKerberosによる認証を選択した場合にのみ使われます。<indexterm><primary>PGREALM</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGREALM</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGOPTIONS</envar> sets additional runtime  options  for  
	the <productname>Postgres</productname> backend.-->

        <emphasis><envar>PGOPTIONS</envar></emphasis>――<productname>Postgres</productname>バックエンドに対する付加のランタイムオプションを設定します。<indexterm><primary>PGOPTIONS</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGOPTIONS</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGTTY</envar> sets the file or tty on which  debugging  
	messages from the backend server are displayed.-->

        <emphasis><envar>PGTTY</envar></emphasis>――バックエンドサーバーのデバッグメッセージを出力するファイル、あるいはttyを設定します。<indexterm><primary>PGTTY</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGTTY</secondary></indexterm>
       </para>
      </listitem>
     </itemizedlist>
	
    <para>
     <!--The following environment variables can be used to specify user-level default
     behavior for every Postgres session:-->

     以下の環境変数は、各Postgresのセッションに対しての、ユーザーレベルのデフォルト動作を設定するときに使います。
</para>

     <itemizedlist>
      <listitem>
       <para>
	<!--<envar>PGDATESTYLE</envar>
	sets the default style of date/time representation.-->

        <emphasis><envar>PGDATESTYLE</envar></emphasis>――デフォルトの日時表示スタイルを設定します。<indexterm><primary>PGDATESTYLE</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGDATESTYLE</secondary></indexterm>
       </para>
      </listitem>
      <listitem>
       <para>
	<!--<envar>PGTZ</envar>
	sets the default time zone.-->
        <emphasis><envar>PGTZ</envar></emphasis>――デフォルトのタイムゾーンを設定します。<indexterm><primary>PGTZ</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGTZ</secondary></indexterm>
       </para>
      </listitem>
     </itemizedlist>
    
    <para>
     <!--The following environment variables can be used to specify default internal
     behavior for every Postgres session:-->

     以下の環境変数は各Postgresのセッション対しての、デフォルトの内部動作を設定するのに使います。
</para>

     <itemizedlist>
      <listitem>
       <para>
	<!--<envar>PGGEQO</envar>
	sets the default mode for the genetic optimizer.-->

        <emphasis><envar>PGGEQO</envar></emphasis>――遺伝的アルゴリズムによるオプティマイザの動作モードを設定します。<indexterm><primary>PGGEQO</primary></indexterm><indexterm><primary sortas="かんきょうへんすう">環境変数</primary><secondary>PGGEQO</secondary></indexterm>
       </para>
      </listitem>
     </itemizedlist>
	
    <para>
     <!--Refer to the <command>SET</command> <acronym>SQL</acronym> command
     for information on correct values for these environment variables.-->

     これらの環境変数の正しい設定値に関しては、<acronym>SQL</acronym>の<command>SET</command>コマンドを参照してください。
    </para>
   </sect2>
  </sect1>

  <sect1 id="libpqpp-classes">
   <title><!--libpq++ Classes-->libpq++のクラス</title>
<indexterm><primary>libpq++</primary><secondary sortas="くらす">クラス</secondary></indexterm>
   <sect2>
    <title><!--Connection Class-->コネクションクラス――<classname>PgConnection</classname></title>
<indexterm><primary>libpq++</primary><secondary sortas="くらす">クラス</secondary><tertiary sortas="こねくしょんくらす">コネクションクラス</tertiary></indexterm>
    <para>
     <!--The connection class makes the actual connection to the database and is inherited
     by all of the access classes.-->

     実際のデータベースへの接続は、このコネクションクラスが確立します。また、すべてのアクセスクラスがこのクラスを継承しています。
    </para>
   </sect2>

   <sect2>
    <title><!--Database Class-->データベースクラス――<classname>PgDatabase</classname></title>
<indexterm><primary>libpq++</primary><secondary sortas="くらす">クラス</secondary><tertiary sortas="でーたべーすくらす">データベースクラス</tertiary></indexterm>

    <para>
     <!--The database class provides C++ objects that have a connection
     to a backend server. To create such an object one first needs
     the apropriate environment for the backend to access.
     The following constructors deal with making a connection to a backend
     server from a C++ program.-->

     データベースクラスは、バックエンドサーバーへの接続を保持するC++オブジェクトを提供します。このオブジェクトを生成するには、まずアクセスしようとするバックエンドに対して適切な環境を整える必要があります。C++プログラムからバックエンドサーバーへ接続する処理は、後述するコンストラクタが扱います。
    </para>
   </sect2>
  </sect1>

  <sect1 id="libpqpp-connect">
   <title><!--Database Connection Functions-->データベース接続関数</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="でーたべーすせつぞくかんすう">データベース接続関数</tertiary></indexterm>
    <itemizedlist>
     <listitem>
      <para>
       <!--<function>PgConnection</function>
       makes a new connection to a backend database server.-->

       <emphasis><function>PgConnection</function></emphasis>――新たなバックエンドサーバーとの接続を確立します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>PgConnection()</tertiary></indexterm><indexterm><primary>PgConnection()</primary></indexterm></para>


<synopsis>
PgConnection::PgConnection(const char *conninfo)
</synopsis>

       <!--Although typically called from one of the access classes, a connection to
       a backend server is possible by creating a PgConnection object.-->

<para>この関数は通常、アクセスクラスのいずれかから呼び出されますが、PgConnectionオブジェクトを生成してもバックエンドサーバーへの接続は可能です。

      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>ConnectionBad</function>
       returns whether or not the connection to the backend server succeeded or
       failed.  -->

       <emphasis><function>ConnectionBad</function></emphasis>――バックエンドへの接続が成功したかどうかを返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>ConnectionBad()</tertiary></indexterm><indexterm><primary>ConnectionBad()</primary></indexterm></para>


<synopsis>
int PgConnection::ConnectionBad()
</synopsis>
       <!--Returns TRUE if the connection failed.-->

<para>接続に失敗するとTRUEを返します。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>Status</function>
       returns the status of the connection to the backend server.-->

       <emphasis><function>Status</function></emphasis>――バックエンドサーバーとの接続状態を返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>Status()</tertiary></indexterm><indexterm><primary>Status()</primary></indexterm></para>


<synopsis>
ConnStatusType PgConnection::Status()
</synopsis>
       <!--Returns either CONNECTION_OK or CONNECTION_BAD depending on the state
       of the connection.-->

<para>接続状態により、CONNECTION_OKもしくはCONNECTION_BADのどちらかを返します。

      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>PgDatabase</function>
       makes a new connection to a backend database server.
<synopsis>
PgDatabase(const char *conninfo)
</synopsis>
       After a PgDatabase has been created it should be checked to make sure
       the connection to the database succeded before sending
       queries to the object. This can easily be done by
       retrieving the current status of the PgDatabase object with the
       <function>Status</function> or <function>ConnectionBad</function> methods.-->

       <emphasis><function>PgDatabase</function></emphasis>――新たにバックエンドデータベースサーバーへの接続を確立します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>PgDatabase()</tertiary></indexterm><indexterm><primary>PgDatabase()</primary></indexterm></para>


<synopsis>
PgDatabase(const char *conninfo)
</synopsis>

<para>PgDatabaseがオブジェクトを生成した後、まずオブジェクトに問い合わせを送る前に、接続が成功したか確認しておく必要があります。これはPgDatabaseオブジェクトから現在の状態を<function>Status</function>メソッド、または<function>ConnectionBad</function>メソッド読み込めば簡単にできます。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>DBName</function>
       Returns the name of the current database.-->
       <emphasis><function>DBName</function></emphasis>――現在のデータベース名を返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>PgDatabase()</tertiary></indexterm><indexterm><primary>PgDatabase()</primary></indexterm></para>

<synopsis>
const char *PgConnection::DBName()
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>Notifies</function>
       Returns the next notification from a list of unhandled notification messages 
       received from the backend.-->

       <emphasis><function>Notifies</function></emphasis>――バックエンドより受信した通知メッセージのリストの中から未処理のものを順に返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>Notifies()</tertiary></indexterm><indexterm><primary>Notifies()</primary></indexterm></para>

<synopsis>
PGnotify* PgConnection::Notifies()
</synopsis>
<para><!--See PQnotifies() for details.-->詳細についてはPQnotifies()を参照してください。
      </para>
     </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="libpqpp-exec">
   <title><!--Query Execution Functions-->問い合わせ実行関数</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="といあわせじっこうかんすう">問い合わせ実行関数</tertiary></indexterm>

<sect2 id="libpqpp-exec-main">
  <title><!--Main Routines-->メインルーチン</title>
    <itemizedlist>
     <listitem>
      <para>
       <!--<function>Exec</function>
       Sends a query to the backend server.  It's probably more desirable to
       use one of the next two functions.-->

       <emphasis><function>Exec</function></emphasis>――問い合わせをバックエンドサーバーに送信します。しかし、この次に出てくる2つの関数のいずれかを呼び出す方がよいでしょう。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>Exec()</tertiary></indexterm><indexterm><primary>Exec()</primary></indexterm></para>


<synopsis>
ExecStatusType PgConnection::Exec(const char* query)
</synopsis>
       <!--Returns the result of the query. The following status results can be expected:-->
<para>問い合わせの結果の状態を返します。可能性のある状態結果は以下のとおりです。
</para>

       <simplelist>
	<member>
	 PGRES_EMPTY_QUERY
	</member>
	<member>
	 <!--PGRES_COMMAND_OK, if the query was a command-->
         PGRES_COMMAND_OK（問い合わせがコマンドだった場合）
	</member>
	<member>
	 <!--PGRES_TUPLES_OK, if the query successfully returned tuples-->
         PGRES_TUPLES_OK（問い合わせがタプルを返すのに成功した場合）
	</member>
	<member>
	 PGRES_COPY_OUT
	</member>
	<member>
	 PGRES_COPY_IN
	</member>
	<member>
	 <!--PGRES_BAD_RESPONSE, if an unexpected response was received-->
         PGRES_BAD_RESPONSE（予期しない応答を受信した場合）
	</member>
	<member>
	 PGRES_NONFATAL_ERROR
	</member>
	<member>
	 PGRES_FATAL_ERROR
	</member>
       </simplelist>
     </listitem>
     <listitem>
      <para>
       <!--<function>ExecCommandOk</function>
       Sends a command query to the backend server.-->

       <emphasis><function>ExecCommandOk</function></emphasis>――バックエンドサーバーへ問い合わせを送信します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>ExecCommandOk()</tertiary></indexterm><indexterm><primary>ExecCommandOk()</primary></indexterm></para>


<synopsis>
int PgConnection::ExecCommandOk(const char *query)
</synopsis>
       <!--Returns TRUE if the command query succeeds.-->
<para>問い合わせの実行に成功すればTRUEを返します。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>ExecTuplesOk</function>
       Sends a command query to the backend server.-->

       <emphasis><function>ExecTuplesOk</function></emphasis>――バックエンドサーバーへ問い合わせを送信します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>ExecTuplesOk()</tertiary></indexterm><indexterm><primary>ExecTuplesOk()</primary></indexterm></para>

<synopsis>
int PgConnection::ExecTuplesOk(const char *query)
</synopsis>
       <!--Returns TRUE if the command query succeeds.-->
<para>問い合わせの実行に成功すればTRUEを返します。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>ErrorMessage</function>
       Returns the last error message text.-->
       <emphasis><function>ErrorMessage</function></emphasis>――最後に出力されたエラーメッセージテキストを返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>ErrorMessage()</tertiary></indexterm><indexterm><primary>ErrorMessage()</primary></indexterm></para>

<synopsis>
const char *PgConnection::ErrorMessage()
</synopsis>
     </listitem>
</itemizedlist>
</sect2>

<sect2 id="libpqpp-exec-select-info">
  <title><!--Retrieving SELECT Result Information-->SELECT結果情報の取り出し</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="SELECTけっかじょうほうのとりだし">SELECT結果情報の取り出し</tertiary></indexterm>

<itemizedlist>
     <listitem>
      <para>
       <!--<function>Tuples</function>
       Returns the number of tuples (rows) in the query result. -->
       <emphasis><function>Tuples</function></emphasis>――問い合わせ結果のタプル（行）数を返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>Tuples()</tertiary></indexterm></para>

<synopsis>
int PgDatabase::Tuples()
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>Fields</function>
       Returns the number of fields (attributes) in each tuple of the query result. -->

       <emphasis><function>Fields</function></emphasis>――問い合わせ結果のタプルに含まれるフィールド（属性）の数を返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>Fields()</tertiary></indexterm><indexterm><primary>Fields()</primary></indexterm></para>

<synopsis>
int PgDatabase::Fields()
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>FieldName</function>
       Returns the field (attribute) name associated with the given field index. 
       Field indices start at 0. -->

       <emphasis><function>FieldName</function></emphasis>――与えられたフィールド（属性）のインデックスに対応するフィールド名を返します。フィールドのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>FieldName()</tertiary></indexterm><indexterm><primary>FieldName()</primary></indexterm></para>


<synopsis>
const char *PgDatabase::FieldName(int field_num)
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>FieldNum</function>
       PQfnumber Returns the field (attribute) index associated with 
       the given field name. -->

       <emphasis><function>FieldNum</function></emphasis>――与えられたフィールド（属性）名に対応するフィールドのインデックスを返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>FieldNum()</tertiary></indexterm><indexterm><primary>FieldNum()</primary></indexterm>
</para>


<synopsis>
int PgDatabase::FieldNum(const char* field_name)
</synopsis>

<para>
       <!---1 is returned if the given name does not match any field.-->
       与えられた名前がどのフィールドとも一致しない場合は-1を返します。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>FieldType</function>
       Returns the field type associated with the given field index. The 
       integer returned is an internal coding of the type. Field indices
       start at 0. -->

       <emphasis><function>FieldType</function></emphasis>――与えられたフィールドのインデックスに対応するフィールドの型を返します。返された整数は型に対する内部コードです。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>FieldType()</tertiary></indexterm><indexterm><primary>FieldType()</primary></indexterm>
</para>

<synopsis>
Oid PgDatabase::FieldType(int field_num)
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>FieldType</function>
       Returns the field type associated with the given field name. The 
       integer returned is an internal coding of the type. Field indices
       start at 0. -->

      <emphasis><function>FieldType</function></emphasis>――与えられたフィールド名に対応するフィールドの型を返します。返された整数は型に対する内部コードです。フィールドのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>FieldType()</tertiary></indexterm><indexterm><primary>FieldType()</primary></indexterm>
</para>

<synopsis>
Oid PgDatabase::FieldType(const char* field_name)
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>FieldSize</function>
       Returns the size in bytes of the field associated with the given 
       field index. Field indices start at 0. -->

       <emphasis><function>FieldSize</function></emphasis>――与えられたフィールドのインデックスに対応するフィールドのサイズをバイト数で返します。フィールドのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>FieldSize()</tertiary></indexterm><indexterm><primary>FieldSize()</primary></indexterm>
</para>

<synopsis>
short PgDatabase::FieldSize(int field_num)
</synopsis>

<para>
       <!--Returns the space allocated for this field in a database tuple given
       the field number. In other words the size of the server's binary 
       representation of the data type. -1 is returned if the field is 
       variable size.-->

       タプル内の指定されたフィールド番号に割り当てられた領域のサイズを返します。つまりこれは、このデータ型のサーバーにおけるバイナリ表現のサイズです。フィールドが可変長の場合は-1を返します。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>FieldSize</function>
       Returns the size in bytes of the field associated with the given 
       field index. Field indices start at 0. -->

       <emphasis><function>FieldSize</function></emphasis>――与えられたフィールド名に対応するフィールドのサイズをバイト数で返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>FieldSize()</tertiary></indexterm><indexterm><primary>FieldSize()</primary></indexterm>
</para>


<synopsis>
short PgDatabase::FieldSize(const char *field_name)
</synopsis>

<para>
       <!--Returns the space allocated for this field in a database tuple given
       the field name. In other words the size of the server's binary 
       representation of the data type. -1 is returned if the field is 
       variable size.-->

       タプル内の指定されたフィールド名に割り当てられた領域のサイズを返します。つまりこれは、このデータ型のサーバーにおけるバイナリ表現のサイズです。フィールドが可変長の場合は-1を返します。
      </para>
     </listitem>
</itemizedlist>
</sect2>


<sect2 id="libpqpp-exec-select-values">
  <title><!--Retrieving SELECT Result Values-->SELECT結果値の取り出し</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="SELECTけっかちのちりだし">SELECT結果値の取り出し</tertiary></indexterm>

<itemizedlist>
     <listitem>
      <para>
       <!--<function>GetValue</function>
       Returns a single field (attribute) value of one tuple of a PGresult. 
       Tuple and field indices start at 0. -->

       <emphasis><function>GetValue</function></emphasis>――PGresultからタプルを1つ取り、その中からフィールド（属性）の値を1つ返します。タプルとフィールドのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>GetValue()</tertiary></indexterm><indexterm><primary>GetValue()</primary></indexterm>
</para>


<synopsis>
const char *PgDatabase::GetValue(int tup_num, int field_num)
</synopsis>

<para>
       <!--For most queries, the value returned by GetValue is a null-terminated 
       ASCII string representation of the attribute value. But if BinaryTuples() 
       is TRUE, the value returned by GetValue is the binary representation 
       of the type in the internal format of the backend server (but not including 
       the size word, if the field is variable-length). It is then the programmer's 
       responsibility to cast and convert the data to the correct C type. The 
       pointer returned by GetValue points to storage that is part of the 
       PGresult structure. One should not modify it, and one must explicitly 
       copy the value into other storage if it is to be used past the lifetime 
       of the PGresult structure itself.  BinaryTuples() is not yet implemented.-->

       ほとんどの問い合わせにおいて、GetValueの返す値は属性値をNULL終端のASCII文字列で表現したものとなります。しかしBinaryTuples()がTRUEの場合、GetValueが返す値はバックエンドサーバーの内部フォーマットによるバイナリ型表現です（ただしフィールドが可変長であっても、そのサイズを示すワードは含まれません）。したがって、これを正しいCの型にキャストして変換するのはプログラマの責任です。GetValueが返すポインタはPGresult構造体の記憶領域の一部ですから、これを変更してはいけません。もし値をPGresult構造体自身の寿命を超えて使うのであれば、明示的に別の記憶領域にコピーしなければいけません。BinaryTuples()はまだ実装されていません。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>BinaryTuples()</tertiary></indexterm>

      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>GetValue</function>
       Returns a single field (attribute) value of one tuple of a PGresult. 
       Tuple and field indices start at 0. -->

       <emphasis><function>GetValue</function></emphasis>――PGresultからタプルを1つ取り、その中からフィールド（属性）の値を1つ返します。タプルのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>GetValue()</tertiary></indexterm><indexterm><primary>GetValue()</primary></indexterm>
</para>


<synopsis>
const char *PgDatabase::GetValue(int tup_num, const char *field_name)
</synopsis>

<para>
       <!--For most queries, the value returned by GetValue is a null-terminated 
       ASCII string representation of the attribute value. But if BinaryTuples() 
       is TRUE, the value returned by GetValue is the binary representation 
       of the type in the internal format of the backend server (but not including 
       the size word, if the field is variable-length). It is then the programmer's 
       responsibility to cast and convert the data to the correct C type. The 
       pointer returned by GetValue points to storage that is part of the 
       PGresult structure. One should not modify it, and one must explicitly 
       copy the value into other storage if it is to be used past the lifetime 
       of the PGresult structure itself.  BinaryTuples() is not yet implemented.-->

       ほとんどの問い合わせにおいて、GetValueの返す値は属性値をNULL終端のASCII文字列で表現したものとなります。しかしBinaryTuples()がTRUEの場合、GetValueが返す値はバックエンドサーバーの内部フォーマットによるバイナリ型表現です（ただしフィールドが可変長であっても、そのサイズを示すワードは含まれません）。したがって、これを正しいCの型にキャストして変換するのはプログラマの責任です。GetValueが返すポインタはPGresult構造体の記憶領域の一部ですから、これを変更してはいけません。もし値をPGresult構造体自身の寿命を超えて使うのであれば、明示的に別の記憶領域にコピーしなければいけません。BinaryTuples()はまだ実装されていません。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>GetLength</function>
       Returns the length of a field (attribute) in bytes. Tuple and field 
       indices start at 0. -->

       <emphasis><function>GetLength</function></emphasis>――フィールド（属性）の長さをバイト数で返します。タプルとフィールドのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>GetLength()</tertiary></indexterm><indexterm><primary>GetLength()</primary></indexterm>
</para>


<synopsis>
int PgDatabase::GetLength(int tup_num, int field_num)
</synopsis>

<para>

       <!--This is the actual data length for the particular data value, that 
       is the size of the object pointed to by GetValue. Note that for
       ASCII-represented values, this size has little to do with the binary 
       size reported by PQfsize.-->

       これは個々のデータ値に対する実際のデータ長で、GetValueが指すオブジェクトのサイズです。なおASCII表現の値の場合、このサイズはPQfsizeで得られるバイナリサイズとはあまり関連しませんので、注意してください。

      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>GetLength</function>
       Returns the length of a field (attribute) in bytes. Tuple and field 
       indices start at 0. -->

       <emphasis><function>GetLength</function></emphasis>――フィールド（属性）の長さをバイト数で返します。タプルとフィールドのインデックスは0から始まります。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>GetLength()</tertiary></indexterm><indexterm><primary>GetLength()</primary></indexterm>
</para>

<synopsis>
int PgDatabase::GetLength(int tup_num, const char* field_name)
</synopsis>

<para>
       <!--This is the actual data length for the particular data value, that 
       is the size of the object pointed to by GetValue. Note that for
       ASCII-represented values, this size has little to do with the binary 
       size reported by PQfsize.-->

       これは個々のデータ値に対する実際のデータ長で、GetValueが指すオブジェクトのサイズです。なおASCII表現の値の場合、このサイズはPQfsizeで得られるバイナリサイズとはあまり関連しませんので、注意してください。

      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>DisplayTuples</function>
       Prints out all the tuples and, optionally, the attribute names to the 
       specified output stream. -->

       <emphasis><function>DisplayTuples</function></emphasis>――指定された出力ストリームにすべてのタプルと、必要ならば属性名も表示します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>DisplayTuples()</tertiary></indexterm><indexterm><primary>DisplayTuples()</primary></indexterm>
</para>

<synopsis>
void PgDatabase::DisplayTuples(FILE *out = 0, int fillAlign = 1, 
        const char* fieldSep = "|",int printHeader = 1, int quiet = 0)
</synopsis>
     </listitem>
     <listitem>
      <para>
       <!--<function>PrintTuples</function>
       Prints out all the tuples and, optionally, the attribute names to the 
       specified output stream. -->

       <emphasis><function>PrintTuples</function></emphasis>――指定された出力ストリームに、すべてのタプルと、必要ならば属性名も表示します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>PrintTuples()</tertiary></indexterm><indexterm><primary>PrintTuples()</primary></indexterm>
</para>

<synopsis>
void PgDatabase::PrintTuples(FILE *out = 0, int printAttName = 1, 
        int terseOutput = 0, int width = 0) 
</synopsis>
     </listitem>
</itemizedlist>
</sect2>

<sect2 id="libpqpp-exec-nonselect">
  <title><!--Retrieving Non-SELECT Result Information-->SELECT以外の結果情報の取り出し</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="SELECTいがいのけっかじょうほうのとりだし">SELECT以外の結果情報の取り出し</tertiary></indexterm>

<itemizedlist>
     <listitem>
      <para>
       <function>CmdTuples</function>
       <!--Returns the number of rows affected after an INSERT, UPDATE or DELETE. 
       If the command was anything else, it returns -1. -->

       <emphasis><function>CmdTuples</function></emphasis>――INSERT、UPDATE、DELETEが実行されて、影響があった行数を返します、それ以外のコマンドが実行された場合には、-1を返します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>CmdTuples()</tertiary></indexterm><indexterm><primary>CmdTuples()</primary></indexterm>
</para>

<synopsis>
      int PgDatabase::CmdTuples()
</synopsis>
     </listitem>

     <listitem>
      <para>
       <emphasis><function>OidStatus</function></emphasis>
</para>
<synopsis>
const char *PgDatabase::OidStatus()
</synopsis>
     </listitem>
</itemizedlist>
</sect2>

<sect2 id="libpqpp-exec-copy">
  <title><!--Handling COPY Queries-->COPYの問い合わせの操作</title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="COPYのといあわせのそうさ">COPYの問い合わせの操作</tertiary></indexterm>

<itemizedlist>
     <listitem>
      <para>
       <emphasis><function>GetLine</function></emphasis><indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>GetLine()</tertiary></indexterm>
</para>

<synopsis>
int PgDatabase::GetLine(char* string, int length)
</synopsis>
     </listitem>
     <listitem>
      <para>
       <emphasis><function>PutLine</function></emphasis><indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>PutLine()</tertiary></indexterm>
</para>

<synopsis>
void PgDatabase::PutLine(const char* string)
</synopsis>
     </listitem>
     <listitem>
      <para>
       <emphasis><function>EndCopy</function></emphasis><indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>EndCopy()</tertiary></indexterm>
</para>

<synopsis>
int PgDatabase::EndCopy()
</synopsis>
     </listitem>
</itemizedlist>

</sect2>
</sect1>

  <sect1 id="libpqpp-notify">
   <title><!--Asynchronous Notification-->非同期通知</title>
    <indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="ひどうきつうち">非同期通知</tertiary></indexterm><indexterm><primary sortas="ひどうきつうち">非同期通知</primary></indexterm><indexterm><primary sortas="つうち">通知</primary></indexterm>

   <para>
    <!--<productname>Postgres</productname> supports asynchronous notification 
    via the <command>LISTEN</command> and <command>NOTIFY</command>
    commands.  A backend registers its interest in a particular semaphore
    with the <command>LISTEN</command> command.
    All backends that are listening on a
    particular named semaphore will be notified asynchronously when 
    a <command>NOTIFY</command> of
    that name is executed by another backend.   No additional
    information is passed from the notifier to the listener.  Thus,
    typically, any actual data that needs to be communicated is transferred
    through the relation.-->

    <productname>Postgres</productname>は、<command>LISTEN</command>と<command>NOTIFY</command>コマンドによる非同期通知機能をサポートしています。バックエンドは<command>LISTEN</command>コマンドを受け取ると、特定のセマフォへ関心を持ったことを登録します。名前のついた特定のセマフォを見ているすべてのバックエンドは、他のバックエンドによって同じ名前の<command>NOTIFY</command>コマンドが実行された時点で非同期的に通知されます。ただし通知の発行側から受信側へ渡される付加的な情報はありません。したがって、典型的にはリレーションを通じ、両者の間で交換すべき実際のデータを転送することになります。
</para>

    <note>
     <para>
      <!--In the past, the documentation has associated the names used for asyncronous
      notification with relations or classes. However, there is in fact no
      direct linkage of the two concepts in the implementation, and the
      named semaphore in fact does not need to have a corresponding relation
      previously defined.-->

      以前のドキュメントでは、非同期通知に使う名前とリレーション（クラス）を関連するものとしていました。しかし現実には、実装がこの2つの概念を直接結び付けている部分は何1つありません。そして以前定義していたように、名前付きセマフォが対応するリレーションを持つ必要性も実際にはありません。
     </para>
    </note>

   <para>
    <!--<filename>libpq++</filename> applications are notified whenever a 
    connected backend has
    received an asynchronous notification.  However, the communication from
    the backend to the frontend is not asynchronous.  
    The <filename>libpq++</filename> application
    must poll the backend to see if there is any pending notification
    information.  After the execution of a query, a frontend may call 
    <function>PgDatabase::Notifies</function>
    to see if any notification data is currently available from the backend. 
    <function>PgDatabase::Notifies</function>
    returns the notification from a list of unhandled notifications from the
    backend. The function eturns NULL if there is no pending notifications from the
    backend.   
    <function>PgDatabase::Notifies</function>
    behaves like the popping of a stack.  Once a notification is returned
    from <function>PgDatabase::Notifies</function>,
    it is considered handled and will be removed from the list of
    notifications.-->

    接続しているバックエンドが非同期通知を受けるたびに、<filename>libpq++</filename>アプリケーションもその通知を受けます。しかしバックエンドからフロントエンドへの通信は非同期的なものではありません。<filename>libpq++</filename>アプリケーションは保留中の通知情報がないかどうか確認するために、バックエンドへのポーリングをしなければいけないのです。フロントエンドは<function>PgDatabase::Notifies</function>を問い合わせ実行の後に呼び出し、その時点でバックエンドから通知データが届いていないか確認することができます。<function>PgDatabase::Notifies</function>はバックエンドから届いた通知の未処理分リストから、1つ通知を返します。バックエンドからの通知が何も保留されていなければ、この関数はNULLを返します。<function>PgDatabase::Notifies</function>の動作はスタックのポップのようなものです。いったん<function>PgDatabase::Notifies</function>が通知を返すとその通知はもはや処理が済んだものとみなされ、通知リストから取り除かれます。
</para>

    <itemizedlist>
     <listitem>
      <para>
       <!--<function>PgDatabase::Notifies</function>
       retrieves pending notifications from the server.-->

       <emphasis><function>Notifies</function></emphasis>――サーバーから保留中の通知を取り出します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>Notifies()</tertiary></indexterm><indexterm><primary>Notifies()</primary></indexterm>
</para>

<synopsis>
PGnotify* PgDatabase::Notifies()
</synopsis>
     </listitem>
    </itemizedlist>

   <para>
    <!--The second sample program gives an example of the use of asynchronous
    notification.-->

    なお、2つ目のサンプルプログラムが非同期通知を使用した例です。
   </para>
  </sect1>

  <sect1 id="libpqpp-copy">
   <title><!--Functions Associated with the COPY Command-->
          COPYコマンドに関連する関数
   </title>
<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary sortas="COPYこまんどかんれん">COPYコマンド関連</tertiary></indexterm>

   <para>
    <!--The <command>copy</command> command in <productname>Postgres</productname> 
    has options to read from or write to the network
    connection used by <filename>libpq++</filename>.  
    Therefore, functions are necessary to
    access this network connection directly so applications may take full
    advantage of this capability.-->

    <productname>Postgres</productname>の<command>copy</command>コマンドは<filename>libpq++</filename>が使っているネットワーク接続に対して読み込み、あるいは書き込みを選ぶことができるようになっています。そこで、このネットワーク接続に直接アクセスするための関数が必要になります。もちろんアプリケーションもこの機能によって十分な恩恵を受けるでしょう。
</para>

    <itemizedlist>
     <listitem>
      <para>
       <!--<function>PgDatabase::GetLine</function>
       reads a newline-terminated line of characters (transmitted by the
       backend server) into a buffer 
       <replaceable class="parameter">string</replaceable>
       of size <replaceable class="parameter">length</replaceable>.-->

        <emphasis><function>GetLine</function></emphasis>――改行で終端する文字列（バックエンドから送信されたもの）を、長さが<replaceable class="parameter">length</replaceable>の<replaceable class="parameter">string</replaceable>に読み込みます。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>GetLine()</tertiary></indexterm><indexterm><primary>GetLine()</primary></indexterm>
</para>

<synopsis>
int PgDatabase::GetLine(char* string, int length)
</synopsis>

      <para>
       <!--Like the Unix system routine
       <function>fgets (3)</function>,
       this routine copies up to 
       <literal><replaceable class="parameter">length</replaceable>-1</literal>
       characters into 
       <replaceable class="parameter">string</replaceable>.
       It is like 
       <function>gets (3)</function>,
       however, in that it converts the terminating newline into a null
       character.-->

       Unixシステムルーチンの<function>fgets (3)</function>と同様に、このルーチンは<replaceable class="parameter">string</replaceable>に最大<literal><replaceable class="parameter">length</replaceable>-1</literal>個の文字をコピーします。しかし終端の改行がNULL文字に置き換えられる点では、<function>gets (3)</function>に似ています。

      </para>
      <para>
       <!--<function>PgDatabase::GetLine</function>
       returns EOF at end of file, 0 if the entire line has been read, and 1 if the
       buffer is full but the terminating newline has not yet been read.-->

       <function>PgDatabase::GetLine</function>は、ファイル終端でEOFを返し、行全体が読み込まれれば0を返します。そして、まだ終端の改行が読み込まれていないうちにバッファがいっぱいになってしまった場合は1を返します。

      </para>
      <para>
       <!--Notice that the application must check to see if a new line consists
       of a single period ("."), which indicates that the backend
       server has finished sending the results of the 
       <command>copy</command>.
       Therefore, if the application ever expects to receive lines
       that are more than
       <literal><replaceable class="parameter">length</replaceable>-1</literal>
       characters long, the application must be sure to check the return
       value of <function>PgDatabase::GetLine</function> very carefully.-->

       アプリケーションでは、新しく読み込んだ行がピリオド1文字（"."）であるかどうかの確認を必ず行わなければいけません。この文字は<command>copy</command>コマンドの結果をバックエンドサーバーが送信し終えたことを示すものです。したがって<literal><replaceable class="parameter">length</replaceable>-1</literal>文字を超える行の受信が想定されるのであれば、アプリケーションは<function>PgDatabase::GetLine</function>が返す値をよく注意して、確実にチェックを行わなければいけません。

      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>PgDatabase::PutLine</function>
       Sends a null-terminated <replaceable class="parameter">string</replaceable>
       to the backend server.-->

       <emphasis><function>PutLine</function></emphasis>――NULL終端の文字列<replaceable class="parameter">string</replaceable>をバックエンドサーバーに送信します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>PutLine()</tertiary></indexterm><indexterm><primary>PutLine()</primary></indexterm>
</para>


<synopsis>
void PgDatabase::PutLine(char* string)
</synopsis>

      <para>
       <!--The application must explicitly send a single period character (".")
       to indicate to the backend that it has finished sending its data.-->

       アプリケーションはデータ送信の完了をバックエンドに示すために、ピリオド1文字（「.」）を明示的に送信しなければいけません。
      </para>
     </listitem>
     <listitem>
      <para>
       <!--<function>PgDatabase::EndCopy</function>
       syncs with the backend.-->

       <emphasis><function>EndCopy</function></emphasis>――バックエンドと同期します。<indexterm><primary>libpq++</primary><secondary sortas="かんすう">関数</secondary><tertiary>EndCopy()</tertiary></indexterm><indexterm><primary>EndCopy()</primary></indexterm>
</para>

<synopsis>
int PgDatabase::EndCopy()
</synopsis>

<para>
       <!--This function waits until the backend has
       finished processing the <command>copy</command>.
       It should either be issued when the
       last string has been sent to the backend using
       <function>PgDatabase::PutLine</function>
       or when the last string has been received from the backend using
       <function>PgDatabase::GetLine</function>.
       It must be issued or the backend may get "out of sync" with
       the frontend.  Upon return from this function, the backend is ready to
       receive the next query.-->

       この関数は、バックエンドが<command>copy</command>の処理を完了するまで待ち、<function>PgDatabase::PutLine</function>を使ったバックエンドへの文字列送信が完了した時点、または<function>PgDatabase::GetLine</function>を使ったバックエンドからの文字列受信が完了した時点ののいずれかで呼び出される必要があります。呼び出されなければ、バックエンドがフロントエンドとの「同期ずれ」を起こしてしまうかもしれません。この関数から戻った時点でバックエンドの次の問い合わせを受ける準備が整います。

      </para>
      <para>
       <!--The return value is 0 on successful completion, nonzero otherwise.-->
       同期が成功すれば0を、そうでなければ0以外の値を返します。
      </para>
     </listitem>
    </itemizedlist>
   <para>
    <!--As an example:-->以下に例を示します。</para>
    
<programlisting>
PgDatabase data;
data.Exec("create table foo (a int4, b char(16), d double precision)");
data.Exec("copy foo from stdin");
data.PutLine("3&bsol;tHello World&bsol;t4.5&bsol;n");
data.PutLine("4&bsol;tGoodbye World&bsol;t7.11&bsol;n");
&amp;...
data.PutLine("&bsol;&bsol;.&bsol;n");
data.EndCopy();
</programlisting>
  </sect1>

 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:("/usr/lib/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->
