<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ecpg.sgml,v 1.8 2001/09/11 08:36:02 k-kondo Exp $
-->

 <chapter id="ecpg">
  <docinfo>
   <authorgroup>
    <author>
     <firstname>Linus</firstname>
     <surname>Tolke</surname>
    </author>
    <author>
     <firstname>Michael</firstname>
     <surname>Meskes</surname>
    </author>
   </authorgroup>
   <copyright>
    <year>1996-1997</year>
    <holder>Linus Tolke</holder>
   </copyright>
   <copyright>
    <year>1998</year>
    <holder>Michael Meskes</holder>
   </copyright>
   <!-- <date>Transcribed 1998-02-12</date> -->
   <date>1998-02-12更新</date>
  </docinfo>

  <!-- <title><application>ecpg</application> - Embedded <acronym>SQL</acronym> 
   in <acronym>C</acronym></title> -->

<title><application>ecpg</application>――<acronym>C</acronym>言語での埋め込み<acronym>SQL</acronym> 
   </title>
<indexterm><primary>ecpg</primary></indexterm><indexterm><primary>SQL</primary><secondary sortas="うめこみSQL">埋め込みSQL</secondary></indexterm>
<indexterm><primary sortas="うめこみSQL">埋め込みSQL</primary></indexterm>
  <para>
   <!-- This describes an embedded <acronym>SQL</acronym> in <acronym>C</acronym> 
   package for <productname>Postgres</productname>.
   It was written by Linus Tolke (<email>linus@epact.se</email>)
   and Michael Meskes (<email>meskes@debian.org</email>).
   The package is installed with the <productname>Postgres</> distribution. -->

   これは<acronym>C</acronym>に埋め込まれた<acronym>SQL</acronym>についての説明です。Linus Tolke（<email>linus@epact.se</email>）とMichael Meskes（<email>meskes@debian.org</email>）によって書かれました。このパッケージは<productname>Postgres</>配布と一緒にインストールされます。
</para>

   <note>
    <para>
     <!-- Permission is granted to copy and use in the same way as you are allowed
     to copy and use the rest of <productname>PostgreSQL</productname>. -->
 
     このパッケージは<productname>PostgreSQL</productname>の他の部分と同じように、コピーして使うことが許されています。

    </para>
   </note>

  <sect1 id="ecpg-why">
   <!-- <title>Why Embedded <acronym>SQL</acronym>?</title> -->
   <title>なぜ埋め込み<acronym>SQL</acronym>なのか？</title>

   <para>
    <!-- Embedded <acronym>SQL</acronym> has some small advantages over other ways 
    to handle <acronym>SQL</acronym>
    queries. It takes care of all the tedious moving of information to and
    from variables in your <acronym>C</acronym> program. 
    Many <acronym>RDBMS</acronym> packages
    support this embedded language. -->

    埋め込み<acronym>SQL</acronym>には、他の<acronym>SQL</acronym>問い合わせの処理法にはないいくつかの利点があります。埋め込みSQLは<acronym>C</acronym>プログラムの変数との面倒な情報移動を処理してくれます。<acronym>RDBMS</acronym>パッケージの多くはこの埋め込み言語をサポートしています。
    
   </para>

   <!-- <para> There is an ANSI-standard describing how the embedded language should
    work. <application>ecpg</application> was designed to meet this standard 
    as much as possible. So it is
    possible to port programs with embedded <acronym>SQL</acronym> written for
    other <acronym>RDBMS</acronym> packages to
    <productname>Postgres</productname> and thus promoting the spirit of free
    software.
   </para> -->

   <para>ANSI標準では埋め込み言語がどのようにあるべきか説明されています。<application>ecpg</application>はできるだけこの標準に合うように設計されています。ですから他の<acronym>RDBMS</acronym>パッケージ用に書かれた埋め込み<acronym>SQL</acronym>を<productname>Postgres</productname>に移植することも可能で、フリーソフトウェア精神の促進にもつながります。</para>

  </sect1>

  <sect1 id="ecpg-concept">
   <!-- <title>The Concept</title> -->
   <title>概念</title>

   <para>
    <!-- You write your program in <acronym>C</acronym> with some 
    special <acronym>SQL</acronym> things.
    For declaring variables that can be used in 
    <acronym>SQL</acronym> statements you need to
    put them in a special declare section.
    You use a special syntax for the <acronym>SQL</acronym> queries. -->

    <acronym>SQL</acronym>の特殊な機能をいくつか使って<acronym>C</acronym>でプログラムを書いたとします。<acronym>SQL</acronym>文の中で使うことのできる変数を宣言するためには、特別な宣言セクションにそれらを置く必要があります。<acronym>SQL</acronym>の問い合わせには特別な構文を使います。

   </para>

   <para>
    <!-- Before compiling you run the file through 
    the embedded <acronym>SQL</acronym> <acronym>C</acronym>
    preprocessor and it converts the <acronym>SQL</acronym> statements you 
    used to function calls with the variables used as arguments. 
    Both variables that are used as input to the <acronym>SQL</acronym> 
    statements and variables that will contain the result are passed. -->

    コンパイルの前に埋め込み<acronym>SQL</acronym> <acronym>C</acronym>プリプロセッサからファイルを実行する必要があります。これは関数呼び出しのために使った<acronym>SQL</acronym>文を、引数として使われる変数と置き換えます。<acronym>SQL</acronym>文への引数として使われる変数と結果を格納する変数の両方が渡されます。

   </para>

   <para>
    <!-- Then you compile and at link time you link with a special library that
    contains the functions used. These functions (actually it is mostly one
    single function) fetches the information from the arguments, performs
    the <acronym>SQL</acronym> query using the ordinary interface 
    (<filename>libpq</filename>) and puts back
    the result in the arguments dedicated for output. -->

    そしてコンパイルをし、使われている関数を持つ特別なライブラリをリンク時にリンクしてください。これらの関数は（大体においては1つですが）、引数から情報を取り出し、通常のインターフェイス（<filename>libpq</filename>）を使った<acronym>SQL</acronym>問い合わせを実行します。そして結果を返り値用の引数に入れて返します。
   </para>

   <para>
    <!-- Then you run your program and when the control arrives to 
    the <acronym>SQL</acronym>
    statement the <acronym>SQL</acronym> statement is performed against 
    the database and you
    can continue with the result. -->

    そしてプログラムを実行すると、制御が<acronym>SQL</acronym>文に達したときにデータベースに対してその<acronym>SQL</acronym>文を実行します。</para>
  </sect1>

  <sect1 id="ecpg-use">
   <!-- <title>How To Use <application>ecpg</application></title> -->
   <title><application>ecpg</application>の使い方</title>
<indexterm><primary>ecpt</primary><secondary sortas="つかいかた">使い方</secondary></indexterm>
   <para>
    <!-- This section describes how to use the <application>ecpg</application> tool. -->
    このセクションは<application>ecpg</application>ツールの使い方を説明します。
   </para>

   <sect2>
<!--    <title>Preprocessor</title> -->
    <title>プリプロセッサ</title>
<indexterm><primary>ecpg</primary><secondary sortas="ぷりぷろせっさ">プリプロセッサ</secondary></indexterm>
    <para>
     <!-- The preprocessor is called <application>ecpg</application>. 
     After installation it resides in
     the <productname>Postgres</productname> <filename>bin/</filename> directory. -->

     プリプロセッサは<application>ecpg</application>と呼ばれます。<productname>Postgres</productname>の<filename>bin/</filename>ディレクトリにインストールされています。
 
    </para>
   </sect2>
   <sect2>
    <!-- <title>Library</title> -->
    <title>ライブラリ</title>
<indexterm><primary>ecpg</primary><secondary sortas="らいぶらり">ライブラリ</secondary></indexterm>
    <para>
     <!-- The <application>ecpg</application> library is called 
     <filename>libecpg.a</filename> or
     <filename>libecpg.so</filename>. Additionally, the library
     uses the <filename>libpq</filename> library for communication to the 
     <productname>Postgres</productname> server so you will
     have to link your program with <Parameter>-lecpg -lpq</parameter>. -->

     <application>ecpg</application>ライブラリは、<filename>libecpg.a</filename>もしくは<filename>libecpg.so</filename>と呼ばれます。さらに、このライブラリは<productname>Postgres</productname>サーバーとの通信に<filename>libpq</filename>ライブラリを使うので、プログラムを<Parameter>-lecpg -lpq</parameter>とリンクしておく必要があります。
    </para>

    <para>
     <!-- The library has some methods that are "hidden" but that could prove very
     useful sometime. -->

     このライブラリはいくつか「隠された」メソッドを持っていて、とても便利な場合があります。
</para>

     <itemizedlist>
      <listitem>
       <para>
	<!-- <function>ECPGdebug(int <replaceable>on</replaceable>, FILE
	 *<replaceable>stream</replaceable>)</function>
	turns on debug logging if called with the first argument non-zero.
	Debug logging is done on <replaceable>stream</replaceable>.
	Most <acronym>SQL</acronym> statement logs its arguments and result. -->

        <function>ECPGdebug(int <replaceable>on</replaceable>, FILE *<replaceable>stream</replaceable>)</function>――0以外の第1引数で渡された場合、デバッグログをonにします。デバッグログは<replaceable>stream</replaceable>で実行されます。ほとんどの<acronym>SQL</acronym>文は引数と結果をログに出します。<indexterm><primary>ECPGdebug()</primary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>ECPGdebug()</secondary></indexterm>

       </para>

       <para>
	<!-- The most important one (<function>ECPGdo</function>) 
	that is called on almost all <acronym>SQL</acronym>
	statements logs both its expanded string,
	i.e. the string
	with all the input variables inserted, and the result from the
	<productname>Postgres</productname> server.
	This can be very useful when searching for errors
	in your <acronym>SQL</acronym> statements. -->

        ほとんどの<acronym>SQL</acronym>文で呼ばれる最も重要な関数<function>ECPGdo</function>は、拡張された文字列（たとえばすべての引数用変数が挿入されたもの）と<productname>Postgres</productname>サーバーからの結果の両方をログに出力します。<acronym>SQL</acronym>文のエラーを探すのにはとても便利です。

       </para>
      </listitem>

      <listitem>
       <para>
	<function>ECPGstatus()</function><!-- This method returns TRUE if we are connected to a database and FALSE if not. -->――このメソッドはデータベースと接続されている場合TRUEを返し、それ以外はFALSEを返します。<indexterm><primary>ECPGstatus()</primary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>ECPGstatus()</secondary></indexterm>

       </para>
      </listitem>
     </itemizedlist>
   </sect2>

   <sect2>
    <!-- <title>Error handling</title> -->
    <title>エラー処理</title>
<indexterm><primary>ecpg</primary><secondary sortas="えらーしょり">エラー処理</secondary></indexterm>
    <para>
     <!-- To be able to detect errors from the <productname>Postgres</productname> 
     server you include a line like -->

     <productname>Postgres</productname>サーバーからのエラーを見つけるためにはファイルのincludeセクションに下記のような行を追加してください。
</para>

<programlisting>
exec sql include sqlca;
</programlisting>

<para>
     <!-- in the include section of your file. This will define a struct and a
     variable with the name <Parameter>sqlca</parameter> as following: -->

     この一文は下記のような<Parameter>sqlca</parameter>という名前の構造体と変数を定義します。
</para>

<programlisting>
struct sqlca
{
 char sqlcaid[8];
 long sqlabc;
 long sqlcode;
 struct
 {
  int sqlerrml;
  char sqlerrmc[70];
 } sqlerrm;
 char sqlerrp[8];
 long sqlerrd[6];
<!-- /* 0: empty                                         */
 /* 1: OID of processed tuple if applicable          */
 /* 2: number of rows processed in an INSERT, UPDATE */
 /*    or DELETE statement                           */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */-->
 /* 0: 空                                            */
 /* 1: 処理されたタプルの OID（あるならば）          */
 /* 2: INSERT、UPDATE、DELTE で処理された行数        */
 /* 3: 空                                            */
 /* 4: 空                                            */
 /* 5: 空                                            */
 char sqlwarn[8];
<!-- /* 0: set to 'W' if at least one other is 'W'       */
 /* 1: if 'W' at least one character string	     */
 /*    value was truncated when it was               */
 /*    stored into a host variable.                  */
 /* 2: empty                                         */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 /* 6: empty                                         */
 /* 7: empty                                         */-->
 /* 0: 少なくともどれかが 'W'ならば'W'               */
 /* 1: 'W' ならば、少なくとも 1 つの文字列がホストの */
 /*    変数に保存されるときに切りつめられている      */
 /* 2: 空                                            */
 /* 3: 空                                            */
 /* 4: 空                                            */
 /* 5: 空                                            */
 /* 6: 空                                            */
 /* 7: 空                                            */
 char sqlext[8];
} sqlca;
</programlisting>

    <para>
     <!-- If an error occured in the last <acronym>SQL</acronym> statement 
     then <Parameter>sqlca.sqlcode</parameter>
     will be non-zero. If <Parameter>sqlca.sqlcode</parameter> is less that 0
     then this is
     some kind of serious error, like the database definition does not match
     the query given. If it is bigger than 0 then this is a normal error like
     the table did not contain the requested row. -->

     もし上の<acronym>SQL</acronym>文でエラーが発生した場合、<Parameter>sqlca.sqlcode</parameter>が0以外になります。もし<Parameter>sqlca.sqlcode</parameter>がその0よりも小さい場合、データベース定義が与えられた問い合わせと合わないといった深刻なエラーです。もし0以上だった場合はテーブルが要求された行を含まないといった通常のエラーです。<indexterm><primary>sqlca.sqlcode</primary></indexterm><indexterm><primary>ecpg</primary><secondary>sqlca.sqlcode</secondary></indexterm>
    </para>

    <para>
     <!-- sqlca.sqlerrm.sqlerrmc will contain a string that describes the error.
     The string ends with the line number
     in the source file. -->

     sqlca.sqlerrm.sqlerrmcは、エラーを説明する文字列を持っています。その文字列はソースファイルの行数で終わります。<indexterm><primary>sqlca.sqlerrm.sqlerrmc</primary></indexterm><indexterm><primary>ecpg</primary><secondary>sqlca.sqlerrm.sqlerrmc</secondary></indexterm>

    </para>

    <para>
     <!-- List of errors that can occur: -->
     起こり得るエラーを以下に示します。
	</para>

     <variablelist>
      <varlistentry>
       <term>-12, Out of memory in line %d.</term>
       <listitem>
	<para>
	 <!-- Does not normally occur. This is a sign that your virtual memory is
	 exhausted. -->

         通常は起こりません。仮想メモリに空きがないことを知らせるものです。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-200, Unsupported type %s on line %d.</term>
       <listitem>
	<para>
	 <!-- Does not normally occur. This is a sign that the preprocessor has
	 generated something that the library does not know about. Perhaps you
	 are running incompatible versions of the preprocessor and the library. -->

         通常は起こりません。ライブラリの知らないものをプリプロセッサが作ったことを知らせます。プリプロセッサとライブラリのバージョンが相容れないものを使っている可能性があります。
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-201, Too many arguments line %d.</term>
       <listitem>
	<para>
	 <!-- This means that <productname>Postgres</productname> has 
         returned more arguments than we have
	 matching variables. Perhaps you have forgotten a couple of the host
	 variables in the <command>INTO :var1,:var2</command>-list. -->

         <productname>Postgres</productname>が、持っている変数より多い引数を返した場合です。おそらく<command>INTO :var1,:var2</command>リストでいくつかのホスト変数を忘れたのでしょう。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-202, Too few arguments line %d.</term>
       <listitem>
	<para>
	 <!-- This means that <productname>Postgres</productname> has returned fewer
	 arguments than we have
	 host variables. Perhaps you have too many host variables in the 
	 <command>INTO :var1,:var2</command>-list. -->

         <productname>Postgres</productname>が、持っているホスト変数より少ない引数を返した場合です。おそらく<command>INTO :var1,:var2</command>リストにホスト変数を多く入れすぎています。

	</para> 
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-203, Too many matches line %d.</term>
       <listitem>
	<para>
	 <!-- This means that the query has returned several lines but the
	 variables specified are no arrays. The <command>SELECT</command> you made
	 probably was not unique. -->

         問い合わせが数行を返したにもかかわらず、指定された変数が配列になっていないことを示します。入力した<command>SELECT</command>が一意なものではなかったのでしょう。
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-204, Not correctly formatted int type: %s line %d.</term>
       <listitem>
	<para>
	 <!-- This means that the host variable is of an <type>int</type> type and the field
	 in the <productname>Postgres</productname> database is of another type and 
	 contains a value that cannot be interpreted as an <type>int</type>. 
	 The library uses <function>strtol</function>
	 for this conversion. -->

         ホスト変数が<type>int</type>型で<productname>Postgres</productname>データベースのフィールドが<type>int</type>では表せない別の型を含んでいることを示します。ライブラリはこの変換に<function>strtol</function>を使います。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-205, Not correctly formatted unsigned type: %s line %d.</term>
       <listitem>
	<para>
	 <!-- This means that the host variable is of an <type>unsigned int</type> type and
	 the field in the <productname>Postgres</productname> database is of another 
	 type and contains a
	 value that cannot be interpreted as an <type>unsigned int</type>. The library
	 uses <function>strtoul</function> for this conversion. -->

         ホスト変数が<type>unsigned int</type>型で<productname>Postgres</productname>データベースのフィールドが<type>unsigned int</type>型では表せない型を含んでいることを示します。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-206, Not correctly formatted floating point type: %s line %d.</term>
       <listitem>
	<para>
	 <!-- This means that the host variable is of a <type>float</type> type and
	 the field in the <productname>Postgres</productname> database is of another 
	 type and contains a
	 value that cannot be interpreted as an <type>float</type>. The library
	 uses <function>strtod</function> for this conversion. -->

         ホスト変数が<type>float</type>型で<productname>Postgres</productname>データベースのフィールドが<type>float</type>では表せない別の型を含んでいるということを示します。ライブラリはこの変換に<function>strtod</function>を使います。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-207, Unable to convert %s to bool on line %d.</term>
       <listitem>
	<para>
	 <!-- This means that the host variable is of a <type>bool</type> type and
	 the field in the <productname>Postgres</productname> database is neither 't'
	 nor 'f'. -->

         ホスト変数が<type>bool</type>型で<productname>Postgres</productname>データベースのフィールドが't'でも'f'でもないということを示します。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-208, Empty query line %d.</term>
       <listitem>
	<para>
	 <!-- <productname>Postgres</productname> returned PGRES_EMPTY_QUERY, probably
	 because the query indeed was empty. -->

         おそらく問い合わせが空だったために、<productname>Postgres</productname>がPGRES_EMPTY_QUERYを返しました。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-220, No such connection %s in line %d.</term>
       <listitem>
	<para>
	 <!-- The program tries to access a connection that does not exist. -->
         プログラムが存在しない接続にアクセスしようとしています。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-221, Not connected in line %d.</term>
       <listitem>
	<para>
	 <!-- The program tries to access a connection that does exist but is not open. -->
         プログラムが、存在するけれども開いていない接続にアクセスしようとしています。
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-230, Invalid statement name %s in line %d.</term>
       <listitem>
	<para>
	 <!-- The statement you are trying to use has not been prepared. -->
         使おうとしている文が用意されていません。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-400, Postgres error: %s line %d.</term>
       <listitem>
	<para>
	 <!-- Some <productname>Postgres</productname> error. 
	 The message contains the error message from the
	 <productname>Postgres</productname> backend. -->

         <productname>Postgres</productname>のエラーです。このメッセージは<productname>Postgres</productname>のバックエンドからのエラーメッセージを含んでいます。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-401, Error in transaction processing line %d. </term>
       <listitem>
	<para>
	 <!-- <productname>Postgres</productname> signalled to us that we 
         cannot start, commit or rollback the transaction. -->

         スタート、コミット、トランザクションのロールバックができないことを<productname>Postgres</productname>が警告しています。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>-402, connect: could not open database %s.</term>
       <listitem>
	<para>
	 <!-- The connect to the database did not work. -->
         データベースへの接続ができませんでした。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>100, Data not found line %d.</term>
       <listitem>
	<para>
	 <!-- This is a "normal" error that tells you that what you are quering cannot
	 be found or we have gone through the cursor. -->

         「一般的な」エラーで問い合わせているものが見つけられないか、カーソルで通りすぎてしまったものです。

	</para>
       </listitem>
      </varlistentry>

     </variablelist>
   </sect2>
  </sect1>

  <sect1 id="ecpg-limitations">
<!--   <title>Limitations</title> -->
   <title>制限</title>
<indexterm><primary>ecpg</primary><secondary sortas="せいげん">制限</secondary></indexterm>
   <abstract>
    <para>
     <!-- What will never be included and why or what cannot be done with this
     concept. -->

     絶対に含まれないものと、この概念ではできないものとその理由。

    </para>
   </abstract>

    <variablelist>
     <varlistentry>
      <!-- <term>Oracle's single tasking possibility</term> -->
      <term>Oracleのシングルタスクの可能性</term>
      <listitem>
       <para>
	<!-- Oracle version 7.0 on AIX 3 uses the OS-supported locks on the shared
	memory segments and allows the application designer to link an
	application in a so called single tasking way. Instead of starting one
	client process per application process both the database part and the
	application part is run in the same process. In later versions of Oracle
	this is no longer supported. -->

        AIX 3上のOracleバージョン7.0は、共有メモリ上でOSにサポートされたロックを使い、アプリケーション設計者がシングルタスクでアプリケーションをリンクすることを許可します。アプリケーションプロセスごとにクライアントプロセスを始める代わりに、データベースの部分とアプリケーションの部分が同じプロセスで実行されます。Oracleの後のバージョンではこの機能はサポートされていません。

       </para>

       <para>
	<!-- This would require a total redesign of the
	<productname>Postgres</productname> access model and
	that effort can not justify the performance gained. -->

        これは<productname>Postgres</productname>のアクセスモデルの完全な再設計を要求しますが、その苦労は得られる結果に見合っていません。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </sect1>

  <sect1 id="ecpg-porting">
   <!-- <title>Porting From Other <acronym>RDBMS</acronym> Packages</title> -->
   <title>他の<acronym>RDBMS</acronym>パッケージからの移植</title>
<indexterm><primary>ecpg</primary><secondary sortas="たのRDBMSからのいしょく">他のRDBMSからの移植</secondary></indexterm>
   <para>
    <!-- The design of <application>ecpg</application> follows SQL standard. So
    porting from a standard RDBMS should not be a problem. Unfortunately there
    is no such thing as a standard RDBMS. So <application>ecpg</application>
    also tries to understand syntax additions as long as they do not create
    conflicts with the standard. -->

    <application>ecpg</application>の設計はSQL標準に基づいています。そのため標準RDBMSからの移植は問題にならないはずです。残念ながら標準RDBMSというものはありません。ですから<application>ecpg</application>は、標準と矛盾しない限り構文の追加を理解しようとします。
   </para>

   <para>
    <!-- The following list shows all the known incompatibilities. If you find one
    not listed please notify 
    <ulink url="meskes@debian.org">Michael Meskes</ulink>.
    Note, however, that we list only incompatibilities from
    a precompiler of another RDBMS to <application>ecpg</application> and not
    additional <application>ecpg</application> features that these RDBMS do not
    have. -->

    後述のリストは知られているすべての矛盾を表しています。載っていないものを見つけたら<ulink url="meskes@debian.org">Michael Meskes</ulink><![%book-publish;[（meskes@debian.org）]]>まで連絡してください。ただし、リストされているのはもう一種類のRDBMSのプリコンパイラから<application>ecpg</application>までの矛盾のみで、RDBMSにはない追加された<application>ecpg</application>の機能はありません。

   </para>

    <variablelist>
     <varlistentry>
      <!-- <term>Syntax of FETCH command</term> -->
      <term>FETCHコマンドの構文</term>
      <listitem>
       <para>
	<!-- The standard syntax of the FETCH command is: -->

        FETCHコマンドの標準的な構文は以下のとおりです。<indexterm><primary>FETCH</primary></indexterm><indexterm><primary>ecpg</primary><secondary>FETCH</secondary></indexterm>

       </para>
       <para>
	FETCH [direction] [amount] IN|FROM <replaceable>cursor name</replaceable>.
       </para>
       <para>
	<!-- <application>ORACLE</application>, however, does not use the keywords IN
	resp. FROM. This feature cannot be added since it would create parsing
	conflicts. -->

        ところが<application>Oracle</application>は、IN resp. FROM.などのキーワードを使いません。構文解析に支障がでるのでこの機能は追加できません。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </sect1>

  <sect1 id="ecpg-develop">
   <!-- <title>For the Developer</title> -->
   <title>開発者向けに</title>

   <para>
    <!-- This section is for those who want to develop the 
    <application>ecpg</application> interface. It
    describes how the things work. The ambition is to make this section
    contain things for those that want to have a look inside and the section
    on How to use it should be enough for all normal questions.

    So, read this before looking at the internals of the 
    <application>ecpg</application>. If
    you are not interested in how it really works, skip this section. -->

    このセクションは、<application>ecpg</application>インターフェイスを開発したい人のために書かれています。内部構造を見たい人に役立つ情報とどのように使えばよいかを入れれば大体の質問には答えられるのではないかと思います。ですから、<application>ecpg</application>の中を見る前にこれを読んでください。興味のない人はここはとばしても構いません。


   </para>

   <sect2>
    <!-- <title>ToDo List</title> -->
    <title>ToDoリスト</title>
<indexterm><primary>ecpg</primary><secondary sortas="TODOりすと">TODOリスト</secondary></indexterm>
    <para>
     <!-- This version the preprocessor has some flaws: -->
     このバージョンではプリプロセッサにいくつか難点があります。
	</para>

     <variablelist>
      <varlistentry>
       <!-- <term>Library functions</term> -->
       <term>ライブラリ関数</term>
       <listitem>
	<para>
	 <!-- to_date et al. do not exists. But then <productname>Postgres</productname>
	 has some good conversion routines itself. So you probably won't miss these. -->

         to_dateは存在しませんが、<productname>Postgres</productname>は優れた変換ルーチンを持っていますので不便はないでしょう。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Structures ans unions</term> -->
       <term>構造体とユニオン</term>
       <listitem>
	<para>
	 <!-- Structures and unions have to be defined in the declare section. -->
         構造体とユニオンは宣言セクションで定義されなくてはいけません。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Missing statements</term> -->
       <term>欠落している文</term>
       <listitem>
	<para>
	 <!-- The following statements are not implemented thus far: -->
         以下の文は今のところ実装されていません。
	</para>

	 <itemizedlist>
	   <listitem>
	    <para>exec sql allocate</para>
	   </listitem>
	   <listitem>
	    <para>exec sql deallocate</para>
	   </listitem>
	   <listitem>
	    <para>SQLSTATE</para>
	   </listitem>
	 </itemizedlist>

       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>message 'no data found'</term> -->
       <term>メッセージ'no data found'</term>
       <listitem>
	<para>
	 <!-- The error message for "no data" in an exec sql insert select from statement
	 has to be 100. -->
         execの中のinsert select from文の「no data」エラーメッセージは100でなければいけません。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>sqlwarn[6]</term>
       <listitem>
	<para>
	 <!-- sqlwarn[6] should be 'W' if the PRECISION or SCALE value specified in a SET
	 DESCRIPTOR statement will be ignored. -->

         sqlwarn[6]は、もしSET DESCRIPTOR文で定義されたPRECISIONもしくはSCALE値が無視された場合'W'になります。

	</para>
       </listitem>
      </varlistentry>
     </variablelist>
   </sect2>

   <sect2>
    <!-- <title>The Preprocessor</title> -->
    <title>プリプロセッサ</title>
<indexterm><primary>ecpg</primary><secondary sortas="ぷりぷろせっさ">プリプロセッサ</secondary></indexterm>
    <para>
     <!-- The first four lines written to the output are constant additions by ecpg.
     These are two comments and two include lines necessary for the interface to the
     library. -->

     出力される最初の4行はecpgから常に追加されます。これらは2つのコメントで、2つはインターフェイスに必要な行をライブラリに含んでいます。

    </para>

    <para>
     <!-- Then the preprocessor works in one pass only, reading the input file and
     writing to the output as it goes along. Normally it just echoes
     everything to the output without looking at it further. -->

     そしてプリプロセッサは1つのパスでのみ動きます。入力ファイルを読み、出力に書き込むのです。通常はただ出力にechoします。

    </para>

    <para>
     <!-- When it comes to an <command>EXEC SQL</command> statements it intervenes and
     changes them depending on what it is. 
     The <command>EXEC SQL</command> statement can be one of these: -->

     <command>EXEC SQL</command>文になると、その内容に基づいて、間に入り変更します。<indexterm><primary>ecpg</primary><secondary>EXEC SQL</secondary></indexterm>
</para>

     <variablelist>
      <varlistentry>
       <!-- <term>Declare sections</term> -->
       <term>宣言セクション</term><indexterm><primary>ecpg</primary><secondary sortas="せんげんせくしょん">宣言セクション</secondary></indexterm>
       <listitem>

<!--
	<para>
	  Declare sections begins with
<programlisting>
exec sql begin declare section;
</programlisting>
	 and ends with
<programlisting>
exec sql end declare section;
</programlisting>
	 In the section only variable declarations are allowed. Every variable
	 declare within this section is also entered in a list of variables
	 indexed on their name together with the corresponding type.
	</para> 
-->

<para>宣言セクションは以下の文で始まります。</para>

<programlisting>
exec sql begin declare section;
</programlisting>

<para>そして、以下の文で終わります。</para>

<programlisting>
exec sql end declare section;
</programlisting>

<para>
このセクションでは変数宣言だけが許可されています。ここで宣言される変数はすべて、型と名前がインデックスされた変数のリストにも入ります。
	 
	</para>

	<para>
	 <!-- In particular the definition of a structure or union also has to be listed
	 inside a declare section. Otherwise <application>ecpg</application> cannot
	 handle these types since it simply does not know the definition. -->

         特に構造体やユニオンの定義は宣言セクションでリストされなければいけません。そうしないと<application>ecpg</application>は定義を知らないためにこれらの型を扱えなくなります。
	</para>

	<para>
	 <!-- The declaration is echoed to the file to make the variable a normal
	 C-variable also. -->
         
         変数を通常のC変数にもするために、宣言はファイルにもechoされます。

	</para>

	<para>
	 <!-- The special types VARCHAR and VARCHAR2 are converted into a named struct
	 for every variable. A declaration like:
<programlisting>
VARCHAR var[180];
</programlisting>
	 is converted into
<programlisting>
struct varchar_var { int len; char arr[180]; } var;
</programlisting>
	</para> -->

        特別な型であるVARCHARとVARCHAR2は、変数ごとに名前のある構造体に変換されます。下記のような宣言があった場合を考えてみます。
</para>

<programlisting>
VARCHAR var[180];
</programlisting>

<para>
	 これは、下のように変換されます。
</para>

<programlisting>
struct varchar_var { int len; char arr[180]; } var;
</programlisting>

       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Include statements</term> -->
       <term>Include文</term>
       <listitem>
	<para>
	 <!-- An include statement looks like: -->
include文は以下のようになります。
	</para>
<programlisting>
exec sql include filename;
</programlisting>

<para>次のものではないことに注意してください。</para>

<programlisting>
#include &lt;filename.h&gt;
</programlisting>

	<para>
	 <!-- Instead the file specified is parsed by <application>ecpg</application>
	 itself. So the contents of the specified file is included in the resulting C
	 code. This way you are able to specify EXEC SQL commands in an include file. -->

         そのかわり、指定されたファイルは<application>ecpg</application>自身で構文解析します。ですから、指定されたファイルの中身は結果のCコードに含まれます。この方法だと、EXEC SQLコマンドをincludeファイルに指定することができます。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Connect statement</term> -->
       <term>connect文</term><indexterm><primary>ecpg</primary><secondary sortas="connectぶん">connect文</secondary></indexterm><indexterm><primary>ecpg</primary><secondary sortas="でーたべーすへのせつぞく">データベースへの接続</secondary></indexterm>
       <listitem>
	<para>
	 <!-- A connect statement looks like: -->
         connect文は以下のようになります。
	</para>

<programlisting>
exec sql connect to <replaceable>connection target</replaceable>;
</programlisting>
	 <!-- It creates a connection to the specified database. -->

<para>これは指定されたデータベースに接続します。</para>


	<para>
	 <!-- The <replaceable>connection target</replaceable> can be specified in the
	 following ways: -->

         <replaceable>connection target</replaceable>（接続ターゲット）は、次のように指定することができます。
</para>

	 <variablelist>
	  <varlistentry>
	   <term>dbname[@server][:port][as <replaceable>connection
	     name</replaceable>][user <replaceable>user name</replaceable>]</term>
	   <listitem><para></para></listitem>
	  </varlistentry>

	  <varlistentry>
	   <term>tcp:postgresql://server[:port][/dbname][as
	    <replaceable>connection name</replaceable>][user <replaceable>user name</replaceable>]</term>
	   <listitem><para></para></listitem>
	  </varlistentry>

	  <varlistentry>
	   <term>unix:postgresql://server[:port][/dbname][as
	    <replaceable>connection name</replaceable>][user <replaceable>user name</replaceable>]</term>
	   <listitem><para></para></listitem>
	  </varlistentry>

	  <varlistentry>
	   <term><replaceable>character variable</replaceable>[as
	    <replaceable>connection name</replaceable>][user <replaceable>user name</replaceable>]</term>
	   <listitem><para></para></listitem>
	  </varlistentry>

	  <varlistentry>
	   <term><replaceable>character string</replaceable>[as
	    <replaceable>connection name</replaceable>][<replaceable>user</replaceable>]</term>
	   <listitem><para></para></listitem>
	  </varlistentry>

	  <varlistentry>
	   <term>default</term>
	   <listitem><para></para></listitem>
	  </varlistentry>

	  <varlistentry>
	   <term>user</term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	 </variablelist>

	<para>
	 <!-- There are also different ways to specify the user name: -->
         ユーザー名を指定するには、別の方法もあります。
	</para>

	 <variablelist>
	  <varlistentry>
	   <term><replaceable>userid</replaceable></term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	  <varlistentry>
	   <term><replaceable>userid</replaceable>/<replaceable>password</replaceable></term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	  <varlistentry>
	   <!-- <term><replaceable>userid</replaceable> identified by <replaceable>password</replaceable></term> -->

            <term><replaceable>password</replaceable>で定義される<replaceable>userid</replaceable></term>

	   <listitem><para></para></listitem>
	  </varlistentry>
	  <varlistentry>
	   <term><replaceable>password</replaceable>を使った<replaceable>userid</replaceable></term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	 </variablelist>

	<!-- <para> Finally the userid and the password. Each may be a constant text, a
	 character variable or a chararcter string.
	</para> -->

        <para>最後にuseridとpasswordです。それぞれテキスト、文字変数、文字列である可能性があります。
	</para>

       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Disconnect statements</term> -->
       <term>Disconnect文</term>
       <listitem>
	<para>
	 <!-- A disconnect statement looks loke: -->
          disconnect文は以下のようになります。
	</para>

<programlisting>
exec sql disconnect [<replaceable>connection target</replaceable>];
</programlisting>

	 <!-- It closes the connection to the specified database. -->
<para>これは指定されたデータベースへの接続を閉じます。

	</para>

	<para>
	 <!-- The<replaceable>connection target</replaceable> can be specified in the
	 following ways: -->

          <replaceable>connection target</replaceable>（接続ターゲット）は次のように指定することができます。
</para>

	 <variablelist>
	  <varlistentry>
	   <term><replaceable>connection name</replaceable></term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	  <varlistentry>
	   <term>default</term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	  <varlistentry>
	   <term>current</term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	  <varlistentry>
	   <term>all</term>
	   <listitem><para></para></listitem>
	  </varlistentry>
	 </variablelist>
       </listitem>
      </varlistentry>

      <!--WARNING: FROM HERE ON THE TEXT IS OUTDATED! -->
      <varlistentry>
       <!-- <term>Open cursor statement</term> -->
       <term>open cursor文</term><indexterm><primary>ecpg</primary><secondary sortas="open curserぶん">open cursor文</secondary></indexterm>
       <listitem>
	<para>
	 <!-- An open cursor statement looks like: -->
         open cursor文はこのようになります。 
	</para>

<programlisting>
exec sql open <replaceable>cursor</replaceable>;
</programlisting>

<para>
	 <!-- and is ignore and not copied from the output. -->
         これは無視され、出力にコピーされません。
</para>

       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Commit statement</term> -->
       <term>commit文</term><indexterm><primary>ecpg</primary><secondary sortas="commitぶん">commit文</secondary></indexterm>
       <listitem>
	<para>
	 <!-- A commit statement looks like -->
         commit文は以下のようになります。
	</para>

<programlisting>
exec sql commit;
</programlisting>

<para>
	 <!-- and is translated on the output to -->
         そして出力上で翻訳されます。
</para>

<programlisting>
ECPGcommit(__LINE__);
</programlisting>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Rollback statement</term> -->
       <term>rollback文</term><indexterm><primary>ecpg</primary><secondary sortas="rollbackぶん">rollback文</secondary></indexterm>
       <listitem>
	<para>
	 <!-- A rollback statement looks like -->
         rollback文は以下のようになります。
	</para>

<programlisting>
exec sql rollback;
</programlisting>

<para>
	 <!-- and is translated on the output to -->
         そして出力上で翻訳されます。
</para>

<programlisting>
ECPGrollback(__LINE__);
</programlisting>
       </listitem>
      </varlistentry>

      <!-- STARTING HERE IT IS OKAY AGAIN! -->
      <varlistentry>
       <!-- <term>Other statements</term> -->
       <term>他の構文</term>
       <listitem>
	<para>
	 <!-- Other <acronym>SQL</acronym> statements are other statements that start with 
	 <command>exec sql</command> and ends with <com
	 Other <acronym>SQL</acronym> statements are other statements that start with 
	 <command>exec sql</command> and ends with <command>;</command>. 
	 Everything inbetween is treated
	 as an <acronym>SQL</acronym> statement and parsed for variable substitution. -->

        他の<acronym>SQL</acronym>文は、<command>exec sql</command>で始まり<command>;</command>で終わるものです。その中間はすべて<acronym>SQL</acronym>文として扱われ、変数の代用が構文解析されます。
	</para>

	<para>
	 <!-- Variable substitution occur when a symbol starts with a colon
	 (<command>:</command>). Then a variable with that name is looked for among
	 the variables that were previously declared within a declare section and
	 depending on the variable being for input or output the pointers to the
	 variables are written to the output to allow for access by the function. -->

         変数の代用はシンボルがコロン（<command>:</command>）で始まる場合に起こります。そしてその名前の変数が、宣言セクションで以前宣言された変数の中から探されます。変数が入力用か出力用であるかによって、関数からのアクセスを許可するために変数へのポインタが出力に書かれます。<indexterm><primary>ecpg</primary><secondary sortas="へんすうのだいよう">変数の代用</secondary></indexterm><indexterm><primary>:</primary></indexterm>

	</para>

	<para>
	 <!-- For every variable that is part of the <acronym>SQL</acronym> request 
	 the function gets another ten arguments: -->

         <acronym>SQL</acronym>要求の一部であるすべての変数には、関数がさらに10の引数を与えられます。
</para>

	 <simplelist>
	  <!-- <member>The type as a special symbol.</member> -->
          <member>特別シンボルとしての型</member>
	  <!-- <member>A pointer to the value or a pointer to the pointer.</member> -->
          <member>値へのポインタもしくはポインタのポインタ</member>
	  <!-- <member>The size of the variable if it is a char or varchar.</member> -->
          <member>変数がcharかvarcharだった場合はそのサイズ</member>
	  <!-- <member>Number of elements in the array (for array fetches).</member> -->
          <member>配列の要素数（配列取り出し用）</member>
	  <!-- <member>The offset to the next element in the array (for array fetches)</member> -->
          <member>配列の次の要素のオフセット（配列取り出し用）</member>

	  <!-- <member>The type of the indicator variable as a special symbol.</member> -->
          <member>特別シンボルとしての指示変数の型</member>
	  <!-- <member>A pointer to the value of the indicator variable or a pointer to the pointer of the indicator variable.</member> -->
           <member>指示変数の値へのポインタもしくは指示変数のポインタへのポインタ</member>

	  <member>0</member>
	  <!-- <member>Number of elements in the indicator array (for array fetches).</member> -->
          <member>指示配列の要素数（配列取り出し用）</member>
	  <!-- <member>The offset to the next element in the indicator array (for array fetches)</member> -->
          <member>指示配列の次の要素のオフセット（配列取り出し用）</member> 
	 </simplelist>

       </listitem>
      </varlistentry>
     </variablelist>
   </sect2>

   <sect2>
    <!-- <title>A Complete Example</title> -->
    <title>完全な例</title> 
<indexterm><primary>ecpg</primary><secondary sortas="れい">例</secondary></indexterm>
    <para>
     <!-- Here is a complete example describing the output of the preprocessor of a
     file foo.pgc: -->

     これはファイルfoo.pgcのプリプロセッサの出力を説明した完全な例です。
</para>

<programlisting>
exec sql begin declare section;
int index;
int result;
exec sql end declare section;
...
exec sql select res into :result from mytable where index = :index;
</programlisting>

<para>
     <!-- is translated into: -->
     これは次のように翻訳されます。
</para>

<programlisting>
/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include &lt;ecpgtype.h&gt;;
#include &lt;ecpglib.h&gt;;

/* exec sql begin declare section */

#line 1 "foo.pgc"

 int index;
 int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, NULL, "select  res  from mytable where index = ?     ",
	ECPGt_int,&amp;(index),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
        ECPGt_int,&amp;(result),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"

</programlisting>


<para>
     <!-- (the indentation in this manual is added for readability and not
     something that the preprocessor can do.) -->
     このマニュアルでは読みやすいようにインデントしてありますが、プリプロセッサはこのようにはしません。

    </para>
   </sect2>

   <sect2>
    <!-- <title>The Library</title> -->
    <title>ライブラリ</title>
<indexterm><primary>ecpg</primary><secondary sortas="らいぶらり">ライブラリ</secondary></indexterm>
    <para>
     <!-- The most important function in the library is the <function>ECPGdo</function>
     function. It takes a variable amount of arguments. Hopefully we will not run
     into machines with limits on the amount of variables that can be
     accepted by a vararg function. This could easily add up to 50 or so
     arguments. -->

     ライブラリの中で最も重要な関数は<function>ECPGdo</function>です。これはさまざまな数の引数をとります。vararg関数に許可される変数の数が限られていないマシンを使わないことを願います。その場合50かそれ以上の引数を追加することになるからです。
    </para>

    <para>
     <!-- The arguments are: -->
     引数は以下のとおりです。
</para>


     <variablelist>
      <varlistentry>
       <!-- <term>A line number</term> -->
       <term>行数</term>
       <listitem>
	<para>
	 <!-- This is a line number for the original line used in error messages only. -->
         エラーメッセージのみで使われた元の行の数です。 
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>A string</term> -->
       <term>文字列</term>
       <listitem>
	<para>
	 <!-- This is the <acronym>SQL</acronym> request that is to be issued. 
	 This request is modified
	 by the input variables, i.e. the variables that where not known at
	 compile time but are to be entered in the request. Where the variables
	 should go the string contains ";". -->

         発行されるべき<acronym>SQL</acronym>要求です。その要求は入力変数により変更されます（たとえばコンパイル時には知られていなかったが要求時に入力された変数）。変数が行くべきところには「;」があります。 
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Input variables</term> -->
       <term>入力変数</term>
       <listitem>
	<para>
	 <!-- As described in the section about the preprocessor every input variable
	 gets ten arguments. -->

         プリプロセッサのセクションで説明されているように、すべての入力変数は10の引数を持ちます。
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>ECPGt_EOIT</term>
       <listitem>
	<para>
	 <!-- An enum telling that there are no more input variables. -->
         入力変数がもうないことを表します。
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <!-- <term>Output variables</term> -->
       <term>出力変数</term>
       <listitem>
	<para>
	 <!-- As described in the section about the preprocessor every input variable
	 gets ten arguments. These variables are filled by the function. -->

         プリプロセッサの部分で説明されるように、すべての入力変数は10の引数を受けます。これらの変数は関数で埋められています。
	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>ECPGt_EORT</term>
       <listitem>
	<para>
	 <!-- An enum telling that there are no more variables. -->
         変数がもうないことを表します。
	</para>
       </listitem>
      </varlistentry>
     </variablelist>

    <para>
     <!-- All the <acronym>SQL</acronym> statements are performed in one transaction
     unless you issue a commit transaction. To get this auto-transaction going
     the first statement or the first after statement after a commit or rollback
     always begins a transaction. To disable this feature per default use the
     <option>-t</option> option on the commandline. -->
 
    すべての<acronym>SQL</acronym>文は、コミットトランザクションを発行しない限り1つのトランザクションで処理されます。この自動トランザクションを実行するために、最初の文もしくはコミットかロールバックのあとの最初の文が常にトランザクションを始めます。この機能を無効にするためにはコマンドラインで<option>-t</option>オプションを付けてください。

    </para>

    <para>
     <!-- To be completed: entries describing the other entries. -->
     他の項目を説明するドキュメントはまだ書かれていません。
    </para>
   </sect2>
  </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:
-->
