mirror of https://github.com/postgres/postgres
They have been deprecated since PostgreSQL 9.1. Reviewed-by: Magnus Hagander <magnus@hagander.net> Reviewed-by: Daniel Gustafsson <daniel@yesql.se>pull/3/merge
parent
691b8d5928
commit
50c956add8
@ -1,291 +0,0 @@ |
||||
<!-- |
||||
doc/src/sgml/ref/createlang.sgml |
||||
PostgreSQL documentation |
||||
--> |
||||
|
||||
<refentry id="APP-CREATELANG"> |
||||
<indexterm zone="app-createlang"> |
||||
<primary>createlang</primary> |
||||
</indexterm> |
||||
|
||||
<refmeta> |
||||
<refentrytitle><application>createlang</application></refentrytitle> |
||||
<manvolnum>1</manvolnum> |
||||
<refmiscinfo>Application</refmiscinfo> |
||||
</refmeta> |
||||
|
||||
<refnamediv> |
||||
<refname>createlang</refname> |
||||
<refpurpose>install a <productname>PostgreSQL</productname> procedural language</refpurpose> |
||||
</refnamediv> |
||||
|
||||
<refsynopsisdiv> |
||||
<cmdsynopsis> |
||||
<command>createlang</command> |
||||
<arg rep="repeat"><replaceable>connection-option</replaceable></arg> |
||||
<arg choice="plain"><replaceable>langname</replaceable></arg> |
||||
<arg choice="opt"><replaceable>dbname</replaceable></arg> |
||||
</cmdsynopsis> |
||||
|
||||
<cmdsynopsis> |
||||
<command>createlang</command> |
||||
<arg rep="repeat"><replaceable>connection-option</replaceable></arg> |
||||
<group choice="plain"><arg choice="plain"><option>--list</option></arg><arg choice="plain"><option>-l</option></arg></group> |
||||
<arg choice="opt"><replaceable>dbname</replaceable></arg> |
||||
</cmdsynopsis> |
||||
</refsynopsisdiv> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Description</title> |
||||
|
||||
<para> |
||||
<application>createlang</application> is a utility for adding a |
||||
procedural language to a <productname>PostgreSQL</productname> database. |
||||
</para> |
||||
|
||||
<para> |
||||
<application>createlang</application> is just a wrapper around the |
||||
<xref linkend="sql-createextension"> SQL command. |
||||
</para> |
||||
|
||||
<caution> |
||||
<para> |
||||
<application>createlang</application> is deprecated and may be removed |
||||
in a future <productname>PostgreSQL</productname> release. Direct use |
||||
of the <command>CREATE EXTENSION</> command is recommended instead. |
||||
</para> |
||||
</caution> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Options</title> |
||||
|
||||
<para> |
||||
<application>createlang</application> accepts the following command-line arguments: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><replaceable class="parameter">langname</replaceable></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the name of the procedural language to be |
||||
installed. (This name is lower-cased.) |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option><optional>-d</> <replaceable class="parameter">dbname</replaceable></></term> |
||||
<term><option><optional>--dbname=</><replaceable class="parameter">dbname</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the database to which the language should be added. |
||||
The default is to use the database with the same name as the |
||||
current system user. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-e</></term> |
||||
<term><option>--echo</></term> |
||||
<listitem> |
||||
<para> |
||||
Display SQL commands as they are executed. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-l</></term> |
||||
<term><option>--list</></term> |
||||
<listitem> |
||||
<para> |
||||
Show a list of already installed languages in the target database. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-V</></term> |
||||
<term><option>--version</></term> |
||||
<listitem> |
||||
<para> |
||||
Print the <application>createlang</application> version and exit. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-?</></term> |
||||
<term><option>--help</></term> |
||||
<listitem> |
||||
<para> |
||||
Show help about <application>createlang</application> command line |
||||
arguments, and exit. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
</variablelist> |
||||
</para> |
||||
|
||||
<para> |
||||
<application>createlang</application> also accepts |
||||
the following command-line arguments for connection parameters: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><option>-h <replaceable class="parameter">host</replaceable></></term> |
||||
<term><option>--host=<replaceable class="parameter">host</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the host name of the machine on which the |
||||
server |
||||
is running. If the value begins with a slash, it is used |
||||
as the directory for the Unix domain socket. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-p <replaceable class="parameter">port</replaceable></></term> |
||||
<term><option>--port=<replaceable class="parameter">port</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the TCP port or local Unix domain socket file |
||||
extension on which the server |
||||
is listening for connections. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-U <replaceable class="parameter">username</replaceable></></term> |
||||
<term><option>--username=<replaceable class="parameter">username</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
User name to connect as. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-w</></term> |
||||
<term><option>--no-password</></term> |
||||
<listitem> |
||||
<para> |
||||
Never issue a password prompt. If the server requires |
||||
password authentication and a password is not available by |
||||
other means such as a <filename>.pgpass</filename> file, the |
||||
connection attempt will fail. This option can be useful in |
||||
batch jobs and scripts where no user is present to enter a |
||||
password. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-W</></term> |
||||
<term><option>--password</></term> |
||||
<listitem> |
||||
<para> |
||||
Force <application>createlang</application> to prompt for a |
||||
password before connecting to a database. |
||||
</para> |
||||
|
||||
<para> |
||||
This option is never essential, since |
||||
<application>createlang</application> will automatically prompt |
||||
for a password if the server demands password authentication. |
||||
However, <application>createlang</application> will waste a |
||||
connection attempt finding out that the server wants a password. |
||||
In some cases it is worth typing <option>-W</> to avoid the extra |
||||
connection attempt. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
</variablelist> |
||||
</para> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Environment</title> |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><envar>PGDATABASE</envar></term> |
||||
<term><envar>PGHOST</envar></term> |
||||
<term><envar>PGPORT</envar></term> |
||||
<term><envar>PGUSER</envar></term> |
||||
|
||||
<listitem> |
||||
<para> |
||||
Default connection parameters |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
|
||||
<para> |
||||
This utility, like most other <productname>PostgreSQL</> utilities, |
||||
also uses the environment variables supported by <application>libpq</> |
||||
(see <xref linkend="libpq-envars">). |
||||
</para> |
||||
|
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Diagnostics</title> |
||||
|
||||
<para> |
||||
Most error messages are self-explanatory. If not, run |
||||
<application>createlang</application> with the <option>--echo</option> |
||||
option and see the respective <acronym>SQL</acronym> command |
||||
for details. Also, any default connection settings and environment |
||||
variables used by the <application>libpq</application> front-end |
||||
library will apply. |
||||
</para> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Notes</title> |
||||
|
||||
<para> |
||||
Use <xref linkend="app-droplang"> to remove a language. |
||||
</para> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Examples</title> |
||||
|
||||
<para> |
||||
To install the language <literal>pltcl</literal> into the database |
||||
<literal>template1</literal>: |
||||
<screen> |
||||
<prompt>$ </prompt><userinput>createlang pltcl template1</userinput> |
||||
</screen> |
||||
Note that installing the language into <literal>template1</literal> |
||||
will cause it to be automatically installed into subsequently-created |
||||
databases as well. |
||||
</para> |
||||
</refsect1> |
||||
|
||||
<refsect1> |
||||
<title>See Also</title> |
||||
|
||||
<simplelist type="inline"> |
||||
<member><xref linkend="app-droplang"></member> |
||||
<member><xref linkend="sql-createextension"></member> |
||||
<member><xref linkend="sql-createlanguage"></member> |
||||
</simplelist> |
||||
</refsect1> |
||||
|
||||
</refentry> |
||||
@ -1,288 +0,0 @@ |
||||
<!-- |
||||
doc/src/sgml/ref/droplang.sgml |
||||
PostgreSQL documentation |
||||
--> |
||||
|
||||
<refentry id="APP-DROPLANG"> |
||||
<indexterm zone="app-droplang"> |
||||
<primary>droplang</primary> |
||||
</indexterm> |
||||
|
||||
<refmeta> |
||||
<refentrytitle><application>droplang</application></refentrytitle> |
||||
<manvolnum>1</manvolnum> |
||||
<refmiscinfo>Application</refmiscinfo> |
||||
</refmeta> |
||||
|
||||
<refnamediv> |
||||
<refname>droplang</refname> |
||||
<refpurpose>remove a <productname>PostgreSQL</productname> procedural language</refpurpose> |
||||
</refnamediv> |
||||
|
||||
<refsynopsisdiv> |
||||
<cmdsynopsis> |
||||
<command>droplang</command> |
||||
<arg rep="repeat"><replaceable>connection-option</replaceable></arg> |
||||
<arg choice="plain"><replaceable>langname</replaceable></arg> |
||||
<arg choice="opt"><replaceable>dbname</replaceable></arg> |
||||
</cmdsynopsis> |
||||
|
||||
<cmdsynopsis> |
||||
<command>droplang</command> |
||||
<arg rep="repeat"><replaceable>connection-option</replaceable></arg> |
||||
<group choice="plain"><arg choice="plain"><option>--list</option></arg><arg choice="plain"><option>-l</option></arg></group> |
||||
<arg choice="opt"><replaceable>dbname</replaceable></arg> |
||||
</cmdsynopsis> |
||||
</refsynopsisdiv> |
||||
|
||||
<refsect1 id="R1-APP-DROPLANG-1"> |
||||
<title> |
||||
Description |
||||
</title> |
||||
|
||||
<para> |
||||
<application>droplang</application> is a utility for removing an |
||||
existing procedural language from a |
||||
<productname>PostgreSQL</productname> database. |
||||
</para> |
||||
|
||||
<para> |
||||
<application>droplang</application> is just a wrapper around the |
||||
<xref linkend="sql-dropextension"> SQL command. |
||||
</para> |
||||
|
||||
<caution> |
||||
<para> |
||||
<application>droplang</application> is deprecated and may be removed |
||||
in a future <productname>PostgreSQL</productname> release. Direct use |
||||
of the <command>DROP EXTENSION</> command is recommended instead. |
||||
</para> |
||||
</caution> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Options</title> |
||||
|
||||
<para> |
||||
<application>droplang</application> accepts the following command line arguments: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><replaceable class="parameter">langname</replaceable></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the name of the procedural language to be removed. |
||||
(This name is lower-cased.) |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option><optional>-d</> <replaceable class="parameter">dbname</replaceable></></term> |
||||
<term><option><optional>--dbname=</><replaceable class="parameter">dbname</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies from which database the language should be removed. |
||||
The default is to use the database with the same name as the |
||||
current system user. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-e</></term> |
||||
<term><option>--echo</></term> |
||||
<listitem> |
||||
<para> |
||||
Display SQL commands as they are executed. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-l</></term> |
||||
<term><option>--list</></term> |
||||
<listitem> |
||||
<para> |
||||
Show a list of already installed languages in the target database. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-V</></term> |
||||
<term><option>--version</></term> |
||||
<listitem> |
||||
<para> |
||||
Print the <application>droplang</application> version and exit. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-?</></term> |
||||
<term><option>--help</></term> |
||||
<listitem> |
||||
<para> |
||||
Show help about <application>droplang</application> command line |
||||
arguments, and exit. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
</variablelist> |
||||
</para> |
||||
|
||||
<para> |
||||
<application>droplang</application> also accepts |
||||
the following command line arguments for connection parameters: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><option>-h <replaceable class="parameter">host</replaceable></></term> |
||||
<term><option>--host=<replaceable class="parameter">host</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the host name of the machine on which the |
||||
server |
||||
is running. If host begins with a slash, it is used |
||||
as the directory for the Unix domain socket. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-p <replaceable class="parameter">port</replaceable></></term> |
||||
<term><option>--port=<replaceable class="parameter">port</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the Internet TCP/IP port or local Unix domain socket file |
||||
extension on which the server |
||||
is listening for connections. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-U <replaceable class="parameter">username</replaceable></></term> |
||||
<term><option>--username=<replaceable class="parameter">username</replaceable></></term> |
||||
<listitem> |
||||
<para> |
||||
User name to connect as. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-w</></term> |
||||
<term><option>--no-password</></term> |
||||
<listitem> |
||||
<para> |
||||
Never issue a password prompt. If the server requires |
||||
password authentication and a password is not available by |
||||
other means such as a <filename>.pgpass</filename> file, the |
||||
connection attempt will fail. This option can be useful in |
||||
batch jobs and scripts where no user is present to enter a |
||||
password. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><option>-W</></term> |
||||
<term><option>--password</></term> |
||||
<listitem> |
||||
<para> |
||||
Force <application>droplang</application> to prompt for a |
||||
password before connecting to a database. |
||||
</para> |
||||
|
||||
<para> |
||||
This option is never essential, since |
||||
<application>droplang</application> will automatically prompt |
||||
for a password if the server demands password authentication. |
||||
However, <application>droplang</application> will waste a |
||||
connection attempt finding out that the server wants a password. |
||||
In some cases it is worth typing <option>-W</> to avoid the extra |
||||
connection attempt. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
</variablelist> |
||||
</para> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Environment</title> |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><envar>PGDATABASE</envar></term> |
||||
<term><envar>PGHOST</envar></term> |
||||
<term><envar>PGPORT</envar></term> |
||||
<term><envar>PGUSER</envar></term> |
||||
|
||||
<listitem> |
||||
<para> |
||||
Default connection parameters |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
|
||||
<para> |
||||
This utility, like most other <productname>PostgreSQL</> utilities, |
||||
also uses the environment variables supported by <application>libpq</> |
||||
(see <xref linkend="libpq-envars">). |
||||
</para> |
||||
|
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Diagnostics</title> |
||||
|
||||
<para> |
||||
Most error messages are self-explanatory. If not, run |
||||
<application>droplang</application> with the <option>--echo</option> |
||||
option and see under the respective <acronym>SQL</acronym> command |
||||
for details. Also, any default connection settings and environment |
||||
variables used by the <application>libpq</application> front-end |
||||
library will apply. |
||||
</para> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Notes</title> |
||||
|
||||
<para> |
||||
Use <xref linkend="app-createlang"> to add a language. |
||||
</para> |
||||
</refsect1> |
||||
|
||||
|
||||
<refsect1> |
||||
<title>Examples</title> |
||||
|
||||
<para> |
||||
To remove the language <literal>pltcl</literal>: |
||||
<screen> |
||||
<prompt>$ </prompt><userinput>droplang pltcl dbname</userinput> |
||||
</screen></para> |
||||
</refsect1> |
||||
|
||||
<refsect1> |
||||
<title>See Also</title> |
||||
|
||||
<simplelist type="inline"> |
||||
<member><xref linkend="app-createlang"></member> |
||||
<member><xref linkend="sql-dropextension"></member> |
||||
<member><xref linkend="sql-droplanguage"></member> |
||||
</simplelist> |
||||
</refsect1> |
||||
|
||||
</refentry> |
||||
@ -1,251 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* createlang |
||||
* |
||||
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/bin/scripts/createlang.c |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#include "postgres_fe.h" |
||||
|
||||
#include "common.h" |
||||
#include "fe_utils/print.h" |
||||
|
||||
static void help(const char *progname); |
||||
|
||||
|
||||
int |
||||
main(int argc, char *argv[]) |
||||
{ |
||||
static struct option long_options[] = { |
||||
{"list", no_argument, NULL, 'l'}, |
||||
{"host", required_argument, NULL, 'h'}, |
||||
{"port", required_argument, NULL, 'p'}, |
||||
{"username", required_argument, NULL, 'U'}, |
||||
{"no-password", no_argument, NULL, 'w'}, |
||||
{"password", no_argument, NULL, 'W'}, |
||||
{"dbname", required_argument, NULL, 'd'}, |
||||
{"echo", no_argument, NULL, 'e'}, |
||||
{NULL, 0, NULL, 0} |
||||
}; |
||||
|
||||
const char *progname; |
||||
int optindex; |
||||
int c; |
||||
|
||||
bool listlangs = false; |
||||
const char *dbname = NULL; |
||||
char *host = NULL; |
||||
char *port = NULL; |
||||
char *username = NULL; |
||||
enum trivalue prompt_password = TRI_DEFAULT; |
||||
bool echo = false; |
||||
char *langname = NULL; |
||||
|
||||
char *p; |
||||
|
||||
PQExpBufferData sql; |
||||
|
||||
PGconn *conn; |
||||
PGresult *result; |
||||
|
||||
progname = get_progname(argv[0]); |
||||
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts")); |
||||
|
||||
handle_help_version_opts(argc, argv, "createlang", help); |
||||
|
||||
while ((c = getopt_long(argc, argv, "lh:p:U:wWd:e", long_options, &optindex)) != -1) |
||||
{ |
||||
switch (c) |
||||
{ |
||||
case 'l': |
||||
listlangs = true; |
||||
break; |
||||
case 'h': |
||||
host = pg_strdup(optarg); |
||||
break; |
||||
case 'p': |
||||
port = pg_strdup(optarg); |
||||
break; |
||||
case 'U': |
||||
username = pg_strdup(optarg); |
||||
break; |
||||
case 'w': |
||||
prompt_password = TRI_NO; |
||||
break; |
||||
case 'W': |
||||
prompt_password = TRI_YES; |
||||
break; |
||||
case 'd': |
||||
dbname = pg_strdup(optarg); |
||||
break; |
||||
case 'e': |
||||
echo = true; |
||||
break; |
||||
default: |
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); |
||||
exit(1); |
||||
} |
||||
} |
||||
|
||||
/*
|
||||
* We set dbname from positional arguments if it is not already set by |
||||
* option arguments -d. If not doing listlangs, positional dbname must |
||||
* follow positional langname. |
||||
*/ |
||||
|
||||
if (argc - optind > 0) |
||||
{ |
||||
if (listlangs) |
||||
{ |
||||
if (dbname == NULL) |
||||
dbname = argv[optind++]; |
||||
} |
||||
else |
||||
{ |
||||
langname = argv[optind++]; |
||||
if (argc - optind > 0 && dbname == NULL) |
||||
dbname = argv[optind++]; |
||||
} |
||||
} |
||||
|
||||
if (argc - optind > 0) |
||||
{ |
||||
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), |
||||
progname, argv[optind]); |
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); |
||||
exit(1); |
||||
} |
||||
|
||||
if (dbname == NULL) |
||||
{ |
||||
if (getenv("PGDATABASE")) |
||||
dbname = getenv("PGDATABASE"); |
||||
else if (getenv("PGUSER")) |
||||
dbname = getenv("PGUSER"); |
||||
else |
||||
dbname = get_user_name_or_exit(progname); |
||||
} |
||||
|
||||
initPQExpBuffer(&sql); |
||||
|
||||
/*
|
||||
* List option |
||||
*/ |
||||
if (listlangs) |
||||
{ |
||||
printQueryOpt popt; |
||||
static const bool translate_columns[] = {false, true}; |
||||
|
||||
conn = connectDatabase(dbname, host, port, username, prompt_password, |
||||
progname, false, false); |
||||
|
||||
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " |
||||
"(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" " |
||||
"FROM pg_catalog.pg_language WHERE lanispl;", |
||||
gettext_noop("Name"), |
||||
gettext_noop("yes"), gettext_noop("no"), |
||||
gettext_noop("Trusted?")); |
||||
result = executeQuery(conn, sql.data, progname, echo); |
||||
|
||||
memset(&popt, 0, sizeof(popt)); |
||||
popt.topt.format = PRINT_ALIGNED; |
||||
popt.topt.border = 1; |
||||
popt.topt.start_table = true; |
||||
popt.topt.stop_table = true; |
||||
popt.topt.encoding = PQclientEncoding(conn); |
||||
popt.title = _("Procedural Languages"); |
||||
popt.translate_header = true; |
||||
popt.translate_columns = translate_columns; |
||||
popt.n_translate_columns = lengthof(translate_columns); |
||||
|
||||
printQuery(result, &popt, stdout, false, NULL); |
||||
|
||||
PQfinish(conn); |
||||
exit(0); |
||||
} |
||||
|
||||
if (langname == NULL) |
||||
{ |
||||
fprintf(stderr, _("%s: missing required argument language name\n"), progname); |
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); |
||||
exit(1); |
||||
} |
||||
|
||||
/* lower case language name */ |
||||
for (p = langname; *p; p++) |
||||
if (*p >= 'A' && *p <= 'Z') |
||||
*p += ('a' - 'A'); |
||||
|
||||
conn = connectDatabase(dbname, host, port, username, prompt_password, |
||||
progname, false, false); |
||||
|
||||
/*
|
||||
* Make sure the language isn't already installed |
||||
*/ |
||||
printfPQExpBuffer(&sql, |
||||
"SELECT oid FROM pg_catalog.pg_language WHERE lanname = '%s';", |
||||
langname); |
||||
result = executeQuery(conn, sql.data, progname, echo); |
||||
if (PQntuples(result) > 0) |
||||
{ |
||||
fprintf(stderr, |
||||
_("%s: language \"%s\" is already installed in database \"%s\"\n"), |
||||
progname, langname, PQdb(conn)); |
||||
PQfinish(conn); |
||||
/* separate exit status for "already installed" */ |
||||
exit(2); |
||||
} |
||||
PQclear(result); |
||||
|
||||
/*
|
||||
* In 9.1 and up, assume that languages should be installed using CREATE |
||||
* EXTENSION. However, it's possible this tool could be used against an |
||||
* older server, and it's easy enough to continue supporting the old way. |
||||
*/ |
||||
if (PQserverVersion(conn) >= 90100) |
||||
printfPQExpBuffer(&sql, "CREATE EXTENSION \"%s\";", langname); |
||||
else |
||||
printfPQExpBuffer(&sql, "CREATE LANGUAGE \"%s\";", langname); |
||||
|
||||
if (echo) |
||||
printf("%s\n", sql.data); |
||||
result = PQexec(conn, sql.data); |
||||
if (PQresultStatus(result) != PGRES_COMMAND_OK) |
||||
{ |
||||
fprintf(stderr, _("%s: language installation failed: %s"), |
||||
progname, PQerrorMessage(conn)); |
||||
PQfinish(conn); |
||||
exit(1); |
||||
} |
||||
|
||||
PQclear(result); |
||||
PQfinish(conn); |
||||
exit(0); |
||||
} |
||||
|
||||
|
||||
|
||||
static void |
||||
help(const char *progname) |
||||
{ |
||||
printf(_("%s installs a procedural language into a PostgreSQL database.\n\n"), progname); |
||||
printf(_("Usage:\n")); |
||||
printf(_(" %s [OPTION]... LANGNAME [DBNAME]\n"), progname); |
||||
printf(_("\nOptions:\n")); |
||||
printf(_(" -d, --dbname=DBNAME database to install language in\n")); |
||||
printf(_(" -e, --echo show the commands being sent to the server\n")); |
||||
printf(_(" -l, --list show a list of currently installed languages\n")); |
||||
printf(_(" -V, --version output version information, then exit\n")); |
||||
printf(_(" -?, --help show this help, then exit\n")); |
||||
printf(_("\nConnection options:\n")); |
||||
printf(_(" -h, --host=HOSTNAME database server host or socket directory\n")); |
||||
printf(_(" -p, --port=PORT database server port\n")); |
||||
printf(_(" -U, --username=USERNAME user name to connect as\n")); |
||||
printf(_(" -w, --no-password never prompt for password\n")); |
||||
printf(_(" -W, --password force password prompt\n")); |
||||
printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); |
||||
} |
||||
@ -1,250 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* droplang |
||||
* |
||||
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/bin/scripts/droplang.c |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#include "postgres_fe.h" |
||||
|
||||
#include "common.h" |
||||
#include "fe_utils/print.h" |
||||
|
||||
|
||||
static void help(const char *progname); |
||||
|
||||
|
||||
int |
||||
main(int argc, char *argv[]) |
||||
{ |
||||
static struct option long_options[] = { |
||||
{"list", no_argument, NULL, 'l'}, |
||||
{"host", required_argument, NULL, 'h'}, |
||||
{"port", required_argument, NULL, 'p'}, |
||||
{"username", required_argument, NULL, 'U'}, |
||||
{"no-password", no_argument, NULL, 'w'}, |
||||
{"password", no_argument, NULL, 'W'}, |
||||
{"dbname", required_argument, NULL, 'd'}, |
||||
{"echo", no_argument, NULL, 'e'}, |
||||
{NULL, 0, NULL, 0} |
||||
}; |
||||
|
||||
const char *progname; |
||||
int optindex; |
||||
int c; |
||||
bool listlangs = false; |
||||
const char *dbname = NULL; |
||||
char *host = NULL; |
||||
char *port = NULL; |
||||
char *username = NULL; |
||||
enum trivalue prompt_password = TRI_DEFAULT; |
||||
bool echo = false; |
||||
char *langname = NULL; |
||||
char *p; |
||||
PQExpBufferData sql; |
||||
PGconn *conn; |
||||
PGresult *result; |
||||
|
||||
progname = get_progname(argv[0]); |
||||
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts")); |
||||
|
||||
handle_help_version_opts(argc, argv, "droplang", help); |
||||
|
||||
while ((c = getopt_long(argc, argv, "lh:p:U:wWd:e", long_options, &optindex)) != -1) |
||||
{ |
||||
switch (c) |
||||
{ |
||||
case 'l': |
||||
listlangs = true; |
||||
break; |
||||
case 'h': |
||||
host = pg_strdup(optarg); |
||||
break; |
||||
case 'p': |
||||
port = pg_strdup(optarg); |
||||
break; |
||||
case 'U': |
||||
username = pg_strdup(optarg); |
||||
break; |
||||
case 'w': |
||||
prompt_password = TRI_NO; |
||||
break; |
||||
case 'W': |
||||
prompt_password = TRI_YES; |
||||
break; |
||||
case 'd': |
||||
dbname = pg_strdup(optarg); |
||||
break; |
||||
case 'e': |
||||
echo = true; |
||||
break; |
||||
default: |
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); |
||||
exit(1); |
||||
} |
||||
} |
||||
|
||||
/*
|
||||
* We set dbname from positional arguments if it is not already set by |
||||
* option arguments -d. If not doing listlangs, positional dbname must |
||||
* follow positional langname. |
||||
*/ |
||||
|
||||
if (argc - optind > 0) |
||||
{ |
||||
if (listlangs) |
||||
{ |
||||
if (dbname == NULL) |
||||
dbname = argv[optind++]; |
||||
} |
||||
else |
||||
{ |
||||
langname = argv[optind++]; |
||||
if (argc - optind > 0 && dbname == NULL) |
||||
dbname = argv[optind++]; |
||||
} |
||||
} |
||||
|
||||
if (argc - optind > 0) |
||||
{ |
||||
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), |
||||
progname, argv[optind]); |
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); |
||||
exit(1); |
||||
} |
||||
|
||||
if (dbname == NULL) |
||||
{ |
||||
if (getenv("PGDATABASE")) |
||||
dbname = getenv("PGDATABASE"); |
||||
else if (getenv("PGUSER")) |
||||
dbname = getenv("PGUSER"); |
||||
else |
||||
dbname = get_user_name_or_exit(progname); |
||||
} |
||||
|
||||
initPQExpBuffer(&sql); |
||||
|
||||
/*
|
||||
* List option |
||||
*/ |
||||
if (listlangs) |
||||
{ |
||||
printQueryOpt popt; |
||||
static const bool translate_columns[] = {false, true}; |
||||
|
||||
conn = connectDatabase(dbname, host, port, username, prompt_password, |
||||
progname, false, false); |
||||
|
||||
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " |
||||
"(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" " |
||||
"FROM pg_catalog.pg_language WHERE lanispl;", |
||||
gettext_noop("Name"), |
||||
gettext_noop("yes"), gettext_noop("no"), |
||||
gettext_noop("Trusted?")); |
||||
result = executeQuery(conn, sql.data, progname, echo); |
||||
|
||||
memset(&popt, 0, sizeof(popt)); |
||||
popt.topt.format = PRINT_ALIGNED; |
||||
popt.topt.border = 1; |
||||
popt.topt.start_table = true; |
||||
popt.topt.stop_table = true; |
||||
popt.topt.encoding = PQclientEncoding(conn); |
||||
popt.title = _("Procedural Languages"); |
||||
popt.translate_header = true; |
||||
popt.translate_columns = translate_columns; |
||||
popt.n_translate_columns = lengthof(translate_columns); |
||||
|
||||
printQuery(result, &popt, stdout, false, NULL); |
||||
|
||||
PQfinish(conn); |
||||
exit(0); |
||||
} |
||||
|
||||
if (langname == NULL) |
||||
{ |
||||
fprintf(stderr, _("%s: missing required argument language name\n"), |
||||
progname); |
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), |
||||
progname); |
||||
exit(1); |
||||
} |
||||
|
||||
/* lower case language name */ |
||||
for (p = langname; *p; p++) |
||||
if (*p >= 'A' && *p <= 'Z') |
||||
*p += ('a' - 'A'); |
||||
|
||||
conn = connectDatabase(dbname, host, port, username, prompt_password, |
||||
progname, false, false); |
||||
|
||||
/*
|
||||
* Force schema search path to be just pg_catalog, so that we don't have |
||||
* to be paranoid about search paths below. |
||||
*/ |
||||
executeCommand(conn, "SET search_path = pg_catalog;", progname, echo); |
||||
|
||||
/*
|
||||
* Make sure the language is installed |
||||
*/ |
||||
printfPQExpBuffer(&sql, "SELECT oid " |
||||
"FROM pg_language WHERE lanname = '%s' AND lanispl;", |
||||
langname); |
||||
result = executeQuery(conn, sql.data, progname, echo); |
||||
if (PQntuples(result) == 0) |
||||
{ |
||||
fprintf(stderr, _("%s: language \"%s\" is not installed in " |
||||
"database \"%s\"\n"), |
||||
progname, langname, PQdb(conn)); |
||||
PQfinish(conn); |
||||
exit(1); |
||||
} |
||||
PQclear(result); |
||||
|
||||
/*
|
||||
* Attempt to drop the language. We do not use CASCADE, so that the drop |
||||
* will fail if there are any functions in the language. |
||||
*/ |
||||
printfPQExpBuffer(&sql, "DROP EXTENSION \"%s\";", langname); |
||||
|
||||
if (echo) |
||||
printf("%s\n", sql.data); |
||||
result = PQexec(conn, sql.data); |
||||
if (PQresultStatus(result) != PGRES_COMMAND_OK) |
||||
{ |
||||
fprintf(stderr, _("%s: language removal failed: %s"), |
||||
progname, PQerrorMessage(conn)); |
||||
PQfinish(conn); |
||||
exit(1); |
||||
} |
||||
|
||||
PQclear(result); |
||||
PQfinish(conn); |
||||
exit(0); |
||||
} |
||||
|
||||
|
||||
static void |
||||
help(const char *progname) |
||||
{ |
||||
printf(_("%s removes a procedural language from a database.\n\n"), progname); |
||||
printf(_("Usage:\n")); |
||||
printf(_(" %s [OPTION]... LANGNAME [DBNAME]\n"), progname); |
||||
printf(_("\nOptions:\n")); |
||||
printf(_(" -d, --dbname=DBNAME database from which to remove the language\n")); |
||||
printf(_(" -e, --echo show the commands being sent to the server\n")); |
||||
printf(_(" -l, --list show a list of currently installed languages\n")); |
||||
printf(_(" -V, --version output version information, then exit\n")); |
||||
printf(_(" -?, --help show this help, then exit\n")); |
||||
printf(_("\nConnection options:\n")); |
||||
printf(_(" -h, --host=HOSTNAME database server host or socket directory\n")); |
||||
printf(_(" -p, --port=PORT database server port\n")); |
||||
printf(_(" -U, --username=USERNAME user name to connect as\n")); |
||||
printf(_(" -w, --no-password never prompt for password\n")); |
||||
printf(_(" -W, --password force password prompt\n")); |
||||
printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); |
||||
} |
||||
@ -1,25 +0,0 @@ |
||||
use strict; |
||||
use warnings; |
||||
|
||||
use PostgresNode; |
||||
use TestLib; |
||||
use Test::More tests => 14; |
||||
|
||||
program_help_ok('createlang'); |
||||
program_version_ok('createlang'); |
||||
program_options_handling_ok('createlang'); |
||||
|
||||
my $node = get_new_node('main'); |
||||
$node->init; |
||||
$node->start; |
||||
|
||||
$node->command_fails([ 'createlang', 'plpgsql' ], |
||||
'fails if language already exists'); |
||||
|
||||
$node->safe_psql('postgres', 'DROP EXTENSION plpgsql'); |
||||
$node->issues_sql_like( |
||||
[ 'createlang', 'plpgsql' ], |
||||
qr/statement: CREATE EXTENSION "plpgsql"/, |
||||
'SQL CREATE EXTENSION run'); |
||||
|
||||
$node->command_like([ 'createlang', '--list' ], qr/plpgsql/, 'list output'); |
||||
@ -1,23 +0,0 @@ |
||||
use strict; |
||||
use warnings; |
||||
|
||||
use PostgresNode; |
||||
use TestLib; |
||||
use Test::More tests => 11; |
||||
|
||||
program_help_ok('droplang'); |
||||
program_version_ok('droplang'); |
||||
program_options_handling_ok('droplang'); |
||||
|
||||
my $node = get_new_node('main'); |
||||
$node->init; |
||||
$node->start; |
||||
|
||||
$node->issues_sql_like( |
||||
[ 'droplang', 'plpgsql', 'postgres' ], |
||||
qr/statement: DROP EXTENSION "plpgsql"/, |
||||
'SQL DROP EXTENSION run'); |
||||
|
||||
$node->command_fails( |
||||
[ 'droplang', 'nonexistent', 'postgres' ], |
||||
'fails with nonexistent language'); |
||||
Loading…
Reference in new issue