PostgreSQL Source Code  git master
common.h File Reference
#include "common/username.h"
#include "fe_utils/connect_utils.h"
#include "getopt_long.h"
#include "libpq-fe.h"
#include "pqexpbuffer.h"
Include dependency graph for common.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void splitTableColumnsSpec (const char *spec, int encoding, char **table, const char **columns)
 
void appendQualifiedRelation (PQExpBuffer buf, const char *name, PGconn *conn, bool echo)
 
bool yesno_prompt (const char *question)
 

Function Documentation

◆ appendQualifiedRelation()

void appendQualifiedRelation ( PQExpBuffer  buf,
const char *  name,
PGconn conn,
bool  echo 
)

Definition at line 69 of file common.c.

References ALWAYS_SECURE_SEARCH_PATH_SQL, appendPQExpBufferStr(), appendStringLiteralConn(), PQExpBufferData::data, executeCommand(), executeQuery(), fmtQualifiedId(), initPQExpBuffer(), ngettext, pg_free(), pg_log_error, PQclear(), PQclientEncoding(), PQfinish(), PQgetvalue(), PQntuples(), splitTableColumnsSpec(), and termPQExpBuffer().

Referenced by cluster_one_database(), and run_reindex_command().

71 {
72  char *table;
73  const char *columns;
74  PQExpBufferData sql;
75  PGresult *res;
76  int ntups;
77 
78  splitTableColumnsSpec(spec, PQclientEncoding(conn), &table, &columns);
79 
80  /*
81  * Query must remain ABSOLUTELY devoid of unqualified names. This would
82  * be unnecessary given a regclassin() variant taking a search_path
83  * argument.
84  */
85  initPQExpBuffer(&sql);
87  "SELECT c.relname, ns.nspname\n"
88  " FROM pg_catalog.pg_class c,"
89  " pg_catalog.pg_namespace ns\n"
90  " WHERE c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n"
91  " AND c.oid OPERATOR(pg_catalog.=) ");
92  appendStringLiteralConn(&sql, table, conn);
93  appendPQExpBufferStr(&sql, "::pg_catalog.regclass;");
94 
95  executeCommand(conn, "RESET search_path;", echo);
96 
97  /*
98  * One row is a typical result, as is a nonexistent relation ERROR.
99  * regclassin() unconditionally accepts all-digits input as an OID; if no
100  * relation has that OID; this query returns no rows. Catalog corruption
101  * might elicit other row counts.
102  */
103  res = executeQuery(conn, sql.data, echo);
104  ntups = PQntuples(res);
105  if (ntups != 1)
106  {
107  pg_log_error(ngettext("query returned %d row instead of one: %s",
108  "query returned %d rows instead of one: %s",
109  ntups),
110  ntups, sql.data);
111  PQfinish(conn);
112  exit(1);
113  }
115  fmtQualifiedId(PQgetvalue(res, 0, 1),
116  PQgetvalue(res, 0, 0)));
117  appendPQExpBufferStr(buf, columns);
118  PQclear(res);
119  termPQExpBuffer(&sql);
120  pg_free(table);
121 
123 }
static PGresult * executeQuery(PGconn *conn, const char *query)
Definition: pg_dumpall.c:1874
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3561
void termPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:131
#define pg_log_error(...)
Definition: logging.h:80
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
Definition: pqexpbuffer.c:369
void PQfinish(PGconn *conn)
Definition: fe-connect.c:4221
int PQntuples(const PGresult *res)
Definition: fe-exec.c:3167
int PQclientEncoding(const PGconn *conn)
Definition: fe-connect.c:6796
static void executeCommand(PGconn *conn, const char *query)
Definition: pg_dumpall.c:1897
#define ngettext(s, p, n)
Definition: c.h:1182
void PQclear(PGresult *res)
Definition: fe-exec.c:680
const char * fmtQualifiedId(const char *schema, const char *id)
Definition: string_utils.c:145
void pg_free(void *ptr)
Definition: fe_memutils.c:105
#define ALWAYS_SECURE_SEARCH_PATH_SQL
Definition: connect.h:25
void appendStringLiteralConn(PQExpBuffer buf, const char *str, PGconn *conn)
Definition: string_utils.c:293
void splitTableColumnsSpec(const char *spec, int encoding, char **table, const char **columns)
Definition: common.c:34
void initPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:92

◆ splitTableColumnsSpec()

void splitTableColumnsSpec ( const char *  spec,
int  encoding,
char **  table,
const char **  columns 
)

Definition at line 34 of file common.c.

References pnstrdup(), and PQmblen().

Referenced by appendQualifiedRelation(), and vacuum_one_database().

36 {
37  bool inquotes = false;
38  const char *cp = spec;
39 
40  /*
41  * Find the first '(' not identifier-quoted. Based on
42  * dequote_downcase_identifier().
43  */
44  while (*cp && (*cp != '(' || inquotes))
45  {
46  if (*cp == '"')
47  {
48  if (inquotes && cp[1] == '"')
49  cp++; /* pair does not affect quoting */
50  else
51  inquotes = !inquotes;
52  cp++;
53  }
54  else
55  cp += PQmblen(cp, encoding);
56  }
57  *table = pnstrdup(spec, cp - spec);
58  *columns = cp;
59 }
char * pnstrdup(const char *in, Size len)
Definition: mcxt.c:1310
int32 encoding
Definition: pg_database.h:41
int PQmblen(const char *s, int encoding)
Definition: fe-misc.c:1186

◆ yesno_prompt()

bool yesno_prompt ( const char *  question)

Definition at line 136 of file common.c.

References _, free, PG_NOLETTER, PG_YESLETTER, printf, simple_prompt(), and snprintf.

Referenced by main().

137 {
138  char prompt[256];
139 
140  /*------
141  translator: This is a question followed by the translated options for
142  "yes" and "no". */
143  snprintf(prompt, sizeof(prompt), _("%s (%s/%s) "),
144  _(question), _(PG_YESLETTER), _(PG_NOLETTER));
145 
146  for (;;)
147  {
148  char *resp;
149 
150  resp = simple_prompt(prompt, true);
151 
152  if (strcmp(resp, _(PG_YESLETTER)) == 0)
153  {
154  free(resp);
155  return true;
156  }
157  if (strcmp(resp, _(PG_NOLETTER)) == 0)
158  {
159  free(resp);
160  return false;
161  }
162  free(resp);
163 
164  printf(_("Please answer \"%s\" or \"%s\".\n"),
166  }
167 }
#define PG_YESLETTER
Definition: common.c:131
#define printf(...)
Definition: port.h:222
char * simple_prompt(const char *prompt, bool echo)
Definition: sprompt.c:38
#define PG_NOLETTER
Definition: common.c:133
#define free(a)
Definition: header.h:65
#define snprintf
Definition: port.h:216
#define _(x)
Definition: elog.c:89