コード例 #1
0
as_namespace *
as_namespace_get_bymsgfield_unswap(as_msg_field *fp)
{
	return as_namespace_get_bybuf((byte *)fp->data, as_msg_field_get_value_sz_unswap(fp));
}
コード例 #2
0
ファイル: proto.c プロジェクト: Benguang/aerospike-server
void
as_msg_peek( cl_msg *msgp, proto_peek *peek )
{
	memset(peek, 0, sizeof(proto_peek));

	if (msgp == 0) return;

	if (msgp->proto.version != PROTO_VERSION ||
			msgp->proto.type != PROTO_TYPE_AS_MSG) {
		return;
	}

	as_msg *m = &msgp->msg;
	peek->info1 = m->info1;
	peek->info2 = m->info2;

	if (m->n_fields == 0) {
		return;
	}

	int n_fields = m->n_fields;
	bool swap = n_fields < 10 ? false : true;
	if (swap) n_fields = ntohs(n_fields);

	as_msg_field *kdfp = 0;
	as_msg_field *sfp = 0;
	as_msg_field *kfp = 0;
	as_msg_field *nfp = 0;

	// over all the fields
	as_msg_field *mf = (as_msg_field *) m->data;
	uint i = 0;
	for (; i < n_fields ; i++) {
		switch (mf->type) {
			case AS_MSG_FIELD_TYPE_DIGEST_RIPE:
				kdfp = mf;
				break;
			case AS_MSG_FIELD_TYPE_SET:
				sfp = mf;
				break;
			case AS_MSG_FIELD_TYPE_KEY:
				kfp = mf;
				break;
			case AS_MSG_FIELD_TYPE_NAMESPACE:
				nfp = mf;
				break;
		}
		if (swap)
			mf = as_msg_field_get_next_unswap(mf);
		else
			mf = as_msg_field_get_next(mf);
	}

	// find the key
	if (kdfp) {
		peek->keyd = *(cf_digest *)kdfp->data;
	}
	else {
		if (kfp) {
			if (sfp == 0 || as_msg_field_get_value_sz(sfp) == 0) {
				int ksz = swap ? as_msg_field_get_value_sz_unswap(kfp) : as_msg_field_get_value_sz(kfp);
				cf_digest_compute(kfp->data, ksz, &peek->keyd);
			}
			else {
				int ksz = swap ? as_msg_field_get_value_sz_unswap(kfp) : as_msg_field_get_value_sz(kfp);
				int ssz = swap ? as_msg_field_get_value_sz_unswap(sfp) : as_msg_field_get_value_sz(sfp);
				cf_digest_compute2(sfp->data, ssz, kfp->data, ksz, &peek->keyd);
			}
		}
	}

	// find the namespace
	if (nfp) {
		int nsz = swap ? as_msg_field_get_value_sz_unswap(nfp) : as_msg_field_get_value_sz(nfp);
		if (nsz > AS_ID_NAMESPACE_SZ) goto no_ns; // this should be illegal
		for (int i = 0; i < g_config.namespaces; i++) {
			tsvc_namespace_devices *ndev = &g_tsvc_devices_a[i];
			if (ndev->n_sz != nsz) continue;
			if (0 == memcmp(ndev->n_name, nfp->data, nsz)) {
				peek->ns_queue_offset = ndev->queue_offset;
				peek->ns_n_devices = ndev->n_devices;
				/*
				if (peek->info1 & AS_MSG_INFO1_READ) {
					cf_info(AS_PROTO, "read peek %s gives ofst %d n_dev %d",ndev->n_name,peek->ns_queue_offset,peek->ns_n_devices);
				} else {
					cf_info(AS_PROTO, "write peek %s gives ofst %d n_dev %d",ndev->n_name,peek->ns_queue_offset,peek->ns_n_devices);
				}
				*/
				break;
			}
		}
	}
no_ns:

	return;
}