Changeset: a616f5db46cf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a616f5db46cf
Modified Files:
        sql/server/sql_privileges.c
        sql/storage/bat/bat_table.c
        sql/storage/sql_storage.h
Branch: default
Log Message:

add interface to storage to directly return sqlid's (reduces malloc/frees)


diffs (211 lines):

diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -509,12 +509,8 @@ role_granting_privs(mvc *m, oid role_rid
        sql_table *auths = find_sql_table(sys, "auths");
        sql_column *auths_grantor = find_sql_column(auths, "grantor");
        sqlid owner_id;
-       void *val;
 
-       val = table_funcs.column_find_value(m->session->tr, auths_grantor, 
role_rid);
-       owner_id = *(sqlid*)val;
-       _DELETE(val);
-
+       owner_id = table_funcs.column_find_sqlid(m->session->tr, auths_grantor, 
role_rid);
        if (owner_id == grantor_id)
                return true;
        if (sql_privilege(m, grantor_id, role_id, PRIV_ROLE_ADMIN))
@@ -533,15 +529,11 @@ sql_grant_role(mvc *m, str grantee, str 
        sql_column *auths_name = find_sql_column(auths, "name");
        sql_column *auths_id = find_sql_column(auths, "id");
        sqlid role_id, grantee_id;
-       void *val;
 
        rid = table_funcs.column_find_row(m->session->tr, auths_name, role, 
NULL);
        if (is_oid_nil(rid))
                throw(SQL, "sql.grant_role", SQLSTATE(M1M05) "GRANT: Cannot 
grant ROLE '%s' to user '%s'", role, grantee);
-       val = table_funcs.column_find_value(m->session->tr, auths_id, rid);
-       role_id = *(sqlid*)val;
-       _DELETE(val);
-
+       role_id = table_funcs.column_find_sqlid(m->session->tr, auths_id, rid);
        if (backend_find_user(m, role) >= 0)
                throw(SQL,"sql.grant_role", SQLSTATE(M1M05) "GRANT: '%s' is a 
USER not a ROLE", role);
        if (!admin_privs(grantor) && !role_granting_privs(m, rid, role_id, 
grantor))
@@ -549,9 +541,7 @@ sql_grant_role(mvc *m, str grantee, str 
        rid = table_funcs.column_find_row(m->session->tr, auths_name, grantee, 
NULL);
        if (is_oid_nil(rid))
                throw(SQL,"sql.grant_role", SQLSTATE(M1M05) "GRANT: Cannot 
grant ROLE '%s' to user '%s'", role, grantee);
-       val = table_funcs.column_find_value(m->session->tr, auths_id, rid);
-       grantee_id = *(sqlid*)val;
-       _DELETE(val);
+       grantee_id = table_funcs.column_find_sqlid(m->session->tr, auths_id, 
rid);
        rid = table_funcs.column_find_row(m->session->tr, 
find_sql_column(roles, "login_id"), &grantee_id, find_sql_column(roles, 
"role_id"), &role_id, NULL);
        if (!is_oid_nil(rid))
                throw(SQL,"sql.grant_role", SQLSTATE(M1M05) "GRANT: User '%s' 
already has ROLE '%s'", grantee, role);
@@ -580,21 +570,15 @@ sql_revoke_role(mvc *m, str grantee, str
        sql_column *roles_role_id = find_sql_column(roles, "role_id");
        sql_column *roles_login_id = find_sql_column(roles, "login_id");
        sqlid role_id, grantee_id;
-       void *val;
 
        rid = table_funcs.column_find_row(m->session->tr, auths_name, grantee, 
NULL);
        if (is_oid_nil(rid))
                throw(SQL,"sql.revoke_role", SQLSTATE(01006) "REVOKE: no such 
role '%s' or grantee '%s'", role, grantee);
-       val = table_funcs.column_find_value(m->session->tr, auths_id, rid);
-       grantee_id = *(sqlid*)val;
-       _DELETE(val);
-
+       grantee_id = table_funcs.column_find_sqlid(m->session->tr, auths_id, 
rid);
        rid = table_funcs.column_find_row(m->session->tr, auths_name, role, 
NULL);
        if (is_oid_nil(rid))
                throw(SQL,"sql.revoke_role", SQLSTATE(01006) "REVOKE: no such 
role '%s' or grantee '%s'", role, grantee);
-       val = table_funcs.column_find_value(m->session->tr, auths_id, rid);
-       role_id = *(sqlid*)val;
-       _DELETE(val);
+       role_id = table_funcs.column_find_sqlid(m->session->tr, auths_id, rid);
        if (!admin_privs(grantor) && !role_granting_privs(m, rid, role_id, 
grantor))
                throw(SQL,"sql.revoke_role", SQLSTATE(0P000) "REVOKE: 
insufficient privileges to revoke ROLE '%s'", role);
 
@@ -628,12 +612,10 @@ sql_find_auth(mvc *m, str auth)
 
        if (!is_oid_nil(rid)) {
                sql_column *auths_id = find_sql_column(auths, "id");
-               sqlid *p = (sqlid *) 
table_funcs.column_find_value(m->session->tr, auths_id, rid);
+               sqlid p = table_funcs.column_find_sqlid(m->session->tr, 
auths_id, rid);
 
-               if (p) {
-                       res = *p;
-                       _DELETE(p);
-               }
+               if (p > -1)
+                       res = p;
        }
        return res;
 }
@@ -651,12 +633,10 @@ sql_find_schema(mvc *m, str schema)
 
        if (!is_oid_nil(rid)) {
                sql_column *schemas_id = find_sql_column(schemas, "id");
-               sqlid *p = (sqlid *) 
table_funcs.column_find_value(m->session->tr, schemas_id, rid);
+               sqlid p = table_funcs.column_find_sqlid(m->session->tr, 
schemas_id, rid);
 
-               if (p) {
-                       schema_id = *p;
-                       _DELETE(p);
-               }
+               if (p > -1)
+                       schema_id = p;
        }
        return schema_id;
 }
@@ -684,10 +664,8 @@ sql_grantable_(mvc *m, sqlid grantorid, 
                        continue;
                rid = table_funcs.column_find_row(m->session->tr, priv_obj, 
&obj_id, priv_auth, &grantorid, priv_priv, &priv, NULL);
                if (!is_oid_nil(rid)) {
-                       void *p = table_funcs.column_find_value(m->session->tr, 
priv_allowed, rid);
-                       int allowed = *(int *)p;
+                       int allowed = 
table_funcs.column_find_int(m->session->tr, priv_allowed, rid);
 
-                       _DELETE(p);
                        /* switch of priv bit */
                        if (allowed)
                                privs = (privs & ~priv);
@@ -720,10 +698,7 @@ mvc_set_role(mvc *m, char *role)
        rid = table_funcs.column_find_row(m->session->tr, auths_name, role, 
NULL);
        if (!is_oid_nil(rid)) {
                sql_column *auths_id = find_sql_column(auths, "id");
-               void *p = table_funcs.column_find_value(m->session->tr, 
auths_id, rid);
-               sqlid id = *(sqlid *)p;
-
-               _DELETE(p);
+               sqlid id = table_funcs.column_find_sqlid(m->session->tr, 
auths_id, rid);
 
                if (m->user_id == id) {
                        m->role_id = id;
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -227,6 +227,52 @@ column_find_value(sql_trans *tr, sql_col
        return res;
 }
 
+static sqlid
+column_find_sqlid(sql_trans *tr, sql_column *c, oid rid)
+{
+       BUN q = BUN_NONE;
+       BAT *b;
+       sqlid res = -1;
+
+       b = full_column(tr, c);
+       if (b) {
+               if (rid < b->hseqbase || rid >= b->hseqbase + BATcount(b))
+                       q = BUN_NONE;
+               else
+                       q = rid - b->hseqbase;
+       }
+       if (q != BUN_NONE) {
+               BATiter bi = bat_iterator(b);
+
+               res = *(sqlid*)BUNtail(bi, q);
+       }
+       full_destroy(c, b);
+       return res;
+}
+
+static sqlid
+column_find_int(sql_trans *tr, sql_column *c, oid rid)
+{
+       BUN q = BUN_NONE;
+       BAT *b;
+       int res = -1;
+
+       b = full_column(tr, c);
+       if (b) {
+               if (rid < b->hseqbase || rid >= b->hseqbase + BATcount(b))
+                       q = BUN_NONE;
+               else
+                       q = rid - b->hseqbase;
+       }
+       if (q != BUN_NONE) {
+               BATiter bi = bat_iterator(b);
+
+               res = *(int*)BUNtail(bi, q);
+       }
+       full_destroy(c, b);
+       return res;
+}
+
 static int
 column_update_value(sql_trans *tr, sql_column *c, oid rid, void *value)
 {
@@ -652,6 +698,8 @@ bat_table_init( table_functions *tf )
 {
        tf->column_find_row = column_find_row;
        tf->column_find_value = column_find_value;
+       tf->column_find_sqlid = column_find_sqlid;
+       tf->column_find_int = column_find_int;
 
        tf->column_update_value = column_update_value;
        tf->table_insert = table_insert;
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -48,6 +48,8 @@ extern int store_initialized;
 /* relational interface */
 typedef oid (*column_find_row_fptr)(sql_trans *tr, sql_column *c, const void 
*value, ...);
 typedef void *(*column_find_value_fptr)(sql_trans *tr, sql_column *c, oid rid);
+typedef sqlid (*column_find_sqlid_fptr)(sql_trans *tr, sql_column *c, oid rid);
+typedef int (*column_find_int_fptr)(sql_trans *tr, sql_column *c, oid rid);
 typedef int (*column_update_value_fptr)(sql_trans *tr, sql_column *c, oid rid, 
void *value);
 typedef int (*table_insert_fptr)(sql_trans *tr, sql_table *t, ...);
 typedef int (*table_delete_fptr)(sql_trans *tr, sql_table *t, oid rid);
@@ -93,6 +95,8 @@ typedef void (*subrids_destroy_fptr)(sub
 typedef struct table_functions {
        column_find_row_fptr column_find_row;
        column_find_value_fptr column_find_value;
+       column_find_sqlid_fptr column_find_sqlid;
+       column_find_int_fptr column_find_int;
        column_update_value_fptr column_update_value;
        table_insert_fptr table_insert;
        table_delete_fptr table_delete;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to