the following patch makes the filename used to store the readline
authorBruce Momjian
Fri, 10 Jun 2005 15:34:26 +0000 (15:34 +0000)
committerBruce Momjian
Fri, 10 Jun 2005 15:34:26 +0000 (15:34 +0000)
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

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/input.c

index 148fd0807dc34e9ea47882168a80eef65fd48bf3..075225b6fb24bc5906a4e4a59dd227ceb302c82e 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -1987,6 +1987,28 @@ bar
         
       
 
+      
+        HISTFILE
+        
+        
+        This variable contains the filename used to save the history.
+        Its default value is ~/.psql_history.
+        For example, use:
+
+\set HISTFILE ~/.psql_history-:DBNAME
+
+        in your ~/.psqlrc will get psql to
+        maintain a separate history for each database.
+        
+        
+        
+        This feature was shamelessly plagiarized from
+        Bash.
+        
+        
+        
+      
+
       
         HISTSIZE
         
index e75c86f7f8c732f28812b282bfd6388ab3c485d2..ee0180376b18babf57e4101bf3903d167123ec53 100644 (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))
+
+       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
        {
-           char       *psql_history;
+           psql_history = pg_strdup(GetVariable(pset.vars, "HISTFILE"));
+           expand_tilde(&psql_history);
+       }
 
-           psql_history = pg_malloc(strlen(home) + 1 +
-                                    strlen(PSQLHISTORY) + 1);
-           sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
+       if (psql_history)
            read_history(psql_history);
-           free(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);
-
-           psql_history = pg_malloc(strlen(home) + 1 +
-                                    strlen(PSQLHISTORY) + 1);
-           sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
-           write_history(psql_history);
-           free(psql_history);
-       }
+       hist_size = GetVariableNum(pset.vars, "HISTSIZE", -1, -1, true);
+       if (hist_size >= 0)
+           stifle_history(hist_size);
+
+       write_history(psql_history);
+       free(psql_history);
+       psql_history = NULL;
    }
 #endif
 }