~vcs-imports/mammoth-replicator/trunk

« back to all changes in this revision

Viewing changes to src/bin/scripts/droplang.c

  • Committer: alvherre
  • Date: 2005-12-16 21:24:52 UTC
  • Revision ID: svn-v4:db760fc0-0f08-0410-9d63-cc6633f64896:trunk:1
Initial import of the REL8_0_3 sources from the Pgsql CVS repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-------------------------------------------------------------------------
 
2
 *
 
3
 * droplang
 
4
 *
 
5
 * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
 
6
 * Portions Copyright (c) 1994, Regents of the University of California
 
7
 *
 
8
 * $PostgreSQL: pgsql/src/bin/scripts/droplang.c,v 1.14 2004-12-31 22:03:17 pgsql Exp $
 
9
 *
 
10
 *-------------------------------------------------------------------------
 
11
 */
 
12
 
 
13
#include "postgres_fe.h"
 
14
#include "common.h"
 
15
#include "print.h"
 
16
 
 
17
#define atooid(x)  ((Oid) strtoul((x), NULL, 10))
 
18
 
 
19
 
 
20
static void help(const char *progname);
 
21
 
 
22
 
 
23
int
 
24
main(int argc, char *argv[])
 
25
{
 
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'},
 
34
                {NULL, 0, NULL, 0}
 
35
        };
 
36
 
 
37
        const char *progname;
 
38
        int                     optindex;
 
39
        int                     c;
 
40
 
 
41
        bool            listlangs = false;
 
42
        const char *dbname = NULL;
 
43
        char       *host = NULL;
 
44
        char       *port = NULL;
 
45
        char       *username = NULL;
 
46
        bool            password = false;
 
47
        bool            echo = false;
 
48
        char       *langname = NULL;
 
49
 
 
50
        char       *p;
 
51
        Oid                     lanplcallfoid;
 
52
        Oid                     lanvalidator;
 
53
        char       *handler;
 
54
        char       *validator;
 
55
        bool            keephandler;
 
56
        bool            keepvalidator;
 
57
 
 
58
        PQExpBufferData sql;
 
59
 
 
60
        PGconn     *conn;
 
61
        PGresult   *result;
 
62
 
 
63
        progname = get_progname(argv[0]);
 
64
        set_pglocale_pgservice(argv[0], "pgscripts");
 
65
 
 
66
        handle_help_version_opts(argc, argv, "droplang", help);
 
67
 
 
68
        while ((c = getopt_long(argc, argv, "lh:p:U:Wd:e", long_options, &optindex)) != -1)
 
69
        {
 
70
                switch (c)
 
71
                {
 
72
                        case 'l':
 
73
                                listlangs = true;
 
74
                                break;
 
75
                        case 'h':
 
76
                                host = optarg;
 
77
                                break;
 
78
                        case 'p':
 
79
                                port = optarg;
 
80
                                break;
 
81
                        case 'U':
 
82
                                username = optarg;
 
83
                                break;
 
84
                        case 'W':
 
85
                                password = true;
 
86
                                break;
 
87
                        case 'd':
 
88
                                dbname = optarg;
 
89
                                break;
 
90
                        case 'e':
 
91
                                echo = true;
 
92
                                break;
 
93
                        default:
 
94
                                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
 
95
                                exit(1);
 
96
                }
 
97
        }
 
98
 
 
99
        if (argc - optind > 0)
 
100
        {
 
101
                if (listlangs)
 
102
                        dbname = argv[optind++];
 
103
                else
 
104
                {
 
105
                        langname = argv[optind++];
 
106
                        if (argc - optind > 0)
 
107
                                dbname = argv[optind++];
 
108
                }
 
109
        }
 
110
 
 
111
        if (argc - optind > 0)
 
112
        {
 
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);
 
116
                exit(1);
 
117
        }
 
118
 
 
119
        if (dbname == NULL)
 
120
        {
 
121
                if (getenv("PGDATABASE"))
 
122
                        dbname = getenv("PGDATABASE");
 
123
                else if (getenv("PGUSER"))
 
124
                        dbname = getenv("PGUSER");
 
125
                else
 
126
                        dbname = get_user_name(progname);
 
127
        }
 
128
 
 
129
        initPQExpBuffer(&sql);
 
130
 
 
131
        /*
 
132
         * List option
 
133
         */
 
134
        if (listlangs)
 
135
        {
 
136
                printQueryOpt popt;
 
137
 
 
138
                conn = connectDatabase(dbname, host, port, username, password, progname);
 
139
 
 
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);
 
142
 
 
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);
 
149
 
 
150
                PQfinish(conn);
 
151
                exit(0);
 
152
        }
 
153
 
 
154
        if (langname == NULL)
 
155
        {
 
156
                fprintf(stderr, _("%s: missing required argument language name\n"), progname);
 
157
                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
 
158
                exit(1);
 
159
        }
 
160
 
 
161
        for (p = langname; *p; p++)
 
162
                if (*p >= 'A' && *p <= 'Z')
 
163
                        *p += ('a' - 'A');
 
164
 
 
165
        conn = connectDatabase(dbname, host, port, username, password, progname);
 
166
 
 
167
        /*
 
168
         * Make sure the language is installed and find the OIDs of the
 
169
         * handler and validator functions
 
170
         */
 
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)
 
174
        {
 
175
                PQfinish(conn);
 
176
                fprintf(stderr, _("%s: language \"%s\" is not installed in database \"%s\"\n"),
 
177
                                progname, langname, dbname);
 
178
                exit(1);
 
179
        }
 
180
        lanplcallfoid = atooid(PQgetvalue(result, 0, 0));
 
181
        lanvalidator = atooid(PQgetvalue(result, 0, 1));
 
182
        PQclear(result);
 
183
 
 
184
        /*
 
185
         * Check that there are no functions left defined in that language
 
186
         */
 
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)
 
190
        {
 
191
                PQfinish(conn);
 
192
                fprintf(stderr,
 
193
                                _("%s: still %s functions declared in language \"%s\"; language not removed\n"),
 
194
                                progname, PQgetvalue(result, 0, 0), langname);
 
195
                exit(1);
 
196
        }
 
197
        PQclear(result);
 
198
 
 
199
        /*
 
200
         * Check that the handler function isn't used by some other language
 
201
         */
 
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)
 
205
                keephandler = false;
 
206
        else
 
207
                keephandler = true;
 
208
        PQclear(result);
 
209
 
 
210
        /*
 
211
         * Find the handler name
 
212
         */
 
213
        if (!keephandler)
 
214
        {
 
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));
 
218
                PQclear(result);
 
219
        }
 
220
        else
 
221
                handler = NULL;
 
222
 
 
223
        /*
 
224
         * Check that the validator function isn't used by some other language
 
225
         */
 
226
        if (OidIsValid(lanvalidator))
 
227
        {
 
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;
 
232
                else
 
233
                        keepvalidator = true;
 
234
                PQclear(result);
 
235
        }
 
236
        else
 
237
                keepvalidator = true;   /* don't try to delete it */
 
238
 
 
239
        /*
 
240
         * Find the validator name
 
241
         */
 
242
        if (!keepvalidator)
 
243
        {
 
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));
 
247
                PQclear(result);
 
248
        }
 
249
        else
 
250
                validator = NULL;
 
251
 
 
252
        /*
 
253
         * Drop the language and the functions
 
254
         */
 
255
        printfPQExpBuffer(&sql, "DROP LANGUAGE \"%s\";\n", langname);
 
256
        if (!keephandler)
 
257
                appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\" ();\n", handler);
 
258
        if (!keepvalidator)
 
259
                appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\" (oid);\n", validator);
 
260
        if (echo)
 
261
                printf("%s", sql.data);
 
262
        result = PQexec(conn, sql.data);
 
263
        if (PQresultStatus(result) != PGRES_COMMAND_OK)
 
264
        {
 
265
                fprintf(stderr, _("%s: language removal failed: %s"),
 
266
                                progname, PQerrorMessage(conn));
 
267
                PQfinish(conn);
 
268
                exit(1);
 
269
        }
 
270
 
 
271
        PQfinish(conn);
 
272
        exit(0);
 
273
}
 
274
 
 
275
 
 
276
static void
 
277
help(const char *progname)
 
278
{
 
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"));
 
293
}