您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

3.7. 与 COPY 命令向关联的函数

PostgreSQL 里的 COPY 命令里有用于 libpq++ 里从网络联接读出或者写入的选项. 因此,这些函数有必要直接访问网络联接,以便应用可以充分利用这个功能.

  • PgDatabase::GetLine 读取一个以回车符(换行符)结尾的字符行中 length 字节的字符(由后端服务器传输)到一个字符串缓冲区 string 里.

    int PgDatabase::GetLine(char* string, int length)

    类似 Unix 系统过程 fgets() ,这个过程拷贝最多 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,否则返回非零值。

一个例子:

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();