aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/describe.c287
-rw-r--r--src/bin/psql/large_obj.c8
-rw-r--r--src/bin/psql/print.c45
-rw-r--r--src/bin/psql/print.h5
-rw-r--r--src/bin/psql/startup.c3
-rw-r--r--src/bin/scripts/createlang.c9
-rw-r--r--src/bin/scripts/droplang.c9
7 files changed, 241 insertions, 125 deletions
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 1259a364111..cf36dadae3f 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2007, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.162 2007/11/15 21:14:42 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.163 2007/12/12 21:41:47 tgl Exp $
*/
#include "postgres_fe.h"
#include "describe.h"
@@ -85,8 +85,11 @@ describeAggregates(const char *pattern, bool verbose)
"FROM pg_catalog.pg_proc p\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
"WHERE p.proisagg\n",
- _("Schema"), _("Name"), _("Result data type"),
- _("Argument data types"), _("Description"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"),
+ gettext_noop("Description"));
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "p.proname", NULL,
@@ -101,6 +104,7 @@ describeAggregates(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of aggregate functions");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -131,13 +135,16 @@ describeTablespaces(const char *pattern, bool verbose)
"SELECT spcname AS \"%s\",\n"
" pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n"
" spclocation AS \"%s\"",
- _("Name"), _("Owner"), _("Location"));
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Location"));
if (verbose)
appendPQExpBuffer(&buf,
- ",\n spcacl as \"%s\""
+ ",\n spcacl AS \"%s\""
",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"",
- _("Access privileges"), _("Description"));
+ gettext_noop("Access privileges"),
+ gettext_noop("Description"));
appendPQExpBuffer(&buf,
"\nFROM pg_catalog.pg_tablespace\n");
@@ -155,6 +162,7 @@ describeTablespaces(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of tablespaces");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -208,8 +216,10 @@ describeFunctions(const char *pattern, bool verbose)
" pg_catalog.generate_series(0, pg_catalog.array_upper(p.proargtypes, 1)) AS s(i)\n"
" ), ', ')\n"
" END AS \"%s\"",
- _("Schema"), _("Name"), _("Result data type"),
- _("Argument data types"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"));
if (verbose)
appendPQExpBuffer(&buf,
@@ -222,8 +232,11 @@ describeFunctions(const char *pattern, bool verbose)
" l.lanname as \"%s\",\n"
" p.prosrc as \"%s\",\n"
" pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"",
- _("Volatility"), _("Owner"), _("Language"),
- _("Source code"), _("Description"));
+ gettext_noop("Volatility"),
+ gettext_noop("Owner"),
+ gettext_noop("Language"),
+ gettext_noop("Source code"),
+ gettext_noop("Description"));
if (!verbose)
appendPQExpBuffer(&buf,
@@ -258,6 +271,7 @@ describeFunctions(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of functions");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -283,7 +297,8 @@ describeTypes(const char *pattern, bool verbose)
printfPQExpBuffer(&buf,
"SELECT n.nspname as \"%s\",\n"
" pg_catalog.format_type(t.oid, NULL) AS \"%s\",\n",
- _("Schema"), _("Name"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
if (verbose)
appendPQExpBuffer(&buf,
" t.typname AS \"%s\",\n"
@@ -293,10 +308,11 @@ describeTypes(const char *pattern, bool verbose)
" THEN CAST('var' AS pg_catalog.text)\n"
" ELSE CAST(t.typlen AS pg_catalog.text)\n"
" END AS \"%s\",\n",
- _("Internal name"), _("Size"));
+ gettext_noop("Internal name"),
+ gettext_noop("Size"));
appendPQExpBuffer(&buf,
" pg_catalog.obj_description(t.oid, 'pg_type') as \"%s\"\n",
- _("Description"));
+ gettext_noop("Description"));
appendPQExpBuffer(&buf, "FROM pg_catalog.pg_type t\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n");
@@ -325,6 +341,7 @@ describeTypes(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of data types");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -354,9 +371,12 @@ describeOperators(const char *pattern)
" pg_catalog.obj_description(o.oprcode, 'pg_proc')) AS \"%s\"\n"
"FROM pg_catalog.pg_operator o\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
- _("Schema"), _("Name"),
- _("Left arg type"), _("Right arg type"),
- _("Result type"), _("Description"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Left arg type"),
+ gettext_noop("Right arg type"),
+ gettext_noop("Result type"),
+ gettext_noop("Description"));
processSQLNamePattern(pset.db, &buf, pattern, false, true,
"n.nspname", "o.oprname", NULL,
@@ -371,6 +391,7 @@ describeOperators(const char *pattern)
myopt.nullPrint = NULL;
myopt.title = _("List of operators");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -395,19 +416,19 @@ listAllDbs(bool verbose)
printfPQExpBuffer(&buf,
"SELECT d.datname as \"%s\",\n"
- " r.rolname as \"%s\"",
- _("Name"), _("Owner"));
- appendPQExpBuffer(&buf,
- ",\n pg_catalog.pg_encoding_to_char(d.encoding) as \"%s\"",
- _("Encoding"));
+ " r.rolname as \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(d.encoding) as \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Encoding"));
if (verbose)
{
appendPQExpBuffer(&buf,
",\n t.spcname as \"%s\"",
- _("Tablespace"));
+ gettext_noop("Tablespace"));
appendPQExpBuffer(&buf,
",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"",
- _("Description"));
+ gettext_noop("Description"));
}
appendPQExpBuffer(&buf,
"\nFROM pg_catalog.pg_database d"
@@ -423,6 +444,7 @@ listAllDbs(bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of databases");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -441,6 +463,7 @@ permissionsList(const char *pattern)
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {false, false, true, false};
initPQExpBuffer(&buf);
@@ -455,7 +478,11 @@ permissionsList(const char *pattern)
"FROM pg_catalog.pg_class c\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
"WHERE c.relkind IN ('r', 'v', 'S')\n",
- _("Schema"), _("Name"), _("table"), _("view"), _("sequence"), _("Type"), _("Access privileges"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("table"), gettext_noop("view"), gettext_noop("sequence"),
+ gettext_noop("Type"),
+ gettext_noop("Access privileges"));
/*
* Unless a schema pattern is specified, we suppress system and temp
@@ -477,8 +504,11 @@ permissionsList(const char *pattern)
}
myopt.nullPrint = NULL;
- printfPQExpBuffer(&buf, _("Access privileges for database \"%s\""), PQdb(pset.db));
+ printfPQExpBuffer(&buf, _("Access privileges for database \"%s\""),
+ PQdb(pset.db));
myopt.title = buf.data;
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -503,13 +533,17 @@ objectDescription(const char *pattern)
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {false, false, true, false};
initPQExpBuffer(&buf);
appendPQExpBuffer(&buf,
"SELECT DISTINCT tt.nspname AS \"%s\", tt.name AS \"%s\", tt.object AS \"%s\", d.description AS \"%s\"\n"
"FROM (\n",
- _("Schema"), _("Name"), _("Object"), _("Description"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Object"),
+ gettext_noop("Description"));
/* Aggregate descriptions */
appendPQExpBuffer(&buf,
@@ -520,7 +554,7 @@ objectDescription(const char *pattern)
" FROM pg_catalog.pg_proc p\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
" WHERE p.proisagg\n",
- _("aggregate"));
+ gettext_noop("aggregate"));
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "p.proname", NULL,
"pg_catalog.pg_function_is_visible(p.oid)");
@@ -539,7 +573,7 @@ objectDescription(const char *pattern)
" AND (p.proargtypes[0] IS NULL\n"
" OR p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)\n"
" AND NOT p.proisagg\n",
- _("function"));
+ gettext_noop("function"));
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "p.proname", NULL,
"pg_catalog.pg_function_is_visible(p.oid)");
@@ -553,7 +587,7 @@ objectDescription(const char *pattern)
" CAST('%s' AS pg_catalog.text) as object\n"
" FROM pg_catalog.pg_operator o\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
- _("operator"));
+ gettext_noop("operator"));
processSQLNamePattern(pset.db, &buf, pattern, false, false,
"n.nspname", "o.oprname", NULL,
"pg_catalog.pg_operator_is_visible(o.oid)");
@@ -567,7 +601,7 @@ objectDescription(const char *pattern)
" CAST('%s' AS pg_catalog.text) as object\n"
" FROM pg_catalog.pg_type t\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n",
- _("data type"));
+ gettext_noop("data type"));
processSQLNamePattern(pset.db, &buf, pattern, false, false,
"n.nspname", "pg_catalog.format_type(t.oid, NULL)",
NULL,
@@ -585,7 +619,10 @@ objectDescription(const char *pattern)
" FROM pg_catalog.pg_class c\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
" WHERE c.relkind IN ('r', 'v', 'i', 'S')\n",
- _("table"), _("view"), _("index"), _("sequence"));
+ gettext_noop("table"),
+ gettext_noop("view"),
+ gettext_noop("index"),
+ gettext_noop("sequence"));
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "c.relname", NULL,
"pg_catalog.pg_table_is_visible(c.oid)");
@@ -601,7 +638,7 @@ objectDescription(const char *pattern)
" JOIN pg_catalog.pg_class c ON c.oid = r.ev_class\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
" WHERE r.rulename != '_RETURN'\n",
- _("rule"));
+ gettext_noop("rule"));
/* XXX not sure what to do about visibility rule here? */
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "r.rulename", NULL,
@@ -617,7 +654,7 @@ objectDescription(const char *pattern)
" FROM pg_catalog.pg_trigger t\n"
" JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n",
- _("trigger"));
+ gettext_noop("trigger"));
/* XXX not sure what to do about visibility rule here? */
processSQLNamePattern(pset.db, &buf, pattern, false, false,
"n.nspname", "t.tgname", NULL,
@@ -636,6 +673,8 @@ objectDescription(const char *pattern)
myopt.nullPrint = NULL;
myopt.title = _("Object descriptions");
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -1572,6 +1611,7 @@ describeRoles(const char *pattern, bool verbose)
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {false, true, true, true, true, false, false};
initPQExpBuffer(&buf);
@@ -1584,16 +1624,20 @@ describeRoles(const char *pattern, bool verbose)
" ELSE CAST(r.rolconnlimit AS pg_catalog.text)\n"
" END AS \"%s\", \n"
" ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as \"%s\"",
- _("Role name"),
- _("yes"), _("no"), _("Superuser"),
- _("yes"), _("no"), _("Create role"),
- _("yes"), _("no"), _("Create DB"),
- _("no limit"), _("Connections"),
- _("Member of"));
+ gettext_noop("Role name"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Superuser"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Create role"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Create DB"),
+ gettext_noop("no limit"),
+ gettext_noop("Connections"),
+ gettext_noop("Member of"));
if (verbose)
appendPQExpBuffer(&buf, "\n, pg_catalog.shobj_description(r.oid, 'pg_authid') AS \"%s\"",
- _("Description"));
+ gettext_noop("Description"));
appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_roles r\n");
@@ -1609,6 +1653,8 @@ describeRoles(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of roles");
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -1642,6 +1688,7 @@ listTables(const char *tabtypes, const char *pattern, bool verbose)
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {false, false, true, false, false, false};
if (!(showTables || showIndexes || showViews || showSeq))
showTables = showViews = showSeq = true;
@@ -1657,19 +1704,21 @@ listTables(const char *tabtypes, const char *pattern, bool verbose)
" c.relname as \"%s\",\n"
" CASE c.relkind WHEN 'r' THEN '%s' WHEN 'v' THEN '%s' WHEN 'i' THEN '%s' WHEN 'S' THEN '%s' WHEN 's' THEN '%s' END as \"%s\",\n"
" r.rolname as \"%s\"",
- _("Schema"), _("Name"),
- _("table"), _("view"), _("index"), _("sequence"),
- _("special"), _("Type"), _("Owner"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("table"), gettext_noop("view"), gettext_noop("index"), gettext_noop("sequence"), gettext_noop("special"),
+ gettext_noop("Type"),
+ gettext_noop("Owner"));
if (showIndexes)
appendPQExpBuffer(&buf,
",\n c2.relname as \"%s\"",
- _("Table"));
+ gettext_noop("Table"));
if (verbose)
appendPQExpBuffer(&buf,
",\n pg_catalog.obj_description(c.oid, 'pg_class') as \"%s\"",
- _("Description"));
+ gettext_noop("Description"));
appendPQExpBuffer(&buf,
"\nFROM pg_catalog.pg_class c"
@@ -1729,6 +1778,8 @@ listTables(const char *tabtypes, const char *pattern, bool verbose)
{
myopt.nullPrint = NULL;
myopt.title = _("List of relations");
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
}
@@ -1766,11 +1817,11 @@ listDomains(const char *pattern)
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n"
" LEFT JOIN pg_catalog.pg_constraint r ON t.oid = r.contypid\n"
"WHERE t.typtype = 'd'\n",
- _("Schema"),
- _("Name"),
- _("Type"),
- _("Modifier"),
- _("Check"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Type"),
+ gettext_noop("Modifier"),
+ gettext_noop("Check"));
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "t.typname", NULL,
@@ -1785,6 +1836,7 @@ listDomains(const char *pattern)
myopt.nullPrint = NULL;
myopt.title = _("List of domains");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -1803,6 +1855,7 @@ listConversions(const char *pattern)
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {false, false, false, false, true};
initPQExpBuffer(&buf);
@@ -1815,13 +1868,12 @@ listConversions(const char *pattern)
" ELSE '%s' END AS \"%s\"\n"
"FROM pg_catalog.pg_conversion c, pg_catalog.pg_namespace n\n"
"WHERE n.oid = c.connamespace\n",
- _("Schema"),
- _("Name"),
- _("Source"),
- _("Destination"),
- _("yes"),
- _("no"),
- _("Default?"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Source"),
+ gettext_noop("Destination"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Default?"));
processSQLNamePattern(pset.db, &buf, pattern, true, false,
"n.nspname", "c.conname", NULL,
@@ -1836,6 +1888,8 @@ listConversions(const char *pattern)
myopt.nullPrint = NULL;
myopt.title = _("List of conversions");
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -1854,13 +1908,19 @@ listCasts(const char *pattern)
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {false, false, false, true};
initPQExpBuffer(&buf);
-/* NEED LEFT JOIN FOR BINARY CASTS */
+ /*
+ * We need left join here for binary casts. Also note that we don't
+ * attempt to localize '(binary compatible)', because there's too much
+ * risk of gettext translating a function name that happens to match
+ * some string in the PO database.
+ */
printfPQExpBuffer(&buf,
"SELECT pg_catalog.format_type(castsource, NULL) AS \"%s\",\n"
" pg_catalog.format_type(casttarget, NULL) AS \"%s\",\n"
- " CASE WHEN castfunc = 0 THEN '%s'\n"
+ " CASE WHEN castfunc = 0 THEN '(binary compatible)'\n"
" ELSE p.proname\n"
" END as \"%s\",\n"
" CASE WHEN c.castcontext = 'e' THEN '%s'\n"
@@ -1870,14 +1930,11 @@ listCasts(const char *pattern)
"FROM pg_catalog.pg_cast c LEFT JOIN pg_catalog.pg_proc p\n"
" ON c.castfunc = p.oid\n"
"ORDER BY 1, 2",
- _("Source type"),
- _("Target type"),
- _("(binary compatible)"),
- _("Function"),
- _("no"),
- _("in assignment"),
- _("yes"),
- _("Implicit?"));
+ gettext_noop("Source type"),
+ gettext_noop("Target type"),
+ gettext_noop("Function"),
+ gettext_noop("no"), gettext_noop("in assignment"), gettext_noop("yes"),
+ gettext_noop("Implicit?"));
res = PSQLexec(buf.data, false);
termPQExpBuffer(&buf);
@@ -1886,6 +1943,8 @@ listCasts(const char *pattern)
myopt.nullPrint = NULL;
myopt.title = _("List of casts");
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -1909,13 +1968,15 @@ listSchemas(const char *pattern, bool verbose)
printfPQExpBuffer(&buf,
"SELECT n.nspname AS \"%s\",\n"
" r.rolname AS \"%s\"",
- _("Name"), _("Owner"));
+ gettext_noop("Name"),
+ gettext_noop("Owner"));
if (verbose)
appendPQExpBuffer(&buf,
",\n n.nspacl as \"%s\","
" pg_catalog.obj_description(n.oid, 'pg_namespace') as \"%s\"",
- _("Access privileges"), _("Description"));
+ gettext_noop("Access privileges"),
+ gettext_noop("Description"));
appendPQExpBuffer(&buf,
"\nFROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_roles r\n"
@@ -1936,6 +1997,7 @@ listSchemas(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of schemas");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -1967,9 +2029,9 @@ listTSParsers(const char *pattern, bool verbose)
" pg_catalog.obj_description(p.oid, 'pg_ts_parser') as \"%s\"\n"
"FROM pg_catalog.pg_ts_parser p \n"
"LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.prsnamespace\n",
- _("Schema"),
- _("Name"),
- _("Description")
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description")
);
processSQLNamePattern(pset.db, &buf, pattern, false, false,
@@ -1985,6 +2047,7 @@ listTSParsers(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of text search parsers");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -2067,6 +2130,7 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
PGresult *res;
char title[1024];
printQueryOpt myopt = pset.popt;
+ static const bool trans_columns[] = {true, false, false};
initPQExpBuffer(&buf);
@@ -2100,14 +2164,19 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
" pg_catalog.obj_description(p.prslextype, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n",
- _("Start parse"),
- _("Method"), _("Function"), _("Description"),
+ gettext_noop("Start parse"),
+ gettext_noop("Method"),
+ gettext_noop("Function"),
+ gettext_noop("Description"),
oid,
- _("Get next token"), oid,
- _("End parse"), oid,
- _("Get headline"), oid,
- _("Get token types"), oid
- );
+ gettext_noop("Get next token"),
+ oid,
+ gettext_noop("End parse"),
+ oid,
+ gettext_noop("Get headline"),
+ oid,
+ gettext_noop("Get token types"),
+ oid);
res = PSQLexec(buf.data, false);
termPQExpBuffer(&buf);
@@ -2122,6 +2191,8 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
myopt.title = title;
myopt.footers = NULL;
myopt.default_footer = false;
+ myopt.trans_headers = true;
+ myopt.trans_columns = trans_columns;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -2134,8 +2205,8 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
" t.description as \"%s\" \n"
"FROM pg_catalog.ts_token_type( '%s'::pg_catalog.oid ) as t \n"
"ORDER BY 1;",
- _("Token name"),
- _("Description"),
+ gettext_noop("Token name"),
+ gettext_noop("Description"),
oid);
res = PSQLexec(buf.data, false);
@@ -2151,6 +2222,8 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
myopt.title = title;
myopt.footers = NULL;
myopt.default_footer = true;
+ myopt.trans_headers = true;
+ myopt.trans_columns = NULL;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -2176,8 +2249,8 @@ listTSDictionaries(const char *pattern, bool verbose)
"SELECT \n"
" n.nspname as \"%s\",\n"
" d.dictname as \"%s\",\n",
- _("Schema"),
- _("Name"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
if (verbose)
{
@@ -2187,13 +2260,13 @@ listTSDictionaries(const char *pattern, bool verbose)
" LEFT JOIN pg_catalog.pg_namespace nt ON nt.oid = t.tmplnamespace \n"
" WHERE d.dicttemplate = t.oid ) AS \"%s\", \n"
" d.dictinitoption as \"%s\", \n",
- _("Template"),
- _("Init options"));
+ gettext_noop("Template"),
+ gettext_noop("Init options"));
}
appendPQExpBuffer(&buf,
" pg_catalog.obj_description(d.oid, 'pg_ts_dict') as \"%s\"\n",
- _("Description"));
+ gettext_noop("Description"));
appendPQExpBuffer(&buf, "FROM pg_catalog.pg_ts_dict d\n"
"LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.dictnamespace\n");
@@ -2211,6 +2284,7 @@ listTSDictionaries(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of text search dictionaries");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -2240,20 +2314,20 @@ listTSTemplates(const char *pattern, bool verbose)
" t.tmplinit::pg_catalog.regproc AS \"%s\",\n"
" t.tmpllexize::pg_catalog.regproc AS \"%s\",\n"
" pg_catalog.obj_description(t.oid, 'pg_ts_template') AS \"%s\"\n",
- _("Schema"),
- _("Name"),
- _("Init"),
- _("Lexize"),
- _("Description"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Init"),
+ gettext_noop("Lexize"),
+ gettext_noop("Description"));
else
printfPQExpBuffer(&buf,
"SELECT \n"
" n.nspname AS \"%s\",\n"
" t.tmplname AS \"%s\",\n"
" pg_catalog.obj_description(t.oid, 'pg_ts_template') AS \"%s\"\n",
- _("Schema"),
- _("Name"),
- _("Description"));
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description"));
appendPQExpBuffer(&buf, "FROM pg_catalog.pg_ts_template t\n"
"LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.tmplnamespace\n");
@@ -2271,6 +2345,7 @@ listTSTemplates(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of text search templates");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -2302,9 +2377,9 @@ listTSConfigs(const char *pattern, bool verbose)
" pg_catalog.obj_description(c.oid, 'pg_ts_config') as \"%s\"\n"
"FROM pg_catalog.pg_ts_config c\n"
"LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.cfgnamespace \n",
- _("Schema"),
- _("Name"),
- _("Description")
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description")
);
processSQLNamePattern(pset.db, &buf, pattern, false, false,
@@ -2320,6 +2395,7 @@ listTSConfigs(const char *pattern, bool verbose)
myopt.nullPrint = NULL;
myopt.title = _("List of text search configurations");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
@@ -2428,8 +2504,8 @@ describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname,
"WHERE c.oid = '%s' AND m.mapcfg = c.oid \n"
"GROUP BY m.mapcfg, m.maptokentype, c.cfgparser \n"
"ORDER BY 1",
- _("Token"),
- _("Dictionaries"),
+ gettext_noop("Token"),
+ gettext_noop("Dictionaries"),
oid);
res = PSQLexec(buf.data, false);
@@ -2440,19 +2516,24 @@ describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname,
initPQExpBuffer(&title);
if (nspname)
- appendPQExpBuffer(&title, _("Text search configuration \"%s.%s\""), nspname, cfgname);
+ appendPQExpBuffer(&title, _("Text search configuration \"%s.%s\""),
+ nspname, cfgname);
else
- appendPQExpBuffer(&title, _("Text search configuration \"%s\""), cfgname);
+ appendPQExpBuffer(&title, _("Text search configuration \"%s\""),
+ cfgname);
if (pnspname)
- appendPQExpBuffer(&title, _("\nParser: \"%s.%s\""), pnspname, prsname);
+ appendPQExpBuffer(&title, _("\nParser: \"%s.%s\""),
+ pnspname, prsname);
else
- appendPQExpBuffer(&title, _("\nParser: \"%s\""), prsname);
+ appendPQExpBuffer(&title, _("\nParser: \"%s\""),
+ prsname);
myopt.nullPrint = NULL;
myopt.title = title.data;
myopt.footers = NULL;
myopt.default_footer = false;
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
index 87918a8850f..4ef2684eac7 100644
--- a/src/bin/psql/large_obj.c
+++ b/src/bin/psql/large_obj.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2007, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/large_obj.c,v 1.48 2007/01/20 16:57:31 neilc Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/large_obj.c,v 1.49 2007/12/12 21:41:47 tgl Exp $
*/
#include "postgres_fe.h"
#include "large_obj.h"
@@ -279,11 +279,12 @@ do_lo_list(void)
printQueryOpt myopt = pset.popt;
snprintf(buf, sizeof(buf),
- "SELECT loid as \"ID\",\n"
+ "SELECT loid as \"%s\",\n"
" pg_catalog.obj_description(loid, 'pg_largeobject') as \"%s\"\n"
"FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject) x\n"
"ORDER BY 1",
- _("Description"));
+ gettext_noop("ID"),
+ gettext_noop("Description"));
res = PSQLexec(buf, false);
if (!res)
@@ -292,6 +293,7 @@ do_lo_list(void)
myopt.topt.tuples_only = false;
myopt.nullPrint = NULL;
myopt.title = _("Large objects");
+ myopt.trans_headers = true;
printQuery(res, &myopt, pset.queryFout, pset.logfile);
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index d0e378b7bdc..c7df0072f84 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2007, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.94 2007/11/22 17:51:39 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.95 2007/12/12 21:41:47 tgl Exp $
*
* Note: we include postgres.h not postgres_fe.h so that we can include
* catalog/pg_type.h, and thereby have access to INT4OID and similar macros.
@@ -1926,38 +1926,59 @@ printTable(const char *title,
void
printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, FILE *flog)
{
+ int ntuples;
int nfields;
int ncells;
const char **headers;
const char **cells;
char **footers;
char *align;
- int i;
+ int i,
+ r,
+ c;
if (cancel_pressed)
return;
/* extract headers */
+ ntuples = PQntuples(result);
nfields = PQnfields(result);
headers = pg_local_calloc(nfields + 1, sizeof(*headers));
for (i = 0; i < nfields; i++)
+ {
headers[i] = (char *) mbvalidate((unsigned char *) PQfname(result, i),
opt->topt.encoding);
+#ifdef ENABLE_NLS
+ if (opt->trans_headers)
+ headers[i] = _(headers[i]);
+#endif
+ }
/* set cells */
- ncells = PQntuples(result) * nfields;
+ ncells = ntuples * nfields;
cells = pg_local_calloc(ncells + 1, sizeof(*cells));
- for (i = 0; i < ncells; i++)
+ i = 0;
+ for (r = 0; r < ntuples; r++)
{
- if (PQgetisnull(result, i / nfields, i % nfields))
- cells[i] = opt->nullPrint ? opt->nullPrint : "";
- else
- cells[i] = (char *)
- mbvalidate((unsigned char *) PQgetvalue(result, i / nfields, i % nfields),
- opt->topt.encoding);
+ for (c = 0; c < nfields; c++)
+ {
+ if (PQgetisnull(result, r, c))
+ cells[i] = opt->nullPrint ? opt->nullPrint : "";
+ else
+ {
+ cells[i] = (char *)
+ mbvalidate((unsigned char *) PQgetvalue(result, r, c),
+ opt->topt.encoding);
+#ifdef ENABLE_NLS
+ if (opt->trans_columns && opt->trans_columns[c])
+ cells[i] = _(cells[i]);
+#endif
+ }
+ i++;
+ }
}
/* set footers */
@@ -1970,7 +1991,7 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, FILE *f
footers = pg_local_calloc(2, sizeof(*footers));
footers[0] = pg_local_malloc(100);
- total_records = opt->topt.prior_records + PQntuples(result);
+ total_records = opt->topt.prior_records + ntuples;
if (total_records == 1)
snprintf(footers[0], 100, _("(1 row)"));
else
@@ -2013,7 +2034,7 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, FILE *f
free(headers);
free(cells);
- if (footers)
+ if (footers && !opt->footers)
{
free(footers[0]);
free(footers);
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h
index 8c1537762ac..cfe9a17a02c 100644
--- a/src/bin/psql/print.h
+++ b/src/bin/psql/print.h
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2007, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/print.h,v 1.33 2007/01/05 22:19:49 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/print.h,v 1.34 2007/12/12 21:41:47 tgl Exp $
*/
#ifndef PRINT_H
#define PRINT_H
@@ -67,7 +67,6 @@ void printTable(const char *title, const char *const * headers,
const printTableOpt *opt, FILE *fout, FILE *flog);
-
typedef struct _printQueryOpt
{
printTableOpt topt; /* the options above */
@@ -76,6 +75,8 @@ typedef struct _printQueryOpt
char *title; /* override title */
char **footers; /* override footer (default is "(xx rows)") */
bool default_footer; /* print default footer if footers==NULL */
+ bool trans_headers; /* do gettext on column headers */
+ const bool *trans_columns; /* trans_columns[i-1] => do gettext on col i */
} printQueryOpt;
/*
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 32f8dcd59ca..77281cbc714 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2007, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.144 2007/12/11 19:01:06 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.145 2007/12/12 21:41:47 tgl Exp $
*/
#include "postgres_fe.h"
@@ -140,6 +140,7 @@ main(int argc, char *argv[])
pset.cur_cmd_source = stdin;
pset.cur_cmd_interactive = false;
+ /* We rely on unmentioned fields of pset.popt to start out 0/false/NULL */
pset.popt.topt.format = PRINT_ALIGNED;
pset.popt.topt.border = 1;
pset.popt.topt.pager = 1;
diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c
index 6fe6f25e6f3..3c0838e32a3 100644
--- a/src/bin/scripts/createlang.c
+++ b/src/bin/scripts/createlang.c
@@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/bin/scripts/createlang.c,v 1.27 2007/12/11 19:57:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/scripts/createlang.c,v 1.28 2007/12/12 21:41:47 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -125,6 +125,7 @@ main(int argc, char *argv[])
if (listlangs)
{
printQueryOpt popt;
+ static const bool trans_columns[] = {false, true};
conn = connectDatabase(dbname, host, port, username, password,
progname);
@@ -132,7 +133,9 @@ main(int argc, char *argv[])
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", "
"(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" "
"FROM pg_catalog.pg_language WHERE lanispl;",
- _("Name"), _("yes"), _("no"), _("Trusted?"));
+ gettext_noop("Name"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Trusted?"));
result = executeQuery(conn, sql.data, progname, echo);
memset(&popt, 0, sizeof(popt));
@@ -142,6 +145,8 @@ main(int argc, char *argv[])
popt.topt.stop_table = true;
popt.topt.encoding = PQclientEncoding(conn);
popt.title = _("Procedural Languages");
+ popt.trans_headers = true;
+ popt.trans_columns = trans_columns;
printQuery(result, &popt, stdout, NULL);
PQfinish(conn);
diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c
index bd255585b43..982471f7c03 100644
--- a/src/bin/scripts/droplang.c
+++ b/src/bin/scripts/droplang.c
@@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/bin/scripts/droplang.c,v 1.24 2007/12/11 19:57:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/scripts/droplang.c,v 1.25 2007/12/12 21:41:47 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -136,6 +136,7 @@ main(int argc, char *argv[])
if (listlangs)
{
printQueryOpt popt;
+ static const bool trans_columns[] = {false, true};
conn = connectDatabase(dbname, host, port, username, password,
progname);
@@ -143,7 +144,9 @@ main(int argc, char *argv[])
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", "
"(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" "
"FROM pg_catalog.pg_language WHERE lanispl;",
- _("Name"), _("yes"), _("no"), _("Trusted?"));
+ gettext_noop("Name"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Trusted?"));
result = executeQuery(conn, sql.data, progname, echo);
memset(&popt, 0, sizeof(popt));
@@ -153,6 +156,8 @@ main(int argc, char *argv[])
popt.topt.stop_table = true;
popt.topt.encoding = PQclientEncoding(conn);
popt.title = _("Procedural Languages");
+ popt.trans_headers = true;
+ popt.trans_columns = trans_columns;
printQuery(result, &popt, stdout, NULL);
PQfinish(conn);