Обсуждение: First attempt: support for "\dg" in psql
G'day folks,
Attached is my first attempt at providing "\du"-like functionality for
groups (i.e. a basic "\dg"). It's really just a copy of describeUsers().
It has one major limitation - members are listed by numeric id as I can't
think of a "cheap" way of turning the list into the corresponding list of
usernames.
I thought about having describeGroups() do a lookup on pg_user, but that
could become quite expensive if there is a large number of groups and/or
users (have I missed an obvious facility for caching this information?).
Also, the TODO mentions that the intention is to have \du list groups - I
assume that means output along the lines of the following is wanted?
List of database users
User name | User ID | Attributes | Groups
-----------+---------+----------------------------+---------------
test | 100 | superuser, create database | testg1, testg2
Getting the group names for \du or the usernames for \dg are both
relatively easy with the appropriate JOIN, but the result is always a set
of rows. How to turn that into a single array? What would be handy is a
a library function returning an array, which takes an array, a table and two
two columns from that table:
F(A,T,C1,C2) returning an array of T.C2 values, one for each
value of T.C1 found in A.
With regard to criticism, please be gentle - this is only my second
contribution (the first being a very minor update to to_char). ;-)
Ciao.
--
-------------------------------------------------------+---------------------
Daniel Baldoni BAppSc, PGradDipCompSci | Technical Director
require 'std/disclaimer.pl' | LcdS Pty. Ltd.
-------------------------------------------------------+ 856B Canning Hwy
Phone/FAX: +61-8-9364-8171 | Applecross
Mobile: 041-888-9794 | WA 6153
URL: http://www.lcds.com.au/ | Australia
-------------------------------------------------------+---------------------
"Any time there's something so ridiculous that no rational systems programmer
would even consider trying it, they send for me."; paraphrased from "King Of
The Murgos" by David Eddings. (I'm not good, just crazy)diff -r -c -w -i -B postgresql-7.4.3/src/bin/psql/command.c
postgresql-7.4.3-01/src/bin/psql/command.c
*** postgresql-7.4.3/src/bin/psql/command.c 2003-10-12 02:04:26.000000000 +0800
--- postgresql-7.4.3-01/src/bin/psql/command.c 2004-06-30 19:17:29.000000000 +0800
***************
*** 363,368 ****
--- 363,371 ----
case 'f':
success = describeFunctions(pattern, show_verbose);
break;
+ case 'g':
+ success = describeGroups(pattern);
+ break;
case 'l':
success = do_lo_list();
break;
diff -r -c -w -i -B postgresql-7.4.3/src/bin/psql/describe.c postgresql-7.4.3-01/src/bin/psql/describe.c
*** postgresql-7.4.3/src/bin/psql/describe.c 2004-01-12 03:25:44.000000000 +0800
--- postgresql-7.4.3-01/src/bin/psql/describe.c 2004-06-30 23:33:50.000000000 +0800
***************
*** 1252,1257 ****
--- 1252,1300 ----
/*
+ * \dg
+ *
+ * Describes groups. Any schema portion of the pattern is ignored.
+ */
+ bool
+ describeGroups(const char *pattern)
+ {
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT g.groname AS \"%s\",\n"
+ " g.grosysid AS \"%s\",\n"
+ " CASE WHEN g.grolist IS NULL"
+ " THEN CAST('none' AS pg_catalog.text)\n"
+ " ELSE CAST(array_to_string(g.grolist, ',') AS pg_catalog.text)\n"
+ " END AS \"%s\"\n"
+ "FROM pg_catalog.pg_group g\n",
+ _("Group name"), _("Group ID"), _("Members"));
+
+ processNamePattern(&buf, pattern, false, false,
+ NULL, "g.groname", 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 database groups");
+
+ printQuery(res, &myopt, pset.queryFout);
+
+ PQclear(res);
+ return true;
+ }
+
+ /*
* \du
*
* Describes users. Any schema portion of the pattern is ignored.
diff -r -c -w -i -B postgresql-7.4.3/src/bin/psql/describe.h postgresql-7.4.3-01/src/bin/psql/describe.h
*** postgresql-7.4.3/src/bin/psql/describe.h 2003-08-05 07:59:40.000000000 +0800
--- postgresql-7.4.3-01/src/bin/psql/describe.h 2004-06-30 23:33:43.000000000 +0800
***************
*** 16,21 ****
--- 16,24 ----
/* \df */
bool describeFunctions(const char *pattern, bool verbose);
+ /* \dg */
+ bool describeGroups(const char *pattern);
+
/* \dT */
bool describeTypes(const char *pattern, bool verbose);
diff -r -c -w -i -B postgresql-7.4.3/src/bin/psql/help.c postgresql-7.4.3-01/src/bin/psql/help.c
*** postgresql-7.4.3/src/bin/psql/help.c 2003-10-02 14:39:31.000000000 +0800
--- postgresql-7.4.3-01/src/bin/psql/help.c 2004-06-30 19:16:52.000000000 +0800
***************
*** 216,221 ****
--- 216,222 ----
fprintf(output, _(" \\dd [PATTERN] show comment for object\n"));
fprintf(output, _(" \\dD [PATTERN] list domains\n"));
fprintf(output, _(" \\df [PATTERN] list functions (add \"+\" for more detail)\n"));
+ fprintf(output, _(" \\dg [PATTERN] list groups\n"));
fprintf(output, _(" \\dn [PATTERN] list schemas\n"));
fprintf(output, _(" \\do [NAME] list operators\n"));
fprintf(output, _(" \\dl list large objects, same as \\lo_list\n"));
diff -r -c -w -i -B postgresql-7.4.3/src/bin/psql/tab-complete.c postgresql-7.4.3-01/src/bin/psql/tab-complete.c
*** postgresql-7.4.3/src/bin/psql/tab-complete.c 2003-11-09 04:54:37.000000000 +0800
--- postgresql-7.4.3-01/src/bin/psql/tab-complete.c 2004-06-30 19:16:29.000000000 +0800
***************
*** 359,364 ****
--- 359,369 ----
" FROM pg_catalog.pg_user "\
" WHERE substring(pg_catalog.quote_ident(usename),1,%d)='%s'"
+ #define Query_for_list_of_groups \
+ " SELECT pg_catalog.quote_ident(groname) "\
+ " FROM pg_catalog.pg_group "\
+ " WHERE substring(pg_catalog.quote_ident(groname),1,%d)='%s'"
+
/* the silly-looking length condition is just to eat up the current word */
#define Query_for_table_owning_index \
"SELECT pg_catalog.quote_ident(c1.relname) "\
***************
*** 580,586 ****
"\\a", "\\connect", "\\C", "\\cd", "\\copy", "\\copyright",
"\\d", "\\da", "\\dc", "\\dC", "\\dd", "\\dD", "\\df", "\\di",
"\\dl", "\\dn", "\\do", "\\dp", "\\ds", "\\dS", "\\dt", "\\dT",
! "\\dv", "\\du",
"\\e", "\\echo", "\\encoding",
"\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
"\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
--- 585,591 ----
"\\a", "\\connect", "\\C", "\\cd", "\\copy", "\\copyright",
"\\d", "\\da", "\\dc", "\\dC", "\\dd", "\\dD", "\\df", "\\di",
"\\dl", "\\dn", "\\do", "\\dp", "\\ds", "\\dS", "\\dt", "\\dT",
! "\\dv", "\\du", "\\dg",
"\\e", "\\echo", "\\encoding",
"\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
"\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
***************
*** 1275,1280 ****
--- 1280,1287 ----
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
else if (strcmp(prev_wd, "\\du") == 0)
COMPLETE_WITH_QUERY(Query_for_list_of_users);
+ else if (strcmp(prev_wd, "\\dg") == 0)
+ COMPLETE_WITH_QUERY(Query_for_list_of_groups);
else if (strcmp(prev_wd, "\\dv") == 0 || strcmp(prev_wd, "\\dv+") == 0)
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL);
else if (strcmp(prev_wd, "\\encoding") == 0)
This is already in: http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/bin/psql/describe.c.diff?r1=text&tr1=1.89&r2=text&tr2=1.90&f=h The - in front of that item on the todo list[1] means that it's already done. This information probably needs to appear more prominently on the todo page. [1] http://developer.postgresql.org/todo.php Thanks. -- Markus Bertheau <twanger@bluetwanger.de>
I have moved the mention of the dash higher in the TODO file. --------------------------------------------------------------------------- Markus Bertheau wrote: > This is already in: > > http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/bin/psql/describe.c.diff?r1=text&tr1=1.89&r2=text&tr2=1.90&f=h > > The - in front of that item on the todo list[1] means that it's already > done. This information probably needs to appear more prominently on the > todo page. > > [1] http://developer.postgresql.org/todo.php > > Thanks. > > -- > Markus Bertheau <twanger@bluetwanger.de> > > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) > > > !DSPAM:40e56844212136178011369! > > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian said: > > I have moved the mention of the dash higher in the TODO file. Maybe you could put the dash in a different color (red?) so it stands out more. Or maybe the whole item could go in a different color if done. cheers andrew
В Втр, 06.07.2004, в 19:09, Andrew Dunstan пишет:
Yes, what about stroke through:
done TODO item
Bruce Momjian said: > > I have moved the mention of the dash higher in the TODO file. Maybe you could put the dash in a different color (red?) so it stands out more. Or maybe the whole item could go in a different color if done.
Yes, what about stroke through:
|
-- Markus Bertheau <twanger@bluetwanger.de> |
>>> I have moved the mention of the dash higher in the TODO file. >> >> >>Maybe you could put the dash in a different color (red?) so it stands out >>more. Or maybe the whole item could go in a different color if done./ >> > > Yes, what about stroke through: Because neither works in the plain text version. Chris
Christopher Kings-Lynne wrote:
> >>> I have moved the mention of the dash higher in the TODO file.
> >>
> >>
> >>Maybe you could put the dash in a different color (red?) so it stands out
> >>more. Or maybe the whole item could go in a different color if done./
> >>
> >
> > Yes, what about stroke through:
>
> Because neither works in the plain text version.
OK, I updated to the newest version of txt2html and got the line to
appear in bold.
I also removed some blank lines and reordered the descriptions:
http://developer.postgresql.org/todo.php
Any other suggestions on how to improve this?
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073