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"
  
