示例#1
0
文件: riack_kv.c 项目: iehoyeba/riack
void riak_set_object_response_values_get(struct RIACK_CLIENT* client, struct RIACK_GET_OBJECT *object, RpbGetResp* getresp)
{
	size_t cnt, i;
	if (!object || !getresp) {
		return;
	}
	object->unchanged_present = getresp->has_unchanged ? 1 : 0;
	object->unchanged = getresp->unchanged ? 1 : 0;
	object->object.bucket.value = 0;
	object->object.bucket.len = 0;
	object->object.key.value = 0;
	object->object.key.len = 0;

	object->object.vclock.len = 0;
	object->object.vclock.clock = 0;
	if (getresp->has_vclock) {
		object->object.vclock.len = getresp->vclock.len;
		object->object.vclock.clock = (uint8_t*)RMALLOC(client, getresp->vclock.len);
		memcpy(object->object.vclock.clock, getresp->vclock.data, getresp->vclock.len);
	}
	cnt = getresp->n_content;
	object->object.content_count = cnt;
	if (cnt > 0) {
		object->object.content = RMALLOC(client, sizeof(struct RIACK_CONTENT)*cnt);
		for (i=0; i<cnt; ++i) {
			riack_copy_rpbcontent_to_content(client, getresp->content[i], &object->object.content[i]);
		}
	}
}
示例#2
0
文件: riack_kv.c 项目: iehoyeba/riack
void riak_set_object_response_values(struct RIACK_CLIENT* client, struct RIACK_OBJECT *pobject, RpbPutResp* pput_resp)
{
	size_t content_cnt, i;
	if (!pput_resp || !pobject) {
		return;
	}
	pobject->bucket.value = 0;
	pobject->bucket.len = 0;
	pobject->key.len = 0;
	pobject->key.value = 0;
	if (pput_resp->has_key) {
		RMALLOCCOPY(client, pobject->key.value, pobject->key.len, pput_resp->key.data, pput_resp->key.len);
	}
	pobject->vclock.len = 0;
	pobject->vclock.clock = 0;
	if (pput_resp->has_vclock) {
		RMALLOCCOPY(client, pobject->vclock.clock, pobject->vclock.len, 
                pput_resp->vclock.data, pput_resp->vclock.len);
	}
	content_cnt = pput_resp->n_content;
	pobject->content_count = content_cnt;
	if (content_cnt > 0) {
		pobject->content = RMALLOC(client, sizeof(struct RIACK_CONTENT)*content_cnt);
		for (i=0; i<content_cnt; ++i) {
			riack_copy_rpbcontent_to_content(client, pput_resp->content[i], &pobject->content[i]);
		}
	}
}
示例#3
0
文件: riack.c 项目: fumpierrez/riack
int riack_connect(struct RIACK_CLIENT *client, const char* host, int port,
		struct RIACK_CONNECTION_OPTIONS* options)
{
	client->sockfd = sock_open(host, port);
	if (client->sockfd > 0) {
		if (client->host && host != client->host) {
			RFREE(client, client->host);
		}
		if (host != client->host) {
			client->host = (char*)RMALLOC(client, strlen(host)+1);
			strcpy(client->host, host);
		}
		client->port = port;
		if (options) {
			client->options = *options;
			if (!sock_set_timeouts(client->sockfd, options->recv_timeout_ms, options->send_timeout_ms)) {
				sock_close(client->sockfd);
				client->sockfd = -1;
				// TODO set last error
			}
		}
		return RIACK_SUCCESS;
	}
	return RIACK_ERROR_COMMUNICATION;
}
示例#4
0
文件: riack_kv.c 项目: iehoyeba/riack
void riack_set_del_properties(struct RIACK_CLIENT *client, struct RIACK_DEL_PROPERTIES* props, RpbDelReq* del_req)
{
	if (props) {
		del_req->has_dw = props->dw_use;
		del_req->dw = props->dw;
		del_req->has_pr = props->pr_use;
		del_req->pr = props->pr;
		del_req->has_pw = props->pw_use;
		del_req->pw = props->pw;
		del_req->has_r = props->r_use;
		del_req->r = props->r;
		del_req->has_rw = props->rw_use;
		del_req->rw = props->rw;
		del_req->has_w = props->w_use;
		del_req->w = props->w;
		del_req->has_vclock = 0;
		del_req->vclock.data = 0;
		if (props->vclock.clock != 0) {
			del_req->has_vclock = 1;
			del_req->vclock.len = props->vclock.len;
			del_req->vclock.data = RMALLOC(client, props->vclock.len);
			memcpy(del_req->vclock.data, props->vclock.clock, props->vclock.len);
		}
	} else {
		del_req->has_dw = 0;
		del_req->has_pr = 0;
		del_req->has_pw = 0;
		del_req->has_r = 0;
		del_req->has_rw = 0;
		del_req->has_w = 0;
		del_req->has_vclock = 0;
		del_req->vclock.data = 0;
	}
}
示例#5
0
static int
grab_token(char **str, char **out)
{
    int _status;
    char *c = *str;
    int len;
    char *tmp;

    while (*c != ' ' && *c != '\0')
        ++c;

    len = c - *str;

    tmp = RMALLOC(len + 1);
    if (!tmp)
        ABORT(R_NO_MEMORY);

    strncpy(tmp, *str, len);
    tmp[len] = '\0';

    *str = c;
    *out = tmp;

    _status = 0;
abort:
    return _status;
}
示例#6
0
// convenience methods, call RFREE on the returned data
int
NR_reg_alloc_data(NR_registry name, Data *data)
{
    int r, _status;
    size_t length;
    UCHAR  *tmp = 0;
    size_t sanity_check;

    if ((r=NR_reg_get_length(name, &length)))
        ABORT(r);

    if (!(tmp = (void*)RMALLOC(length)))
        ABORT(R_NO_MEMORY);

    if ((r=NR_reg_get_bytes(name, tmp, length, &sanity_check)))
        ABORT(r);

    assert(length == sanity_check);

    data->len = length;
    data->data = tmp;

    _status=0;
abort:
    if (_status) {
        if (tmp) RFREE(tmp);
    }
    return(_status);
}
示例#7
0
int nr_concat_strings(char **outp,...)
  {
    va_list ap;
    char *s,*out=0;
    int len=0;
    int _status;

    va_start(ap,outp);
    while(s=va_arg(ap,char *)){
      len+=strlen(s);
    }
    va_end(ap);


    if(!(out=RMALLOC(len+1)))
      ABORT(R_NO_MEMORY);
    
    *outp=out;

    va_start(ap,outp);
    while(s=va_arg(ap,char *)){
      len=strlen(s);
      memcpy(out,s,len);
      out+=len;
    }
    va_end(ap);

    *out=0;
    
    _status=0;
  abort:
    return(_status);
  }
示例#8
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_set_clientid(struct RIACK_CLIENT *client, RIACK_STRING clientid)
{
	int result;
	struct RIACK_PB_MSG msg_req, *msg_resp;
	RpbSetClientIdReq req;
	size_t packed_size;
	uint8_t *request_buffer;

	rpb_set_client_id_req__init(&req);
	req.client_id.len = clientid.len;
    req.client_id.data = (uint8_t*)clientid.value;

	packed_size = rpb_set_client_id_req__get_packed_size(&req);
	request_buffer = (uint8_t*)RMALLOC(client, packed_size);
	result = RIACK_ERROR_COMMUNICATION;
	if (request_buffer) {
		rpb_set_client_id_req__pack(&req, request_buffer);
		msg_req.msg_len = packed_size;
		msg_req.msg_code = mc_RpbSetClientIdReq;
		msg_req.msg = request_buffer;
		if ((riack_send_message(client, &msg_req) > 0)&&
			(riack_receive_message(client, &msg_resp) > 0)) {
			if (msg_resp->msg_code == mc_RpbSetClientIdResp) {
				result = RIACK_SUCCESS;
			} else {
				riack_got_error_response(client, msg_resp);
				result = RIACK_ERROR_RESPONSE;
			}
			riack_message_free(client, &msg_resp);
		}
		RFREE(client, request_buffer);
	}
	return result;
}
示例#9
0
int riack_send_message(struct RIACK_CLIENT *client, struct RIACK_PB_MSG* msg)
{
	uint8_t *buf;
	uint32_t netlen, sendlen;

	sendlen = 5 + msg->msg_len;
	buf = (uint8_t*)RMALLOC(client, sendlen);
	netlen = htonl(msg->msg_len+1);
	memcpy(buf, &netlen, 4);
	buf[4] = msg->msg_code;
	if (msg->msg_len > 0)
	{
		memcpy(buf+5, msg->msg, (int)msg->msg_len);
	}
	// first send header
	if (sock_send(client->sockfd, buf, sendlen) != sendlen)
	{
		printf("sock_send failed to send correct number of bytes\n");
		// Error failed to send bytes most have lost connection
		RFREE(client, buf);
		return -1;
	}
	RFREE(client, buf);
	return sendlen;
}
示例#10
0
int
NR_reg_alloc_string(NR_registry name, char **data)
{
    int r, _status;
    size_t length;
    char  *tmp = 0;

    if ((r=NR_reg_get_length(name, &length)))
        ABORT(r);

    if (!(tmp = (void*)RMALLOC(length+1)))
        ABORT(R_NO_MEMORY);

    if ((r=NR_reg_get_string(name, tmp, length+1)))
        ABORT(r);

    assert(length == strlen(tmp));

    *data = tmp;

    _status=0;
abort:
    if (_status) {
        if (tmp) RFREE(tmp);
    }
    return(_status);
}
示例#11
0
void riack_string_linked_list_set_entry(struct RIACK_CLIENT *client,
										struct RIACK_STRING_LINKED_LIST** entry,
										RIACK_STRING string_new)
{
	*entry = RMALLOC(client, sizeof(struct RIACK_STRING_LINKED_LIST));
	(*entry)->next = 0;
	(*entry)->string = string_new;
}
示例#12
0
void riack_string_linked_list_set_entry(riack_client *client,
										riack_string_linked_list** entry,
                                        riack_string string_new)
{
	*entry = RMALLOC(client, sizeof(riack_string_linked_list));
	(*entry)->next = 0;
	(*entry)->string = string_new;
}
示例#13
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_get(struct RIACK_CLIENT *client,
			 RIACK_STRING bucket,
			 RIACK_STRING key,
			 struct RIACK_GET_PROPERTIES* props,
			 struct RIACK_GET_OBJECT* result_object)
{
	int result;
	size_t packed_size;
	struct RIACK_PB_MSG msg_req, *msg_resp;
	ProtobufCAllocator pb_allocator;
	RpbGetReq get_req;
	RpbGetResp *get_resp;
	uint8_t *request_buffer;

	if (!bucket.value || !key.value || key.len == 0 || bucket.len == 0 || !client) {
		return RIACK_ERROR_INVALID_INPUT;
	}

	pb_allocator = riack_pb_allocator(&client->allocator);

	result = RIACK_ERROR_COMMUNICATION;
	rpb_get_req__init(&get_req);
	get_req.key.data = (uint8_t *) key.value;
	get_req.key.len = key.len;
	get_req.bucket.data = (uint8_t *) bucket.value;
	get_req.bucket.len = bucket.len;
	riack_set_get_properties(client, props, &get_req);

	packed_size = rpb_get_req__get_packed_size(&get_req);
	request_buffer = (uint8_t*)RMALLOC(client, packed_size);
	if (request_buffer) {
		rpb_get_req__pack(&get_req, request_buffer);
		msg_req.msg_code = mc_RpbGetReq;
		msg_req.msg_len = packed_size;
		msg_req.msg = request_buffer;
		if ((riack_send_message(client, &msg_req) > 0)&&
			(riack_receive_message(client, &msg_resp) > 0))
		{
			if (msg_resp->msg_code == mc_RpbGetResp) {
				get_resp = rpb_get_resp__unpack(&pb_allocator, msg_resp->msg_len, msg_resp->msg);
				if (get_resp) {
					riak_set_object_response_values_get(client, result_object, get_resp);
					rpb_get_resp__free_unpacked(get_resp, &pb_allocator);
					result = RIACK_SUCCESS;
				} else {
					result = RIACK_FAILED_PB_UNPACK;
				}
			} else {
				riack_got_error_response(client, msg_resp);
				result = RIACK_ERROR_RESPONSE;
			}
			riack_message_free(client, &msg_resp);
		}
		RFREE(client, request_buffer);
	}
	return result;
}
示例#14
0
文件: riack_search.c 项目: ecks/riack
/// Copies all optional search parameters to the protobuffers request.
void riack_set_optional_search_properties_on_req(riack_client *client, riack_search_optional_params* props,
        RpbSearchQueryReq* search_req)
{
    size_t cnt;
    if (!props) {
        return;
    }
    if (props->default_field_present) {
        search_req->has_df = 1;
        RMALLOCCOPY(client,
                    search_req->df.data, search_req->df.len,
                    props->default_field.value, props->default_field.len);
    }
    if (props->default_operation_present) {
        search_req->has_op = 1;
        RMALLOCCOPY(client,
                    search_req->op.data, search_req->op.len,
                    props->default_operation.value, props->default_operation.len);
    }
    if (props->filter_present) {
        search_req->has_filter = 1;
        RMALLOCCOPY(client,
                    search_req->filter.data, search_req->filter.len,
                    props->filter.value, props->filter.len);
    }
    if (props->presort_present) {
        search_req->has_presort = 1;
        RMALLOCCOPY(client,
                    search_req->presort.data, search_req->presort.len,
                    props->presort.value, props->presort.len);
    }
    if (props->rowlimit_present) {
        search_req->has_rows = 1;
        search_req->rows = props->rowlimit;
    }
    if (props->sort_present) {
        search_req->has_sort = 1;
        RMALLOCCOPY(client,
                    search_req->sort.data, search_req->sort.len,
                    props->sort.value, props->sort.len);
    }
    if (props->start_present) {
        search_req->has_start = 1;
        search_req->start = props->start;
    }
    cnt = props->field_limits_count;
    search_req->n_fl = cnt;
    if (cnt > 0) {
        size_t i;
        search_req->fl = RMALLOC(client, sizeof(ProtobufCBinaryData) * cnt);
        for (i = 0; i<cnt; ++i) {
            RMALLOCCOPY(client,
                        search_req->fl[i].data, search_req->fl[i].len,
                        props->field_limits[i].value, props->field_limits[i].len);
        }
    }
}
示例#15
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_2i_query(struct RIACK_CLIENT *client, RpbIndexReq* request, RIACK_STRING_LIST* result_keys)
{
	struct RIACK_PB_MSG msg_req, *msg_resp;
	ProtobufCAllocator pb_allocator;
	RpbIndexResp *index_resp;
	int result;
	size_t packed_size, keys, i;
	uint8_t *request_buffer;
	result = RIACK_ERROR_COMMUNICATION;
	pb_allocator = riack_pb_allocator(&client->allocator);
	packed_size = rpb_index_req__get_packed_size(request);
	request_buffer = (uint8_t*)RMALLOC(client, packed_size);
	if (request_buffer) {
		rpb_index_req__pack(request, request_buffer);
		msg_req.msg = request_buffer;
		msg_req.msg_code = mc_RpbIndexReq;
		msg_req.msg_len = packed_size;
		if ((riack_send_message(client, &msg_req) > 0) &&
			(riack_receive_message(client, &msg_resp) > 0)) {
			if (msg_resp->msg_code == mc_RpbIndexResp) {
				index_resp = rpb_index_resp__unpack(&pb_allocator, msg_resp->msg_len, msg_resp->msg);
				if (index_resp) {
					keys = index_resp->n_keys;
					result_keys->string_count = keys;
					result_keys->strings = RMALLOC(client, sizeof(RIACK_STRING) * keys);
					for (i=0; i<keys; ++i) {
						RMALLOCCOPY(client, result_keys->strings[i].value, result_keys->strings[i].len,
								index_resp->keys[i].data, index_resp->keys[i].len);
					}
					rpb_index_resp__free_unpacked(index_resp, &pb_allocator);
					result = RIACK_SUCCESS;
				} else {
					result = RIACK_FAILED_PB_UNPACK;
				}
			} else {
				riack_got_error_response(client, msg_resp);
				result = RIACK_ERROR_RESPONSE;
			}
			riack_message_free(client, &msg_resp);
		}
		RFREE(client, request_buffer);
	}
	return result;
}
示例#16
0
文件: riack_kv.c 项目: iehoyeba/riack
static void _map_reduce_stream_callback(struct RIACK_CLIENT *client, void *args_raw, struct RIACK_MAPRED_RESPONSE *result)
{
    struct RIACK_MAPRED_RESPONSE_LIST** chain = (struct RIACK_MAPRED_RESPONSE_LIST**)args_raw;
    struct RIACK_MAPRED_RESPONSE_LIST* mapred_result_current =
            (struct RIACK_MAPRED_RESPONSE_LIST*)RMALLOC(client, sizeof(struct RIACK_MAPRED_RESPONSE_LIST));
	assert(chain);
	assert(result);
	riack_copy_strmapred_to_mapred(client, result, mapred_result_current);
	riack_mapred_add_to_chain(client, chain, mapred_result_current);
}
示例#17
0
void riak_copy_rpbpair_to_pair(struct RIACK_CLIENT* client, RpbPair* rpc_pair, struct RIACK_PAIR* rpair)
{
	RMALLOCCOPY(client, rpair->key.value, rpair->key.len, rpc_pair->key.data, rpc_pair->key.len);
	rpair->value_present = rpc_pair->has_value;
	if (rpair->value_present) {
		rpair->value_len = rpc_pair->value.len;
		rpair->value = (uint8_t*)RMALLOC(client, rpair->value_len);
		memcpy(rpair->value, rpc_pair->value.data, rpair->value_len);
	}
}
示例#18
0
void riack_copy_rpbpair_to_pair(riack_client* client, RpbPair* rpc_pair, riack_pair* rpair)
{
	RMALLOCCOPY(client, rpair->key.value, rpair->key.len, rpc_pair->key.data, rpc_pair->key.len);
	rpair->value_present = (uint8_t) rpc_pair->has_value;
	if (rpair->value_present) {
		rpair->value_len = rpc_pair->value.len;
		rpair->value = (uint8_t*)RMALLOC(client, rpair->value_len);
		memcpy(rpair->value, rpc_pair->value.data, rpair->value_len);
	}
}
示例#19
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_put(struct RIACK_CLIENT *client,
			struct RIACK_OBJECT object,
			struct RIACK_OBJECT* preturned_object,
			struct RIACK_PUT_PROPERTIES* properties)
{
	int result;
	size_t packed_size;
	struct RIACK_PB_MSG msg_req, *msg_resp;
	ProtobufCAllocator pb_allocator;
	RpbPutReq put_req;
	RpbPutResp *put_resp;
	uint8_t *request_buffer;

    if (!client || !object.bucket.value) {
		return RIACK_ERROR_INVALID_INPUT;
	}

	pb_allocator = riack_pb_allocator(&client->allocator);
	result = RIACK_ERROR_COMMUNICATION;
	rpb_put_req__init(&put_req);
	riack_copy_object_to_rpbputreq(client, &object, &put_req);
    riack_set_object_properties(properties, &put_req);

	packed_size = rpb_put_req__get_packed_size(&put_req);
	request_buffer = (uint8_t*)RMALLOC(client, packed_size);
	if (request_buffer) {
		rpb_put_req__pack(&put_req, request_buffer);
		msg_req.msg_code = mc_RpbPutReq;
		msg_req.msg_len = packed_size;
		msg_req.msg = request_buffer;
		if ((riack_send_message(client, &msg_req) > 0)&&
			(riack_receive_message(client, &msg_resp) > 0))
		{
			if (msg_resp->msg_code == mc_RpbPutResp) {
				result = RIACK_SUCCESS;
				if (preturned_object) {
					put_resp = rpb_put_resp__unpack(&pb_allocator, msg_resp->msg_len, msg_resp->msg);
					if (put_resp) {
						riak_set_object_response_values(client, preturned_object, put_resp);
						rpb_put_resp__free_unpacked(put_resp, &pb_allocator);
					} else {
						result = RIACK_FAILED_PB_UNPACK;
					}
				}
			} else {
				riack_got_error_response(client, msg_resp);
				result = RIACK_ERROR_RESPONSE;
			}
			riack_message_free(client, &msg_resp);
		}
		RFREE(client, request_buffer);
	}
    riack_free_copied_rpb_put_req(client, &put_req);
	return result;
}
示例#20
0
void riack_copy_strmapred_to_mapred(struct RIACK_CLIENT* client, struct RIACK_MAPRED_STREAM_RESULT* source,
									struct RIACK_MAPRED_RESULT* target)
{
	memset(target, 0, sizeof(*target));
	target->phase = source->phase;
	target->phase_present = source->phase_present;
	if (source->data_size > 0) {
		target->data_size = source->data_size;
		target->data = (uint8_t*)RMALLOC(client, source->data_size);
		memcpy(target->data, source->data, source->data_size);
	}
}
示例#21
0
void riack_copy_strmapred_to_mapred(riack_client* client, riack_mapred_response* source,
        riack_mapred_response_list* target)
{
	memset(target, 0, sizeof(*target));
    target->response.phase = source->phase;
    target->response.phase_present = source->phase_present;
	if (source->data_size > 0) {
        target->response.data_size = source->data_size;
        target->response.data = (uint8_t*)RMALLOC(client, source->data_size);
        memcpy(target->response.data, source->data, source->data_size);
	}
}
示例#22
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_get_bucket_props(struct RIACK_CLIENT *client, RIACK_STRING bucket, uint32_t *n_val, uint8_t *allow_mult)
{
	int result;
	struct RIACK_PB_MSG msg_req, *msg_resp;
	ProtobufCAllocator pb_allocator;
	size_t packed_size;
	uint8_t *request_buffer;
	RpbGetBucketResp *response;
	RpbGetBucketReq get_request = RPB_GET_BUCKET_REQ__INIT;

	if (!client || !bucket.value || bucket.len == 0) {
		return RIACK_ERROR_INVALID_INPUT;
	}
	pb_allocator = riack_pb_allocator(&client->allocator);
	result = RIACK_ERROR_COMMUNICATION;
	get_request.bucket.len = bucket.len;
	get_request.bucket.data = (uint8_t*)bucket.value;
	packed_size = rpb_get_bucket_req__get_packed_size(&get_request);
	request_buffer = (uint8_t*)RMALLOC(client, packed_size);
	if (request_buffer) {
		rpb_get_bucket_req__pack(&get_request, request_buffer);
		msg_req.msg_code = mc_RpbGetBucketReq;
		msg_req.msg_len = packed_size;
		msg_req.msg = request_buffer;
		if ((riack_send_message(client, &msg_req) > 0)&&
			(riack_receive_message(client, &msg_resp) > 0))
		{
			if (msg_resp->msg_code == mc_RpbGetBucketResp) {
				response = rpb_get_bucket_resp__unpack(&pb_allocator, msg_resp->msg_len, msg_resp->msg);
				if (response) {
					if (response->props->has_allow_mult) {
						*allow_mult = response->props->allow_mult ? 1 : 0;
					}
					if (response->props->has_n_val) {
						*n_val = response->props->n_val;
					}
					rpb_get_bucket_resp__free_unpacked(response, &pb_allocator);
					result = RIACK_SUCCESS;
				} else {
					result = RIACK_FAILED_PB_UNPACK;
				}
			} else {
				riack_got_error_response(client, msg_resp);
				result = RIACK_ERROR_RESPONSE;
			}
			riack_message_free(client, &msg_resp);
		}

		RFREE(client, request_buffer);
	}
	return result;
}
示例#23
0
文件: riack_search.c 项目: ecks/riack
void riack_copy_rpbsearchdoc_to_searchdoc(riack_client *client, RpbSearchDoc* rpbsearchdoc,
        riack_search_doc *searchdoc)
{
    size_t cnt, i;
    cnt = rpbsearchdoc->n_fields;
    searchdoc->field_count = cnt;
    if (cnt > 0) {
        searchdoc->fields = RMALLOC(client, sizeof(riack_pair)*cnt);
        for (i=0; i<cnt; ++i) {
            riack_copy_rpbpair_to_pair(client, rpbsearchdoc->fields[i], &searchdoc->fields[i]);
        }
    }
}
示例#24
0
int riack_receive_message(struct RIACK_CLIENT *client, struct RIACK_PB_MSG** msg)
{
	struct RIACK_PB_MSG* recvMsg;
	uint32_t msgLenN;
	int rcvBytes = 0;
	if (msg == 0)
		return 0;
	*msg = 0;
	recvMsg = (struct RIACK_PB_MSG*)RMALLOC(client, sizeof(struct RIACK_PB_MSG));
	recvMsg->msg_len = 0;
	recvMsg->msg = 0;
	rcvBytes = sock_recv(client->sockfd, (uint8_t*)&msgLenN, 4);
	if (rcvBytes == 4)
	{
		rcvBytes = sock_recv(client->sockfd, &recvMsg->msg_code, 1);
		if (rcvBytes == 1)
		{
			recvMsg->msg_len = ntohl(msgLenN)-1;
			if (recvMsg->msg_len > 0)
			{
				recvMsg->msg = (uint8_t*)RMALLOC(client, recvMsg->msg_len);
				rcvBytes = sock_recv(client->sockfd, recvMsg->msg, recvMsg->msg_len);
				if (rcvBytes == recvMsg->msg_len)
				{
					*msg = recvMsg;
					return recvMsg->msg_len + 5;
				}
			}
			else
			{
				*msg = recvMsg;
				return 5;
			}
		}
	}
	riack_message_free(client, &recvMsg);
	return -1;
}
示例#25
0
void riack_copy_rpbmapred_to_mapred(struct RIACK_CLIENT* client, RpbMapRedResp* source, struct RIACK_MAPRED_RESULT* target)
{
	target->next_result = 0;
	target->phase_present = source->has_phase;
	target->phase = source->phase;
	if (source->has_response) {
		target->data_size = source->response.len;
		target->data = (uint8_t*)RMALLOC(client, source->response.len);
		memcpy(target->data, source->response.data, source->response.len);
	} else {
		target->data_size = 0;
		target->data = 0;
	}
}
示例#26
0
void riack_copy_object_to_rpbputreq(struct RIACK_CLIENT* client, struct RIACK_OBJECT *pobject, RpbPutReq* pput_req)
{
	RpbContent *content;
	content = (RpbContent*)RMALLOC(client, sizeof(RpbContent));
	rpb_content__init(content);

	riack_copy_content_to_rpbcontent(client, pobject->content, content);
	pput_req->content = content;
	pput_req->bucket.len = pobject->bucket.len;
	pput_req->bucket.data = (uint8_t*)RMALLOC(client, pobject->bucket.len);
	memcpy(pput_req->bucket.data, pobject->bucket.value, pobject->bucket.len);
	if (pobject->key.value) {
		pput_req->has_key = 1;
		pput_req->key.len = pobject->key.len;
		pput_req->key.data = (uint8_t*)RMALLOC(client, pobject->key.len);
		memcpy(pput_req->key.data, pobject->key.value, pobject->key.len);
	}
	if (pobject->vclock.len > 0) {
		pput_req->has_vclock = 1;
		pput_req->vclock.len = pobject->vclock.len;
		pput_req->vclock.data = (uint8_t*)RMALLOC(client, pobject->vclock.len);
		memcpy(pput_req->vclock.data, pobject->vclock.clock, pobject->vclock.len);
	}
}
示例#27
0
int
nr_stun_remove_duplicate_addrs(nr_local_addr addrs[], int remove_loopback, int remove_link_local, int *count)
{
    int r, _status;
    nr_local_addr *tmp = 0;
    int i;
    int n;

    tmp = RMALLOC(*count * sizeof(*tmp));
    if (!tmp)
        ABORT(R_NO_MEMORY);

    n = 0;
    for (i = 0; i < *count; ++i) {
        if (nr_stun_is_duplicate_addr(tmp, n, &addrs[i])) {
            /* skip addrs[i], it's a duplicate */
        }
        else if (remove_loopback && nr_transport_addr_is_loopback(&addrs[i].addr)) {
            /* skip addrs[i], it's a loopback */
        }
        else if (remove_link_local &&
                 addrs[i].addr.ip_version == NR_IPV6 &&
                 nr_transport_addr_is_link_local(&addrs[i].addr)) {
            /* skip addrs[i], it's a link-local address */
        }
        else {
            /* otherwise, copy it to the temporary array */
            if ((r=nr_local_addr_copy(&tmp[n], &addrs[i])))
                ABORT(r);
            ++n;
        }
    }

    *count = n;

    memset(addrs, 0, *count * sizeof(*addrs));
    /* copy temporary array into passed in/out array */
    for (i = 0; i < *count; ++i) {
        if ((r=nr_local_addr_copy(&addrs[i], &tmp[i])))
            ABORT(r);
    }

    _status = 0;
  abort:
    RFREE(tmp);
    return _status;
}
示例#28
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_list_buckets(struct RIACK_CLIENT *client, RIACK_STRING_LIST* bucket_list)
{
	int result;
	struct RIACK_PB_MSG msg_req;
	struct RIACK_PB_MSG *msg_resp;
	RpbListBucketsResp *list_resp;
	ProtobufCAllocator pb_allocator;
	size_t i;

	if (!client || !bucket_list) {
		return RIACK_ERROR_INVALID_INPUT;
	}

	pb_allocator = riack_pb_allocator(&client->allocator);
	result = RIACK_ERROR_COMMUNICATION;

	msg_req.msg_code = mc_RpbListBucketsReq;
	msg_req.msg_len = 0;
	bucket_list->string_count = 0;
	if ((riack_send_message(client, &msg_req) > 0)&&
		(riack_receive_message(client, &msg_resp) > 0)) {
		if (msg_resp->msg_code == mc_RpbListBucketsResp) {
			list_resp = rpb_list_buckets_resp__unpack(&pb_allocator, msg_resp->msg_len, msg_resp->msg);
			if (list_resp) {
				bucket_list->string_count = list_resp->n_buckets;
				bucket_list->strings = (RIACK_STRING*)RMALLOC(client, sizeof(RIACK_STRING) * list_resp->n_buckets);
				for (i=0; i<list_resp->n_buckets; ++i) {
					RMALLOCCOPY(client,
								bucket_list->strings[i].value,
								bucket_list->strings[i].len,
								list_resp->buckets[i].data,
								list_resp->buckets[i].len);
				}
				rpb_list_buckets_resp__free_unpacked(list_resp, &pb_allocator);
				result = RIACK_SUCCESS;
			} else {
				result = RIACK_FAILED_PB_UNPACK;
			}
		} else {
			riack_got_error_response(client, msg_resp);
			result = RIACK_ERROR_RESPONSE;
		}
		riack_message_free(client, &msg_resp);
	}
	return result;
}
示例#29
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_delete(struct RIACK_CLIENT *client, RIACK_STRING bucket, RIACK_STRING key, struct RIACK_DEL_PROPERTIES *props)
{
	int result;
	size_t packed_size;
	struct RIACK_PB_MSG msg_req, *msg_resp;
	RpbDelReq del_req;
	uint8_t *request_buffer;

	if (!client || !bucket.value || !key.value || key.len == 0 || bucket.len == 0) {
		return RIACK_ERROR_INVALID_INPUT;
	}

	result = RIACK_ERROR_COMMUNICATION;
	rpb_del_req__init(&del_req);

	del_req.bucket.len = bucket.len;
	del_req.bucket.data = (uint8_t *) bucket.value;
	del_req.key.len = key.len;
	del_req.key.data = (uint8_t *) key.value;
	riack_set_del_properties(client, props, &del_req);

	packed_size = rpb_del_req__get_packed_size(&del_req);
	request_buffer = (uint8_t*)RMALLOC(client, packed_size);
	if (request_buffer) {
		rpb_del_req__pack(&del_req, request_buffer);
		msg_req.msg_code = mc_RpbDelReq;
		msg_req.msg_len = packed_size;
		msg_req.msg = request_buffer;
		if ((riack_send_message(client, &msg_req) > 0)&&
			(riack_receive_message(client, &msg_resp) > 0))
		{
			if (msg_resp->msg_code == mc_RpbDelResp) {
				result = RIACK_SUCCESS;
			} else {
				riack_got_error_response(client, msg_resp);
				result = RIACK_ERROR_RESPONSE;
			}
			riack_message_free(client, &msg_resp);
		}
		RFREE(client, request_buffer);
	}

    RFREE(client, del_req.vclock.data);
    return result;
}
示例#30
0
文件: riack_kv.c 项目: iehoyeba/riack
int riack_put_simple(struct RIACK_CLIENT *client, char* bucket, char* key, uint8_t* data, size_t datalen, char* content_type)
{
	int result;
	struct RIACK_OBJECT object;
	object.bucket.value = bucket;
	object.bucket.len = strlen(bucket);
	object.key.value = key;
	object.key.len = strlen(key);
	object.vclock.len = 0;
	object.content = (struct RIACK_CONTENT*)RMALLOC(client, sizeof(struct RIACK_CONTENT));
	memset(object.content, 0, sizeof(struct RIACK_CONTENT));
	object.content[0].content_type.value = content_type;
	object.content[0].content_type.len = strlen(content_type);
	object.content[0].data_len = datalen;
	object.content[0].data = data;
	result = riack_put(client, object, 0, (struct RIACK_PUT_PROPERTIES*)0);
	RFREE(client, object.content);
	return result;
}