PostgreSQL7.0手册-接口-54. libpq - C++ 绑定库
,因而实际上命名信号灯不需要象以前定义的那样与对应的关系相关联。
libpq++ 应用在与之相联的后端收到一个异步通知时将被通知。不过,从后端到前端的通讯不是异步的。libpq++ 应用必须轮询后端以便查找是否有待处理的信息。在一个查询执行完毕后,前端可以调用 PgDatabase::Notifies 来判断目前是否有从后端来的任何通知数据。PgDatabase::Notifies 从一个来自后端的未处理通知列表里返回一个通知。如果没有来自后端的待处理的通知,该函数返回 NULL。PgDatabase::Notifies 的表现想一个弹出栈。一旦从 PgDatabase::Notifies 返回了一个通知,该通知就被认为已处理并且被从通知列表里删除。
PgDatabase::Notifies 从服务器里检索待处理通知。
PGnotify* PgDatabase::Notifies()
第二个例子程序给出了一个使用异步通知的例子。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
与 COPY 命令向关联的函数
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 float8)");
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();
--------------------------------------------------------------------------------
libpq++ 应用在与之相联的后端收到一个异步通知时将被通知。不过,从后端到前端的通讯不是异步的。libpq++ 应用必须轮询后端以便查找是否有待处理的信息。在一个查询执行完毕后,前端可以调用 PgDatabase::Notifies 来判断目前是否有从后端来的任何通知数据。PgDatabase::Notifies 从一个来自后端的未处理通知列表里返回一个通知。如果没有来自后端的待处理的通知,该函数返回 NULL。PgDatabase::Notifies 的表现想一个弹出栈。一旦从 PgDatabase::Notifies 返回了一个通知,该通知就被认为已处理并且被从通知列表里删除。
PgDatabase::Notifies 从服务器里检索待处理通知。
PGnotify* PgDatabase::Notifies()
第二个例子程序给出了一个使用异步通知的例子。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
与 COPY 命令向关联的函数
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 float8)");
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();
--------------------------------------------------------------------------------

