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
87
88
89
90
91
92
93
94
95
96
use core::Command;
use std::vec;
use proto::command;
use std::default::Default;
use commands::common;
pub struct Put {
pub key: vec::Vec<u8>,
pub value: vec::Vec<u8>,
pub new_version: vec::Vec<u8>,
pub current_version: common::Versioning,
pub synchronization: command::Synchronization,
pub integrity: Option<common::Integrity>,
}
impl Default for Put {
fn default() -> Put {
Put { key: vec![],
value: vec![],
new_version: vec![],
current_version: common::Versioning::Match(vec![]),
synchronization: command::Synchronization::WRITEBACK,
integrity: None }
}
}
impl Command<::responses::PutResponse> for Put {
fn build_proto(self) -> (::proto::Command, Option<vec::Vec<u8>>) {
let mut cmd = ::proto::Command::new();
let mut header = ::proto::command::Header::new();
header.set_messageType(command::MessageType::PUT);
cmd.set_header(header);
let mut kv = command::KeyValue::new();
kv.set_key(self.key);
kv.set_newVersion(self.new_version);
kv.set_synchronization(self.synchronization);
match self.current_version {
common::Versioning::Match(v) => kv.set_dbVersion(v),
common::Versioning::Force => kv.set_force(true),
};
match self.integrity {
Some(integrity) => {
kv.set_tag(integrity.tag);
kv.set_algorithm(integrity.algorithm);
},
None => {
kv.set_tag(vec![1,2,3,4]);
kv.set_algorithm(command::Algorithm::SHA1);
},
}
let mut body = command::Body::new();
body.set_keyValue(kv);
cmd.set_body(body);
(cmd, Some(self.value))
}
}