mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Issue psql connection warnings on connection start and via \c, per
observation by David Fetter.
This commit is contained in:
parent
6b797c852b
commit
92d1cc8973
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.191 2008/06/26 01:35:45 momjian Exp $
|
* $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.192 2008/07/01 00:08:18 momjian Exp $
|
||||||
*/
|
*/
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
@ -29,6 +29,9 @@
|
|||||||
#include <sys/types.h> /* for umask() */
|
#include <sys/types.h> /* for umask() */
|
||||||
#include <sys/stat.h> /* for stat() */
|
#include <sys/stat.h> /* for stat() */
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_SSL
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "portability/instr_time.h"
|
#include "portability/instr_time.h"
|
||||||
|
|
||||||
@ -57,6 +60,15 @@ static bool do_edit(const char *filename_arg, PQExpBuffer query_buf);
|
|||||||
static bool do_connect(char *dbname, char *user, char *host, char *port);
|
static bool do_connect(char *dbname, char *user, char *host, char *port);
|
||||||
static bool do_shell(const char *command);
|
static bool do_shell(const char *command);
|
||||||
|
|
||||||
|
#ifdef USE_SSL
|
||||||
|
static void printSSLInfo(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
static void checkWin32Codepage(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*----------
|
/*----------
|
||||||
* HandleSlashCmds:
|
* HandleSlashCmds:
|
||||||
@ -1185,6 +1197,7 @@ do_connect(char *dbname, char *user, char *host, char *port)
|
|||||||
* Replace the old connection with the new one, and update
|
* Replace the old connection with the new one, and update
|
||||||
* connection-dependent variables.
|
* connection-dependent variables.
|
||||||
*/
|
*/
|
||||||
|
connection_warnings();
|
||||||
PQsetNoticeProcessor(n_conn, NoticeProcessor, NULL);
|
PQsetNoticeProcessor(n_conn, NoticeProcessor, NULL);
|
||||||
pset.db = n_conn;
|
pset.db = n_conn;
|
||||||
SyncVariables();
|
SyncVariables();
|
||||||
@ -1212,6 +1225,100 @@ do_connect(char *dbname, char *user, char *host, char *port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
connection_warnings(void)
|
||||||
|
{
|
||||||
|
if (!pset.quiet && !pset.notty)
|
||||||
|
{
|
||||||
|
int client_ver = parse_version(PG_VERSION);
|
||||||
|
|
||||||
|
if (pset.sversion != client_ver)
|
||||||
|
{
|
||||||
|
const char *server_version;
|
||||||
|
char server_ver_str[16];
|
||||||
|
|
||||||
|
/* Try to get full text form, might include "devel" etc */
|
||||||
|
server_version = PQparameterStatus(pset.db, "server_version");
|
||||||
|
if (!server_version)
|
||||||
|
{
|
||||||
|
snprintf(server_ver_str, sizeof(server_ver_str),
|
||||||
|
"%d.%d.%d",
|
||||||
|
pset.sversion / 10000,
|
||||||
|
(pset.sversion / 100) % 100,
|
||||||
|
pset.sversion % 100);
|
||||||
|
server_version = server_ver_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(_("%s (%s, server %s)\n"),
|
||||||
|
pset.progname, PG_VERSION, server_version);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("%s (%s)\n", pset.progname, PG_VERSION);
|
||||||
|
|
||||||
|
if (pset.sversion / 100 != client_ver / 100)
|
||||||
|
printf(_("WARNING: %s version %d.%d, server version %d.%d.\n"
|
||||||
|
" Some psql features might not work.\n"),
|
||||||
|
pset.progname, client_ver / 10000, (client_ver / 100) % 100,
|
||||||
|
pset.sversion / 10000, (pset.sversion / 100) % 100);
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
checkWin32Codepage();
|
||||||
|
#endif
|
||||||
|
#ifdef USE_SSL
|
||||||
|
printSSLInfo();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* printSSLInfo
|
||||||
|
*
|
||||||
|
* Prints information about the current SSL connection, if SSL is in use
|
||||||
|
*/
|
||||||
|
#ifdef USE_SSL
|
||||||
|
static void
|
||||||
|
printSSLInfo(void)
|
||||||
|
{
|
||||||
|
int sslbits = -1;
|
||||||
|
SSL *ssl;
|
||||||
|
|
||||||
|
ssl = PQgetssl(pset.db);
|
||||||
|
if (!ssl)
|
||||||
|
return; /* no SSL */
|
||||||
|
|
||||||
|
SSL_get_cipher_bits(ssl, &sslbits);
|
||||||
|
printf(_("SSL connection (cipher: %s, bits: %i)\n"),
|
||||||
|
SSL_get_cipher(ssl), sslbits);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* checkWin32Codepage
|
||||||
|
*
|
||||||
|
* Prints a warning when win32 console codepage differs from Windows codepage
|
||||||
|
*/
|
||||||
|
#ifdef WIN32
|
||||||
|
static void
|
||||||
|
checkWin32Codepage(void)
|
||||||
|
{
|
||||||
|
unsigned int wincp,
|
||||||
|
concp;
|
||||||
|
|
||||||
|
wincp = GetACP();
|
||||||
|
concp = GetConsoleCP();
|
||||||
|
if (wincp != concp)
|
||||||
|
{
|
||||||
|
printf(_("WARNING: Console code page (%u) differs from Windows code page (%u)\n"
|
||||||
|
" 8-bit characters might not work correctly. See psql reference\n"
|
||||||
|
" page \"Notes for Windows users\" for details.\n"),
|
||||||
|
concp, wincp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SyncVariables
|
* SyncVariables
|
||||||
*
|
*
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/psql/command.h,v 1.30 2008/01/01 19:45:55 momjian Exp $
|
* $PostgreSQL: pgsql/src/bin/psql/command.h,v 1.31 2008/07/01 00:08:18 momjian Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef COMMAND_H
|
#ifndef COMMAND_H
|
||||||
#define COMMAND_H
|
#define COMMAND_H
|
||||||
@ -34,6 +34,8 @@ extern bool do_pset(const char *param,
|
|||||||
printQueryOpt *popt,
|
printQueryOpt *popt,
|
||||||
bool quiet);
|
bool quiet);
|
||||||
|
|
||||||
|
extern void connection_warnings(void);
|
||||||
|
|
||||||
extern void SyncVariables(void);
|
extern void SyncVariables(void);
|
||||||
|
|
||||||
extern void UnsyncVariables(void);
|
extern void UnsyncVariables(void);
|
||||||
|
@ -3,14 +3,11 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.148 2008/05/16 17:17:00 momjian Exp $
|
* $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.149 2008/07/01 00:08:18 momjian Exp $
|
||||||
*/
|
*/
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#ifdef USE_SSL
|
|
||||||
#include <openssl/ssl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -78,7 +75,6 @@ struct adhoc_opts
|
|||||||
bool single_txn;
|
bool single_txn;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int parse_version(const char *versionString);
|
|
||||||
static void parse_psql_options(int argc, char *argv[],
|
static void parse_psql_options(int argc, char *argv[],
|
||||||
struct adhoc_opts * options);
|
struct adhoc_opts * options);
|
||||||
static void process_psqlrc(char *argv0);
|
static void process_psqlrc(char *argv0);
|
||||||
@ -86,14 +82,6 @@ static void process_psqlrc_file(char *filename);
|
|||||||
static void showVersion(void);
|
static void showVersion(void);
|
||||||
static void EstablishVariableSpace(void);
|
static void EstablishVariableSpace(void);
|
||||||
|
|
||||||
#ifdef USE_SSL
|
|
||||||
static void printSSLInfo(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
static void checkWin32Codepage(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* main
|
* main
|
||||||
@ -296,49 +284,9 @@ main(int argc, char *argv[])
|
|||||||
if (!options.no_psqlrc)
|
if (!options.no_psqlrc)
|
||||||
process_psqlrc(argv[0]);
|
process_psqlrc(argv[0]);
|
||||||
|
|
||||||
|
connection_warnings();
|
||||||
if (!pset.quiet && !pset.notty)
|
if (!pset.quiet && !pset.notty)
|
||||||
{
|
|
||||||
int client_ver = parse_version(PG_VERSION);
|
|
||||||
|
|
||||||
if (pset.sversion != client_ver)
|
|
||||||
{
|
|
||||||
const char *server_version;
|
|
||||||
char server_ver_str[16];
|
|
||||||
|
|
||||||
/* Try to get full text form, might include "devel" etc */
|
|
||||||
server_version = PQparameterStatus(pset.db, "server_version");
|
|
||||||
if (!server_version)
|
|
||||||
{
|
|
||||||
snprintf(server_ver_str, sizeof(server_ver_str),
|
|
||||||
"%d.%d.%d",
|
|
||||||
pset.sversion / 10000,
|
|
||||||
(pset.sversion / 100) % 100,
|
|
||||||
pset.sversion % 100);
|
|
||||||
server_version = server_ver_str;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(_("%s (%s, server %s)\n"),
|
|
||||||
pset.progname, PG_VERSION, server_version);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("%s (%s)\n", pset.progname, PG_VERSION);
|
|
||||||
|
|
||||||
if (pset.sversion / 100 != client_ver / 100)
|
|
||||||
printf(_("WARNING: %s version %d.%d, server version %d.%d.\n"
|
|
||||||
" Some psql features might not work.\n"),
|
|
||||||
pset.progname, client_ver / 10000, (client_ver / 100) % 100,
|
|
||||||
pset.sversion / 10000, (pset.sversion / 100) % 100);
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
checkWin32Codepage();
|
|
||||||
#endif
|
|
||||||
#ifdef USE_SSL
|
|
||||||
printSSLInfo();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printf(_("Type \"help\" for help.\n\n"));
|
printf(_("Type \"help\" for help.\n\n"));
|
||||||
}
|
|
||||||
|
|
||||||
if (!pset.notty)
|
if (!pset.notty)
|
||||||
initializeInput(options.no_readline ? 0 : 1);
|
initializeInput(options.no_readline ? 0 : 1);
|
||||||
if (options.action_string) /* -f - was used */
|
if (options.action_string) /* -f - was used */
|
||||||
@ -357,29 +305,6 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert a version string into a number.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
parse_version(const char *versionString)
|
|
||||||
{
|
|
||||||
int cnt;
|
|
||||||
int vmaj,
|
|
||||||
vmin,
|
|
||||||
vrev;
|
|
||||||
|
|
||||||
cnt = sscanf(versionString, "%d.%d.%d", &vmaj, &vmin, &vrev);
|
|
||||||
|
|
||||||
if (cnt < 2)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (cnt == 2)
|
|
||||||
vrev = 0;
|
|
||||||
|
|
||||||
return (100 * vmaj + vmin) * 100 + vrev;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse command line options
|
* Parse command line options
|
||||||
*/
|
*/
|
||||||
@ -683,54 +608,6 @@ showVersion(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* printSSLInfo
|
|
||||||
*
|
|
||||||
* Prints information about the current SSL connection, if SSL is in use
|
|
||||||
*/
|
|
||||||
#ifdef USE_SSL
|
|
||||||
static void
|
|
||||||
printSSLInfo(void)
|
|
||||||
{
|
|
||||||
int sslbits = -1;
|
|
||||||
SSL *ssl;
|
|
||||||
|
|
||||||
ssl = PQgetssl(pset.db);
|
|
||||||
if (!ssl)
|
|
||||||
return; /* no SSL */
|
|
||||||
|
|
||||||
SSL_get_cipher_bits(ssl, &sslbits);
|
|
||||||
printf(_("SSL connection (cipher: %s, bits: %i)\n"),
|
|
||||||
SSL_get_cipher(ssl), sslbits);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* checkWin32Codepage
|
|
||||||
*
|
|
||||||
* Prints a warning when win32 console codepage differs from Windows codepage
|
|
||||||
*/
|
|
||||||
#ifdef WIN32
|
|
||||||
static void
|
|
||||||
checkWin32Codepage(void)
|
|
||||||
{
|
|
||||||
unsigned int wincp,
|
|
||||||
concp;
|
|
||||||
|
|
||||||
wincp = GetACP();
|
|
||||||
concp = GetConsoleCP();
|
|
||||||
if (wincp != concp)
|
|
||||||
{
|
|
||||||
printf(_("WARNING: Console code page (%u) differs from Windows code page (%u)\n"
|
|
||||||
" 8-bit characters might not work correctly. See psql reference\n"
|
|
||||||
" page \"Notes for Windows users\" for details.\n"),
|
|
||||||
concp, wincp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Assign hooks for psql variables.
|
* Assign hooks for psql variables.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user