1 /*-------------------------------------------------------------------------
5 * Portions Copyright (c) 2002-2003, PostgreSQL Global Development Group
7 * $Header: /cvsroot/pgsql/src/bin/scripts/clusterdb.c,v 1.3 2003/08/04 00:43:29 momjian Exp $
9 *-------------------------------------------------------------------------
12 #include "postgres_fe.h"
14 #include "dumputils.h"
19 cluster_one_database(const char *dbname, const char *table,
20 const char *host, const char *port, const char *username, bool password,
21 const char *progname, bool echo, bool quiet);
24 cluster_all_databases(const char *host, const char *port, const char *username, bool password,
25 const char *progname, bool echo, bool quiet);
27 static void help(const char *progname);
31 main(int argc, char *argv[])
33 static struct option long_options[] = {
34 {"host", required_argument, NULL, 'h'},
35 {"port", required_argument, NULL, 'p'},
36 {"username", required_argument, NULL, 'U'},
37 {"password", no_argument, NULL, 'W'},
38 {"echo", no_argument, NULL, 'e'},
39 {"quiet", no_argument, NULL, 'q'},
40 {"dbname", required_argument, NULL, 'd'},
41 {"all", no_argument, NULL, 'a'},
42 {"table", required_argument, NULL, 't'},
50 const char *dbname = NULL;
53 char *username = NULL;
54 bool password = false;
60 progname = get_progname(argv[0]);
62 handle_help_version_opts(argc, argv, "clusterdb", help);
64 while ((c = getopt_long(argc, argv, "h:p:U:Weqd:at:", long_options, &optindex)) != -1)
96 fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
101 switch (argc - optind)
106 dbname = argv[optind];
109 fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
110 progname, argv[optind + 1]);
111 fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
119 fprintf(stderr, _("%s: cannot cluster all databases and a specific one at the same time\n"),
125 fprintf(stderr, _("%s: cannot cluster a specific table in all databases\n"),
130 cluster_all_databases(host, port, username, password,
131 progname, echo, quiet);
137 if (getenv("PGDATABASE"))
138 dbname = getenv("PGDATABASE");
139 else if (getenv("PGUSER"))
140 dbname = getenv("PGUSER");
142 dbname = get_user_name(progname);
145 cluster_one_database(dbname, table,
146 host, port, username, password,
147 progname, echo, quiet);
156 cluster_one_database(const char *dbname, const char *table,
157 const char *host, const char *port, const char *username, bool password,
158 const char *progname, bool echo, bool quiet)
165 initPQExpBuffer(&sql);
167 appendPQExpBuffer(&sql, "CLUSTER");
169 appendPQExpBuffer(&sql, " %s", fmtId(table));
170 appendPQExpBuffer(&sql, ";\n");
172 conn = connectDatabase(dbname, host, port, username, password, progname);
175 printf("%s", sql.data);
176 result = PQexec(conn, sql.data);
178 if (PQresultStatus(result) != PGRES_COMMAND_OK)
181 fprintf(stderr, _("%s: clustering of table \"%s\" in database \"%s\" failed: %s"),
182 progname, table, dbname, PQerrorMessage(conn));
184 fprintf(stderr, _("%s: clustering of database \"%s\" failed: %s"),
185 progname, dbname, PQerrorMessage(conn));
192 termPQExpBuffer(&sql);
201 cluster_all_databases(const char *host, const char *port, const char *username, bool password,
202 const char *progname, bool echo, bool quiet)
208 conn = connectDatabase("template1", host, port, username, password, progname);
209 result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn;", progname, echo);
212 for (i = 0; i < PQntuples(result); i++)
214 char *dbname = PQgetvalue(result, i, 0);
217 fprintf(stderr, _("%s: clustering database \"%s\"\n"), progname, dbname);
219 cluster_one_database(dbname, NULL,
220 host, port, username, password,
221 progname, echo, quiet);
229 help(const char *progname)
231 printf(_("%s clusters all previously clustered tables in a database.\n\n"), progname);
232 printf(_("Usage:\n"));
233 printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
234 printf(_("\nOptions:\n"));
235 printf(_(" -a, --all cluster all databases\n"));
236 printf(_(" -d, --dbname=DBNAME database to cluster\n"));
237 printf(_(" -t, --table=TABLE cluster specific table only\n"));
238 printf(_(" -e, --echo show the commands being sent to the server\n"));
239 printf(_(" -q, --quiet don't write any messages\n"));
240 printf(_(" --help show this help, then exit\n"));
241 printf(_(" --version output version information, then exit\n"));
242 printf(_("\nConnection options:\n"));
243 printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
244 printf(_(" -p, --port=PORT database server port\n"));
245 printf(_(" -U, --username=USERNAME user name to connect as\n"));
246 printf(_(" -W, --password prompt for password\n"));
247 printf(_("\nRead the description of the SQL command CLUSTER for details.\n"));
248 printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));