mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Page \h output and centralize psql paging code in PageOutput().
This commit is contained in:
		
							parent
							
								
									30963fc200
								
							
						
					
					
						commit
						641b658c26
					
				| @ -3,7 +3,7 @@ | |||||||
|  * |  * | ||||||
|  * Copyright 2000-2002 by PostgreSQL Global Development Group |  * Copyright 2000-2002 by PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.83 2002/10/15 02:24:15 tgl Exp $ |  * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.84 2002/10/23 19:23:56 momjian Exp $ | ||||||
|  */ |  */ | ||||||
| #include "postgres_fe.h" | #include "postgres_fe.h" | ||||||
| #include "command.h" | #include "command.h" | ||||||
| @ -493,7 +493,8 @@ exec_command(const char *cmd, | |||||||
| 	/* help */ | 	/* help */ | ||||||
| 	else if (strcmp(cmd, "h") == 0 || strcmp(cmd, "help") == 0) | 	else if (strcmp(cmd, "h") == 0 || strcmp(cmd, "help") == 0) | ||||||
| 	{ | 	{ | ||||||
| 		helpSQL(options_string ? &options_string[strspn(options_string, " \t\n\r")] : NULL); | 		helpSQL(options_string ? &options_string[strspn(options_string, " \t\n\r")] : NULL, | ||||||
|  | 				pset.popt.topt.pager); | ||||||
| 		/* set pointer to end of line */ | 		/* set pointer to end of line */ | ||||||
| 		if (string) | 		if (string) | ||||||
| 			string += strlen(string); | 			string += strlen(string); | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|  * |  * | ||||||
|  * Copyright 2000 by PostgreSQL Global Development Group |  * Copyright 2000 by PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.48 2002/10/15 16:44:21 tgl Exp $ |  * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.49 2002/10/23 19:23:56 momjian Exp $ | ||||||
|  */ |  */ | ||||||
| #include "postgres_fe.h" | #include "postgres_fe.h" | ||||||
| 
 | 
 | ||||||
| @ -515,3 +515,46 @@ SendQuery(const char *query) | |||||||
| 
 | 
 | ||||||
| 	return success; | 	return success; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * PageOutput | ||||||
|  |  * | ||||||
|  |  * Tests if pager is needed and returns appropriate FILE pointer. | ||||||
|  |  */ | ||||||
|  | FILE * | ||||||
|  | PageOutput(int lines, bool pager) | ||||||
|  | { | ||||||
|  | 	/* check whether we need / can / are supposed to use pager */ | ||||||
|  | 	if (pager | ||||||
|  | #ifndef WIN32 | ||||||
|  | 		&& | ||||||
|  | 		isatty(fileno(stdin)) && | ||||||
|  | 		isatty(fileno(stdout)) | ||||||
|  | #endif | ||||||
|  | 		) | ||||||
|  | 	{ | ||||||
|  | 		const char *pagerprog; | ||||||
|  | 
 | ||||||
|  | #ifdef TIOCGWINSZ | ||||||
|  | 		int			result; | ||||||
|  | 		struct winsize screen_size; | ||||||
|  | 
 | ||||||
|  | 		result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size); | ||||||
|  | 		if (result == -1 || lines > screen_size.ws_row) | ||||||
|  | 		{ | ||||||
|  | #endif | ||||||
|  | 			pagerprog = getenv("PAGER"); | ||||||
|  | 			if (!pagerprog) | ||||||
|  | 				pagerprog = DEFAULT_PAGER; | ||||||
|  | #ifndef WIN32 | ||||||
|  | 			pqsignal(SIGPIPE, SIG_IGN); | ||||||
|  | #endif | ||||||
|  | 			return popen(pagerprog, "w"); | ||||||
|  | #ifdef TIOCGWINSZ | ||||||
|  | 		} | ||||||
|  | #endif | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return stdout; | ||||||
|  | } | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|  * |  * | ||||||
|  * Copyright 2000 by PostgreSQL Global Development Group |  * Copyright 2000 by PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.19 2002/10/15 02:24:16 tgl Exp $ |  * $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.20 2002/10/23 19:23:56 momjian Exp $ | ||||||
|  */ |  */ | ||||||
| #ifndef COMMON_H | #ifndef COMMON_H | ||||||
| #define COMMON_H | #define COMMON_H | ||||||
| @ -37,6 +37,8 @@ extern PGresult *PSQLexec(const char *query, bool ignore_command_ok); | |||||||
| 
 | 
 | ||||||
| extern bool SendQuery(const char *query); | extern bool SendQuery(const char *query); | ||||||
| 
 | 
 | ||||||
|  | extern FILE *PageOutput(int lines, bool pager); | ||||||
|  | 
 | ||||||
| /* sprompt.h */ | /* sprompt.h */ | ||||||
| extern char *simple_prompt(const char *prompt, int maxlen, bool echo); | extern char *simple_prompt(const char *prompt, int maxlen, bool echo); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,9 +3,10 @@ | |||||||
|  * |  * | ||||||
|  * Copyright 2000 by PostgreSQL Global Development Group |  * Copyright 2000 by PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.58 2002/10/18 22:05:36 petere Exp $ |  * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.59 2002/10/23 19:23:56 momjian Exp $ | ||||||
|  */ |  */ | ||||||
| #include "postgres_fe.h" | #include "postgres_fe.h" | ||||||
|  | #include "common.h" | ||||||
| #include "print.h" | #include "print.h" | ||||||
| #include "help.h" | #include "help.h" | ||||||
| 
 | 
 | ||||||
| @ -161,48 +162,11 @@ struct winsize | |||||||
| void | void | ||||||
| slashUsage(bool pager) | slashUsage(bool pager) | ||||||
| { | { | ||||||
| 	FILE	   *output, | 	FILE	   *output; | ||||||
| 			   *pagerfd = NULL; |  | ||||||
| 
 | 
 | ||||||
| 	/* check whether we need / can / are supposed to use pager */ | 	output = PageOutput(50, pager); | ||||||
| 	if (pager |  | ||||||
| #ifndef WIN32 |  | ||||||
| 		&& |  | ||||||
| 		isatty(fileno(stdin)) && |  | ||||||
| 		isatty(fileno(stdout)) |  | ||||||
| #endif |  | ||||||
| 		) |  | ||||||
| 	{ |  | ||||||
| 		const char *pagerprog; |  | ||||||
| 
 | 
 | ||||||
| #ifdef TIOCGWINSZ | 	/* if you add/remove a line here, change the row count above */ | ||||||
| 		int			result; |  | ||||||
| 		struct winsize screen_size; |  | ||||||
| 
 |  | ||||||
| 		result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size); |  | ||||||
| 		if (result == -1 || 50 > screen_size.ws_row) |  | ||||||
| 		{ |  | ||||||
| #endif |  | ||||||
| 			pagerprog = getenv("PAGER"); |  | ||||||
| 			if (!pagerprog) |  | ||||||
| 				pagerprog = DEFAULT_PAGER; |  | ||||||
| 			pagerfd = popen(pagerprog, "w"); |  | ||||||
| #ifdef TIOCGWINSZ |  | ||||||
| 		} |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (pagerfd) |  | ||||||
| 	{ |  | ||||||
| 		output = pagerfd; |  | ||||||
| #ifndef WIN32 |  | ||||||
| 		pqsignal(SIGPIPE, SIG_IGN); |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 		output = stdout; |  | ||||||
| 
 |  | ||||||
| 	/* if you add/remove a line here, change the row test above */ |  | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * if this " is the start of the string then it ought to end there to | 	 * if this " is the start of the string then it ought to end there to | ||||||
| @ -262,9 +226,9 @@ slashUsage(bool pager) | |||||||
| 	fprintf(output, _(" \\z [PATTERN]   list table access privileges (same as \\dp)\n")); | 	fprintf(output, _(" \\z [PATTERN]   list table access privileges (same as \\dp)\n")); | ||||||
| 	fprintf(output, _(" \\! [COMMAND]   execute command in shell or start interactive shell\n")); | 	fprintf(output, _(" \\! [COMMAND]   execute command in shell or start interactive shell\n")); | ||||||
| 
 | 
 | ||||||
| 	if (pagerfd) | 	if (output != stdout) | ||||||
| 	{ | 	{ | ||||||
| 		pclose(pagerfd); | 		pclose(output); | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
| 		pqsignal(SIGPIPE, SIG_DFL); | 		pqsignal(SIGPIPE, SIG_DFL); | ||||||
| #endif | #endif | ||||||
| @ -278,7 +242,7 @@ slashUsage(bool pager) | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| void | void | ||||||
| helpSQL(const char *topic) | helpSQL(const char *topic, bool pager) | ||||||
| { | { | ||||||
| #define VALUE_OR_NULL(a) ((a) ? (a) : "") | #define VALUE_OR_NULL(a) ((a) ? (a) : "") | ||||||
| 
 | 
 | ||||||
| @ -286,21 +250,31 @@ helpSQL(const char *topic) | |||||||
| 	{ | 	{ | ||||||
| 		int			i; | 		int			i; | ||||||
| 		int			items_per_column = (QL_HELP_COUNT + 2) / 3; | 		int			items_per_column = (QL_HELP_COUNT + 2) / 3; | ||||||
|  | 		FILE		*output; | ||||||
| 
 | 
 | ||||||
| 		puts(_("Available help:")); | 		output = PageOutput(items_per_column, pager); | ||||||
|  | 
 | ||||||
|  | 		fputs(_("Available help:\n"), output); | ||||||
| 
 | 
 | ||||||
| 		for (i = 0; i < items_per_column; i++) | 		for (i = 0; i < items_per_column; i++) | ||||||
| 		{ | 		{ | ||||||
| 			printf("  %-26s%-26s", | 			fprintf(output, "  %-26s%-26s", | ||||||
| 				   VALUE_OR_NULL(QL_HELP[i].cmd), | 				   VALUE_OR_NULL(QL_HELP[i].cmd), | ||||||
| 				   VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd)); | 				   VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd)); | ||||||
| 			if (i + 2 * items_per_column < QL_HELP_COUNT) | 			if (i + 2 * items_per_column < QL_HELP_COUNT) | ||||||
| 				printf("%-26s", | 				fprintf(output, "%-26s", | ||||||
| 				   VALUE_OR_NULL(QL_HELP[i + 2 * items_per_column].cmd)); | 				   VALUE_OR_NULL(QL_HELP[i + 2 * items_per_column].cmd)); | ||||||
| 			fputc('\n', stdout); | 			fputc('\n', output); | ||||||
|  | 		} | ||||||
|  | 		/* Only close if we used the pager */ | ||||||
|  | 		if (output != stdout) | ||||||
|  | 		{ | ||||||
|  | 			pclose(output); | ||||||
|  | #ifndef WIN32 | ||||||
|  | 			pqsignal(SIGPIPE, SIG_DFL); | ||||||
|  | #endif | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		int			i; | 		int			i; | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|  * |  * | ||||||
|  * Copyright 2000 by PostgreSQL Global Development Group |  * Copyright 2000 by PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.9 2002/07/15 01:56:25 momjian Exp $ |  * $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.10 2002/10/23 19:23:57 momjian Exp $ | ||||||
|  */ |  */ | ||||||
| #ifndef HELP_H | #ifndef HELP_H | ||||||
| #define HELP_H | #define HELP_H | ||||||
| @ -12,7 +12,7 @@ void		usage(void); | |||||||
| 
 | 
 | ||||||
| void		slashUsage(bool pager); | void		slashUsage(bool pager); | ||||||
| 
 | 
 | ||||||
| void		helpSQL(const char *topic); | void		helpSQL(const char *topic, bool pager); | ||||||
| 
 | 
 | ||||||
| void		print_copyright(void); | void		print_copyright(void); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,9 +3,10 @@ | |||||||
|  * |  * | ||||||
|  * Copyright 2000 by PostgreSQL Global Development Group |  * Copyright 2000 by PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.32 2002/10/03 17:09:42 momjian Exp $ |  * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.33 2002/10/23 19:23:57 momjian Exp $ | ||||||
|  */ |  */ | ||||||
| #include "postgres_fe.h" | #include "postgres_fe.h" | ||||||
|  | #include "common.h" | ||||||
| #include "print.h" | #include "print.h" | ||||||
| 
 | 
 | ||||||
| #include <math.h> | #include <math.h> | ||||||
| @ -970,9 +971,7 @@ printTable(const char *title, | |||||||
| { | { | ||||||
| 	const char *default_footer[] = {NULL}; | 	const char *default_footer[] = {NULL}; | ||||||
| 	unsigned short int border = opt->border; | 	unsigned short int border = opt->border; | ||||||
| 	FILE	   *pagerfd = NULL, | 	FILE		*output; | ||||||
| 			   *output; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| 	if (opt->format == PRINT_NOTHING) | 	if (opt->format == PRINT_NOTHING) | ||||||
| 		return; | 		return; | ||||||
| @ -983,25 +982,12 @@ printTable(const char *title, | |||||||
| 	if (opt->format != PRINT_HTML && border > 2) | 	if (opt->format != PRINT_HTML && border > 2) | ||||||
| 		border = 2; | 		border = 2; | ||||||
| 
 | 
 | ||||||
| 
 | 	if (fout == stdout) | ||||||
| 	/* check whether we need / can / are supposed to use pager */ |  | ||||||
| 	if (fout == stdout && opt->pager |  | ||||||
| #ifndef WIN32 |  | ||||||
| 		&& |  | ||||||
| 		isatty(fileno(stdin)) && |  | ||||||
| 		isatty(fileno(stdout)) |  | ||||||
| #endif |  | ||||||
| 		) |  | ||||||
| 	{ | 	{ | ||||||
| 		const char *pagerprog; | 		int col_count = 0, | ||||||
| 
 | 			row_count = 0, | ||||||
| #ifdef TIOCGWINSZ | 			lines; | ||||||
| 		unsigned int col_count = 0, |  | ||||||
| 					row_count = 0, |  | ||||||
| 					lines; |  | ||||||
| 		const char *const * ptr; | 		const char *const * ptr; | ||||||
| 		int			result; |  | ||||||
| 		struct winsize screen_size; |  | ||||||
| 
 | 
 | ||||||
| 		/* rough estimate of columns and rows */ | 		/* rough estimate of columns and rows */ | ||||||
| 		if (headers) | 		if (headers) | ||||||
| @ -1020,31 +1006,11 @@ printTable(const char *title, | |||||||
| 		if (footers && !opt->tuples_only) | 		if (footers && !opt->tuples_only) | ||||||
| 			for (ptr = footers; *ptr; ptr++) | 			for (ptr = footers; *ptr; ptr++) | ||||||
| 				lines++; | 				lines++; | ||||||
| 
 | 		output = PageOutput(lines, opt->pager); | ||||||
| 		result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size); |  | ||||||
| 		if (result == -1 || lines > screen_size.ws_row) |  | ||||||
| 		{ |  | ||||||
| #endif |  | ||||||
| 			pagerprog = getenv("PAGER"); |  | ||||||
| 			if (!pagerprog) |  | ||||||
| 				pagerprog = DEFAULT_PAGER; |  | ||||||
| 			pagerfd = popen(pagerprog, "w"); |  | ||||||
| #ifdef TIOCGWINSZ |  | ||||||
| 		} |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (pagerfd) |  | ||||||
| 	{ |  | ||||||
| 		output = pagerfd; |  | ||||||
| #ifndef WIN32 |  | ||||||
| 		pqsignal(SIGPIPE, SIG_IGN); |  | ||||||
| #endif |  | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 		output = fout; | 		output = fout; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 	/* print the stuff */ | 	/* print the stuff */ | ||||||
| 
 | 
 | ||||||
| 	switch (opt->format) | 	switch (opt->format) | ||||||
| @ -1077,9 +1043,10 @@ printTable(const char *title, | |||||||
| 			fprintf(stderr, "+ Oops, you shouldn't see this!\n"); | 			fprintf(stderr, "+ Oops, you shouldn't see this!\n"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (pagerfd) | 	/* Only close if we used the pager */ | ||||||
|  | 	if (fout == stdout && output != stdout) | ||||||
| 	{ | 	{ | ||||||
| 		pclose(pagerfd); | 		pclose(output); | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
| 		pqsignal(SIGPIPE, SIG_DFL); | 		pqsignal(SIGPIPE, SIG_DFL); | ||||||
| #endif | #endif | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user