PostgreSQL の COPY コマンドは libpq++ で使用されるネットワーク接続から、読み込むのか書き出すのかを決定するオプションがあります。そのため、アプリケーションがこの機能の利点を全て享受できるように、関数は、このネットワーク接続に直接アクセスする必要があります。
PgDatabase::GetLine は、改行で終端する文字行を lengthサイズ分、 string バッファに読み込みます。
int PgDatabase::GetLine(char* string, int length)
fgets() Unix システムルーチンと同様、このルーチンは length-1 まで string にコピーします。しかし、終端の改行をゼロバイトに変換するという点では、gets() と同じです。
PgDatabase::GetLine は、ファイルの終了時に EOF を、行全体を読み込んだ場合は 0 を、終端を示す改行を読み込む前にバッファがいっぱいになった場合は 1 を返します。
バックエンドからの COPY 結果の送信が完了したことを示す、バックスラッシュ、次いで、ピリオド(\.)を読み込んだ行が含んでいるかどうかを点検しなければならないことに注意して下さい。従って、アプリケーションが複数行、つまり、 length-1 より多い文字数を受け取ることを想定する場合は、必ず PgDatabase::GetLine の戻り値を注意して検査しなければなりません。
PgDatabase::PutLine はヌル終端の string をバックエンドサーバに送信します。
void PgDatabase::PutLine(char* string)
アプリケーションは、バックエンドにデータの送信が完了したことを伝える \.文字を明示的に送信しなければなりません。
PgDatabase::EndCopy はバックエンドと同期をとります。
int PgDatabase::EndCopy()
この関数は、バックエンドの COPY 処理が完了するまで待機します。最後の文字列を PgDatabase::PutLine を使用してバックエンドに送信した時や、PgDatabase::GetLine を使用してバックエンドから最後の文字列を受信した時に、この関数を発行しなければなりません。これを発行しないと、バックエンドはフロントエンドとの "同期がずれた" 状態になってしまいます。この関数が返った段階で、バックエンドは次のコマンドを受け取ることができます。
正常に終了した場合、返り値は 0 です。さもなくば、非 0 です。
以下に例を示します。
PgDatabase data; data.Exec("CREATE TABLE foo (a int4, b char(16), d double precision)"); data.Exec("COPY foo FROM STDIN"); data.PutLine("3\tHello World\t4.5\n"); data.PutLine("4\tGoodbye World\t7.11\n"); ... data.PutLine("\\.\n"); data.EndCopy();