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_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; }