help.c 10.3 KB
Newer Older
P
Peter Eisentraut 已提交
1 2 3
/*
 * psql - the PostgreSQL interactive terminal
 *
P
Peter Eisentraut 已提交
4
 * Copyright 2000 by PostgreSQL Global Development Group
P
Peter Eisentraut 已提交
5
 *
6
 * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.27 2000/05/09 19:08:36 momjian Exp $
P
Peter Eisentraut 已提交
7
 */
8
#include "postgres.h"
9 10 11
#include "help.h"

#include <signal.h>
12
#include <errno.h>
13 14

#ifndef WIN32
B
Bruce Momjian 已提交
15
#include <sys/ioctl.h>			/* for ioctl() */
16
#ifdef HAVE_PWD_H
B
Bruce Momjian 已提交
17
#include <pwd.h>				/* for getpwuid() */
18
#endif
B
Bruce Momjian 已提交
19 20
#include <sys/types.h>			/* (ditto) */
#include <unistd.h>				/* for getuid() */
21
#else
22
#include <win32.h>
23 24
#endif

25 26
#include "pqsignal.h"
#include "libpq-fe.h"
27 28 29 30 31

#include "settings.h"
#include "common.h"
#include "sql_help.h"

32 33 34 35 36 37 38
/*
 * PLEASE:
 * If you change something in this file, also make the same changes
 * in the DocBook documentation, file ref/psql-ref.sgml. If you don't
 * know how to do it, please find someone who can help you.
 */

39 40 41 42

/*
 * usage
 *
43
 * print out command line arguments
44 45 46
 */
#define ON(var) (var ? "on" : "off")

B
Bruce Momjian 已提交
47 48
void
usage(void)
49
{
B
Bruce Momjian 已提交
50 51 52
	const char *env;
	const char *user;

53
#ifndef WIN32
B
Bruce Momjian 已提交
54
	struct passwd *pw = NULL;
55

56 57
#endif

B
Bruce Momjian 已提交
58 59 60 61
	/* Find default user, in case we need it. */
	user = getenv("USER");
	if (!user)
	{
62
#ifndef WIN32
P
Peter Eisentraut 已提交
63
		pw = getpwuid(geteuid());
B
Bruce Momjian 已提交
64 65 66 67
		if (pw)
			user = pw->pw_name;
		else
		{
68
			psql_error("could not get current user name: %s\n", strerror(errno));
B
Bruce Momjian 已提交
69 70
			exit(EXIT_FAILURE);
		}
71
#else
B
Bruce Momjian 已提交
72
		user = "?";
73
#endif
B
Bruce Momjian 已提交
74
	}
75

76
/* If this " is the start of the string then it ought to end there to fit in 80 columns >> " */
77 78 79 80 81 82 83
	puts("This is psql, the PostgreSQL interactive terminal.\n");
	puts("Usage:");
	puts("  psql [options] [dbname [username]]\n");
	puts("Options:");
	puts("  -a              Echo all input from script");
	puts("  -A              Unaligned table output mode (-P format=unaligned)");
	puts("  -c <query>      Run only single query (or slash command) and exit");
B
Bruce Momjian 已提交
84 85 86 87 88

	/* Display default database */
	env = getenv("PGDATABASE");
	if (!env)
		env = user;
P
Peter Eisentraut 已提交
89
	printf("  -d <dbname>     Specify database name to connect to (default: %s)\n", env);
B
Bruce Momjian 已提交
90

91 92 93 94
	puts("  -e              Echo queries sent to backend");
	puts("  -E              Display queries that internal commands generate");
	puts("  -f <filename>   Execute queries from file, then exit");
	puts("  -F <string>     Set field separator (default: \"" DEFAULT_FIELD_SEP "\") (-P fieldsep=)");
B
Bruce Momjian 已提交
95 96 97

	/* Display default host */
	env = getenv("PGHOST");
P
Peter Eisentraut 已提交
98
	printf("  -h <host>       Specify database server host (default: ");
B
Bruce Momjian 已提交
99
	if (env)
100
		fputs(env, stdout);
B
Bruce Momjian 已提交
101
	else
102 103
		fputs("domain socket", stdout);
	puts(")");
B
Bruce Momjian 已提交
104

105 106 107
	puts("  -H              HTML table output mode (-P format=html)");
	puts("  -l              List available databases, then exit");
	puts("  -o <filename>   Send query output to filename (or |pipe)");
B
Bruce Momjian 已提交
108 109 110

	/* Display default port */
	env = getenv("PGPORT");
P
Peter Eisentraut 已提交
111
	printf("  -p <port>       Specify database server port (default: %s)\n",
112
		   env ? env : "hardwired");
B
Bruce Momjian 已提交
113

114 115 116 117 118 119 120
	puts("  -P var[=arg]    Set printing option 'var' to 'arg' (see \\pset command)");
	puts("  -q              Run quietly (no messages, only query output)");
	puts("  -R <string>     Set record separator (default: newline) (-P recordsep=)");
	puts("  -s              Single step mode (confirm each query)");
	puts("  -S              Single line mode (newline terminates query)");
	puts("  -t              Don't print headings and row count (-P tuples_only)");
	puts("  -T text         Set HTML table tag options (width, border) (-P tableattr=)");
B
Bruce Momjian 已提交
121 122 123 124 125

	/* Display default user */
	env = getenv("PGUSER");
	if (!env)
		env = user;
126
	printf("  -U <username>   Specify database username (default: %s)\n", env);
B
Bruce Momjian 已提交
127

128 129 130 131 132
	puts("  -v name=val     Set psql variable 'name' to 'value'");
	puts("  -V              Show version information and exit");
	puts("  -W              Prompt for password (should happen automatically)");
	puts("  -x              Turn on expanded table output (-P expanded)");
	puts("  -X              Do not read startup file (~/.psqlrc)");
B
Bruce Momjian 已提交
133

134 135 136 137 138
	puts("\nFor more information, type \"\\?\" (for internal commands) or \"\\help\"");
	puts("(for SQL commands) from within psql, or consult the psql section in");
	puts("the PostgreSQL manual, which accompanies the distribution and is also");
	puts("available at <http://www.postgresql.org>.");
	puts("Report bugs to <pgsql-bugs@postgresql.org>.");
139 140

#ifndef WIN32
B
Bruce Momjian 已提交
141 142
	if (pw)
		free(pw);
143 144 145 146 147 148 149 150 151 152 153 154
#endif
}



/*
 * slashUsage
 *
 * print out help for the backslash commands
 */

#ifndef TIOCGWINSZ
B
Bruce Momjian 已提交
155 156 157 158
struct winsize
{
	int			ws_row;
	int			ws_col;
159
};
B
Bruce Momjian 已提交
160

161 162 163
#endif

void
164
slashUsage(void)
165
{
B
Bruce Momjian 已提交
166 167 168 169
	bool		usePipe = false;
	const char *pagerenv;
	FILE	   *fout;
	struct winsize screen_size;
170 171

#ifdef TIOCGWINSZ
172
	if (pset.notty == 0 &&
B
Bruce Momjian 已提交
173 174 175 176
		(ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 ||
		 screen_size.ws_col == 0 ||
		 screen_size.ws_row == 0))
	{
177
#endif
B
Bruce Momjian 已提交
178 179
		screen_size.ws_row = 24;
		screen_size.ws_col = 80;
180
#ifdef TIOCGWINSZ
B
Bruce Momjian 已提交
181
	}
182 183
#endif

184
	if (pset.notty == 0 &&
B
Bruce Momjian 已提交
185 186
		(pagerenv = getenv("PAGER")) &&
		(pagerenv[0] != '\0') &&
187
		screen_size.ws_row <= 39 &&
B
Bruce Momjian 已提交
188 189 190
		(fout = popen(pagerenv, "w")))
	{
		usePipe = true;
B
Hi!  
Bruce Momjian 已提交
191
#ifndef WIN32
B
Bruce Momjian 已提交
192
		pqsignal(SIGPIPE, SIG_IGN);
B
Hi!  
Bruce Momjian 已提交
193
#endif
B
Bruce Momjian 已提交
194 195 196 197 198
	}
	else
		fout = stdout;

	/* if you add/remove a line here, change the row test above */
199
	fprintf(fout, " \\a             toggle between unaligned and aligned mode\n");
200
	fprintf(fout, " \\c[onnect] [dbname|- [user]]\n"
201
			"                 connect to new database (currently '%s')\n", PQdb(pset.db));
202
	fprintf(fout, " \\copy ...      perform SQL COPY with data stream to the client machine\n");
203 204 205 206 207 208 209 210
	fprintf(fout, " \\copyright     show PostgreSQL usage and distribution terms\n");
	fprintf(fout, " \\d <table>     describe table (or view, index, sequence)\n");
	fprintf(fout, " \\d{i|s|t|v|S}  list only indices/sequences/tables/views/system tables\n");
	fprintf(fout, " \\da            list aggregates\n");
	fprintf(fout, " \\dd [object]   list comment for table, type, function, or operator\n");
	fprintf(fout, " \\df            list functions\n");
	fprintf(fout, " \\do            list operators\n");
	fprintf(fout, " \\dT            list data types\n");
211
	fprintf(fout, " \\e [file]      edit the current query buffer or [file] with external editor\n");
212
	fprintf(fout, " \\echo <text>   write text to stdout\n");
213
	fprintf(fout, " \\encoding <encoding>  set client encoding\n");
214
	fprintf(fout, " \\f <sep>       change field separator\n");
215
	fprintf(fout, " \\g [file]      send query to backend (and results in [file] or |pipe)\n");
216
	fprintf(fout, " \\h [cmd]       help on syntax of sql commands, * for all commands\n");
217 218
	fprintf(fout, " \\H             toggle HTML mode (currently %s)\n",
			ON(pset.popt.topt.format == PRINT_HTML));
219
	fprintf(fout, " \\i <file>      read and execute queries from <file>\n");
220 221
	fprintf(fout, " \\l             list all databases\n");
	fprintf(fout, " \\lo_export, \\lo_import, \\lo_list, \\lo_unlink\n"
222
			"                  large object operations\n");
223
	fprintf(fout, " \\o [file]      send all query results to [file], or |pipe\n");
224
	fprintf(fout, " \\p             show the content of the current query buffer\n");
225
	fprintf(fout, " \\pset {format|border|expanded|fieldsep|recordsep|tuples_only|title|tableattr\n"
226
			"     |pager}    set table output options\n");
227 228 229
	fprintf(fout, " \\q             quit psql\n");
	fprintf(fout, " \\qecho <text>  write text to query output stream (see \\o)\n");
	fprintf(fout, " \\r             reset (clear) the query buffer\n");
230
	fprintf(fout, " \\s [file]      print history or save it in [file]\n");
231 232 233
	fprintf(fout, " \\set <var> <value>  set internal variable\n");
	fprintf(fout, " \\t             don't show table headers or footers (currently %s)\n", ON(pset.popt.topt.tuples_only));
	fprintf(fout, " \\unset <var>   unset (delete) internal variable\n");
234
	fprintf(fout, " \\w <file>      write current query buffer to a <file>\n");
235
	fprintf(fout, " \\x             toggle expanded output (currently %s)\n", ON(pset.popt.topt.expanded));
236 237
	fprintf(fout, " \\z             list table access permissions\n");
	fprintf(fout, " \\! [cmd]       shell escape or command\n");
B
Bruce Momjian 已提交
238 239 240 241

	if (usePipe)
	{
		pclose(fout);
B
Hi!  
Bruce Momjian 已提交
242
#ifndef WIN32
B
Bruce Momjian 已提交
243
		pqsignal(SIGPIPE, SIG_DFL);
B
Hi!  
Bruce Momjian 已提交
244
#endif
B
Bruce Momjian 已提交
245
	}
246 247 248 249 250 251 252 253 254 255 256
}



/*
 * helpSQL -- help with SQL commands
 *
 */
void
helpSQL(const char *topic)
{
257 258
#define VALUE_OR_NULL(a) ((a) ? (a) : "")

B
Bruce Momjian 已提交
259
	if (!topic || strlen(topic) == 0)
260
	{
261
		int			i;
262
		int			items_per_column = (QL_HELP_COUNT + 2) / 3;
B
Bruce Momjian 已提交
263

264
		puts("Available help:");
B
Bruce Momjian 已提交
265

266
		for (i = 0; i < items_per_column; i++)
B
Bruce Momjian 已提交
267
		{
268 269 270 271 272 273 274
			printf("    %-25s%-25s",
					VALUE_OR_NULL(QL_HELP[i].cmd),
					VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd));
			if (i + 2 * items_per_column < QL_HELP_COUNT)
				printf("%-25s",
					VALUE_OR_NULL(QL_HELP[i + 2 * items_per_column].cmd));
			fputc('\n', stdout);
B
Bruce Momjian 已提交
275
		}
276 277
	}

B
Bruce Momjian 已提交
278
	else
279
	{
B
Bruce Momjian 已提交
280 281 282 283 284 285 286 287 288
		int			i;
		bool		help_found = false;

		for (i = 0; QL_HELP[i].cmd; i++)
		{
			if (strcasecmp(QL_HELP[i].cmd, topic) == 0 ||
				strcmp(topic, "*") == 0)
			{
				help_found = true;
289
				printf("Command:     %s\n"
290 291 292
					   "Description: %s\n"
					   "Syntax:\n%s\n\n",
					 QL_HELP[i].cmd, QL_HELP[i].help, QL_HELP[i].syntax);
B
Bruce Momjian 已提交
293 294 295 296 297
			}
		}

		if (!help_found)
			printf("No help available for '%s'.\nTry \\h with no arguments to see available help.\n", topic);
298 299 300 301 302 303 304 305
	}
}



void
print_copyright(void)
{
B
Bruce Momjian 已提交
306
	puts(
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
		 "PostgreSQL Data Base Management System\n\n"
		 "Portions Copyright (c) 1996-2000, PostgreSQL, Inc\n\n"
		 "This software is based on Postgres95, formerly known as Postgres, which\n"
		 "contains the following notice:\n\n"
		 "Portions Copyright(c) 1994 - 7 Regents of the University of California\n\n"
		 "Permission to use, copy, modify, and distribute this software and its\n"
		 "documentation for any purpose, without fee, and without a written agreement\n"
		 "is hereby granted, provided that the above copyright notice and this paragraph\n"
		 "and the following two paragraphs appear in all copies.\n\n"
		 "IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n"
		 "DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST\n"
		 "PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF\n"
		 "THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n"
		 "DAMAGE.\n\n"
		 "THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,\n"
		 "BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n"
		 "PARTICULAR PURPOSE.THE SOFTWARE PROVIDED HEREUNDER IS ON AN \"AS IS\" BASIS,\n"
		 "AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,\n"
		 "SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
	);
327
}