Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * dropdb
4 : : *
5 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
6 : : * Portions Copyright (c) 1994, Regents of the University of California
7 : : *
8 : : * src/bin/scripts/dropdb.c
9 : : *
10 : : *-------------------------------------------------------------------------
11 : : */
12 : :
13 : : #include "postgres_fe.h"
14 : : #include "common.h"
15 : : #include "common/logging.h"
16 : : #include "fe_utils/option_utils.h"
17 : : #include "fe_utils/string_utils.h"
18 : :
19 : :
20 : : static void help(const char *progname);
21 : :
22 : :
23 : : int
7698 peter_e@gmx.net 24 :CBC 10 : main(int argc, char *argv[])
25 : : {
26 : : static int if_exists = 0;
27 : :
28 : : static struct option long_options[] = {
29 : : {"host", required_argument, NULL, 'h'},
30 : : {"port", required_argument, NULL, 'p'},
31 : : {"username", required_argument, NULL, 'U'},
32 : : {"no-password", no_argument, NULL, 'w'},
33 : : {"password", no_argument, NULL, 'W'},
34 : : {"echo", no_argument, NULL, 'e'},
35 : : {"interactive", no_argument, NULL, 'i'},
36 : : {"if-exists", no_argument, &if_exists, 1},
37 : : {"maintenance-db", required_argument, NULL, 2},
38 : : {"force", no_argument, NULL, 'f'},
39 : : {NULL, 0, NULL, 0}
40 : : };
41 : :
42 : : const char *progname;
43 : : int optindex;
44 : : int c;
45 : :
46 : 10 : char *dbname = NULL;
4513 rhaas@postgresql.org 47 : 10 : char *maintenance_db = NULL;
7698 peter_e@gmx.net 48 : 10 : char *host = NULL;
49 : 10 : char *port = NULL;
50 : 10 : char *username = NULL;
5526 51 : 10 : enum trivalue prompt_password = TRI_DEFAULT;
52 : : ConnParams cparams;
7698 53 : 10 : bool echo = false;
54 : 10 : bool interactive = false;
1609 akapila@postgresql.o 55 : 10 : bool force = false;
56 : :
57 : : PQExpBufferData sql;
58 : :
59 : : PGconn *conn;
60 : : PGresult *result;
61 : :
1840 peter@eisentraut.org 62 : 10 : pg_logging_init(argv[0]);
7698 peter_e@gmx.net 63 : 10 : progname = get_progname(argv[0]);
5603 64 : 10 : set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
65 : :
7698 66 : 10 : handle_help_version_opts(argc, argv, "dropdb", help);
67 : :
489 peter@eisentraut.org 68 [ + + ]: 12 : while ((c = getopt_long(argc, argv, "efh:ip:U:wW", long_options, &optindex)) != -1)
69 : : {
7698 peter_e@gmx.net 70 [ - + - - : 5 : switch (c)
- + - - -
- + ]
71 : : {
489 peter@eisentraut.org 72 :UBC 0 : case 'e':
73 : 0 : echo = true;
74 : 0 : break;
489 peter@eisentraut.org 75 :CBC 1 : case 'f':
76 : 1 : force = true;
77 : 1 : break;
7698 peter_e@gmx.net 78 :UBC 0 : case 'h':
4202 bruce@momjian.us 79 : 0 : host = pg_strdup(optarg);
7698 peter_e@gmx.net 80 : 0 : break;
489 peter@eisentraut.org 81 : 0 : case 'i':
82 : 0 : interactive = true;
83 : 0 : break;
7698 peter_e@gmx.net 84 : 0 : case 'p':
4202 bruce@momjian.us 85 : 0 : port = pg_strdup(optarg);
7698 peter_e@gmx.net 86 : 0 : break;
7698 peter_e@gmx.net 87 :CBC 3 : case 'U':
4202 bruce@momjian.us 88 : 3 : username = pg_strdup(optarg);
7698 peter_e@gmx.net 89 : 3 : break;
5526 peter_e@gmx.net 90 :UBC 0 : case 'w':
91 : 0 : prompt_password = TRI_NO;
92 : 0 : break;
7698 93 : 0 : case 'W':
5526 94 : 0 : prompt_password = TRI_YES;
7698 95 : 0 : break;
4611 rhaas@postgresql.org 96 : 0 : case 0:
97 : : /* this covers the long options */
98 : 0 : break;
4513 99 : 0 : case 2:
4202 bruce@momjian.us 100 : 0 : maintenance_db = pg_strdup(optarg);
4513 rhaas@postgresql.org 101 : 0 : break;
7698 peter_e@gmx.net 102 :CBC 1 : default:
103 : : /* getopt_long already emitted a complaint */
737 tgl@sss.pgh.pa.us 104 : 1 : pg_log_error_hint("Try \"%s --help\" for more information.", progname);
7698 peter_e@gmx.net 105 : 1 : exit(1);
106 : : }
107 : : }
108 : :
109 [ - + - ]: 7 : switch (argc - optind)
110 : : {
7698 peter_e@gmx.net 111 :UBC 0 : case 0:
1840 peter@eisentraut.org 112 : 0 : pg_log_error("missing required argument database name");
737 tgl@sss.pgh.pa.us 113 : 0 : pg_log_error_hint("Try \"%s --help\" for more information.", progname);
7698 peter_e@gmx.net 114 : 0 : exit(1);
7698 peter_e@gmx.net 115 :CBC 7 : case 1:
116 : 7 : dbname = argv[optind];
117 : 7 : break;
7698 peter_e@gmx.net 118 :UBC 0 : default:
1840 peter@eisentraut.org 119 : 0 : pg_log_error("too many command-line arguments (first is \"%s\")",
120 : : argv[optind + 1]);
737 tgl@sss.pgh.pa.us 121 : 0 : pg_log_error_hint("Try \"%s --help\" for more information.", progname);
7698 peter_e@gmx.net 122 : 0 : exit(1);
123 : : }
124 : :
7698 peter_e@gmx.net 125 [ - + ]:CBC 7 : if (interactive)
126 : : {
7571 peter_e@gmx.net 127 :UBC 0 : printf(_("Database \"%s\" will be permanently removed.\n"), dbname);
6414 128 [ # # ]: 0 : if (!yesno_prompt("Are you sure?"))
7698 129 : 0 : exit(0);
130 : : }
131 : :
7698 peter_e@gmx.net 132 :CBC 7 : initPQExpBuffer(&sql);
133 : :
1609 akapila@postgresql.o 134 [ + + ]: 14 : appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;",
135 [ - + ]: 7 : (if_exists ? "IF EXISTS " : ""),
136 : : fmtId(dbname),
137 : : force ? " WITH (FORCE)" : "");
138 : :
139 : : /* Avoid trying to drop postgres db while we are connected to it. */
4513 rhaas@postgresql.org 140 [ + - - + ]: 7 : if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
4513 rhaas@postgresql.org 141 :UBC 0 : maintenance_db = "template1";
142 : :
1273 tgl@sss.pgh.pa.us 143 :CBC 7 : cparams.dbname = maintenance_db;
144 : 7 : cparams.pghost = host;
145 : 7 : cparams.pgport = port;
146 : 7 : cparams.pguser = username;
147 : 7 : cparams.prompt_password = prompt_password;
148 : 7 : cparams.override_dbname = NULL;
149 : :
150 : 7 : conn = connectMaintenanceDatabase(&cparams, progname, echo);
151 : :
7698 peter_e@gmx.net 152 [ - + ]: 7 : if (echo)
3716 peter_e@gmx.net 153 :UBC 0 : printf("%s\n", sql.data);
7698 peter_e@gmx.net 154 :CBC 7 : result = PQexec(conn, sql.data);
155 [ + + ]: 7 : if (PQresultStatus(result) != PGRES_COMMAND_OK)
156 : : {
1840 peter@eisentraut.org 157 : 1 : pg_log_error("database removal failed: %s", PQerrorMessage(conn));
7698 peter_e@gmx.net 158 : 1 : PQfinish(conn);
159 : 1 : exit(1);
160 : : }
161 : :
6530 bruce@momjian.us 162 : 6 : PQclear(result);
7698 peter_e@gmx.net 163 : 6 : PQfinish(conn);
164 : 6 : exit(0);
165 : : }
166 : :
167 : :
168 : : static void
169 : 1 : help(const char *progname)
170 : : {
171 : 1 : printf(_("%s removes a PostgreSQL database.\n\n"), progname);
172 : 1 : printf(_("Usage:\n"));
173 : 1 : printf(_(" %s [OPTION]... DBNAME\n"), progname);
174 : 1 : printf(_("\nOptions:\n"));
175 : 1 : printf(_(" -e, --echo show the commands being sent to the server\n"));
1609 akapila@postgresql.o 176 : 1 : printf(_(" -f, --force try to terminate other connections before dropping\n"));
1444 peter@eisentraut.org 177 : 1 : printf(_(" -i, --interactive prompt before deleting anything\n"));
4318 peter_e@gmx.net 178 : 1 : printf(_(" -V, --version output version information, then exit\n"));
4611 rhaas@postgresql.org 179 : 1 : printf(_(" --if-exists don't report error if database doesn't exist\n"));
4318 peter_e@gmx.net 180 : 1 : printf(_(" -?, --help show this help, then exit\n"));
5527 181 : 1 : printf(_("\nConnection options:\n"));
7613 bruce@momjian.us 182 : 1 : printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
7698 peter_e@gmx.net 183 : 1 : printf(_(" -p, --port=PORT database server port\n"));
184 : 1 : printf(_(" -U, --username=USERNAME user name to connect as\n"));
5526 185 : 1 : printf(_(" -w, --no-password never prompt for password\n"));
5969 tgl@sss.pgh.pa.us 186 : 1 : printf(_(" -W, --password force password prompt\n"));
4513 rhaas@postgresql.org 187 : 1 : printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
1507 peter@eisentraut.org 188 : 1 : printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
189 : 1 : printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
7698 peter_e@gmx.net 190 : 1 : }
|