Commit 92d1cc89 authored by Bruce Momjian's avatar Bruce Momjian

Issue psql connection warnings on connection start and via \c, per

observation by David Fetter.
parent 6b797c85
...@@ -3,7 +3,7 @@ ...@@ -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 @@ ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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, ...@@ -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 @@ ...@@ -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 ...@@ -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); ...@@ -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[]) ...@@ -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[]) ...@@ -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) ...@@ -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.
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment