LCOV - code coverage report
Current view: top level - src/interfaces/libpq/test - libpq_uri_regress.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 88.0 % 25 22
Test Date: 2026-03-01 09:14:34 Functions: 100.0 % 1 1
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*
       2              :  * libpq_uri_regress.c
       3              :  *      A test program for libpq URI format
       4              :  *
       5              :  * This is a helper for libpq conninfo regression testing.  It takes a single
       6              :  * conninfo string as a parameter, parses it using PQconninfoParse, and then
       7              :  * prints out the values from the parsed PQconninfoOption struct that differ
       8              :  * from the defaults (obtained from PQconndefaults).
       9              :  *
      10              :  * Portions Copyright (c) 2012-2026, PostgreSQL Global Development Group
      11              :  *
      12              :  * IDENTIFICATION
      13              :  *      src/interfaces/libpq/test/libpq_uri_regress.c
      14              :  */
      15              : 
      16              : #include "postgres_fe.h"
      17              : 
      18              : #include "libpq-fe.h"
      19              : 
      20              : int
      21           63 : main(int argc, char *argv[])
      22              : {
      23              :     PQconninfoOption *opts;
      24              :     PQconninfoOption *defs;
      25              :     PQconninfoOption *opt;
      26              :     PQconninfoOption *def;
      27           63 :     char       *errmsg = NULL;
      28           63 :     bool        local = true;
      29              : 
      30           63 :     if (argc != 2)
      31            0 :         return 1;
      32              : 
      33           63 :     opts = PQconninfoParse(argv[1], &errmsg);
      34           63 :     if (opts == NULL)
      35              :     {
      36           16 :         fprintf(stderr, "libpq_uri_regress: %s", errmsg);
      37           16 :         return 1;
      38              :     }
      39              : 
      40           47 :     defs = PQconndefaults();
      41           47 :     if (defs == NULL)
      42              :     {
      43            0 :         fprintf(stderr, "libpq_uri_regress: cannot fetch default options\n");
      44            0 :         return 1;
      45              :     }
      46              : 
      47              :     /*
      48              :      * Loop on the options, and print the value of each if not the default.
      49              :      *
      50              :      * XXX this coding assumes that PQconninfoOption structs always have the
      51              :      * keywords in the same order.
      52              :      */
      53         2444 :     for (opt = opts, def = defs; opt->keyword; ++opt, ++def)
      54              :     {
      55         2397 :         if (opt->val != NULL)
      56              :         {
      57           94 :             if (def->val == NULL || strcmp(opt->val, def->val) != 0)
      58           93 :                 printf("%s='%s' ", opt->keyword, opt->val);
      59              : 
      60              :             /*
      61              :              * Try to detect if this is a Unix-domain socket or inet.  This is
      62              :              * a bit grotty but it's the same thing that libpq itself does.
      63              :              *
      64              :              * Note that we directly test for '/' instead of using
      65              :              * is_absolute_path, as that would be considerably more messy.
      66              :              * This would fail on Windows, but that platform doesn't have
      67              :              * Unix-domain sockets anyway.
      68              :              */
      69           94 :             if (*opt->val &&
      70           94 :                 (strcmp(opt->keyword, "hostaddr") == 0 ||
      71           92 :                  (strcmp(opt->keyword, "host") == 0 && *opt->val != '/')))
      72              :             {
      73           33 :                 local = false;
      74              :             }
      75              :         }
      76              :     }
      77              : 
      78           47 :     if (local)
      79           15 :         printf("(local)\n");
      80              :     else
      81           32 :         printf("(inet)\n");
      82              : 
      83           47 :     return 0;
      84              : }
        

Generated by: LCOV version 2.0-1