Struct opendal::BlockingOperator
source · pub struct BlockingOperator { /* private fields */ }
Expand description
BlockingOperator is the entry for all public blocking APIs.
Read concepts
for know more about Operator
.
§Examples
§Init backends
Read more backend init examples in services
use opendal::services::Fs;
use opendal::BlockingOperator;
use opendal::Operator;
fn main() -> Result<()> {
// Create fs backend builder.
let builder = Fs::default().root("/tmp");
// Build an `BlockingOperator` to start operating the storage.
let _: BlockingOperator = Operator::new(builder)?.finish().blocking();
Ok(())
}
§Init backends with blocking layer
Some services like s3, gcs doesn’t have native blocking supports, we can use layers::BlockingLayer
to wrap the async operator to make it blocking.
use opendal::layers::BlockingLayer;
use opendal::services::S3;
use opendal::BlockingOperator;
use opendal::Operator;
async fn test() -> Result<()> {
// Create fs backend builder.
let mut builder = S3::default().bucket("test").region("us-east-1");
// Build an `BlockingOperator` with blocking layer to start operating the storage.
let _: BlockingOperator = Operator::new(builder)?
.layer(BlockingLayer::create()?)
.finish()
.blocking();
Ok(())
}
Implementations§
source§impl BlockingOperator
impl BlockingOperator
sourcepub fn limit(&self) -> usize
👎Deprecated since 0.52.0: limit is no-op for now
pub fn limit(&self) -> usize
Get current operator’s limit
sourcepub fn with_limit(&self, _: usize) -> Self
👎Deprecated since 0.52.0: limit is no-op for now
pub fn with_limit(&self, _: usize) -> Self
Specify the batch limit.
Default: 1000
sourcepub fn info(&self) -> OperatorInfo
pub fn info(&self) -> OperatorInfo
Get information of underlying accessor.
§Examples
use opendal::BlockingOperator;
let info = op.info();
source§impl BlockingOperator
impl BlockingOperator
§Operator blocking API.
sourcepub fn stat(&self, path: &str) -> Result<Metadata>
pub fn stat(&self, path: &str) -> Result<Metadata>
Get given path’s metadata.
§Behavior
§Services that support create_dir
test
and test/
may vary in some services such as S3. However, on a local file system,
they’re identical. Therefore, the behavior of stat("test")
and stat("test/")
might differ
in certain edge cases. Always use stat("test/")
when you need to access a directory if possible.
Here are the behavior list:
Case | Path | Result |
---|---|---|
stat existing dir | abc/ | Metadata with dir mode |
stat existing file | abc/def_file | Metadata with file mode |
stat dir without / | abc/def_dir | Error NotFound or metadata with dir mode |
stat file with / | abc/def_file/ | Error NotFound |
stat not existing path | xyz | Error NotFound |
Refer to RFC: List Prefix for more details.
§Services that not support create_dir
For services that not support create_dir
, stat("test/")
will return NotFound
even
when test/abc
exists since the service won’t have the concept of dir. There is nothing
we can do about this.
§Examples
§Check if file exists
use opendal::ErrorKind;
if let Err(e) = op.stat("test") {
if e.kind() == ErrorKind::NotFound {
println!("file not exist")
}
}
sourcepub fn stat_with(&self, path: &str) -> FunctionStat
pub fn stat_with(&self, path: &str) -> FunctionStat
Get given path’s metadata with extra options.
§Behavior
§Services that support create_dir
test
and test/
may vary in some services such as S3. However, on a local file system,
they’re identical. Therefore, the behavior of stat("test")
and stat("test/")
might differ
in certain edge cases. Always use stat("test/")
when you need to access a directory if possible.
Here are the behavior list:
Case | Path | Result |
---|---|---|
stat existing dir | abc/ | Metadata with dir mode |
stat existing file | abc/def_file | Metadata with file mode |
stat dir without / | abc/def_dir | Error NotFound or metadata with dir mode |
stat file with / | abc/def_file/ | Error NotFound |
stat not existing path | xyz | Error NotFound |
Refer to RFC: List Prefix for more details.
§Services that not support create_dir
For services that not support create_dir
, stat("test/")
will return NotFound
even
when test/abc
exists since the service won’t have the concept of dir. There is nothing
we can do about this.
§Examples
§Get metadata while ETag
matches
stat_with
will
- return
Ok(metadata)
ifETag
matches - return
Err(error)
anderror.kind() == ErrorKind::ConditionNotMatch
if file exists butETag
mismatch - return
Err(err)
if other errors occur, for example,NotFound
.
use opendal::ErrorKind;
if let Err(e) = op.stat_with("test").if_match("<etag>").call() {
if e.kind() == ErrorKind::ConditionNotMatch {
println!("file exists, but etag mismatch")
}
if e.kind() == ErrorKind::NotFound {
println!("file not exist")
}
}
sourcepub fn exists(&self, path: &str) -> Result<bool>
pub fn exists(&self, path: &str) -> Result<bool>
Check if this path exists or not.
§Example
use anyhow::Result;
use opendal::BlockingOperator;
fn test(op: BlockingOperator) -> Result<()> {
let _ = op.exists("test")?;
Ok(())
}
sourcepub fn is_exist(&self, path: &str) -> Result<bool>
👎Deprecated: rename to exists
for consistence with std::fs::exists
pub fn is_exist(&self, path: &str) -> Result<bool>
exists
for consistence with std::fs::exists
Check if this path exists or not.
§Example
use anyhow::Result;
use opendal::BlockingOperator;
fn test(op: BlockingOperator) -> Result<()> {
let _ = op.is_exist("test")?;
Ok(())
}
sourcepub fn create_dir(&self, path: &str) -> Result<()>
pub fn create_dir(&self, path: &str) -> Result<()>
Create a dir at given path.
§Notes
To indicate that a path is a directory, it is compulsory to include
a trailing / in the path. Failure to do so may result in
NotADirectory
error being returned by OpenDAL.
§Behavior
- Create on existing dir will succeed.
- Create dir is always recursive, works like
mkdir -p
§Examples
op.create_dir("path/to/dir/")?;
sourcepub fn read(&self, path: &str) -> Result<Buffer>
pub fn read(&self, path: &str) -> Result<Buffer>
Read the whole path into a bytes.
This function will allocate a new bytes internally. For more precise memory control or
reading data lazily, please use BlockingOperator::reader
§Examples
let bs = op.read("path/to/file")?;
sourcepub fn read_with(&self, path: &str) -> FunctionRead
pub fn read_with(&self, path: &str) -> FunctionRead
Read the whole path into a bytes with extra options.
This function will allocate a new bytes internally. For more precise memory control or
reading data lazily, please use BlockingOperator::reader
§Examples
use opendal::BlockingOperator;
use opendal::EntryMode;
let bs = op.read_with("path/to/file").range(0..10).call()?;
sourcepub fn reader(&self, path: &str) -> Result<BlockingReader>
pub fn reader(&self, path: &str) -> Result<BlockingReader>
sourcepub fn reader_with(&self, path: &str) -> FunctionReader
pub fn reader_with(&self, path: &str) -> FunctionReader
Create a new reader with extra options
§Examples
use opendal::BlockingOperator;
use opendal::EntryMode;
let r = op
.reader_with("path/to/file")
.version("version_id")
.call()?;
sourcepub fn write_with(&self, path: &str, bs: impl Into<Buffer>) -> FunctionWrite
pub fn write_with(&self, path: &str, bs: impl Into<Buffer>) -> FunctionWrite
sourcepub fn writer(&self, path: &str) -> Result<BlockingWriter>
pub fn writer(&self, path: &str) -> Result<BlockingWriter>
sourcepub fn writer_with(&self, path: &str) -> FunctionWriter
pub fn writer_with(&self, path: &str) -> FunctionWriter
Create a new reader with extra options
§Examples
use opendal::BlockingOperator;
use opendal::EntryMode;
let mut w = op.writer_with("path/to/file").call()?;
w.write(vec![0; 4096])?;
w.write(vec![1; 4096])?;
w.close()?;
sourcepub fn delete_with(&self, path: &str) -> FunctionDelete
pub fn delete_with(&self, path: &str) -> FunctionDelete
sourcepub fn delete_iter<I, D>(&self, iter: I) -> Result<()>where
I: IntoIterator<Item = D>,
D: IntoDeleteInput,
pub fn delete_iter<I, D>(&self, iter: I) -> Result<()>where
I: IntoIterator<Item = D>,
D: IntoDeleteInput,
Delete an infallible iterator of paths.
Also see:
BlockingOperator::delete_try_iter
: delete an fallible iterator of paths.
sourcepub fn delete_try_iter<I, D>(&self, try_iter: I) -> Result<()>
pub fn delete_try_iter<I, D>(&self, try_iter: I) -> Result<()>
Delete a fallible iterator of paths.
Also see:
BlockingOperator::delete_iter
: delete an infallible iterator of paths.
sourcepub fn deleter(&self) -> Result<BlockingDeleter>
pub fn deleter(&self) -> Result<BlockingDeleter>
Create a BlockingDeleter
to continuously remove content from storage.
It leverages batch deletion capabilities provided by storage services for efficient removal.
Users can have more control over the deletion process by using BlockingDeleter
directly.
sourcepub fn remove_via(&self, input: impl Iterator<Item = String>) -> Result<()>
👎Deprecated since 0.52.0: use BlockingOperator::delete_iter
instead
pub fn remove_via(&self, input: impl Iterator<Item = String>) -> Result<()>
BlockingOperator::delete_iter
insteadsourcepub fn remove(&self, paths: Vec<String>) -> Result<()>
👎Deprecated since 0.52.0: use BlockingOperator::delete_iter
instead
pub fn remove(&self, paths: Vec<String>) -> Result<()>
BlockingOperator::delete_iter
insteadsourcepub fn remove_all(&self, path: &str) -> Result<()>
pub fn remove_all(&self, path: &str) -> Result<()>
sourcepub fn list(&self, path: &str) -> Result<Vec<Entry>>
pub fn list(&self, path: &str) -> Result<Vec<Entry>>
List entries that starts with given path
in parent dir.
§Notes
§Recursively List
This function only read the children of the given directory. To read
all entries recursively, use BlockingOperator::list_with("path").recursive(true)
instead.
§Streaming List
This function will read all entries in the given directory. It could take very long time and consume a lot of memory if the directory contains a lot of entries.
In order to avoid this, you can use BlockingOperator::lister
to list entries in
a streaming way.
§Examples
use opendal::BlockingOperator;
use opendal::EntryMode;
let mut entries = op.list("path/to/dir/")?;
for entry in entries {
match entry.metadata().mode() {
EntryMode::FILE => {
println!("Handling file")
}
EntryMode::DIR => {
println!("Handling dir {}", entry.path())
}
EntryMode::Unknown => continue,
}
}
sourcepub fn list_with(&self, path: &str) -> FunctionList
pub fn list_with(&self, path: &str) -> FunctionList
List entries that starts with given path
in parent dir. with options.
§Notes
§Streaming List
This function will read all entries in the given directory. It could take very long time and consume a lot of memory if the directory contains a lot of entries.
In order to avoid this, you can use BlockingOperator::lister
to list entries in
a streaming way.
§Examples
§List entries with prefix
This function can also be used to list entries in recursive way.
use opendal::BlockingOperator;
use opendal::EntryMode;
let mut entries = op.list_with("prefix/").recursive(true).call()?;
for entry in entries {
match entry.metadata().mode() {
EntryMode::FILE => {
println!("Handling file")
}
EntryMode::DIR => {
println!("Handling dir like start a new list via meta.path()")
}
EntryMode::Unknown => continue,
}
}
sourcepub fn lister(&self, path: &str) -> Result<BlockingLister>
pub fn lister(&self, path: &str) -> Result<BlockingLister>
List entries that starts with given path
in parent dir.
This function will create a new BlockingLister
to list entries. Users can stop listing
via dropping this Lister
.
§Notes
§Recursively List
This function only read the children of the given directory. To read
all entries recursively, use BlockingOperator::lister_with
and delimiter("")
instead.
§Examples
use futures::TryStreamExt;
use opendal::BlockingOperator;
use opendal::EntryMode;
let mut ds = op.lister("path/to/dir/")?;
for de in ds {
let de = de?;
match de.metadata().mode() {
EntryMode::FILE => {
println!("Handling file")
}
EntryMode::DIR => {
println!("Handling dir like start a new list via meta.path()")
}
EntryMode::Unknown => continue,
}
}
sourcepub fn lister_with(&self, path: &str) -> FunctionLister
pub fn lister_with(&self, path: &str) -> FunctionLister
List entries within a given directory as an iterator with options.
This function will create a new handle to list entries.
An error will be returned if given path doesn’t end with /
.
§Examples
§List current dir
use futures::TryStreamExt;
use opendal::BlockingOperator;
use opendal::EntryMode;
let mut ds = op
.lister_with("path/to/dir/")
.limit(10)
.start_after("start")
.call()?;
for entry in ds {
let entry = entry?;
match entry.metadata().mode() {
EntryMode::FILE => {
println!("Handling file {}", entry.path())
}
EntryMode::DIR => {
println!("Handling dir {}", entry.path())
}
EntryMode::Unknown => continue,
}
}
§List all files recursively
use futures::TryStreamExt;
use opendal::BlockingOperator;
use opendal::EntryMode;
let mut ds = op.lister_with("path/to/dir/").recursive(true).call()?;
for entry in ds {
let entry = entry?;
match entry.metadata().mode() {
EntryMode::FILE => {
println!("Handling file {}", entry.path())
}
EntryMode::DIR => {
println!("Handling dir {}", entry.path())
}
EntryMode::Unknown => continue,
}
}
Trait Implementations§
source§impl Clone for BlockingOperator
impl Clone for BlockingOperator
source§fn clone(&self) -> BlockingOperator
fn clone(&self) -> BlockingOperator
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for BlockingOperator
impl Debug for BlockingOperator
source§impl From<BlockingOperator> for Operator
impl From<BlockingOperator> for Operator
source§fn from(v: BlockingOperator) -> Self
fn from(v: BlockingOperator) -> Self
Auto Trait Implementations§
impl Freeze for BlockingOperator
impl !RefUnwindSafe for BlockingOperator
impl Send for BlockingOperator
impl Sync for BlockingOperator
impl Unpin for BlockingOperator
impl !UnwindSafe for BlockingOperator
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CompatExt for T
impl<T> CompatExt for T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.