Index: help.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/help.c,v
retrieving revision 1.106
diff -c -r1.106 help.c
*** help.c 15 Oct 2005 02:49:40 -0000 1.106
--- help.c 8 Dec 2005 01:40:14 -0000
***************
*** 7,12 ****
--- 7,13 ----
*/
#include "postgres_fe.h"
#include "common.h"
+ #include "pqexpbuffer.h"
#include "input.h"
#include "print.h"
#include "help.h"
Index: input.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/input.c,v
retrieving revision 1.46
diff -c -r1.46 input.c
*** input.c 15 Oct 2005 02:49:40 -0000 1.46
--- input.c 8 Dec 2005 01:40:14 -0000
***************
*** 7,14 ****
*/
#include "postgres_fe.h"
- #include "input.h"
#include "pqexpbuffer.h"
#include "settings.h"
#include "tab-complete.h"
#include "common.h"
--- 7,14 ----
*/
#include "postgres_fe.h"
#include "pqexpbuffer.h"
+ #include "input.h"
#include "settings.h"
#include "tab-complete.h"
#include "common.h"
***************
*** 90,107 ****
#ifdef USE_READLINE
char *s;
- static char *prev_hist = NULL;
-
if (useReadline)
/* On some platforms, readline is declared as readline(char *) */
s = readline((char *) prompt);
else
s = gets_basic(prompt);
! if (useHistory && s && s[0])
{
- enum histcontrol HC;
HC = GetHistControlConfig();
if (((HC & hctl_ignorespace) && s[0] == ' ') ||
--- 90,146 ----
#ifdef USE_READLINE
char *s;
if (useReadline)
/* On some platforms, readline is declared as readline(char *) */
s = readline((char *) prompt);
else
s = gets_basic(prompt);
! return s;
! #else
! return gets_basic(prompt);
! #endif
! }
!
! /* Put the line in the history buffer and also add the trailing \n */
! void pgadd_history(char *s, PQExpBuffer history_buf)
! {
! #ifdef USE_READLINE
!
! int slen;
! if (useReadline && useHistory && s && s[0])
! {
! slen = strlen(s);
! if (s[slen-1]=='\n')
! {
! appendPQExpBufferStr(history_buf, s);
! }
! else
! {
! appendPQExpBufferStr(history_buf, s);
! appendPQExpBufferChar(history_buf, '\n');
! }
! }
! #endif
! }
!
!
! /* Feed the contents of the history buffer to readline */
! void pgflush_history(PQExpBuffer history_buf)
! {
! #ifdef USE_READLINE
! char *s;
! static char *prev_hist;
! int slen, i;
!
! if (useReadline && useHistory )
{
+ enum histcontrol HC;
+
+ s = history_buf->data;
+ prev_hist = NULL;
+
HC = GetHistControlConfig();
if (((HC & hctl_ignorespace) && s[0] == ' ') ||
***************
*** 112,130 ****
else
{
free(prev_hist);
prev_hist = pg_strdup(s);
add_history(s);
}
}
- return s;
- #else
- return gets_basic(prompt);
#endif
}
/*
* gets_fromFile
*
--- 151,184 ----
else
{
free(prev_hist);
+ slen = strlen(s);
+ /* Trim the trailing \n's */
+ for(i = slen-1; (i >= 0) && ( s[i] == '\n' ); i--);
+ s[i + 1] = 0;
prev_hist = pg_strdup(s);
add_history(s);
}
+
+ resetPQExpBuffer(history_buf);
+ }
+ #endif
+ }
+
+ void pgclear_history(PQExpBuffer history_buf)
+ {
+ #ifdef USE_READLINE
+ if (useReadline && useHistory )
+ {
+ resetPQExpBuffer(history_buf);
}
#endif
}
+
+
/*
* gets_fromFile
*
Index: input.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/input.h,v
retrieving revision 1.23
diff -c -r1.23 input.h
*** input.h 1 Jan 2005 05:43:08 -0000 1.23
--- input.h 8 Dec 2005 01:40:14 -0000
***************
*** 39,42 ****
--- 39,47 ----
void initializeInput(int flags);
bool saveHistory(char *fname);
+ void pgadd_history(char *s, PQExpBuffer history_buf);
+ void pgclear_history(PQExpBuffer history_buf);
+ void pgflush_history(PQExpBuffer history_buf);
+
+
#endif /* INPUT_H */
Index: mainloop.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/mainloop.c,v
retrieving revision 1.68
diff -c -r1.68 mainloop.c
*** mainloop.c 15 Oct 2005 02:49:40 -0000 1.68
--- mainloop.c 8 Dec 2005 01:40:14 -0000
***************
*** 37,42 ****
--- 37,43 ----
PQExpBuffer query_buf; /* buffer for query being accumulated */
PQExpBuffer previous_buf; /* if there isn't anything in the new buffer
* yet, use this one for \e, etc. */
+ PQExpBuffer history_buf;
char *line; /* current line of input */
int added_nl_pos;
bool success;
***************
*** 66,72 ****
query_buf = createPQExpBuffer();
previous_buf = createPQExpBuffer();
! if (!query_buf || !previous_buf)
{
psql_error("out of memory\n");
exit(EXIT_FAILURE);
--- 67,75 ----
query_buf = createPQExpBuffer();
previous_buf = createPQExpBuffer();
! history_buf = createPQExpBuffer();
!
! if (!query_buf || !previous_buf || !history_buf)
{
psql_error("out of memory\n");
exit(EXIT_FAILURE);
***************
*** 90,95 ****
--- 93,101 ----
successResult = EXIT_USER;
break;
}
+ {
+ pgclear_history(history_buf);
+ }
cancel_pressed = false;
}
***************
*** 100,111 ****
--- 106,120 ----
/* got here with longjmp */
/* reset parsing state */
+
resetPQExpBuffer(query_buf);
psql_scan_finish(scan_state);
psql_scan_reset(scan_state);
count_eof = 0;
slashCmdStatus = CMD_UNKNOWN;
prompt_status = PROMPT_READY;
+ if (pset.cur_cmd_interactive)
+ pgclear_history(history_buf);
if (pset.cur_cmd_interactive)
putc('\n', stdout);
***************
*** 138,143 ****
--- 147,161 ----
psql_scan_reset(scan_state);
slashCmdStatus = CMD_UNKNOWN;
prompt_status = PROMPT_READY;
+
+ if ( pset.cur_cmd_interactive )
+ {
+ /* Pass all the contents of history_buf to readline
+ * and free the history buffer.
+ */
+ pgflush_history(history_buf);
+ }
+
}
/*
***************
*** 212,218 ****
*/
psql_scan_setup(scan_state, line, strlen(line));
success = true;
!
while (success || !die_on_error)
{
PsqlScanResult scan_result;
--- 230,242 ----
*/
psql_scan_setup(scan_state, line, strlen(line));
success = true;
!
! if (pset.cur_cmd_interactive)
! {
! /* Put current line in the history buffer */
! pgadd_history(line, history_buf);
! }
!
while (success || !die_on_error)
{
PsqlScanResult scan_result;
***************
*** 229,234 ****
--- 253,259 ----
(scan_result == PSCAN_EOL &&
GetVariableBool(pset.vars, "SINGLELINE")))
{
+
/* execute query */
success = SendQuery(query_buf->data);
slashCmdStatus = success ? CMD_SEND : CMD_ERROR;
***************
*** 249,258 ****
--- 274,286 ----
* newline again. This avoids any change to query_buf when a
* line contains only a backslash command.
*/
+
+
if (query_buf->len == added_nl_pos)
query_buf->data[--query_buf->len] = '\0';
added_nl_pos = -1;
+
slashCmdStatus = HandleSlashCmds(scan_state,
query_buf->len > 0 ?
query_buf : previous_buf);
***************
*** 266,271 ****
--- 294,300 ----
appendPQExpBufferStr(query_buf, previous_buf->data);
}
+
if (slashCmdStatus == CMD_SEND)
{
success = SendQuery(query_buf->data);
***************
*** 287,292 ****
--- 316,329 ----
scan_result == PSCAN_EOL)
break;
}
+
+ if (pset.cur_cmd_interactive && (prompt_status != PROMPT_CONTINUE))
+ {
+ /* Pass all the contents of history_buf to readline
+ and free the history buffer.
+ */
+ pgflush_history(history_buf);
+ }
psql_scan_finish(scan_state);
free(line);
***************
*** 333,338 ****
--- 370,376 ----
destroyPQExpBuffer(query_buf);
destroyPQExpBuffer(previous_buf);
+ destroyPQExpBuffer(history_buf);
psql_scan_destroy(scan_state);
Index: prompt.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/prompt.c,v
retrieving revision 1.40
diff -c -r1.40 prompt.c
*** prompt.c 15 Oct 2005 02:49:40 -0000 1.40
--- prompt.c 8 Dec 2005 01:40:15 -0000
***************
*** 12,17 ****
--- 12,18 ----
#include "settings.h"
#include "common.h"
+ #include "pqexpbuffer.h"
#include "input.h"
#include "variables.h"