Sergey E. Koposov wrote:
> Fix of several issues:
>
> 1) Fix the problems with the \s command.
> When the saveHistory is executed by the \s command we must not do the
> conversion \n -> \x01 (per
> http://archives.postgresql.org/pgsql-hackers/2006-03/msg00317.php )
>
> 2) Fix the handling of Ctrl+C
>
> Now when you do
> wsdb=# select 'your long query here '
> wsdb-#
> and press afterwards the CtrlC the line "select 'your long query here '"
> will be in the history
>
> (partly per
> http://archives.postgresql.org/pgsql-hackers/2006-03/msg00297.php )
>
> 3) Fix the handling of commands with not closed brackets, quotes, double
> quotes. (now those commands are not splitted in parts...)
>
> 4) Fix the behaviour when SINGLELINE mode is used. (before it was almost
> broken ;(
Great. Patch applied. I had to adjust your patch around changes made
to put backslash commands embedded in queries to the top of the history.
Updated patch attached.
--
Bruce Momjian http://candle.pha.pa.us
SRA OSS, Inc. http://www.sraoss.com
+ If your life is a hard drive, Christ can be your backup. +
Index: src/bin/psql/command.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/command.c,v
retrieving revision 1.164
diff -c -c -r1.164 command.c
*** src/bin/psql/command.c 5 Mar 2006 15:58:51 -0000 1.164
--- src/bin/psql/command.c 21 Mar 2006 12:50:34 -0000
***************
*** 753,759 ****
expand_tilde(&fname);
/* This scrolls off the screen when using /dev/tty */
! success = saveHistory(fname ? fname : DEVTTY);
if (success && !quiet && fname)
printf(gettext("Wrote history to file \"%s/%s\".\n"),
pset.dirname ? pset.dirname : ".", fname);
--- 753,759 ----
expand_tilde(&fname);
/* This scrolls off the screen when using /dev/tty */
! success = saveHistory(fname ? fname : DEVTTY, false);
if (success && !quiet && fname)
printf(gettext("Wrote history to file \"%s/%s\".\n"),
pset.dirname ? pset.dirname : ".", fname);
Index: src/bin/psql/input.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/input.c,v
retrieving revision 1.52
diff -c -c -r1.52 input.c
*** src/bin/psql/input.c 6 Mar 2006 04:45:21 -0000 1.52
--- src/bin/psql/input.c 21 Mar 2006 12:50:34 -0000
***************
*** 148,153 ****
--- 148,157 ----
{
enum histcontrol HC;
+ /* Flushing of empty buffer should do nothing */
+ if (*s == 0)
+ return;
+
prev_hist = NULL;
HC = GetHistControlConfig();
***************
*** 295,307 ****
}
bool
! saveHistory(char *fname)
{
#ifdef USE_READLINE
if (useHistory && fname)
{
! encode_history();
if (write_history(fname) == 0)
return true;
--- 299,318 ----
}
+ /* This function is designed for saving the readline history when user
+ * run \s command or when psql finishes.
+ * We have an argument named encodeFlag to handle those cases differently
+ * In that case of call via \s we don't really need to encode \n as \x01,
+ * but when we save history for Readline we must do that conversion
+ */
bool
! saveHistory(char *fname, bool encodeFlag)
{
#ifdef USE_READLINE
if (useHistory && fname)
{
! if (encodeFlag)
! encode_history();
if (write_history(fname) == 0)
return true;
***************
*** 331,337 ****
if (hist_size >= 0)
stifle_history(hist_size);
! saveHistory(psql_history);
free(psql_history);
psql_history = NULL;
}
--- 342,348 ----
if (hist_size >= 0)
stifle_history(hist_size);
! saveHistory(psql_history, true);
free(psql_history);
psql_history = NULL;
}
Index: src/bin/psql/input.h
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/input.h,v
retrieving revision 1.26
diff -c -c -r1.26 input.h
*** src/bin/psql/input.h 6 Mar 2006 04:45:21 -0000 1.26
--- src/bin/psql/input.h 21 Mar 2006 12:50:34 -0000
***************
*** 37,43 ****
char *gets_fromFile(FILE *source);
void initializeInput(int flags);
! bool saveHistory(char *fname);
void pg_append_history(char *s, PQExpBuffer history_buf);
void pg_clear_history(PQExpBuffer history_buf);
--- 37,43 ----
char *gets_fromFile(FILE *source);
void initializeInput(int flags);
! bool saveHistory(char *fname, bool encodeFlag);
void pg_append_history(char *s, PQExpBuffer history_buf);
void pg_clear_history(PQExpBuffer history_buf);
Index: src/bin/psql/mainloop.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/mainloop.c,v
retrieving revision 1.73
diff -c -c -r1.73 mainloop.c
*** src/bin/psql/mainloop.c 6 Mar 2006 15:09:04 -0000 1.73
--- src/bin/psql/mainloop.c 21 Mar 2006 12:50:34 -0000
***************
*** 112,118 ****
slashCmdStatus = PSQL_CMD_UNKNOWN;
prompt_status = PROMPT_READY;
if (pset.cur_cmd_interactive)
! pg_clear_history(history_buf);
if (pset.cur_cmd_interactive)
putc('\n', stdout);
--- 112,118 ----
slashCmdStatus = PSQL_CMD_UNKNOWN;
prompt_status = PROMPT_READY;
if (pset.cur_cmd_interactive)
! pg_write_history(history_buf->data);
if (pset.cur_cmd_interactive)
putc('\n', stdout);
***************
*** 321,327 ****
break;
}
! if (pset.cur_cmd_interactive && prompt_status !=
PROMPT_CONTINUE)
{
/*
* Pass all the contents of history_buf to readline
--- 321,328 ----
break;
}
! if ((pset.cur_cmd_interactive && prompt_status == PROMPT_READY)
||
! (GetVariableBool(pset.vars, "SINGLELINE") &&
prompt_status == PROMPT_CONTINUE))
{
/*
* Pass all the contents of history_buf to readline
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings