zoukankan      html  css  js  c++  java
  • vc6操作PostgreSQL 测试下异步通知接口

    这个异步通知还很有用,就是一旦表里有数据写入了,马上通知你做其他什么事情


    例子官方的是linux 的, 改成windows 吧,毕竟使用这个的人太少,霍霍

    距离任务设定越来越短。接近完工鸟


    准备工作:

     *   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);  执行 4次 程序退出


    附上VC6  demo


    // pgDemo.cpp : Defines the entry point for the console application.
    //


    #include "stdafx.h"
    /*
     * 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 <time.h>
    #include <libpq-fe.h>


    #include "winsock.h"
    static void
    exit_nicely(PGconn *conn)
    {
        PQfinish(conn);
        exit(1);
    }


    int
    main(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";
    conninfo = "dbname=mydb user=Eagle password=123456";




        /* 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;
    }


    效果图 2张:



       
            

  • 相关阅读:
    北京清北 综合强化班 Day1
    Noip2015 提高组 Day1
    Noip2016 提高组 Day2 T1 组合数问题
    2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1
    [51NOD1103] N的倍数(鸽笼原理)
    [51NOD1420] 数袋鼠好有趣(贪心)
    [CF808A] Lucky Year(规律)
    [CF808B] Average Sleep Time([强行]树状数组,数学)
    [CF808C] Tea Party(贪心)
    [CF808D] Array Division(暴力,枚举)
  • 原文地址:https://www.cnblogs.com/eaglezzb/p/4176540.html
Copyright © 2011-2022 走看看