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

Reply via email to