Hi,, My job, I maintainer some postgres server for clients. We have many PL/(Java, Perl, Ruby, Python, R) and to more easy administration, I worked new little psql attribute to list languages com shorcurt/function \dL.
postg...@darkside:/media/disk/devel/pg$ bin/psql -U postgres test psql (8.4devel) Type "help" for help. test=# \dL List of languages Name | Owner | Procedural Language | Trusted | Call Handler | Validator ----------+----------+---------------------+------------+---------------------+------------------------- c | postgres | No | Unstrusted | | fmgr_c_validator internal | postgres | No | Unstrusted | | fmgr_internal_validator plperl | postgres | Yes | Trusted | plperl_call_handler | plperl_validator sql | postgres | No | Trusted | | fmgr_sql_validator (4 rows) test=# I know that this moment is inappropriate to submit patch, with the discussions about features for 8.4. But, if can added for commitfest to 8.5 version. I'm appreciate. Regards, -- Fernando Ike http://www.midstorm.org/~fike/weblog
*** a/src/bin/psql/command.c --- b/src/bin/psql/command.c *************** *** 375,380 **** exec_command(const char *cmd, --- 375,383 ---- case 'l': success = do_lo_list(); break; + case 'L': + success = listLanguages(pattern, show_verbose); + break; case 'n': success = listSchemas(pattern, show_verbose); break; *** a/src/bin/psql/describe.c --- b/src/bin/psql/describe.c *************** *** 2018,2023 **** listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys --- 2018,2081 ---- return true; } + /* + * \dL + * + * Describes Languages. + */ + bool + listLanguages(const char *pattern, bool verbose) + { + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + + printfPQExpBuffer(&buf, + "SELECT l.lanname as \"%s\",\n" + " pg_catalog.pg_get_userbyid(l.lanowner) as \"%s\",\n" + " CASE WHEN l.lanispl = 't' THEN 'Trusted' WHEN l.lanispl = 'f' THEN 'Untrusted' END AS \"%s\",\n" + " CASE WHEN l.lanpltrusted='t' THEN 'Trusted' WHEN lanpltrusted='f' THEN 'Unstrusted' END AS \"%s\",\n" + " CASE WHEN p.oid = 0 THEN NULL ELSE p.proname END AS \"%s\",\n" + " CASE WHEN q.oid = 0 THEN NULL ELSE q.proname END AS \"%s\"\n", + gettext_noop("Name"), + gettext_noop("Owner"), + gettext_noop("Procedural Language"), + gettext_noop("Trusted"), + gettext_noop("Call Handler"), + gettext_noop("Validator")); + + if (verbose) + { + appendPQExpBuffer(&buf, ",\n"); + printACLColumn(&buf, "l.lanacl"); + } + + appendPQExpBuffer(&buf, " FROM pg_catalog.pg_language l\n"); + appendPQExpBuffer(&buf, " LEFT JOIN pg_catalog.pg_proc p on l.lanplcallfoid = p.oid\n"); + appendPQExpBuffer(&buf, " LEFT JOIN pg_catalog.pg_proc q on l.lanvalidator = q.oid\n"); + + processSQLNamePattern(pset.db, &buf, pattern, false, false, + NULL, "l.lanname", NULL, NULL); + + appendPQExpBuffer(&buf, "ORDER BY 1;"); + + res = PSQLexec(buf.data, false); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.nullPrint = NULL; + myopt.title = _("List of languages"); + myopt.translate_header = true; + + printQuery(res, &myopt, pset.queryFout, pset.logfile); + + PQclear(res); + return true; + + } /* * \dD *** a/src/bin/psql/describe.h --- b/src/bin/psql/describe.h *************** *** 75,79 **** extern bool listForeignServers(const char *pattern, bool verbose); --- 75,81 ---- /* \deu */ extern bool listUserMappings(const char *pattern, bool verbose); + /* \dL */ + extern bool listLanguages(const char *pattern, bool verbose); #endif /* DESCRIBE_H */ *** a/src/bin/psql/help.c --- b/src/bin/psql/help.c *************** *** 215,220 **** slashUsage(unsigned short int pager) --- 215,221 ---- fprintf(output, _(" \\dg [PATTERN] list roles (groups)\n")); fprintf(output, _(" \\di[S+] [PATTERN] list indexes\n")); fprintf(output, _(" \\dl list large objects, same as \\lo_list\n")); + fprintf(output, _(" \\dL list (procedural) languages\n")); fprintf(output, _(" \\dn[+] [PATTERN] list schemas\n")); fprintf(output, _(" \\do[S] [PATTERN] list operators\n")); fprintf(output, _(" \\dp [PATTERN] list table, view, and sequence access privileges\n"));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers