LCOV - code coverage report
Current view: top level - src/interfaces/libpq/test - libpq_uri_regress.c (source / functions) Hit Total Coverage
Test: PostgreSQL 18devel Lines: 22 25 88.0 %
Date: 2024-12-12 16:15:21 Functions: 1 1 100.0 %
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-2024, 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         126 : main(int argc, char *argv[])
      22             : {
      23             :     PQconninfoOption *opts;
      24             :     PQconninfoOption *defs;
      25             :     PQconninfoOption *opt;
      26             :     PQconninfoOption *def;
      27         126 :     char       *errmsg = NULL;
      28         126 :     bool        local = true;
      29             : 
      30         126 :     if (argc != 2)
      31           0 :         return 1;
      32             : 
      33         126 :     opts = PQconninfoParse(argv[1], &errmsg);
      34         126 :     if (opts == NULL)
      35             :     {
      36          32 :         fprintf(stderr, "libpq_uri_regress: %s", errmsg);
      37          32 :         return 1;
      38             :     }
      39             : 
      40          94 :     defs = PQconndefaults();
      41          94 :     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        3948 :     for (opt = opts, def = defs; opt->keyword; ++opt, ++def)
      54             :     {
      55        3854 :         if (opt->val != NULL)
      56             :         {
      57         188 :             if (def->val == NULL || strcmp(opt->val, def->val) != 0)
      58         186 :                 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         188 :             if (*opt->val &&
      70         188 :                 (strcmp(opt->keyword, "hostaddr") == 0 ||
      71         184 :                  (strcmp(opt->keyword, "host") == 0 && *opt->val != '/')))
      72             :             {
      73          66 :                 local = false;
      74             :             }
      75             :         }
      76             :     }
      77             : 
      78          94 :     if (local)
      79          30 :         printf("(local)\n");
      80             :     else
      81          64 :         printf("(inet)\n");
      82             : 
      83          94 :     return 0;
      84             : }

Generated by: LCOV version 1.14