Skip to content

Commit b5b63c0

Browse files
author
xuhui-lu
committed
Add sync API for raw client
Signed-off-by: xuhui-lu <[email protected]>
1 parent 73a00ff commit b5b63c0

File tree

2 files changed

+180
-1
lines changed

2 files changed

+180
-1
lines changed

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ pub use crate::backoff::Backoff;
122122
#[doc(inline)]
123123
pub use crate::kv::{BoundRange, IntoOwnedRange, Key, KvPair, Value};
124124
#[doc(inline)]
125-
pub use crate::raw::{lowering as raw_lowering, Client as RawClient, ColumnFamily};
125+
pub use crate::raw::{lowering as raw_lowering, Client as RawClient, SyncClient, ColumnFamily};
126126
#[doc(inline)]
127127
pub use crate::request::RetryOptions;
128128
#[doc(inline)]

src/raw/client.rs

+179
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::{
1010
request::{Collect, Plan},
1111
BoundRange, ColumnFamily, Key, KvPair, Result, Value,
1212
};
13+
use futures::executor::block_on;
1314
use log::debug;
1415
use std::{sync::Arc, u32};
1516

@@ -159,6 +160,10 @@ impl Client {
159160
plan.execute().await
160161
}
161162

163+
pub fn get_sync(&self, key: impl Into<Key>) -> Result<Option<Value>> {
164+
block_on(self.get(key))
165+
}
166+
162167
/// Create a new 'batch get' request.
163168
///
164169
/// Once resolved this request will result in the fetching of the values associated with the
@@ -193,6 +198,13 @@ impl Client {
193198
.map(|r| r.into_iter().map(Into::into).collect())
194199
}
195200

201+
pub fn batch_get_sync(
202+
&self,
203+
keys: impl IntoIterator<Item = impl Into<Key>>,
204+
) -> Result<Vec<KvPair>> {
205+
block_on(self.batch_get(keys))
206+
}
207+
196208
/// Create a new 'put' request.
197209
///
198210
/// Once resolved this request will result in the setting of the value associated with the given key.
@@ -222,6 +234,10 @@ impl Client {
222234
Ok(())
223235
}
224236

237+
pub fn put_sync(&self, key: impl Into<Key>, value: impl Into<Value>) -> Result<()> {
238+
block_on(self.put(key, value))
239+
}
240+
225241
/// Create a new 'batch put' request.
226242
///
227243
/// Once resolved this request will result in the setting of the values associated with the given keys.
@@ -258,6 +274,10 @@ impl Client {
258274
Ok(())
259275
}
260276

277+
pub fn batch_put_sync(&self, pairs: impl IntoIterator<Item = impl Into<KvPair>>) -> Result<()> {
278+
block_on(self.batch_put(pairs))
279+
}
280+
261281
/// Create a new 'delete' request.
262282
///
263283
/// Once resolved this request will result in the deletion of the given key.
@@ -288,6 +308,10 @@ impl Client {
288308
Ok(())
289309
}
290310

311+
pub fn delete_sync(&self, key: impl Into<Key>) -> Result<()> {
312+
block_on(self.delete(key))
313+
}
314+
291315
/// Create a new 'batch delete' request.
292316
///
293317
/// Once resolved this request will result in the deletion of the given keys.
@@ -319,6 +343,10 @@ impl Client {
319343
Ok(())
320344
}
321345

346+
pub fn batch_delete_sync(&self, keys: impl IntoIterator<Item = impl Into<Key>>) -> Result<()> {
347+
block_on(self.batch_delete(keys))
348+
}
349+
322350
/// Create a new 'delete range' request.
323351
///
324352
/// Once resolved this request will result in the deletion of all keys lying in the given range.
@@ -347,6 +375,10 @@ impl Client {
347375
Ok(())
348376
}
349377

378+
pub fn delete_range_sync(&self, range: impl Into<BoundRange>) -> Result<()> {
379+
block_on(self.delete_range(range))
380+
}
381+
350382
/// Create a new 'scan' request.
351383
///
352384
/// Once resolved this request will result in a `Vec` of key-value pairs that lies in the specified range.
@@ -371,6 +403,10 @@ impl Client {
371403
self.scan_inner(range.into(), limit, false).await
372404
}
373405

406+
pub fn scan_sync(&self, range: impl Into<BoundRange>, limit: u32) -> Result<Vec<KvPair>> {
407+
block_on(self.scan(range, limit))
408+
}
409+
374410
/// Create a new 'scan' request that only returns the keys.
375411
///
376412
/// Once resolved this request will result in a `Vec` of keys that lies in the specified range.
@@ -400,6 +436,10 @@ impl Client {
400436
.collect())
401437
}
402438

439+
pub fn scan_keys_sync(&self, range: impl Into<BoundRange>, limit: u32) -> Result<Vec<Key>> {
440+
block_on(self.scan_keys(range, limit))
441+
}
442+
403443
/// Create a new 'batch scan' request.
404444
///
405445
/// Once resolved this request will result in a set of scanners over the given keys.
@@ -432,6 +472,14 @@ impl Client {
432472
self.batch_scan_inner(ranges, each_limit, false).await
433473
}
434474

475+
pub fn batch_scan_sync(
476+
&self,
477+
ranges: impl IntoIterator<Item = impl Into<BoundRange>>,
478+
each_limit: u32,
479+
) -> Result<Vec<KvPair>> {
480+
block_on(self.batch_scan(ranges, each_limit))
481+
}
482+
435483
/// Create a new 'batch scan' request that only returns the keys.
436484
///
437485
/// Once resolved this request will result in a set of scanners over the given keys.
@@ -468,6 +516,14 @@ impl Client {
468516
.collect())
469517
}
470518

519+
pub fn batch_scan_keys_sync(
520+
&self,
521+
ranges: impl IntoIterator<Item = impl Into<BoundRange>>,
522+
each_limit: u32,
523+
) -> Result<Vec<Key>> {
524+
block_on(self.batch_scan_keys(ranges, each_limit))
525+
}
526+
471527
/// Create a new *atomic* 'compare and set' request.
472528
///
473529
/// Once resolved this request will result in an atomic `compare and set'
@@ -502,6 +558,15 @@ impl Client {
502558
plan.execute().await
503559
}
504560

561+
pub async fn compare_and_swap_sync(
562+
&self,
563+
key: impl Into<Key>,
564+
previous_value: impl Into<Option<Value>>,
565+
new_value: impl Into<Value>,
566+
) -> Result<(Option<Value>, bool)> {
567+
block_on(self.compare_and_swap(key, previous_value, new_value))
568+
}
569+
505570
async fn scan_inner(
506571
&self,
507572
range: impl Into<BoundRange>,
@@ -563,3 +628,117 @@ impl Client {
563628
self.atomic.then(|| ()).ok_or(Error::UnsupportedMode)
564629
}
565630
}
631+
632+
#[derive(Clone)]
633+
pub struct SyncClient {
634+
client: Client,
635+
}
636+
637+
impl SyncClient {
638+
/// The Sync version of Client
639+
///
640+
/// # Examples
641+
///
642+
/// ```rust,no_run
643+
/// # use tikv_client::SyncClient;
644+
/// let client = SyncClient::new(vec!["192.168.0.100"]).await.unwrap();
645+
/// ```
646+
pub async fn new<S: Into<String>>(pd_endpoints: Vec<S>) -> Result<Client> {
647+
Self::new_with_config(pd_endpoints, Config::default()).await
648+
}
649+
650+
pub async fn new_with_config<S: Into<String>>(
651+
pd_endpoints: Vec<S>,
652+
config: Config,
653+
) -> Result<Client> {
654+
let client = Client::new_with_config(pd_endpoints, config)
655+
Ok(SyncClient {
656+
client: client
657+
})
658+
}
659+
660+
pub fn with_cf(&self, cf: ColumnFamily) -> SyncClient {
661+
SyncClient {
662+
client: self.clietn.with_cf(cf),
663+
}
664+
}
665+
666+
pub fn with_atomic_for_cas(&self) -> SyncClient {
667+
SyncClient {
668+
client: self.client.with_atomic_for_cas()
669+
}
670+
}
671+
672+
pub fn get(&self, key: impl Into<Key>) -> Result<Option<Value>> {
673+
block_on(self.client.get(key))
674+
}
675+
676+
pub fn batch_get(
677+
&self,
678+
keys: impl IntoIterator<Item = impl Into<Key>>,
679+
) -> Result<Vec<KvPair>> {
680+
block_on(self.client.batch_get(keys))
681+
}
682+
683+
pub fn put(&self, key: impl Into<Key>, value: impl Into<Value>) -> Result<()> {
684+
block_on(self.client.put(key, value))
685+
}
686+
687+
pub fn batch_put(&self, pairs: impl IntoIterator<Item = impl Into<KvPair>>) -> Result<()> {
688+
block_on(self.client.batch_put(pairs))
689+
}
690+
691+
pub fn delete(&self, key: impl Into<Key>) -> Result<()> {
692+
block_on(self.client.delete(key))
693+
}
694+
695+
pub fn batch_delete(&self, keys: impl IntoIterator<Item = impl Into<Key>>) -> Result<()> {
696+
block_on(self.client.batch_delete(keys))
697+
}
698+
699+
pub fn delete_range(&self, range: impl Into<BoundRange>) -> Result<()> {
700+
block_on(self.client.delete_range(range))
701+
}
702+
703+
pub fn scan(&self, range: impl Into<BoundRange>, limit: u32) -> Result<Vec<KvPair>> {
704+
block_on(self.client.scan(range, limit))
705+
}
706+
707+
pub fn scan_keys(&self, range: impl Into<BoundRange>, limit: u32) -> Result<Vec<Key>> {
708+
block_on(self.client.scan_keys(range, limit))
709+
}
710+
711+
pub fn batch_scan(
712+
&self,
713+
ranges: impl IntoIterator<Item = impl Into<BoundRange>>,
714+
each_limit: u32,
715+
) -> Result<Vec<KvPair>> {
716+
block_on(self.client.batch_scan(ranges, each_limit))
717+
}
718+
719+
pub fn batch_scan_keys(
720+
&self,
721+
ranges: impl IntoIterator<Item = impl Into<BoundRange>>,
722+
each_limit: u32,
723+
) -> Result<Vec<Key>> {
724+
block_on(self.client.batch_scan_keys(ranges, each_limit))
725+
}
726+
727+
pub fn compare_and_swap(
728+
&self,
729+
key: impl Into<Key>,
730+
previous_value: impl Into<Option<Value>>,
731+
new_value: impl Into<Value>,
732+
) -> Result<(Option<Value>, bool)> {
733+
block_on(self.client.compare_and_swap(key, previous_value, new_value))
734+
}
735+
736+
737+
fn assert_non_atomic(&self) -> Result<()> {
738+
(!self.atomic).then(|| ()).ok_or(Error::UnsupportedMode)
739+
}
740+
741+
fn assert_atomic(&self) -> Result<()> {
742+
self.atomic.then(|| ()).ok_or(Error::UnsupportedMode)
743+
}
744+
}

0 commit comments

Comments
 (0)