static VALUE method_get_acl(VALUE self, VALUE reqid, VALUE path, VALUE async) { VALUE watch = Qfalse; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); struct ACL_vector acls; struct Stat stat; int rc; switch (call_type) { case SYNC: rc = zkrb_call_zoo_get_acl(zk->zh, RSTRING_PTR(path), &acls, &stat); break; case ASYNC: rc = zkrb_call_zoo_aget_acl(zk->zh, RSTRING_PTR(path), zkrb_acl_callback, data_ctx); break; default: /* TODO(wickman) raise proper argument error */ return Qnil; break; } VALUE output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { rb_ary_push(output, zkrb_acl_vector_to_ruby(&acls)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); deallocate_ACL_vector(&acls); } return output; }
static VALUE method_get_acl(VALUE self, VALUE reqid, VALUE path, VALUE async) { STANDARD_PREAMBLE(self, zk, reqid, path, async, Qfalse, call_type); VALUE output = Qnil; struct ACL_vector acls; struct Stat stat; int rc=ZOK; switch (call_type) { #ifdef THREADED case SYNC: rc = zkrb_call_zoo_get_acl(zk->zh, RSTRING_PTR(path), &acls, &stat); break; #endif case ASYNC: rc = zkrb_call_zoo_aget_acl(zk->zh, RSTRING_PTR(path), zkrb_acl_callback, CTX_ALLOC(zk, reqid)); break; default: raise_invalid_call_type_err(call_type); break; } output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { rb_ary_push(output, zkrb_acl_vector_to_ruby(&acls)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); deallocate_ACL_vector(&acls); } return output; }
/* this is called only from a method_get_latest_event, so the hash is allocated on the proper thread stack */ VALUE zkrb_event_to_ruby(zkrb_event_t *event) { VALUE hash = rb_hash_new(); rb_hash_aset(hash, GET_SYM("req_id"), LL2NUM(event->req_id)); if (event->type != ZKRB_WATCHER) rb_hash_aset(hash, GET_SYM("rc"), INT2FIX(event->rc)); switch (event->type) { case ZKRB_DATA: { struct zkrb_data_completion *data_ctx = event->completion.data_completion; if (ZKRBDebugging) zkrb_print_stat(data_ctx->stat); rb_hash_aset(hash, GET_SYM("data"), data_ctx->data ? rb_str_new2(data_ctx->data) : Qnil); rb_hash_aset(hash, GET_SYM("stat"), data_ctx->stat ? zkrb_stat_to_rarray(data_ctx->stat) : Qnil); break; } case ZKRB_STAT: { struct zkrb_stat_completion *stat_ctx = event->completion.stat_completion; rb_hash_aset(hash, GET_SYM("stat"), stat_ctx->stat ? zkrb_stat_to_rarray(stat_ctx->stat) : Qnil); break; } case ZKRB_STRING: { struct zkrb_string_completion *string_ctx = event->completion.string_completion; rb_hash_aset(hash, GET_SYM("string"), string_ctx->value ? rb_str_new2(string_ctx->value) : Qnil); break; } case ZKRB_STRINGS: { struct zkrb_strings_completion *strings_ctx = event->completion.strings_completion; rb_hash_aset(hash, GET_SYM("strings"), strings_ctx->values ? zkrb_string_vector_to_ruby(strings_ctx->values) : Qnil); break; } case ZKRB_STRINGS_STAT: { struct zkrb_strings_stat_completion *strings_stat_ctx = event->completion.strings_stat_completion; rb_hash_aset(hash, GET_SYM("strings"), strings_stat_ctx->values ? zkrb_string_vector_to_ruby(strings_stat_ctx->values) : Qnil); rb_hash_aset(hash, GET_SYM("stat"), strings_stat_ctx->stat ? zkrb_stat_to_rarray(strings_stat_ctx->stat) : Qnil); break; } case ZKRB_ACL: { struct zkrb_acl_completion *acl_ctx = event->completion.acl_completion; rb_hash_aset(hash, GET_SYM("acl"), acl_ctx->acl ? zkrb_acl_vector_to_ruby(acl_ctx->acl) : Qnil); rb_hash_aset(hash, GET_SYM("stat"), acl_ctx->stat ? zkrb_stat_to_rarray(acl_ctx->stat) : Qnil); break; } case ZKRB_WATCHER: { struct zkrb_watcher_completion *watcher_ctx = event->completion.watcher_completion; rb_hash_aset(hash, GET_SYM("type"), INT2FIX(watcher_ctx->type)); rb_hash_aset(hash, GET_SYM("state"), INT2FIX(watcher_ctx->state)); rb_hash_aset(hash, GET_SYM("path"), watcher_ctx->path ? rb_str_new2(watcher_ctx->path) : Qnil); break; } case ZKRB_VOID: default: break; } return hash; }