Changeset: 161b8c89ea5f for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=161b8c89ea5f Modified Files: clients/mapiclient/dump.c sql/test/testdb/Tests/testdb-dump.stable.out sql/test/testdb/Tests/testdb-dump.stable.out.Windows sql/test/testdb/Tests/testdb-load.sql Branch: Jun2016 Log Message:
Dump (and test dumping) grants on functions. diffs (104 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -1450,6 +1450,24 @@ dump_database(Mapi mid, stream *toConsol "t.system = FALSE AND " "p.grantor = g.id " "ORDER BY s.name, t.name, c.name, a.name, g.name, p.grantable"; + const char *function_grants = + "SELECT s.name, f.name, a.name, " + "CASE p.privileges " + "WHEN 1 THEN 'SELECT' " + "WHEN 2 THEN 'UPDATE' " + "WHEN 4 THEN 'INSERT' " + "WHEN 8 THEN 'DELETE' " + "WHEN 16 THEN 'EXECUTE' " + "WHEN 32 THEN 'GRANT' END, " + "g.name, p.grantable " + "FROM sys.schemas s, sys.functions f, " + "sys.auths a, sys.privileges p, sys.auths g " + "WHERE s.id = f.schema_id AND " + "f.id = p.obj_id AND " + "p.auth_id = a.id AND " + "p.grantor = g.id " + "%s" /* and f.id not in systemfunctions */ + "ORDER BY s.name, f.name, a.name, g.name, p.grantable"; const char *schemas = "SELECT s.name, a.name " "FROM sys.schemas s, " @@ -1962,6 +1980,38 @@ dump_database(Mapi mid, stream *toConsol goto bailout; mapi_close_handle(hdl); + snprintf(query, sizeof(query), function_grants, + has_systemfunctions(mid) ? "AND f.id NOT IN (SELECT function_id FROM sys.systemfunctions) " : ""); + if ((hdl = mapi_query(mid, query)) == NULL || + mapi_error(mid)) + goto bailout; + + while (mapi_fetch_row(hdl) != 0) { + char *schema = mapi_fetch_field(hdl, 0); + char *fname = mapi_fetch_field(hdl, 1); + char *aname = mapi_fetch_field(hdl, 2); + char *priv = mapi_fetch_field(hdl, 3); + char *grantable = mapi_fetch_field(hdl, 5); + + if (sname != NULL && strcmp(schema, sname) != 0) + continue; + if (curschema == NULL || strcmp(schema, curschema) != 0) { + if (curschema) + free(curschema); + curschema = strdup(schema); + mnstr_printf(toConsole, "SET SCHEMA \"%s\";\n", + curschema); + } + mnstr_printf(toConsole, "GRANT %s ON \"%s\" TO \"%s\"", + priv, fname, aname); + if (strcmp(grantable, "1") == 0) + mnstr_printf(toConsole, " WITH GRANT OPTION"); + mnstr_printf(toConsole, ";\n"); + } + if (mapi_error(mid)) + goto bailout; + mapi_close_handle(hdl); + if (curschema) { if (strcmp(sname ? sname : "sys", curschema) != 0) { mnstr_printf(toConsole, "SET SCHEMA \"%s\";\n", diff --git a/sql/test/testdb/Tests/testdb-dump.stable.out b/sql/test/testdb/Tests/testdb-dump.stable.out --- a/sql/test/testdb/Tests/testdb-dump.stable.out +++ b/sql/test/testdb/Tests/testdb-dump.stable.out @@ -101306,6 +101306,9 @@ ALTER TABLE "testschema"."keytest2" ADD ALTER TABLE "testschema"."selfref" ADD CONSTRAINT "selfref_parentid_fkey" FOREIGN KEY ("parentid") REFERENCES "testschema"."selfref" ("id"); ALTER SEQUENCE "testschema"."selfref_seq" RESTART WITH 7 NO CYCLE; ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 5 MAXVALUE 10 CYCLE; +SET SCHEMA "testschema"; +GRANT EXECUTE ON "keyjoin" TO "public"; +SET SCHEMA "sys"; COMMIT; # 11:31:35 > diff --git a/sql/test/testdb/Tests/testdb-dump.stable.out.Windows b/sql/test/testdb/Tests/testdb-dump.stable.out.Windows --- a/sql/test/testdb/Tests/testdb-dump.stable.out.Windows +++ b/sql/test/testdb/Tests/testdb-dump.stable.out.Windows @@ -101306,6 +101306,9 @@ ALTER TABLE "testschema"."keytest2" ADD ALTER TABLE "testschema"."selfref" ADD CONSTRAINT "selfref_parentid_fkey" FOREIGN KEY ("parentid") REFERENCES "testschema"."selfref" ("id"); ALTER SEQUENCE "testschema"."selfref_seq" RESTART WITH 7 NO CYCLE; ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 5 MAXVALUE 10 CYCLE; +SET SCHEMA "testschema"; +GRANT EXECUTE ON "keyjoin" TO "public"; +SET SCHEMA "sys"; COMMIT; # 11:31:35 > diff --git a/sql/test/testdb/Tests/testdb-load.sql b/sql/test/testdb/Tests/testdb-load.sql --- a/sql/test/testdb/Tests/testdb-load.sql +++ b/sql/test/testdb/Tests/testdb-load.sql @@ -101192,6 +101192,7 @@ begin where keytest1.key1 = keytest2.key1 and keytest1.key2 = keytest2.key2 ); end; +grant execute on function keyjoin to public; CREATE TABLE "testschema"."selfref" ( "id" INTEGER NOT NULL DEFAULT next value for "testschema"."selfref_seq", "parentid" INTEGER, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list