↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 6.5
历史版本PostgreSQL 6.5 已于 2004 年 6 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

47.6. 与 COPY 命令相关的函数

Postgres 中的 copy 命令有一些选项,可以读取或写入 libpq++ 所使用的网络连接。 因此,需要一些函数来直接访问这个网络连接,使应用可以充分利用这一能力。

  • PgDatabase::GetLine 把后端服务器传输的一行以换行符结尾的字符读入大小为 length 的缓冲区 string。

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

    与 Unix 系统例程 fgets (3) 一样,此例程最多复制 length-1 个字符到 string。但它又像 gets (3),会把结尾的换行符转换为一个空字符。

    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 char16, d float8)");
        data.Exec("copy foo from stdin");
        data.putline("3\etHello World\et4.5\en");
        data.putline("4\etGoodbye World\et7.11\en");
        &...
        data.putline(".\en");
        data.endcopy();
    

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。