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