On Sun, 4 Dec 2005, Bruce Momjian wrote:
>
> Can I have this patch in diff -c? The format you used isn't reliable
> for patching. Thanks.
Sorry, I didn't know that the patch should be done with "-c".
Ok, now I'm sending it diff -c
Regards,
Sergey
>
> ---------------------------------------------------------------------------
>
> Sergey E. Koposov wrote:
> > Hello,
> >
> > Sorry for not quick problem fixing, I was quite busy last time...
> >
> > I submit the new version of my patch (against the CVS tip), correcting the
> > problem with \edit (pointed by Andreas). So now everything works fine.
> >
> > With Best Regards,
> >
> > Sergey
> >
> >
> >
> > On Thu, 1 Dec 2005, Bruce Momjian wrote:
> >
> > >
> > > Where are we on this patch? Was it submitted? Applied? Just an idea?
> > >
> > > ---------------------------------------------------------------------------
> > >
> > > Andreas Seltenreich wrote:
> > > > Sergey E. Koposov writes:
> > > >
> > > > > I'm proposing the small patch for the TODO item -- Improve psql's
> > > > > handling
> > > > > of multi-line queries. With this patch the multi-line queries are
> > > > > saved
> > > > > by readline as whole and not line by line.
> > > >
> > > > I like it already!
> > > >
> > > > > This is my first patch for Postgres but it seems to work and to not
> > > > > break
> > > > > anything.
> > > > >
> > > > > I'm waiting for review, comments, objections, etc...
> > > >
> > > > Did you consider its interaction with \e? Editing the query_buffer
> > > > with \e will leave that query prefixed with \e in the history. That
> > > > wasn't the case before your patch.
> > > >
> > > > Also, using \e several times on a query without sending it (i.e.
> > > > without a semicolon) will yield a history entry of a concatenation of
> > > > old query buffers.
> > > >
> > > > Thanks,
> > > > Andreas
> > > >
> > > > ---------------------------(end of broadcast)---------------------------
> > > > TIP 4: Have you searched our list archives?
> > > >
> > > > http://archives.postgresql.org
> > > >
> > >
> > >
> >
> >
> > *****************************************************
> > Sergey E. Koposov
> > Max-Planck Institut for Astronomy
> > Web: http://lnfm1.sai.msu.ru/~math
> > E-mail: [EMAIL PROTECTED]
> >
>
> Content-Description:
>
> [ Attachment, skipping... ]
>
>
*****************************************************
Sergey E. Koposov
Max-Planck Institut for Astronomy
Web: http://lnfm1.sai.msu.ru/~math
E-mail: [EMAIL PROTECTED]
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 5 Dec 2005 04:07:32 -0000
***************
*** 90,106 ****
#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();
--- 90,155 ----
#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 */
! char *pgadd_history(char *s, char *history_buf, int *cur_len)
! {
! #ifdef USE_READLINE
!
! int slen;
! char *history_buf1 = 0;
! if (useReadline && useHistory && s && s[0])
{
+ slen = strlen(s);
+ history_buf1 = history_buf;
+ history_buf1 = realloc(history_buf1, (*cur_len + slen + 2) *
sizeof(char));
+ strcpy(history_buf1 + *cur_len, s);
+ if (s[slen-1]!='\n')
+ {
+ *cur_len += (slen + 1);
+ history_buf1[*cur_len - 1] = '\n';
+ history_buf1[*cur_len] = 0;
+ }
+ else
+ {
+ *cur_len += (slen);
+ history_buf1[*cur_len] = 0;
+ }
+
+ }
+ return history_buf1;
+ #endif
+ }
+
+ /* Feed the contents of the history buffer to readline */
+ void pgflush_history(char **history_buf, int *cur_len)
+ {
+
+ #ifdef USE_READLINE
+
+ char *s;
+ static char *prev_hist;
+
+ if (useReadline && useHistory && ((*cur_len) > 0))
+ {
+
enum histcontrol HC;
+
+ s = *history_buf;
+ prev_hist = NULL;
+
+ s[(*cur_len) - 1] = 0;
HC = GetHistControlConfig();
***************
*** 115,128 ****
prev_hist = pg_strdup(s);
add_history(s);
}
}
-
- return s;
- #else
- return gets_basic(prompt);
#endif
- }
/*
--- 164,177 ----
prev_hist = pg_strdup(s);
add_history(s);
}
+
+ free(s);
+ *history_buf = 0;
+ *cur_len = 0;
}
#endif
+ }
/*
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 5 Dec 2005 04:07:32 -0000
***************
*** 39,42 ****
--- 39,45 ----
void initializeInput(int flags);
bool saveHistory(char *fname);
+ char *pgadd_history(char *s, char *history_buf, int *cur_len);
+ void pgflush_history(char **history_buf, int *cur_len);
+
#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 5 Dec 2005 04:07:32 -0000
***************
*** 38,43 ****
--- 38,45 ----
PQExpBuffer previous_buf; /* if there isn't anything in the new
buffer
* yet, use
this one for \e, etc. */
char *line; /* current line of input */
+ char *history_buf = 0;
+ int history_buf_len = 0;
int added_nl_pos;
bool success;
volatile int successResult = EXIT_SUCCESS;
***************
*** 138,143 ****
--- 140,154 ----
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,
&history_buf_len);
+ }
+
}
/*
***************
*** 212,218 ****
*/
psql_scan_setup(scan_state, line, strlen(line));
success = true;
!
while (success || !die_on_error)
{
PsqlScanResult scan_result;
--- 223,235 ----
*/
psql_scan_setup(scan_state, line, strlen(line));
success = true;
!
! if (pset.cur_cmd_interactive)
! {
! /* Put current line in the history buffer */
! history_buf = pgadd_history(line, history_buf,
&history_buf_len);
! }
!
while (success || !die_on_error)
{
PsqlScanResult scan_result;
***************
*** 229,234 ****
--- 246,252 ----
(scan_result == PSCAN_EOL &&
GetVariableBool(pset.vars, "SINGLELINE")))
{
+
/* execute query */
success = SendQuery(query_buf->data);
slashCmdStatus = success ? CMD_SEND : CMD_ERROR;
***************
*** 249,258 ****
--- 267,279 ----
* 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 ****
--- 287,293 ----
appendPQExpBufferStr(query_buf,
previous_buf->data);
}
+
if (slashCmdStatus == CMD_SEND)
{
success = SendQuery(query_buf->data);
***************
*** 287,292 ****
--- 309,322 ----
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, &history_buf_len);
+ }
psql_scan_finish(scan_state);
free(line);
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly