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