summaryrefslogtreecommitdiff
path: root/example/protocol.cc
blob: e7f2a387f172f2080b2a937d23c53ae966240b69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <msgpack.hpp>
#include <string>
#include <iostream>
#include <sstream>

namespace myprotocol {
	using namespace msgpack::type;
	using msgpack::define;

	struct Get : define< tuple<uint32_t, std::string> > {
		Get() { }
		Get(uint32_t f, const std::string& k) :
			define_type(msgpack_type(f, k)) { }
		uint32_t&    flags() { return get<0>(); }
		std::string& key()   { return get<1>(); }
	};

	struct Put : define< tuple<uint32_t, std::string, raw_ref> > {
		Put() { }
		Put(uint32_t f, const std::string& k, const char* valref, size_t vallen) :
			define_type(msgpack_type( f, k, raw_ref(valref,vallen) )) { }
		uint32_t&    flags() { return get<0>(); }
		std::string& key()   { return get<1>(); }
		raw_ref&     value() { return get<2>(); }
	};

	struct MultiGet : define< std::vector<Get> > {
	};
}


int main(void)
{
	// send Get request
	std::stringstream stream;
	{
		myprotocol::Get req;
		req.flags() = 0;
		req.key()   = "key0";
		msgpack::pack(stream, req);
	}

	stream.seekg(0);

	// receive Get request
	{
		std::string buffer(stream.str());

		msgpack::zone mempool;
		msgpack::object o =
			msgpack::unpack(buffer.data(), buffer.size(), mempool);

		myprotocol::Get req;
		msgpack::convert(req, o);
		std::cout << "received: " << o << std::endl;
	}


	stream.str("");


	// send MultiGet request
	{
		myprotocol::MultiGet req;
		req.push_back( myprotocol::Get(1, "key1") );
		req.push_back( myprotocol::Get(2, "key2") );
		req.push_back( myprotocol::Get(3, "key3") );
		msgpack::pack(stream, req);
	}

	stream.seekg(0);

	// receive MultiGet request
	{
		std::string buffer(stream.str());

		msgpack::zone mempool;
		msgpack::object o =
			msgpack::unpack(buffer.data(), buffer.size(), mempool);

		myprotocol::MultiGet req;
		msgpack::convert(req, o);
		std::cout << "received: " << o << std::endl;
	}
}