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 : }