⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testlibpq2.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
字号:
/* * testlibpq2.c *		Test of the asynchronous notification interface * * Start this program, then from psql in another window do *	 NOTIFY TBL2; * Repeat four times to get this program to exit. * * Or, if you want to get fancy, try this: * populate a database with the following commands * (provided in src/test/examples/testlibpq2.sql): * *	 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); * * and do this four times: * *	 INSERT INTO TBL1 VALUES (10); */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/time.h>#include "libpq-fe.h"static voidexit_nicely(PGconn *conn){	PQfinish(conn);	exit(1);}intmain(int argc, char **argv){	const char *conninfo;	PGconn	   *conn;	PGresult   *res;	PGnotify   *notify;	int			nnotifies;	/*	 * If the user supplies a parameter on the command line, use it as the	 * conninfo string; otherwise default to setting dbname=postgres and using	 * environment variables or defaults for all other connection parameters.	 */	if (argc > 1)		conninfo = argv[1];	else		conninfo = "dbname = postgres";	/* Make a connection to the database */	conn = PQconnectdb(conninfo);	/* Check to see that the backend connection was successfully made */	if (PQstatus(conn) != CONNECTION_OK)	{		fprintf(stderr, "Connection to database failed: %s",				PQerrorMessage(conn));		exit_nicely(conn);	}	/*	 * Issue LISTEN command to enable notifications from the rule's NOTIFY.	 */	res = PQexec(conn, "LISTEN TBL2");	if (PQresultStatus(res) != PGRES_COMMAND_OK)	{		fprintf(stderr, "LISTEN command failed: %s", PQerrorMessage(conn));		PQclear(res);		exit_nicely(conn);	}	/*	 * should PQclear PGresult whenever it is no longer needed to avoid memory	 * leaks	 */	PQclear(res);	/* Quit after four notifies are received. */	nnotifies = 0;	while (nnotifies < 4)	{		/*		 * Sleep until something happens on the connection.  We use select(2)		 * to wait for input, but you could also use poll() or similar		 * facilities.		 */		int			sock;		fd_set		input_mask;		sock = PQsocket(conn);		if (sock < 0)			break;				/* shouldn't happen */		FD_ZERO(&input_mask);		FD_SET(sock, &input_mask);		if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0)		{			fprintf(stderr, "select() failed: %s\n", strerror(errno));			exit_nicely(conn);		}		/* Now check for input */		PQconsumeInput(conn);		while ((notify = PQnotifies(conn)) != NULL)		{			fprintf(stderr,					"ASYNC NOTIFY of '%s' received from backend pid %d\n",					notify->relname, notify->be_pid);			PQfreemem(notify);			nnotifies++;		}	}	fprintf(stderr, "Done.\n");	/* close the connection to the database and cleanup */	PQfinish(conn);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -