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