Changeset: cdce135788ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cdce135788ed
Modified Files:
        clients/mapiclient/dump.c
        clients/mapiclient/mhelp.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_user.c
        sql/common/sql_backend.c
        sql/common/sql_backend.h
        sql/server/rel_schema.c
        sql/server/sql_parser.y
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
Branch: scoping2
Log Message:

Added schema path property to user to be used in searches. Updated create, 
alter user statements and database dump. Validation is the next step


diffs (truncated from 534 to 300 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -2332,7 +2332,8 @@ dump_database(Mapi mid, stream *toConsol
                "SELECT ui.name, "
                       "ui.fullname, "
                       "password_hash(ui.name), "
-                      "s.name "
+                      "s.name, "
+                          "ui.schema_path "
                "FROM sys.db_user_info ui, "
                     "sys.schemas s "
                "WHERE ui.default_schema = s.id "
@@ -2665,6 +2666,7 @@ dump_database(Mapi mid, stream *toConsol
                        const char *fullname = mapi_fetch_field(hdl, 1);
                        const char *pwhash = mapi_fetch_field(hdl, 2);
                        const char *sname = mapi_fetch_field(hdl, 3);
+                       const char *spath = mapi_fetch_field(hdl, 4);
 
                        mnstr_printf(toConsole, "CREATE USER ");
                        dquoted_print(toConsole, uname, " ");
@@ -2673,7 +2675,8 @@ dump_database(Mapi mid, stream *toConsol
                        mnstr_printf(toConsole, " NAME ");
                        squoted_print(toConsole, fullname, '\'', false);
                        mnstr_printf(toConsole, " SCHEMA ");
-                       dquoted_print(toConsole, describe ? sname : "sys", 
";\n");
+                       dquoted_print(toConsole, describe ? sname : "sys", " ");
+                       mnstr_printf(toConsole, "SCHEMA PATH %s;\n", spath);
                }
                if (mapi_error(mid))
                        goto bailout;
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -82,7 +82,8 @@ SQLhelp sqlhelp1[] = {
         "ALTER USER ident RENAME TO ident\n"
         "ALTER USER SET [ENCRYPTED | UNENCRYPTED] PASSWORD string USING OLD 
PASSWORD string\n"
         "ALTER USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string\n"
-        "ALTER USER ident [ WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string ] 
SET SCHEMA ident",
+        "ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string] SET 
SCHEMA ident\n"
+        "ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string] SET 
SCHEMA PATH ident",
         "ident",
         "See also https://www.monetdb.org/Documentation/SQLreference/Users"},
        {"ANALYZE",
@@ -229,7 +230,7 @@ SQLhelp sqlhelp1[] = {
         NULL},
        {"CREATE USER",
         "Create a new database user",
-        "CREATE USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string NAME 
string SCHEMA ident",
+        "CREATE USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string NAME 
string SCHEMA ident [SCHEMA PATH ident]",
         "ident",
         "See also https://www.monetdb.org/Documentation/SQLreference/Users"},
        {"CREATE VIEW",
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -6389,10 +6389,10 @@ static mel_func sql_init_funcs[] = {
  pattern("sqlcatalog", "revoke", SQLrevoke, false, "Catalog operation revoke", 
args(0,7, 
arg("sname",str),arg("tbl",str),arg("grantee",str),arg("privs",int),arg("cname",str),arg("grant",int),arg("grantor",int))),
  pattern("sqlcatalog", "grant_function", SQLgrant_function, false, "Catalog 
operation grant_function", args(0,6, 
arg("sname",str),arg("fcnid",int),arg("grantee",str),arg("privs",int),arg("grant",int),arg("grantor",int))),
  pattern("sqlcatalog", "revoke_function", SQLrevoke_function, false, "Catalog 
operation revoke_function", args(0,6, 
arg("sname",str),arg("fcnid",int),arg("grantee",str),arg("privs",int),arg("grant",int),arg("grantor",int))),
- pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog 
operation create_user", args(0,5, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("fullname",str))),
+ pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog 
operation create_user", args(0,6, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("fullname",str))),
  pattern("sqlcatalog", "drop_user", SQLdrop_user, false, "Catalog operation 
drop_user", args(0,2, arg("sname",str),arg("action",int))),
  pattern("sqlcatalog", "drop_user", SQLdrop_user, false, "Catalog operation 
drop_user", args(0,3, arg("sname",str),arg("auth",str),arg("action",int))),
- pattern("sqlcatalog", "alter_user", SQLalter_user, false, "Catalog operation 
alter_user", args(0,5, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("oldpasswrd",str))),
+ pattern("sqlcatalog", "alter_user", SQLalter_user, false, "Catalog operation 
alter_user", args(0,6, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("oldpasswrd",str))),
  pattern("sqlcatalog", "rename_user", SQLrename_user, false, "Catalog 
operation rename_user", args(0,3, 
arg("sname",str),arg("newnme",str),arg("action",int))),
  pattern("sqlcatalog", "create_role", SQLcreate_role, false, "Catalog 
operation create_role", args(0,3, 
arg("sname",str),arg("role",str),arg("grator",int))),
  pattern("sqlcatalog", "drop_role", SQLdrop_role, false, "Catalog operation 
drop_role", args(0,3, arg("auth",str),arg("role",str),arg("action",int))),
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -1352,10 +1352,11 @@ SQLcreate_user(Client cntxt, MalBlkPtr m
        char *passwd = *getArgReference_str(stk, pci, 2);
        int enc = *getArgReference_int(stk, pci, 3);
        char *schema = SaveArgReference(stk, pci, 4);
-       char *fullname = SaveArgReference(stk, pci, 5);
+       char *schema_path = SaveArgReference(stk, pci, 5);
+       char *fullname = SaveArgReference(stk, pci, 6);
 
        initcontext();
-       msg = sql_create_user(sql, sname, passwd, enc, fullname, schema);
+       msg = sql_create_user(sql, sname, passwd, enc, fullname, schema, 
schema_path);
        return msg;
 }
 
@@ -1378,10 +1379,11 @@ SQLalter_user(Client cntxt, MalBlkPtr mb
        char *passwd = SaveArgReference(stk, pci, 2);
        int enc = *getArgReference_int(stk, pci, 3);
        char *schema = SaveArgReference(stk, pci, 4);
-       char *oldpasswd = SaveArgReference(stk, pci, 5);
+       char *schema_path = SaveArgReference(stk, pci, 5);
+       char *oldpasswd = SaveArgReference(stk, pci, 6);
 
        initcontext();
-       msg = sql_alter_user(sql, sname, passwd, enc, schema, oldpasswd);
+       msg = sql_alter_user(sql, sname, passwd, enc, schema, schema_path, 
oldpasswd);
 
        return msg;
 }
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -82,8 +82,10 @@ monet5_drop_user(ptr _mvc, str user)
        return TRUE;
 }
 
+#define default_schema_path "\"sys\"" /* "sys" will be the default schema path 
*/
+
 static str
-monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname, 
sqlid schema_id, sqlid grantorid)
+monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname, 
sqlid schema_id, str schema_path, sqlid grantorid)
 {
        mvc *m = (mvc *) _mvc;
        oid uid = 0;
@@ -95,6 +97,11 @@ monet5_create_user(ptr _mvc, str user, s
        sql_table *db_user_info, *auths;
        Client c = MCgetClient(m->clientid);
 
+       if (schema_path && strNil(schema_path))
+               throw(MAL, "sql.create_user", SQLSTATE(42000) "Schema path 
cannot be NULL");
+       if (!schema_path)
+               schema_path = default_schema_path;
+
        if (!enc) {
                pwd = mcrypt_BackendSum(passwd, strlen(passwd));
                if (pwd == NULL) {
@@ -114,7 +121,7 @@ monet5_create_user(ptr _mvc, str user, s
        user_id = store_next_oid();
        db_user_info = find_sql_table(s, "db_user_info");
        auths = find_sql_table(s, "auths");
-       table_funcs.table_insert(m->session->tr, db_user_info, user, fullname, 
&schema_id);
+       table_funcs.table_insert(m->session->tr, db_user_info, user, fullname, 
&schema_id, schema_path);
        table_funcs.table_insert(m->session->tr, auths, &user_id, user, 
&grantorid);
        return NULL;
 }
@@ -204,7 +211,6 @@ monet5_create_privileges(ptr _mvc, sql_s
        sql_table *t, *uinfo;
        mvc *m = (mvc *) _mvc;
        sqlid schema_id = 0;
-       str monetdbuser = "monetdb";
        list *res, *ops;
 
        /* create the authorisation related tables */
@@ -212,6 +218,7 @@ monet5_create_privileges(ptr _mvc, sql_s
        mvc_create_column_(m, t, "name", "varchar", 1024);
        mvc_create_column_(m, t, "fullname", "varchar", 2048);
        mvc_create_column_(m, t, "default_schema", "int", 9);
+       mvc_create_column_(m, t, "schema_path", "varchar", 2048);
        uinfo = t;
 
        res = sa_list(m->sa);
@@ -225,9 +232,9 @@ monet5_create_privileges(ptr _mvc, sql_s
 
        t = mvc_init_create_view(m, s, "users",
                            "SELECT u.\"name\" AS \"name\", "
-                           "ui.\"fullname\", ui.\"default_schema\" "
-                           "FROM db_users() AS u LEFT JOIN "
-                           "\"sys\".\"db_user_info\" AS ui "
+                           "ui.\"fullname\", ui.\"default_schema\", "
+                               "ui.\"schema_path\" FROM db_users() AS u "
+                               "LEFT JOIN \"sys\".\"db_user_info\" AS ui "
                            "ON u.\"name\" = ui.\"name\";");
        if (!t) {
                TRC_CRITICAL(SQL_TRANS, "Failed to create 'users' view\n");
@@ -237,11 +244,12 @@ monet5_create_privileges(ptr _mvc, sql_s
        mvc_create_column_(m, t, "name", "varchar", 1024);
        mvc_create_column_(m, t, "fullname", "varchar", 2024);
        mvc_create_column_(m, t, "default_schema", "int", 9);
+       mvc_create_column_(m, t, "schema_path", "varchar", 2048);
 
        schema_id = sql_find_schema(m, "sys");
        assert(schema_id >= 0);
 
-       table_funcs.table_insert(m->session->tr, uinfo, monetdbuser, "MonetDB 
Admin", &schema_id);
+       table_funcs.table_insert(m->session->tr, uinfo, "monetdb", "MonetDB 
Admin", &schema_id, default_schema_path);
 }
 
 static int
@@ -261,7 +269,7 @@ monet5_schema_has_user(ptr _mvc, sql_sch
 }
 
 static int
-monet5_alter_user(ptr _mvc, str user, str passwd, char enc, sqlid schema_id, 
str oldpasswd)
+monet5_alter_user(ptr _mvc, str user, str passwd, char enc, sqlid schema_id, 
str schema_path, str oldpasswd)
 {
        mvc *m = (mvc *) _mvc;
        Client c = MCgetClient(m->clientid);
@@ -338,18 +346,33 @@ monet5_alter_user(ptr _mvc, str user, st
        }
 
        if (schema_id) {
-               oid rid;
                sql_schema *sys = find_sql_schema(m->session->tr, "sys");
                sql_table *info = find_sql_table(sys, "db_user_info");
                sql_column *users_name = find_sql_column(info, "name");
                sql_column *users_schema = find_sql_column(info, 
"default_schema");
 
                /* FIXME: we don't really check against the backend here */
-               rid = table_funcs.column_find_row(m->session->tr, users_name, 
user, NULL);
+               oid rid = table_funcs.column_find_row(m->session->tr, 
users_name, user, NULL);
                if (is_oid_nil(rid))
                        return FALSE;
+               table_funcs.column_update_value(m->session->tr, users_schema, 
rid, &schema_id);
+       }
 
-               table_funcs.column_update_value(m->session->tr, users_schema, 
rid, &schema_id);
+       if (schema_path) {
+               sql_schema *sys = find_sql_schema(m->session->tr, "sys");
+               sql_table *info = find_sql_table(sys, "db_user_info");
+               sql_column *users_name = find_sql_column(info, "name");
+               sql_column *sp = find_sql_column(info, "schema_path");
+
+               if (strNil(schema_path)) {
+                       (void) sql_error(m, 02, SQLSTATE(42000) "ALTER USER: 
schema path cannot be NULL");
+                       return (FALSE);
+               }
+
+               oid rid = table_funcs.column_find_row(m->session->tr, 
users_name, user, NULL);
+               if (is_oid_nil(rid))
+                       return FALSE;
+               table_funcs.column_update_value(m->session->tr, sp, rid, 
schema_path);
        }
 
        return TRUE;
diff --git a/sql/common/sql_backend.c b/sql/common/sql_backend.c
--- a/sql/common/sql_backend.c
+++ b/sql/common/sql_backend.c
@@ -35,10 +35,10 @@ backend_freecode(int clientid, char *nam
 }
 
 char *
-backend_create_user(ptr mvc, char *user, char *passwd, char enc, char 
*fullname, sqlid defschemid, sqlid grantor)
+backend_create_user(ptr mvc, char *user, char *passwd, char enc, char 
*fullname, sqlid defschemid, char *schema_path, sqlid grantor)
 {
        if (be_funcs.fcuser != NULL)
-               return(be_funcs.fcuser(mvc, user, passwd, enc, fullname, 
defschemid, grantor));
+               return(be_funcs.fcuser(mvc, user, passwd, enc, fullname, 
defschemid, schema_path, grantor));
        return(NULL);
 }
 
@@ -75,10 +75,10 @@ backend_schema_has_user(ptr mvc, sql_sch
 
 int
 backend_alter_user(ptr mvc, str user, str passwd, char enc,
-               sqlid schema_id, str oldpasswd)
+                                  sqlid schema_id, char *schema_path, str 
oldpasswd)
 {
        if (be_funcs.fauser != NULL)
-               return(be_funcs.fauser(mvc, user, passwd, enc, schema_id, 
oldpasswd));
+               return(be_funcs.fauser(mvc, user, passwd, enc, schema_id, 
schema_path, oldpasswd));
        return(FALSE);
 }
 
diff --git a/sql/common/sql_backend.h b/sql/common/sql_backend.h
--- a/sql/common/sql_backend.h
+++ b/sql/common/sql_backend.h
@@ -15,12 +15,12 @@
 
 typedef void (*freecode_fptr) (int clientid, char *name);
 
-typedef char *(*create_user_fptr) (ptr mvc, char *user, char *passwd, char 
enc, char *fullname, sqlid schema_id, sqlid grantor_id);
+typedef char *(*create_user_fptr) (ptr mvc, char *user, char *passwd, char 
enc, char *fullname, sqlid schema_id, char *schema_path, sqlid grantor_id);
 typedef int  (*drop_user_fptr) (ptr mvc, char *user);
 typedef int  (*find_user_fptr) (ptr mvc, char *user);
 typedef void (*create_privileges_fptr) (ptr mvc, sql_schema *s);
 typedef int  (*schema_has_user_fptr) (ptr mvc, sql_schema *s);
-typedef int  (*alter_user_fptr) (ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, str oldpasswd);
+typedef int  (*alter_user_fptr) (ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, char *schema_path, str oldpasswd);
 typedef int  (*rename_user_fptr) (ptr mvc, str olduser, str newuser);
 typedef void*  (*schema_user_dependencies) (ptr mvc, int schema_id);
 typedef void  (*create_function) (ptr mvc, str name, sql_rel *rel, sql_table 
*t);
@@ -42,12 +42,12 @@ typedef struct _backend_functions {
 
 extern void backend_freecode(int clientid, char *name);
 
-extern char *backend_create_user(ptr mvc, char *user, char *passwd, char enc, 
char *fullname, sqlid defschemid, sqlid grantor);
+extern char *backend_create_user(ptr mvc, char *user, char *passwd, char enc, 
char *fullname, sqlid defschemid, char *schema_path, sqlid grantor);
 extern int  backend_drop_user(ptr mvc, char *user);
 extern int  backend_find_user(ptr mp, char *user);
 extern void backend_create_privileges(ptr mvc, sql_schema *s);
 extern int  backend_schema_has_user(ptr mvc, sql_schema *s);
-extern int     backend_alter_user(ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, str oldpasswd);
+extern int     backend_alter_user(ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, char *schema_path, str oldpasswd);
 extern int     backend_rename_user(ptr mvc, str olduser, str newuser);
 extern void*   backend_schema_user_dependencies(ptr trans, sqlid schema_id);
 extern int     backend_resolve_function(ptr trans, sql_func *f);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1848,7 +1848,7 @@ rel_create_index(mvc *sql, char *iname, 
 }
 
 static sql_rel *
-rel_create_user(sql_allocator *sa, char *user, char *passwd, int enc, char 
*fullname, char *schema)
+rel_create_user(sql_allocator *sa, char *user, char *passwd, int enc, char 
*fullname, char *schema, char *schema_path)
 {
        sql_rel *rel = rel_create(sa);
        list *exps = new_exp_list(sa);
@@ -1859,6 +1859,7 @@ rel_create_user(sql_allocator *sa, char 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to