as_status aerospike_query_role(aerospike* as, as_error* err, const as_policy_admin* policy, const char* role_name, as_role** role) { uint8_t buffer[AS_STACK_BUF_SIZE]; uint8_t* p = buffer + 8; p = as_admin_write_header(p, QUERY_ROLES, 1); p = as_admin_write_field_string(p, ROLE, role_name); as_vector list; as_vector_inita(&list, sizeof(as_role*), 1); as_status status = as_admin_read_list(as, err, policy, buffer, p, as_parse_roles, &list); if (status == AEROSPIKE_OK) { if (list.size == 1) { *role = as_vector_get_ptr(&list, 0); } else if (list.size <= 0) { *role = 0; as_free_roles(&list, 0); } else { *role = as_vector_get_ptr(&list, 0); // Delete excess users. as_free_roles(&list, 1); } } else { *role = 0; as_free_roles(&list, 0); } return status; }
static void as_free_roles(as_vector* roles, int offset) { for (uint32_t i = offset; i < roles->size; i++) { as_role* role = as_vector_get_ptr(roles, i); cf_free(role); } as_vector_destroy(roles); }
static void as_free_users(as_vector* users, int offset) { for (uint32_t i = offset; i < users->size; i++) { as_user* user = as_vector_get_ptr(users, i); cf_free(user); } as_vector_destroy(users); }
as_status aerospike_query_user(aerospike* as, as_error* err, const as_policy_admin* policy, const char* user_name, as_user** user) { as_error_reset(err); if (! user_name) { user_name = as->cluster->user; if (! user_name) { return AEROSPIKE_INVALID_USER; } } uint8_t buffer[AS_STACK_BUF_SIZE]; uint8_t* p = buffer + 8; p = as_admin_write_header(p, QUERY_USERS, 1); p = as_admin_write_field_string(p, USER, user_name); as_vector list; as_vector_inita(&list, sizeof(as_user*), 1); as_status status = as_admin_read_list(as, err, policy, buffer, p, as_parse_users, &list); if (status == AEROSPIKE_OK) { if (list.size == 1) { *user = as_vector_get_ptr(&list, 0); } else if (list.size <= 0) { *user = 0; as_free_users(&list, 0); } else { *user = as_vector_get_ptr(&list, 0); // Delete excess users. as_free_users(&list, 1); } } else { *user = 0; as_free_users(&list, 0); } return status; }
static void print_users(as_vector* /*<as_user_roles*>*/ users) { for (uint32_t i = 0; i < users->size; i++) { as_user_roles* urs = as_vector_get_ptr(users, i); printf("User %s Roles ", urs->user); for (uint32_t j = 0; j < urs->roles_size; j++) { printf("%s", urs->roles[j]); } printf("\n"); } }
static as_node* as_cluster_find_node_in_vector(as_vector* nodes, const char* name) { as_node* node; for (uint32_t i = 0; i < nodes->size; i++) { node = as_vector_get_ptr(nodes, i); if (strcmp(node->name, name) == 0) { return node; } } return NULL; }
int aerospike_query_user(aerospike* as, const as_policy_admin* policy, const char* user, as_user_roles** user_roles) { if (! user) { user = as->cluster->user; } uint8_t buffer[STACK_BUF_SZ]; uint8_t* p = buffer + 8; p = write_header(p, QUERY_USERS, 1); p = write_field_string(p, USER, user); as_vector users; as_vector_inita(&users, sizeof(as_user_roles*), 1); int status = as_read_users(as, policy, buffer, p, &users); if (status == 0) { if (users.size == 1) { *user_roles = as_vector_get_ptr(&users, 0); } else if (users.size <= 0) { *user_roles = 0; as_free_users(&users, 0); } else { *user_roles = as_vector_get_ptr(&users, 0); // Delete excess users. as_free_users(&users, 1); } } else { *user_roles = 0; as_free_users(&users, 0); } return status; }