the following patch makes the filename used to store the readline

history customizable through a variable named HISTFILE, analogous to
psql's already implemented HISTCONTROL and HISTSIZE variables, and
bash's HISTFILE-Variable.

The motivation was to be able to get psql to maintain separate
histories for separate databases.  This is now easily achievable
through a line like the following in ~/.psqlrc:

\set HISTFILE ~/.psql_history-:DBNAME

Andreas Seltenreich
This commit is contained in:
Bruce Momjian 2005-06-10 15:34:26 +00:00
parent 92eadf6c4a
commit ea88824a3e
2 changed files with 50 additions and 26 deletions

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.139 2005/06/09 15:27:26 momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.140 2005/06/10 15:34:25 momjian Exp $
PostgreSQL documentation
-->
@ -1987,6 +1987,28 @@ bar
</listitem>
</varlistentry>
<varlistentry>
<term><varname>HISTFILE</varname></term>
<listitem>
<para>
This variable contains the filename used to save the history.
Its default value is <filename>~/.psql_history</filename>.
For example, use:
<programlisting>
\set HISTFILE ~/.psql_history-:DBNAME
</programlisting>
in your <filename>~/.psqlrc</filename> will get psql to
maintain a separate history for each database.
</para>
<note>
<para>
This feature was shamelessly plagiarized from
<application>Bash</application>.
</para>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>HISTSIZE</varname></term>
<listitem>

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.43 2005/01/06 18:29:09 tgl Exp $
* $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.44 2005/06/10 15:34:26 momjian Exp $
*/
#include "postgres_fe.h"
@ -24,6 +24,8 @@
#ifdef USE_READLINE
static bool useReadline;
static bool useHistory;
char *psql_history;
enum histcontrol
{
@ -177,16 +179,24 @@ initializeInput(int flags)
if (GetVariable(pset.vars, "HISTSIZE") == NULL)
SetVariable(pset.vars, "HISTSIZE", "500");
using_history();
if (get_home_path(home))
{
char *psql_history;
psql_history = pg_malloc(strlen(home) + 1 +
strlen(PSQLHISTORY) + 1);
sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
read_history(psql_history);
free(psql_history);
if (GetVariable(pset.vars, "HISTFILE") == NULL)
{
if (get_home_path(home))
{
psql_history = pg_malloc(strlen(home) + 1 +
strlen(PSQLHISTORY) + 1);
snprintf(psql_history, MAXPGPATH, "%s/%s", home, PSQLHISTORY);
}
}
else
{
psql_history = pg_strdup(GetVariable(pset.vars, "HISTFILE"));
expand_tilde(&psql_history);
}
if (psql_history)
read_history(psql_history);
}
#endif
@ -227,25 +237,17 @@ finishInput(int exitstatus, void *arg)
#endif
{
#ifdef USE_READLINE
if (useHistory)
if (useHistory && psql_history)
{
char home[MAXPGPATH];
int hist_size;
if (get_home_path(home))
{
char *psql_history;
int hist_size;
hist_size = GetVariableNum(pset.vars, "HISTSIZE", -1, -1, true);
if (hist_size >= 0)
stifle_history(hist_size);
hist_size = GetVariableNum(pset.vars, "HISTSIZE", -1, -1, true);
if (hist_size >= 0)
stifle_history(hist_size);
psql_history = pg_malloc(strlen(home) + 1 +
strlen(PSQLHISTORY) + 1);
sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
write_history(psql_history);
free(psql_history);
}
write_history(psql_history);
free(psql_history);
psql_history = NULL;
}
#endif
}