分享
 
 
 

PostgreSQL数据库学习手册之libpq-C库的例子程序

王朝mssql·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

1.14. 例子程序

Example 1-1. libpq 例子程序 1

[myphp]

/*

* testlibpq.c

*

* Test the C version of libpq, thePostgreSQLfrontend

* library.

* 测试 PostgreSQL 前端库 libpq 的 C 版本

*/

#include <stdio.h>

#include <libpq-fe.h>

void

exit_nicely(PGconn *conn)

{

PQfinish(conn);

exit(1);

}

main()

{

char *pghost,

*pgport,

*pgoptions,

*pgtty;

char *dbName;

int nFields;

int i,

j;

/* FILE *debug; */

PGconn *conn;

PGresult *res;

/*

* begin, by setting the parameters for a backend connection if the

* parameters are null, then the system will try to use reasonable

* defaults by looking up environment variables or, failing that,

* using hardwired constants

*/

pghost = NULL; /* host name of the backend server */

pgport = NULL; /* port of the backend server */

pgoptions = NULL; /* special options to start up the backend

* server */

pgtty = NULL; /* debugging tty for the backend server */

dbName = "template1";

/* make a connection to the database */

conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

/*

* check to see that the backend connection was successfully made

*/

if (PQstatus(conn) == CONNECTION_BAD)

{

fprintf(stderr, "Connection to database '%s' failed.\n", dbName);

fprintf(stderr, "%s", PQerrorMessage(conn));

exit_nicely(conn);

}

/* debug = fopen("/tmp/trace.out","w"); */

/* PQtrace(conn, debug); */

/* start a transaction block */

res = PQexec(conn, "BEGIN");

if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

{

fprintf(stderr, "BEGIN command failed\n");

PQclear(res);

exit_nicely(conn);

}

/*

* should PQclear PGresult whenever it is no longer needed to avoid

* memory leaks

*/

PQclear(res);

/*

* fetch rows from the pg_database, the system catalog of

* databases

*/

res = PQexec(conn, "DECLARE mycursor CURSOR FOR SELECT * FROM pg_database");

if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

{

fprintf(stderr, "DECLARE CURSOR command failed\n");

PQclear(res);

exit_nicely(conn);

}

PQclear(res);

res = PQexec(conn, "FETCH ALL in mycursor");

if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)

{

fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");

PQclear(res);

exit_nicely(conn);

}

/* first, print out the attribute names */

nFields = PQnfields(res);

for (i = 0; i < nFields; i++)

printf("%-15s", PQfname(res, i));

printf("\n\n");

/* next, print out the rows */

for (i = 0; i < PQntuples(res); i++)

{

for (j = 0; j < nFields; j++)

printf("%-15s", PQgetvalue(res, i, j));

printf("\n");

}

PQclear(res);

/* close the cursor */

res = PQexec(conn, "CLOSE mycursor");

PQclear(res);

/* commit the transaction */

res = PQexec(conn, "COMMIT");

PQclear(res);

/* close the connection to the database and cleanup */

PQfinish(conn);

/* fclose(debug); */

return 0;

}

[/myphp]

Example 1-2. libpq 例子程序 2

[myphp]

/*

* testlibpq2.c

* 测试异步通知接口

*

* 运行此程序,然后从另外一个窗口的 psql 里运行 NOTIFY TBL2;

*

* 或者,如果你想好玩一点,尝试下面动作∶

* 用下面的语句填充一个数据库∶

*

* CREATE TABLE TBL1 (i int4);

*

* CREATE TABLE TBL2 (i int4);

*

* CREATE RULE r1 AS ON INSERT TO TBL1 DO

* (INSERT INTO TBL2 values (new.i); NOTIFY TBL2);

*

* 然后∶

*

* INSERT INTO TBL1 values (10);

*

*/

#include <stdio.h>

#include "libpq-fe.h"

void

exit_nicely(PGconn *conn)

{

PQfinish(conn);

exit(1);

}

main()

{

char *pghost,

*pgport,

*pgoptions,

*pgtty;

char *dbName;

int nFields;

int i,

j;

PGconn *conn;

PGresult *res;

PGnotify *notify;

/*

* begin, by setting the parameters for a backend connection if the

* parameters are null, then the system will try to use reasonable

* defaults by looking up environment variables or, failing that,

* using hardwired constants

*/

pghost = NULL; /* host name of the backend server */

pgport = NULL; /* port of the backend server */

pgoptions = NULL; /* special options to start up the backend

* server */

pgtty = NULL; /* debugging tty for the backend server */

dbName = getenv("USER"); /* change this to the name of your test

* database */

/* make a connection to the database */

conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

/*

* check to see that the backend connection was successfully made

*/

if (PQstatus(conn) == CONNECTION_BAD)

{

fprintf(stderr, "Connection to database '%s' failed.\n", dbName);

fprintf(stderr, "%s", PQerrorMessage(conn));

exit_nicely(conn);

}

res = PQexec(conn, "LISTEN TBL2");

if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

{

fprintf(stderr, "LISTEN command failed\n");

PQclear(res);

exit_nicely(conn);

}

/*

* should PQclear PGresult whenever it is no longer needed to avoid

* memory leaks

*/

PQclear(res);

while (1)

{

/*

* wait a little bit between checks; waiting with select()

* would be more efficient.

*/

sleep(1);

/* collect any asynchronous backend messages */

PQconsumeInput(conn);

/* check for asynchronous notify messages */

while ((notify = PQnotifies(conn)) != NULL)

{

fprintf(stderr,

"ASYNC NOTIFY of '%s' from backend pid '%d' received\n",

notify->relname, notify->be_pid);

free(notify);

}

}

/* close the connection to the database and cleanup */

PQfinish(conn);

return 0;

}

Example 1-3. libpq 例子程序 3

/*

* testlibpq3.c 测试 C 版本的 Libpq --PostgreSQL的前端库.

* 测试二进制游标接口

*

*

*

* 用下面语句填充一个数据库∶

*

* CREATE TABLE test1 (i int4, d real, p polygon);

*

* INSERT INTO test1 values (1, 3.567, polygon '(3.0, 4.0, 1.0, 2.0)');

*

* INSERT INTO test1 values (2, 89.05, polygon '(4.0, 3.0, 2.0, 1.0)');

*

* 预期的输出是∶

*

* tuple 0: got i = (4 bytes) 1, d = (4 bytes) 3.567000, p = (4

* bytes) 2 points boundbox = (hi=3.000000/4.000000, lo =

* 1.000000,2.000000) tuple 1: got i = (4 bytes) 2, d = (4 bytes)

* 89.050003, p = (4 bytes) 2 points boundbox =

* (hi=4.000000/3.000000, lo = 2.000000,1.000000)

*

*

*/

#include <stdio.h>

#include "libpq-fe.h"

#include "utils/geo_decls.h" /* for the POLYGON type */

void

exit_nicely(PGconn *conn)

{

PQfinish(conn);

exit(1);

}

main()

{

char *pghost,

*pgport,

*pgoptions,

*pgtty;

char *dbName;

int nFields;

int i,

j;

int i_fnum,

d_fnum,

p_fnum;

PGconn *conn;

PGresult *res;

/*

* begin, by setting the parameters for a backend connection if the

* parameters are null, then the system will try to use reasonable

* defaults by looking up environment variables or, failing that,

* using hardwired constants

*/

pghost = NULL; /* host name of the backend server */

pgport = NULL; /* port of the backend server */

pgoptions = NULL; /* special options to start up the backend

* server */

pgtty = NULL; /* debugging tty for the backend server */

dbName = getenv("USER"); /* change this to the name of your test

* database */

/* make a connection to the database */

conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

/*

* check to see that the backend connection was successfully made

*/

if (PQstatus(conn) == CONNECTION_BAD)

{

fprintf(stderr, "Connection to database '%s' failed.\n", dbName);

fprintf(stderr, "%s", PQerrorMessage(conn));

exit_nicely(conn);

}

/* start a transaction block */

res = PQexec(conn, "BEGIN");

if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

{

fprintf(stderr, "BEGIN command failed\n");

PQclear(res);

exit_nicely(conn);

}

/*

* should PQclear PGresult whenever it is no longer needed to avoid

* memory leaks

*/

PQclear(res);

/*

* fetch rows from the pg_database, the system catalog of

* databases

*/

res = PQexec(conn, "DECLARE mycursor BINARY CURSOR FOR SELECT * FROM test1");

if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

{

fprintf(stderr, "DECLARE CURSOR command failed\n");

PQclear(res);

exit_nicely(conn);

}

PQclear(res);

res = PQexec(conn, "FETCH ALL in mycursor");

if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)

{

fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");

PQclear(res);

exit_nicely(conn);

}

i_fnum = PQfnumber(res, "i");

d_fnum = PQfnumber(res, "d");

p_fnum = PQfnumber(res, "p");

for (i = 0; i < 3; i++)

{

printf("type[%d] = %d, size[%d] = %d\n",

i, PQftype(res, i),

i, PQfsize(res, i));

}

for (i = 0; i < PQntuples(res); i++)

{

int *ival;

float *dval;

int plen;

POLYGON *pval;

/* we hard-wire this to the 3 fields we know about */

ival = (int *) PQgetvalue(res, i, i_fnum);

dval = (float *) PQgetvalue(res, i, d_fnum);

plen = PQgetlength(res, i, p_fnum);

/*

* plen doesn't include the length field so need to

* increment by VARHDSZ

*/

pval = (POLYGON *) malloc(plen + VARHDRSZ);

pval->size = plen;

memmove((char *) &pval->npts, PQgetvalue(res, i, p_fnum), plen);

printf("tuple %d: got\n", i);

printf(" i = (%d bytes) %d,\n",

PQgetlength(res, i, i_fnum), *ival);

printf(" d = (%d bytes) %f,\n",

PQgetlength(res, i, d_fnum), *dval);

printf(" p = (%d bytes) %d points \tboundbox = (hi=%f/%f, lo = %f,%f)\n",

PQgetlength(res, i, d_fnum),

pval->npts,

pval->boundbox.xh,

pval->boundbox.yh,

pval->boundbox.xl,

pval->boundbox.yl);

}

PQclear(res);

/* close the cursor */

res = PQexec(conn, "CLOSE mycursor");

PQclear(res);

/* commit the transaction */

res = PQexec(conn, "COMMIT");

PQclear(res);

/* close the connection to the database and cleanup */

PQfinish(conn);

return 0;

}

[/myphp]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有