#include "postgres_fe.h"#include <pwd.h>#include <signal.h>#include <unistd.h>#include "common.h"
Go to the source code of this file.
Defines | |
| #define | PARAMS_ARRAY_SIZE 7 |
| #define | PG_YESLETTER gettext_noop("y") |
| #define | PG_NOLETTER gettext_noop("n") |
Functions | |
| static void | SetCancelConn (PGconn *conn) |
| static void | ResetCancelConn (void) |
| const char * | get_user_name (const char *progname) |
| void | handle_help_version_opts (int argc, char *argv[], const char *fixed_progname, help_handler hlp) |
| PGconn * | connectDatabase (const char *dbname, const char *pghost, const char *pgport, const char *pguser, enum trivalue prompt_password, const char *progname, bool fail_ok) |
| PGconn * | connectMaintenanceDatabase (const char *maintenance_db, const char *pghost, const char *pgport, const char *pguser, enum trivalue prompt_password, const char *progname) |
| PGresult * | executeQuery (PGconn *conn, const char *query, const char *progname, bool echo) |
| void | executeCommand (PGconn *conn, const char *query, const char *progname, bool echo) |
| bool | executeMaintenanceCommand (PGconn *conn, const char *query, bool echo) |
| bool | yesno_prompt (const char *question) |
| static void | handle_sigint (SIGNAL_ARGS) |
| void | setup_cancel_handler (void) |
Variables | |
| static PGcancel *volatile | cancelConn = NULL |
| #define PARAMS_ARRAY_SIZE 7 |
| #define PG_NOLETTER gettext_noop("n") |
Definition at line 286 of file common.c.
Referenced by yesno_prompt().
| #define PG_YESLETTER gettext_noop("y") |
Definition at line 284 of file common.c.
Referenced by yesno_prompt().
| PGconn* connectDatabase | ( | const char * | dbname, | |
| const char * | pghost, | |||
| const char * | pgport, | |||
| const char * | pguser, | |||
| enum trivalue | prompt_password, | |||
| const char * | progname, | |||
| bool | fail_ok | |||
| ) |
Definition at line 93 of file common.c.
References _, conn, CONNECTION_BAD, free, NULL, PARAMS_ARRAY_SIZE, pg_malloc(), PQconnectdbParams(), PQconnectionNeedsPassword(), PQerrorMessage(), PQfinish(), PQstatus(), simple_prompt(), TRI_NO, TRI_YES, and values.
{
PGconn *conn;
char *password = NULL;
bool new_pass;
if (prompt_password == TRI_YES)
password = simple_prompt("Password: ", 100, false);
/*
* Start the connection. Loop until we have a password if requested by
* backend.
*/
do
{
#define PARAMS_ARRAY_SIZE 7
const char **keywords = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
const char **values = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
keywords[0] = "host";
values[0] = pghost;
keywords[1] = "port";
values[1] = pgport;
keywords[2] = "user";
values[2] = pguser;
keywords[3] = "password";
values[3] = password;
keywords[4] = "dbname";
values[4] = dbname;
keywords[5] = "fallback_application_name";
values[5] = progname;
keywords[6] = NULL;
values[6] = NULL;
new_pass = false;
conn = PQconnectdbParams(keywords, values, true);
free(keywords);
free(values);
if (!conn)
{
fprintf(stderr, _("%s: could not connect to database %s\n"),
progname, dbname);
exit(1);
}
if (PQstatus(conn) == CONNECTION_BAD &&
PQconnectionNeedsPassword(conn) &&
password == NULL &&
prompt_password != TRI_NO)
{
PQfinish(conn);
password = simple_prompt("Password: ", 100, false);
new_pass = true;
}
} while (new_pass);
if (password)
free(password);
/* check to see that the backend connection was successfully made */
if (PQstatus(conn) == CONNECTION_BAD)
{
if (fail_ok)
{
PQfinish(conn);
return NULL;
}
fprintf(stderr, _("%s: could not connect to database %s: %s"),
progname, dbname, PQerrorMessage(conn));
exit(1);
}
return conn;
}
| PGconn* connectMaintenanceDatabase | ( | const char * | maintenance_db, | |
| const char * | pghost, | |||
| const char * | pgport, | |||
| const char * | pguser, | |||
| enum trivalue | prompt_password, | |||
| const char * | progname | |||
| ) |
Definition at line 176 of file common.c.
References conn, and connectDatabase().
Referenced by cluster_all_databases(), main(), reindex_all_databases(), and vacuum_all_databases().
{
PGconn *conn;
/* If a maintenance database name was specified, just connect to it. */
if (maintenance_db)
return connectDatabase(maintenance_db, pghost, pgport, pguser,
prompt_password, progname, false);
/* Otherwise, try postgres first and then template1. */
conn = connectDatabase("postgres", pghost, pgport, pguser, prompt_password,
progname, true);
if (!conn)
conn = connectDatabase("template1", pghost, pgport, pguser,
prompt_password, progname, false);
return conn;
}
Definition at line 229 of file common.c.
References _, PGRES_COMMAND_OK, PQclear(), PQerrorMessage(), PQexec(), PQfinish(), and PQresultStatus().
{
PGresult *res;
if (echo)
printf("%s\n", query);
res = PQexec(conn, query);
if (!res ||
PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, _("%s: query failed: %s"),
progname, PQerrorMessage(conn));
fprintf(stderr, _("%s: query was: %s\n"),
progname, query);
PQfinish(conn);
exit(1);
}
PQclear(res);
}
Definition at line 259 of file common.c.
References PQclear(), PQexec(), PQresultStatus(), ResetCancelConn(), and SetCancelConn().
Referenced by cluster_one_database(), reindex_one_database(), reindex_system_catalogs(), and vacuum_one_database().
{
PGresult *res;
bool r;
if (echo)
printf("%s\n", query);
SetCancelConn(conn);
res = PQexec(conn, query);
ResetCancelConn();
r = (res && PQresultStatus(res) == PGRES_COMMAND_OK);
if (res)
PQclear(res);
return r;
}
Definition at line 202 of file common.c.
References _, PGRES_TUPLES_OK, PQerrorMessage(), PQexec(), PQfinish(), and PQresultStatus().
{
PGresult *res;
if (echo)
printf("%s\n", query);
res = PQexec(conn, query);
if (!res ||
PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, _("%s: query failed: %s"),
progname, PQerrorMessage(conn));
fprintf(stderr, _("%s: query was: %s\n"),
progname, query);
PQfinish(conn);
exit(1);
}
return res;
}
| const char* get_user_name | ( | const char * | progname | ) |
Definition at line 36 of file common.c.
References _, strerror(), and username.
Referenced by main().
{
#ifndef WIN32
struct passwd *pw;
pw = getpwuid(geteuid());
if (!pw)
{
fprintf(stderr, _("%s: could not obtain information about current user: %s\n"),
progname, strerror(errno));
exit(1);
}
return pw->pw_name;
#else
static char username[128]; /* remains after function exit */
DWORD len = sizeof(username) - 1;
if (!GetUserName(username, &len))
{
fprintf(stderr, _("%s: could not get current user name: %s\n"),
progname, strerror(errno));
exit(1);
}
return username;
#endif
}
| void handle_help_version_opts | ( | int | argc, | |
| char * | argv[], | |||
| const char * | fixed_progname, | |||
| help_handler | hlp | |||
| ) |
Definition at line 69 of file common.c.
References get_progname().
Referenced by main().
{
if (argc > 1)
{
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
{
hlp(get_progname(argv[0]));
exit(0);
}
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
{
printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname);
exit(0);
}
}
}
| static void handle_sigint | ( | SIGNAL_ARGS | ) | [static] |
Definition at line 386 of file common.c.
References _, NULL, and PQcancel().
Referenced by setup_cancel_handler().
{
int save_errno = errno;
char errbuf[256];
/* Send QueryCancel if we are processing a database query */
if (cancelConn != NULL)
{
if (PQcancel(cancelConn, errbuf, sizeof(errbuf)))
fprintf(stderr, _("Cancel request sent\n"));
else
fprintf(stderr, _("Could not send cancel request: %s"), errbuf);
}
errno = save_errno; /* just in case the write changed it */
}
| static void ResetCancelConn | ( | void | ) | [static] |
Definition at line 358 of file common.c.
References NULL, and PQfreeCancel().
{
PGcancel *oldCancelConn;
#ifdef WIN32
EnterCriticalSection(&cancelConnLock);
#endif
oldCancelConn = cancelConn;
/* be sure handle_sigint doesn't use pointer while freeing */
cancelConn = NULL;
if (oldCancelConn != NULL)
PQfreeCancel(oldCancelConn);
#ifdef WIN32
LeaveCriticalSection(&cancelConnLock);
#endif
}
| static void SetCancelConn | ( | PGconn * | conn | ) | [static] |
Definition at line 328 of file common.c.
References NULL, PQfreeCancel(), and PQgetCancel().
{
PGcancel *oldCancelConn;
#ifdef WIN32
EnterCriticalSection(&cancelConnLock);
#endif
/* Free the old one if we have one */
oldCancelConn = cancelConn;
/* be sure handle_sigint doesn't use pointer while freeing */
cancelConn = NULL;
if (oldCancelConn != NULL)
PQfreeCancel(oldCancelConn);
cancelConn = PQgetCancel(conn);
#ifdef WIN32
LeaveCriticalSection(&cancelConnLock);
#endif
}
| void setup_cancel_handler | ( | void | ) |
Definition at line 404 of file common.c.
References handle_sigint(), and pqsignal().
{
pqsignal(SIGINT, handle_sigint);
}
| bool yesno_prompt | ( | const char * | question | ) |
Definition at line 289 of file common.c.
References _, free, PG_NOLETTER, PG_YESLETTER, simple_prompt(), and snprintf().
Referenced by main().
{
char prompt[256];
/*------
translator: This is a question followed by the translated options for
"yes" and "no". */
snprintf(prompt, sizeof(prompt), _("%s (%s/%s) "),
_(question), _(PG_YESLETTER), _(PG_NOLETTER));
for (;;)
{
char *resp;
resp = simple_prompt(prompt, 1, true);
if (strcmp(resp, _(PG_YESLETTER)) == 0)
{
free(resp);
return true;
}
else if (strcmp(resp, _(PG_NOLETTER)) == 0)
{
free(resp);
return false;
}
free(resp);
printf(_("Please answer \"%s\" or \"%s\".\n"),
_(PG_YESLETTER), _(PG_NOLETTER));
}
}
PGcancel* volatile cancelConn = NULL [static] |
1.7.1