Hi all,
Attached is a patch for the following TODO item:
o Improve psql's handling of multi-line queries
Currently, while \e saves a single query as one entry, interactive
queries are saved one line at a time. Ideally all queries
whould be saved like \e does.
I know now's probably not a good time, but it caught my eye and looked
easy enough even for my rusty C.
Regards, Steve Woodcock
Index: input.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/input.c,v
retrieving revision 1.45
diff -c -r1.45 input.c
*** input.c 10 Jun 2005 15:40:41 -0000 1.45
--- input.c 28 Aug 2005 13:00:30 -0000
***************
*** 24,29 ****
--- 24,31 ----
#ifdef USE_READLINE
static bool useReadline;
static bool useHistory;
+ static PQExpBuffer hist_buf; /* buffer for history entry being accumulated */
+ static PQExpBuffer prev_buf; /* previous history entry */
char *psql_history;
***************
*** 90,97 ****
#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);
--- 92,97 ----
***************
*** 100,120 ****
if (useHistory && s && s[0])
{
! enum histcontrol HC;
!
! HC = GetHistControlConfig();
!
! if (((HC & hctl_ignorespace) && s[0] == ' ') ||
! ((HC & hctl_ignoredups) && prev_hist && strcmp(s, prev_hist) == 0))
! {
! /* Ignore this line as far as history is concerned */
! }
! else
! {
! free(prev_hist);
! prev_hist = pg_strdup(s);
! add_history(s);
! }
}
return s;
--- 100,109 ----
if (useHistory && s && s[0])
{
! /* Append line to history buffer, separating with newline */
! if (hist_buf->len > 0)
! appendPQExpBufferChar(hist_buf, '\n');
! appendPQExpBufferStr(hist_buf, s);
}
return s;
***************
*** 197,202 ****
--- 186,194 ----
if (psql_history)
read_history(psql_history);
+
+ hist_buf = createPQExpBuffer();
+ prev_buf = createPQExpBuffer();
}
#endif
***************
*** 228,233 ****
--- 220,257 ----
}
+ void
+ maybeAddHistory(void)
+ {
+ #ifdef USE_READLINE
+ if (useHistory)
+ {
+ enum histcontrol HC;
+
+ HC = GetHistControlConfig();
+
+ if (((HC & hctl_ignorespace) && hist_buf->data[0] == ' ') ||
+ ((HC & hctl_ignoredups) && strcmp(hist_buf->data, prev_buf->data) == 0))
+ {
+ /* Ignore this buffer as far as history is concerned */
+ resetPQExpBuffer(hist_buf);
+ }
+ else
+ {
+ PQExpBuffer tmp;
+
+ add_history(hist_buf->data);
+
+ /* swap hist and prev and reset hist */
+ tmp = prev_buf;
+ prev_buf = hist_buf;
+ hist_buf = tmp;
+ resetPQExpBuffer(hist_buf);
+ }
+ }
+ #endif
+ }
+
static void
#ifdef HAVE_ATEXIT
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 28 Aug 2005 13:00:30 -0000
***************
*** 38,42 ****
--- 38,43 ----
void initializeInput(int flags);
bool saveHistory(char *fname);
+ void maybeAddHistory(void);
#endif /* INPUT_H */
Index: mainloop.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/mainloop.c,v
retrieving revision 1.67
diff -c -r1.67 mainloop.c
*** mainloop.c 22 Feb 2005 04:40:55 -0000 1.67
--- mainloop.c 28 Aug 2005 13:00:31 -0000
***************
*** 286,291 ****
--- 286,297 ----
break;
}
+ #ifdef USE_READLINE
+ if (pset.cur_cmd_interactive &&
+ scan_result == PSCAN_INCOMPLETE)
+ maybeAddHistory();
+ #endif
+
/* fall out of loop if lexer reached EOL */
if (scan_result == PSCAN_INCOMPLETE ||
scan_result == PSCAN_EOL)
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
http://archives.postgresql.org