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; }
static VALUE method_get(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); /* ugh */ char * data = malloc(MAX_ZNODE_SIZE); int data_len = MAX_ZNODE_SIZE; struct Stat stat; int rc; switch (call_type) { 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, watch_ctx, data, &data_len, &stat); break; case ASYNC: rc = zkrb_call_zoo_aget(zk->zh, RSTRING_PTR(path), 0, zkrb_data_callback, data_ctx); break; case ASYNC_WATCH: rc = zkrb_call_zoo_awget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_data_callback, data_ctx); break; } VALUE 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; }