3.7. 与 COPY 命令相关的函数 #
PostgreSQL 中的 COPY 命令有一些选项,可以读取或写入 libpq++ 所使用的网络连接。因此,需要一些函数来直接访问这个网络连接,使应用可以充分利用这一能力。
PgDatabase::GetLine把后端服务器传输的一行以换行符结尾的字符读入大小为length的缓冲区string。int PgDatabase::GetLine(char* string, int length)
与 Unix 系统例程
fgets()一样,此例程最多复制个字符到length-1string。但它又像gets(),会把结尾的换行符转换为一个零字节。PgDatabase::GetLine在文件末尾返回EOF,整行已读取时返回 0,而缓冲区已满但尚未读到终止换行符时返回 1。注意,应用程序必须检查新行是否由一个反斜杠后跟一个句点(
\.)组成,这表示后端服务器已经完成了COPY结果的发送。因此,如果应用预期会收到长度超过个字符的行,务必非常仔细地检查length-1PgDatabase::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();