In psql, save history of backslash commands used in multi-line

statements before the multi-line statement, rather than inside the
multi-line statement.
This commit is contained in:
Bruce Momjian 2006-03-06 04:45:21 +00:00
parent 99114a2473
commit ca8f27998a
3 changed files with 43 additions and 23 deletions

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2006, PostgreSQL Global Development Group * Copyright (c) 2000-2006, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.51 2006/03/05 15:58:51 momjian Exp $ * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.52 2006/03/06 04:45:21 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
@ -114,7 +114,7 @@ gets_interactive(const char *prompt)
/* Put the line in the history buffer and also add the trailing \n */ /* Put the line in the history buffer and also add the trailing \n */
void void
pgadd_history(char *s, PQExpBuffer history_buf) pg_append_history(char *s, PQExpBuffer history_buf)
{ {
#ifdef USE_READLINE #ifdef USE_READLINE
@ -134,12 +134,13 @@ pgadd_history(char *s, PQExpBuffer history_buf)
} }
/* Feed the contents of the history buffer to readline */ /*
* Feed the string to readline
*/
void void
pgflush_history(PQExpBuffer history_buf) pg_write_history(char *s)
{ {
#ifdef USE_READLINE #ifdef USE_READLINE
char *s;
static char *prev_hist; static char *prev_hist;
int slen, i; int slen, i;
@ -147,7 +148,6 @@ pgflush_history(PQExpBuffer history_buf)
{ {
enum histcontrol HC; enum histcontrol HC;
s = history_buf->data;
prev_hist = NULL; prev_hist = NULL;
HC = GetHistControlConfig(); HC = GetHistControlConfig();
@ -168,14 +168,12 @@ pgflush_history(PQExpBuffer history_buf)
prev_hist = pg_strdup(s); prev_hist = pg_strdup(s);
add_history(s); add_history(s);
} }
resetPQExpBuffer(history_buf);
} }
#endif #endif
} }
void void
pgclear_history(PQExpBuffer history_buf) pg_clear_history(PQExpBuffer history_buf)
{ {
#ifdef USE_READLINE #ifdef USE_READLINE
if (useReadline && useHistory) if (useReadline && useHistory)

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2006, PostgreSQL Global Development Group * Copyright (c) 2000-2006, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/input.h,v 1.25 2006/03/05 15:58:51 momjian Exp $ * $PostgreSQL: pgsql/src/bin/psql/input.h,v 1.26 2006/03/06 04:45:21 momjian Exp $
*/ */
#ifndef INPUT_H #ifndef INPUT_H
#define INPUT_H #define INPUT_H
@ -39,9 +39,9 @@ char *gets_fromFile(FILE *source);
void initializeInput(int flags); void initializeInput(int flags);
bool saveHistory(char *fname); bool saveHistory(char *fname);
void pgadd_history(char *s, PQExpBuffer history_buf); void pg_append_history(char *s, PQExpBuffer history_buf);
void pgclear_history(PQExpBuffer history_buf); void pg_clear_history(PQExpBuffer history_buf);
void pgflush_history(PQExpBuffer history_buf); void pg_write_history(char *s);
#endif /* INPUT_H */ #endif /* INPUT_H */

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2006, PostgreSQL Global Development Group * Copyright (c) 2000-2006, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/mainloop.c,v 1.71 2006/03/05 15:58:51 momjian Exp $ * $PostgreSQL: pgsql/src/bin/psql/mainloop.c,v 1.72 2006/03/06 04:45:21 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "mainloop.h" #include "mainloop.h"
@ -41,6 +41,8 @@ MainLoop(FILE *source)
char *line; /* current line of input */ char *line; /* current line of input */
int added_nl_pos; int added_nl_pos;
bool success; bool success;
bool first_query_scan;
volatile int successResult = EXIT_SUCCESS; volatile int successResult = EXIT_SUCCESS;
volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN; volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN;
volatile promptStatus_t prompt_status = PROMPT_READY; volatile promptStatus_t prompt_status = PROMPT_READY;
@ -93,7 +95,7 @@ MainLoop(FILE *source)
successResult = EXIT_USER; successResult = EXIT_USER;
break; break;
} }
pgclear_history(history_buf); pg_clear_history(history_buf);
cancel_pressed = false; cancel_pressed = false;
} }
@ -110,7 +112,7 @@ MainLoop(FILE *source)
slashCmdStatus = PSQL_CMD_UNKNOWN; slashCmdStatus = PSQL_CMD_UNKNOWN;
prompt_status = PROMPT_READY; prompt_status = PROMPT_READY;
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
pgclear_history(history_buf); pg_clear_history(history_buf);
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
putc('\n', stdout); putc('\n', stdout);
@ -145,11 +147,14 @@ MainLoop(FILE *source)
prompt_status = PROMPT_READY; prompt_status = PROMPT_READY;
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
{
/* /*
* Pass all the contents of history_buf to readline * Pass all the contents of history_buf to readline
* and free the history buffer. * and free the history buffer.
*/ */
pgflush_history(history_buf); pg_write_history(history_buf->data);
pg_clear_history(history_buf);
}
} }
/* otherwise, get another line */ /* otherwise, get another line */
else if (pset.cur_cmd_interactive) else if (pset.cur_cmd_interactive)
@ -221,10 +226,7 @@ MainLoop(FILE *source)
*/ */
psql_scan_setup(scan_state, line, strlen(line)); psql_scan_setup(scan_state, line, strlen(line));
success = true; success = true;
first_query_scan = true;
if (pset.cur_cmd_interactive)
/* Put current line in the history buffer */
pgadd_history(line, history_buf);
while (success || !die_on_error) while (success || !die_on_error)
{ {
@ -234,6 +236,23 @@ MainLoop(FILE *source)
scan_result = psql_scan(scan_state, query_buf, &prompt_tmp); scan_result = psql_scan(scan_state, query_buf, &prompt_tmp);
prompt_status = prompt_tmp; prompt_status = prompt_tmp;
/*
* If we append to history a backslash command that is inside
* a multi-line query, then when we recall the history, the
* backslash command will make the query invalid, so we write
* backslash commands immediately rather than keeping them
* as part of the current multi-line query.
*/
if (first_query_scan && pset.cur_cmd_interactive)
{
if (scan_result == PSCAN_BACKSLASH && query_buf->len != 0)
pg_write_history(line);
else
pg_append_history(line, history_buf);
}
first_query_scan = false;
/* /*
* Send command if semicolon found, or if end of line and we're in * Send command if semicolon found, or if end of line and we're in
* single-line mode. * single-line mode.
@ -302,11 +321,14 @@ MainLoop(FILE *source)
} }
if (pset.cur_cmd_interactive && prompt_status != PROMPT_CONTINUE) if (pset.cur_cmd_interactive && prompt_status != PROMPT_CONTINUE)
{
/* /*
* Pass all the contents of history_buf to readline * Pass all the contents of history_buf to readline
* and free the history buffer. * and free the history buffer.
*/ */
pgflush_history(history_buf); pg_write_history(history_buf->data);
pg_clear_history(history_buf);
}
psql_scan_finish(scan_state); psql_scan_finish(scan_state);
free(line); free(line);