1
/*-------------------------------------------------------------------------
5
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
6
* Portions Copyright (c) 1994, Regents of the University of California
8
* $PostgreSQL: pgsql/src/bin/scripts/droplang.c,v 1.14 2004-12-31 22:03:17 pgsql Exp $
10
*-------------------------------------------------------------------------
13
#include "postgres_fe.h"
17
#define atooid(x) ((Oid) strtoul((x), NULL, 10))
20
static void help(const char *progname);
24
main(int argc, char *argv[])
26
static struct option long_options[] = {
27
{"list", no_argument, NULL, 'l'},
28
{"host", required_argument, NULL, 'h'},
29
{"port", required_argument, NULL, 'p'},
30
{"username", required_argument, NULL, 'U'},
31
{"password", no_argument, NULL, 'W'},
32
{"dbname", required_argument, NULL, 'd'},
33
{"echo", no_argument, NULL, 'e'},
41
bool listlangs = false;
42
const char *dbname = NULL;
45
char *username = NULL;
46
bool password = false;
48
char *langname = NULL;
63
progname = get_progname(argv[0]);
64
set_pglocale_pgservice(argv[0], "pgscripts");
66
handle_help_version_opts(argc, argv, "droplang", help);
68
while ((c = getopt_long(argc, argv, "lh:p:U:Wd:e", long_options, &optindex)) != -1)
94
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
99
if (argc - optind > 0)
102
dbname = argv[optind++];
105
langname = argv[optind++];
106
if (argc - optind > 0)
107
dbname = argv[optind++];
111
if (argc - optind > 0)
113
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
114
progname, argv[optind]);
115
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
121
if (getenv("PGDATABASE"))
122
dbname = getenv("PGDATABASE");
123
else if (getenv("PGUSER"))
124
dbname = getenv("PGUSER");
126
dbname = get_user_name(progname);
129
initPQExpBuffer(&sql);
138
conn = connectDatabase(dbname, host, port, username, password, progname);
140
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", (CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" FROM pg_language WHERE lanispl IS TRUE;", _("Name"), _("yes"), _("no"), _("Trusted?"));
141
result = executeQuery(conn, sql.data, progname, echo);
143
memset(&popt, 0, sizeof(popt));
144
popt.topt.format = PRINT_ALIGNED;
145
popt.topt.border = 1;
146
popt.topt.encoding = PQclientEncoding(conn);
147
popt.title = _("Procedural Languages");
148
printQuery(result, &popt, stdout);
154
if (langname == NULL)
156
fprintf(stderr, _("%s: missing required argument language name\n"), progname);
157
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
161
for (p = langname; *p; p++)
162
if (*p >= 'A' && *p <= 'Z')
165
conn = connectDatabase(dbname, host, port, username, password, progname);
168
* Make sure the language is installed and find the OIDs of the
169
* handler and validator functions
171
printfPQExpBuffer(&sql, "SELECT lanplcallfoid, lanvalidator FROM pg_language WHERE lanname = '%s' AND lanispl;", langname);
172
result = executeQuery(conn, sql.data, progname, echo);
173
if (PQntuples(result) == 0)
176
fprintf(stderr, _("%s: language \"%s\" is not installed in database \"%s\"\n"),
177
progname, langname, dbname);
180
lanplcallfoid = atooid(PQgetvalue(result, 0, 0));
181
lanvalidator = atooid(PQgetvalue(result, 0, 1));
185
* Check that there are no functions left defined in that language
187
printfPQExpBuffer(&sql, "SELECT count(proname) FROM pg_proc P, pg_language L WHERE P.prolang = L.oid AND L.lanname = '%s';", langname);
188
result = executeQuery(conn, sql.data, progname, echo);
189
if (strcmp(PQgetvalue(result, 0, 0), "0") != 0)
193
_("%s: still %s functions declared in language \"%s\"; language not removed\n"),
194
progname, PQgetvalue(result, 0, 0), langname);
200
* Check that the handler function isn't used by some other language
202
printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language WHERE lanplcallfoid = %u AND lanname <> '%s';", lanplcallfoid, langname);
203
result = executeQuery(conn, sql.data, progname, echo);
204
if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
211
* Find the handler name
215
printfPQExpBuffer(&sql, "SELECT proname FROM pg_proc WHERE oid = %u;", lanplcallfoid);
216
result = executeQuery(conn, sql.data, progname, echo);
217
handler = strdup(PQgetvalue(result, 0, 0));
224
* Check that the validator function isn't used by some other language
226
if (OidIsValid(lanvalidator))
228
printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language WHERE lanvalidator = %u AND lanname <> '%s';", lanvalidator, langname);
229
result = executeQuery(conn, sql.data, progname, echo);
230
if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
231
keepvalidator = false;
233
keepvalidator = true;
237
keepvalidator = true; /* don't try to delete it */
240
* Find the validator name
244
printfPQExpBuffer(&sql, "SELECT proname FROM pg_proc WHERE oid = %u;", lanvalidator);
245
result = executeQuery(conn, sql.data, progname, echo);
246
validator = strdup(PQgetvalue(result, 0, 0));
253
* Drop the language and the functions
255
printfPQExpBuffer(&sql, "DROP LANGUAGE \"%s\";\n", langname);
257
appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\" ();\n", handler);
259
appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\" (oid);\n", validator);
261
printf("%s", sql.data);
262
result = PQexec(conn, sql.data);
263
if (PQresultStatus(result) != PGRES_COMMAND_OK)
265
fprintf(stderr, _("%s: language removal failed: %s"),
266
progname, PQerrorMessage(conn));
277
help(const char *progname)
279
printf(_("%s removes a procedural language from a database.\n\n"), progname);
280
printf(_("Usage:\n"));
281
printf(_(" %s [OPTION]... LANGNAME [DBNAME]\n"), progname);
282
printf(_("\nOptions:\n"));
283
printf(_(" -d, --dbname=DBNAME database from which to remove the language\n"));
284
printf(_(" -e, --echo show the commands being sent to the server\n"));
285
printf(_(" -l, --list show a list of currently installed languages\n"));
286
printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
287
printf(_(" -p, --port=PORT database server port\n"));
288
printf(_(" -U, --username=USERNAME user name to connect as\n"));
289
printf(_(" -W, --password prompt for password\n"));
290
printf(_(" --help show this help, then exit\n"));
291
printf(_(" --version output version information, then exit\n"));
292
printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));