PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
uri-regress.c
Go to the documentation of this file.
1 /*
2  * 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-2017, PostgreSQL Global Development Group
11  *
12  * IDENTIFICATION
13  * src/interfaces/libpq/test/uri-regress.c
14  */
15 
16 #include "postgres_fe.h"
17 
18 #include "libpq-fe.h"
19 
20 int
21 main(int argc, char *argv[])
22 {
23  PQconninfoOption *opts;
24  PQconninfoOption *defs;
25  PQconninfoOption *opt;
26  PQconninfoOption *def;
27  char *errmsg = NULL;
28  bool local = true;
29 
30  if (argc != 2)
31  return 1;
32 
33  opts = PQconninfoParse(argv[1], &errmsg);
34  if (opts == NULL)
35  {
36  fprintf(stderr, "uri-regress: %s", errmsg);
37  return 1;
38  }
39 
40  defs = PQconndefaults();
41  if (defs == NULL)
42  {
43  fprintf(stderr, "uri-regress: cannot fetch default options\n");
44  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  for (opt = opts, def = defs; opt->keyword; ++opt, ++def)
54  {
55  if (opt->val != NULL)
56  {
57  if (def->val == NULL || strcmp(opt->val, def->val) != 0)
58  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  if (*opt->val &&
70  (strcmp(opt->keyword, "hostaddr") == 0 ||
71  (strcmp(opt->keyword, "host") == 0 && *opt->val != '/')))
72  {
73  local = false;
74  }
75  }
76  }
77 
78  if (local)
79  printf("(local)\n");
80  else
81  printf("(inet)\n");
82 
83  return 0;
84 }
PQconninfoOption * PQconninfoParse(const char *conninfo, char **errmsg)
Definition: fe-connect.c:4717
int main(int argc, char *argv[])
Definition: uri-regress.c:21
PQconninfoOption * PQconndefaults(void)
Definition: fe-connect.c:1224
int errmsg(const char *fmt,...)
Definition: elog.c:797