inve_etcd/kv/
mod.rs

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}