Postgres里的 copy 命令里有用于 libpq++ 里从网络联接读出或者写入的选项. 因此,这些函数有必要直接访问网络联接,以便应用可以充分利用这个功能.
PgDatabase::GetLine 读取一个以回车符(换行符)结尾的字符行中 length 字节的字符(由后端服务器传输)到一个字符串缓冲区 string 里.
int PgDatabase::GetLine(char* string, int length)
类似 Unix 系统过程 fgets (3),这个过程拷贝最多 length-1 个字符到字符串 string. 里.但是它会象 gets (3), 那样把结尾的换行符转换成一个空字符(null)。
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();