1mod compact;
2mod delete;
3mod put;
4mod range;
5mod txn;
6
7pub use compact::{CompactRequest, CompactResponse};
8pub use delete::{DeleteRequest, DeleteResponse};
9pub use put::{PutRequest, PutResponse};
10pub use range::{RangeRequest, RangeResponse};
11pub use txn::{TxnCmp, TxnOp, TxnOpResponse, TxnRequest, TxnResponse};
12
13use std::ops::Range;
14
15use async_trait::async_trait;
16
17use crate::lease::LeaseId;
18use crate::proto::mvccpb;
19use crate::Result;
20
21#[async_trait]
22pub trait KeyValueOp {
23 async fn put<R>(&self, req: R) -> Result<PutResponse>
24 where
25 R: Into<PutRequest> + Send;
26
27 async fn get<R>(&self, req: R) -> Result<RangeResponse>
28 where
29 R: Into<RangeRequest> + Send;
30 async fn get_all(&self) -> Result<RangeResponse>;
31 async fn get_by_prefix<K>(&self, p: K) -> Result<RangeResponse>
32 where
33 K: Into<Vec<u8>> + Send;
34 async fn get_range<F, E>(&self, from: F, end: E) -> Result<RangeResponse>
35 where
36 F: Into<Vec<u8>> + Send,
37 E: Into<Vec<u8>> + Send;
38
39 async fn delete<R>(&self, req: R) -> Result<DeleteResponse>
40 where
41 R: Into<DeleteRequest> + Send;
42 async fn delete_all(&self) -> Result<DeleteResponse>;
43 async fn delete_by_prefix<K>(&self, p: K) -> Result<DeleteResponse>
44 where
45 K: Into<Vec<u8>> + Send;
46 async fn delete_range<F, E>(&self, from: F, end: E) -> Result<DeleteResponse>
47 where
48 F: Into<Vec<u8>> + Send,
49 E: Into<Vec<u8>> + Send;
50
51 async fn txn<R>(&self, req: R) -> Result<TxnResponse>
52 where
53 R: Into<TxnRequest> + Send;
54
55 async fn compact<R>(&self, req: R) -> Result<CompactResponse>
56 where
57 R: Into<CompactRequest> + Send;
58}
59
60#[derive(Clone, PartialEq, Default, Debug)]
61pub struct KeyValue {
62 pub key: Vec<u8>,
63 pub value: Vec<u8>,
64 pub create_revision: i64,
65 pub mod_revision: i64,
66 pub version: i64,
67 pub lease: LeaseId,
68}
69
70impl KeyValue {
71 pub fn key_str(&self) -> &str {
72 std::str::from_utf8(&self.key).expect("convert bytes to string")
73 }
74
75 pub fn value_str(&self) -> &str {
76 std::str::from_utf8(&self.value).expect("convert bytes to string")
77 }
78}
79
80impl From<mvccpb::KeyValue> for KeyValue {
81 fn from(proto: mvccpb::KeyValue) -> Self {
82 Self {
83 key: proto.key,
84 value: proto.value,
85 create_revision: proto.create_revision,
86 mod_revision: proto.mod_revision,
87 version: proto.version,
88 lease: proto.lease,
89 }
90 }
91}
92
93pub struct KeyRange {
94 pub key: Vec<u8>,
95 pub range_end: Vec<u8>,
96}
97
98impl KeyRange {
99 pub fn range<K, R>(key: K, range_end: R) -> Self
100 where
101 K: Into<Vec<u8>>,
102 R: Into<Vec<u8>>,
103 {
104 Self {
105 key: key.into(),
106 range_end: range_end.into(),
107 }
108 }
109
110 pub fn key<K>(key: K) -> Self
111 where
112 K: Into<Vec<u8>>,
113 {
114 Self {
115 key: key.into(),
116 range_end: vec![],
117 }
118 }
119
120 pub fn all() -> Self {
121 Self {
122 key: vec![0],
123 range_end: vec![0],
124 }
125 }
126
127 pub fn prefix<K>(prefix: K) -> Self
128 where
129 K: Into<Vec<u8>>,
130 {
131 let key = prefix.into();
132 if key.is_empty() {
133 return KeyRange::all();
134 }
135
136 let range_end = {
137 let mut end = key.clone();
138
139 for i in (0..end.len()).rev() {
140 if end[i] < 0xff {
141 end[i] += 1;
142 end.truncate(i + 1);
143 break;
144 }
145 }
146 end
147 };
148 Self { key, range_end }
149 }
150}
151
152impl<T> From<Range<T>> for KeyRange
153where
154 T: Into<Vec<u8>>,
155{
156 fn from(range: Range<T>) -> Self {
157 Self::range(range.start, range.end)
158 }
159}
160
161impl From<&str> for KeyRange {
162 fn from(k: &str) -> Self {
163 Self::key(k)
164 }
165}
166
167impl From<String> for KeyRange {
168 fn from(k: String) -> Self {
169 Self::key(k)
170 }
171}