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_set_acl(VALUE self, VALUE reqid, VALUE path, VALUE acls, VALUE async, VALUE version) { VALUE watch = Qfalse; struct ACL_vector * aclptr ; int rc; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); aclptr = zkrb_ruby_to_aclvector(acls); switch (call_type) { case SYNC: rc = zoo_set_acl(zk->zh, RSTRING_PTR(path), FIX2INT(version), aclptr); break; case ASYNC: rc = zoo_aset_acl(zk->zh, RSTRING_PTR(path), FIX2INT(version), aclptr, zkrb_void_callback, data_ctx); break; default: /* TODO(wickman) raise proper argument error */ return Qnil; break; } deallocate_ACL_vector(aclptr); free(aclptr); return INT2FIX(rc); }
static VALUE method_set(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE async, VALUE version) { VALUE watch = Qfalse; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); struct Stat stat; if (data != Qnil) Check_Type(data, T_STRING); const char *data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data); size_t data_len = (data == Qnil) ? -1 : RSTRING_LEN(data); int rc; switch (call_type) { case SYNC: rc = zkrb_call_zoo_set2(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, FIX2INT(version), &stat); break; case ASYNC: rc = zkrb_call_zoo_aset(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, FIX2INT(version), zkrb_stat_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_stat_to_rarray(&stat)); } return output; }
static VALUE method_exists(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); struct Stat stat; int rc; switch (call_type) { case SYNC: rc = zkrb_call_zoo_exists(zk->zh, RSTRING_PTR(path), 0, &stat); break; case SYNC_WATCH: rc = zkrb_call_zoo_wexists(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, &stat); break; case ASYNC: rc = zkrb_call_zoo_aexists(zk->zh, RSTRING_PTR(path), 0, zkrb_stat_callback, data_ctx); break; case ASYNC_WATCH: rc = zkrb_call_zoo_awexists(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_stat_callback, data_ctx); break; } VALUE output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { rb_ary_push(output, zkrb_stat_to_rarray(&stat)); } return output; }
static VALUE method_get_children(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { struct String_vector strings; struct Stat stat; int rc; VALUE output; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); switch (call_type) { case SYNC: rc = zoo_get_children2(zk->zh, RSTRING_PTR(path), 0, &strings, &stat); break; case SYNC_WATCH: rc = zoo_wget_children2(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, &strings, &stat); break; case ASYNC: rc = zoo_aget_children2(zk->zh, RSTRING_PTR(path), 0, zkrb_strings_stat_callback, data_ctx); break; case ASYNC_WATCH: rc = zoo_awget_children2(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_strings_stat_callback, data_ctx); break; } output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { rb_ary_push(output, zkrb_string_vector_to_ruby(&strings)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); } return output; }
static VALUE method_set_acl(VALUE self, VALUE reqid, VALUE path, VALUE acls, VALUE async, VALUE version) { STANDARD_PREAMBLE(self, zk, reqid, path, async, Qfalse, call_type); struct ACL_vector * aclptr = zkrb_ruby_to_aclvector(acls); int rc=ZOK, invalid_call_type=0; switch (call_type) { #ifdef THREADED case SYNC: rc = zkrb_call_zoo_set_acl(zk->zh, RSTRING_PTR(path), FIX2INT(version), aclptr); break; #endif case ASYNC: rc = zkrb_call_zoo_aset_acl(zk->zh, RSTRING_PTR(path), FIX2INT(version), aclptr, zkrb_void_callback, CTX_ALLOC(zk, reqid)); break; default: invalid_call_type=1; break; } deallocate_ACL_vector(aclptr); free(aclptr); if (invalid_call_type) raise_invalid_call_type_err(call_type); return INT2FIX(rc); }
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; }
static VALUE method_get(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, call_type); VALUE output = Qnil; int data_len = MAX_ZNODE_SIZE; struct Stat stat; char * data = NULL; if (IS_SYNC(call_type)) { data = malloc(MAX_ZNODE_SIZE); /* ugh */ memset(data, 0, sizeof(data)); } int rc, invalid_call_type=0; switch (call_type) { #ifdef THREADED case SYNC: rc = zkrb_call_zoo_get(zk->zh, RSTRING_PTR(path), 0, data, &data_len, &stat); break; case SYNC_WATCH: rc = zkrb_call_zoo_wget( zk->zh, RSTRING_PTR(path), zkrb_state_callback, CTX_ALLOC(zk, reqid), data, &data_len, &stat); break; #endif case ASYNC: rc = zkrb_call_zoo_aget(zk->zh, RSTRING_PTR(path), 0, zkrb_data_callback, CTX_ALLOC(zk, reqid)); break; case ASYNC_WATCH: // first ctx is a watch, second is the async callback rc = zkrb_call_zoo_awget( zk->zh, RSTRING_PTR(path), zkrb_state_callback, CTX_ALLOC(zk, reqid), zkrb_data_callback, CTX_ALLOC(zk, reqid)); break; default: invalid_call_type=1; goto cleanup; break; } output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { if (data_len == -1) rb_ary_push(output, Qnil); /* No data associated with path */ else rb_ary_push(output, rb_str_new(data, data_len)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); } cleanup: free(data); if (invalid_call_type) raise_invalid_call_type_err(call_type); return output; }
// this method is *only* called asynchronously static VALUE method_sync(VALUE self, VALUE reqid, VALUE path) { VALUE async = Qtrue; VALUE watch = Qfalse; int rc; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); rc = zkrb_call_zoo_async(zk->zh, RSTRING_PTR(path), zkrb_string_callback, data_ctx); return INT2FIX(rc); }
static VALUE method_create(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE async, VALUE acls, VALUE flags) { STANDARD_PREAMBLE(self, zk, reqid, path, async, Qfalse, call_type); VALUE output = Qnil; if (data != Qnil) Check_Type(data, T_STRING); Check_Type(flags, T_FIXNUM); const char *data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data); ssize_t data_len = (data == Qnil) ? -1 : RSTRING_LEN(data); struct ACL_vector *aclptr = NULL; if (acls != Qnil) { aclptr = zkrb_ruby_to_aclvector(acls); } char realpath[16384]; int invalid_call_type=0; int rc; switch (call_type) { #ifdef THREADED case SYNC: // casting data_len to int is OK as you can only store 1MB in zookeeper rc = zkrb_call_zoo_create(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, aclptr, FIX2INT(flags), realpath, sizeof(realpath)); break; #endif case ASYNC: rc = zkrb_call_zoo_acreate(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, aclptr, FIX2INT(flags), zkrb_string_callback, CTX_ALLOC(zk, reqid)); break; default: invalid_call_type=1; break; } if (aclptr) { deallocate_ACL_vector(aclptr); free(aclptr); } if (invalid_call_type) raise_invalid_call_type_err(call_type); output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { return rb_ary_push(output, rb_str_new2(realpath)); } return output; }
static VALUE method_get_children(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, call_type); VALUE output = Qnil; struct String_vector strings; struct Stat stat; int rc; switch (call_type) { #ifdef THREADED case SYNC: rc = zkrb_call_zoo_get_children2( zk->zh, RSTRING_PTR(path), 0, &strings, &stat); break; case SYNC_WATCH: rc = zkrb_call_zoo_wget_children2( zk->zh, RSTRING_PTR(path), zkrb_state_callback, CTX_ALLOC(zk, reqid), &strings, &stat); break; #endif case ASYNC: rc = zkrb_call_zoo_aget_children2( zk->zh, RSTRING_PTR(path), 0, zkrb_strings_stat_callback, CTX_ALLOC(zk, reqid)); break; case ASYNC_WATCH: rc = zkrb_call_zoo_awget_children2( zk->zh, RSTRING_PTR(path), zkrb_state_callback, CTX_ALLOC(zk, reqid), zkrb_strings_stat_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_string_vector_to_ruby(&strings)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); } return output; }
static VALUE method_create(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE async, VALUE acls, VALUE flags) { VALUE watch = Qfalse; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); if (data != Qnil) Check_Type(data, T_STRING); Check_Type(flags, T_FIXNUM); const char *data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data); size_t data_len = (data == Qnil) ? -1 : RSTRING_LEN(data); struct ACL_vector *aclptr = NULL; if (acls != Qnil) { aclptr = zkrb_ruby_to_aclvector(acls); } char realpath[16384]; int rc; switch (call_type) { case SYNC: // casting data_len to int is OK as you can only store 1MB in zookeeper rc = zkrb_call_zoo_create(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, aclptr, FIX2INT(flags), realpath, sizeof(realpath)); break; case ASYNC: rc = zkrb_call_zoo_acreate(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, aclptr, FIX2INT(flags), zkrb_string_callback, data_ctx); break; default: /* TODO(wickman) raise proper argument error */ return Qnil; break; } if (aclptr) { deallocate_ACL_vector(aclptr); free(aclptr); } VALUE output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { return rb_ary_push(output, rb_str_new2(realpath)); } return output; }
static VALUE method_get(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { char * data ; int data_len = MAX_ZNODE_SIZE; struct Stat stat; int rc; VALUE output ; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); /* ugh */ data = malloc(MAX_ZNODE_SIZE); switch (call_type) { case SYNC: rc = zoo_get(zk->zh, RSTRING_PTR(path), 0, data, &data_len, &stat); break; case SYNC_WATCH: rc = zoo_wget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, data, &data_len, &stat); break; case ASYNC: rc = zoo_aget(zk->zh, RSTRING_PTR(path), 0, zkrb_data_callback, data_ctx); break; case ASYNC_WATCH: rc = zoo_awget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_data_callback, data_ctx); break; } output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { if (data_len == -1) rb_ary_push(output, Qnil); /* No data associated with path */ else rb_ary_push(output, rb_str_new(data, data_len)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); } free(data); return output; }
static VALUE method_delete(VALUE self, VALUE reqid, VALUE path, VALUE version, VALUE async) { VALUE watch = Qfalse; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); Check_Type(version, T_FIXNUM); int rc = 0; switch (call_type) { case SYNC: rc = zkrb_call_zoo_delete(zk->zh, RSTRING_PTR(path), FIX2INT(version)); break; case ASYNC: rc = zkrb_call_zoo_adelete(zk->zh, RSTRING_PTR(path), FIX2INT(version), zkrb_void_callback, data_ctx); break; default: /* TODO(wickman) raise proper argument error */ return Qnil; break; } return INT2FIX(rc); }
static VALUE method_set(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE async, VALUE version) { STANDARD_PREAMBLE(self, zk, reqid, path, async, Qfalse, call_type); VALUE output = Qnil; struct Stat stat; if (data != Qnil) Check_Type(data, T_STRING); const char *data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data); ssize_t data_len = (data == Qnil) ? -1 : RSTRING_LEN(data); int rc=ZOK; switch (call_type) { #ifdef THREADED case SYNC: rc = zkrb_call_zoo_set2(zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, FIX2INT(version), &stat); break; #endif case ASYNC: rc = zkrb_call_zoo_aset( zk->zh, RSTRING_PTR(path), data_ptr, (int)data_len, FIX2INT(version), zkrb_stat_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_stat_to_rarray(&stat)); } return output; }
static VALUE method_delete(VALUE self, VALUE reqid, VALUE path, VALUE version, VALUE async) { STANDARD_PREAMBLE(self, zk, reqid, path, async, Qfalse, call_type); Check_Type(version, T_FIXNUM); int rc = 0; switch (call_type) { #ifdef THREADED case SYNC: rc = zkrb_call_zoo_delete(zk->zh, RSTRING_PTR(path), FIX2INT(version)); break; #endif case ASYNC: rc = zkrb_call_zoo_adelete(zk->zh, RSTRING_PTR(path), FIX2INT(version), zkrb_void_callback, CTX_ALLOC(zk, reqid)); break; default: raise_invalid_call_type_err(call_type); break; } return INT2FIX(rc); }