This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new b5b7132c4b feat(bindings/c): add opendal_operator_exists and mark 
is_exist deprecated (#5199)
b5b7132c4b is described below

commit b5b7132c4b91c2d5e6dad52b0af46fcedb504f62
Author: Twice <[email protected]>
AuthorDate: Fri Oct 18 14:35:44 2024 +0800

    feat(bindings/c): add opendal_operator_exists and mark is_exist deprecated 
(#5199)
---
 bindings/c/cbindgen.toml     |  3 +++
 bindings/c/include/opendal.h | 64 ++++++++++++++++++++++++++++++++++++++++++++
 bindings/c/src/lib.rs        |  1 +
 bindings/c/src/operator.rs   | 61 ++++++++++++++++++++++++++++++++++++++++-
 bindings/c/src/result.rs     | 16 +++++++++++
 bindings/c/tests/bdd.cpp     |  8 +++---
 6 files changed, 148 insertions(+), 5 deletions(-)

diff --git a/bindings/c/cbindgen.toml b/bindings/c/cbindgen.toml
index aafbb6d5f1..66296943c8 100644
--- a/bindings/c/cbindgen.toml
+++ b/bindings/c/cbindgen.toml
@@ -48,3 +48,6 @@ sys_includes = ["stdint.h", "stddef.h", "stdbool.h"]
 [parse]
 include = ["opendal"]
 parse_deps = true
+
+[fn]
+deprecated_with_note = "__attribute__((deprecated({})))"
diff --git a/bindings/c/include/opendal.h b/bindings/c/include/opendal.h
index 8eeacf7c51..03e3eda759 100644
--- a/bindings/c/include/opendal.h
+++ b/bindings/c/include/opendal.h
@@ -361,6 +361,27 @@ typedef struct opendal_result_is_exist {
   struct opendal_error *error;
 } opendal_result_is_exist;
 
+/**
+ * \brief The result type returned by opendal_operator_exists().
+ *
+ * The result type for opendal_operator_exists(), the field `exists`
+ * contains whether the path exists, and the field `error` contains the
+ * corresponding error. If successful, the `error` field is null.
+ *
+ * \note If the opendal_operator_exists() fails, the `exists` field
+ * will be set to false.
+ */
+typedef struct opendal_result_exists {
+  /**
+   * Whether the path exists
+   */
+  bool exists;
+  /**
+   * The error, if ok, it is null
+   */
+  struct opendal_error *error;
+} opendal_result_exists;
+
 /**
  * \brief The result type returned by opendal_operator_stat().
  *
@@ -1025,9 +1046,52 @@ struct opendal_error *opendal_operator_delete(const 
struct opendal_operator *op,
  *
  * * If the `path` points to NULL, this function panics, i.e. exits with 
information
  */
+__attribute__((deprecated("Use opendal_operator_exists() instead.")))
 struct opendal_result_is_exist opendal_operator_is_exist(const struct 
opendal_operator *op,
                                                          const char *path);
 
+/**
+ * \brief Check whether the path exists.
+ *
+ * If the operation succeeds, no matter the path exists or not,
+ * the error should be a nullptr. Otherwise, the field `exists`
+ * is filled with false, and the error is set
+ *
+ * @param op The opendal_operator created previously
+ * @param path The path you want to check existence
+ * @see opendal_operator
+ * @see opendal_result_exists
+ * @see opendal_error
+ * @return Returns opendal_result_exists, the `exists` field contains whether 
the path exists.
+ * However, it the operation fails, the `exists` will contain false and the 
error will be set.
+ *
+ * # Example
+ *
+ * ```C
+ * // .. you previously wrote some data to path "/mytest/obj"
+ * opendal_result_exists e = opendal_operator_exists(op, "/mytest/obj");
+ * assert(e.error == NULL);
+ * assert(e.exists);
+ *
+ * // but you previously did **not** write any data to path "/yourtest/obj"
+ * opendal_result_exists e = opendal_operator_exists(op, "/yourtest/obj");
+ * assert(e.error == NULL);
+ * assert(!e.exists);
+ * ```
+ *
+ * # Safety
+ *
+ * It is **safe** under the cases below
+ * * The memory pointed to by `path` must contain a valid nul terminator at 
the end of
+ *   the string.
+ *
+ * # Panic
+ *
+ * * If the `path` points to NULL, this function panics, i.e. exits with 
information
+ */
+struct opendal_result_exists opendal_operator_exists(const struct 
opendal_operator *op,
+                                                     const char *path);
+
 /**
  * \brief Stat the path, return its metadata.
  *
diff --git a/bindings/c/src/lib.rs b/bindings/c/src/lib.rs
index ac125b0d42..8ddd6e34c8 100644
--- a/bindings/c/src/lib.rs
+++ b/bindings/c/src/lib.rs
@@ -46,6 +46,7 @@ pub use operator::opendal_operator;
 mod operator_info;
 
 mod result;
+pub use result::opendal_result_exists;
 pub use result::opendal_result_is_exist;
 pub use result::opendal_result_list;
 pub use result::opendal_result_lister_next;
diff --git a/bindings/c/src/operator.rs b/bindings/c/src/operator.rs
index ba03f9c2ae..3aa8b2e2a1 100644
--- a/bindings/c/src/operator.rs
+++ b/bindings/c/src/operator.rs
@@ -519,6 +519,7 @@ pub unsafe extern "C" fn opendal_operator_delete(
 ///
 /// * If the `path` points to NULL, this function panics, i.e. exits with 
information
 #[no_mangle]
+#[deprecated(note = "Use opendal_operator_exists() instead.")]
 pub unsafe extern "C" fn opendal_operator_is_exist(
     op: &opendal_operator,
     path: *const c_char,
@@ -527,7 +528,7 @@ pub unsafe extern "C" fn opendal_operator_is_exist(
     let path = std::ffi::CStr::from_ptr(path)
         .to_str()
         .expect("malformed path");
-    match op.deref().is_exist(path) {
+    match op.deref().exists(path) {
         Ok(e) => opendal_result_is_exist {
             is_exist: e,
             error: std::ptr::null_mut(),
@@ -539,6 +540,64 @@ pub unsafe extern "C" fn opendal_operator_is_exist(
     }
 }
 
+/// \brief Check whether the path exists.
+///
+/// If the operation succeeds, no matter the path exists or not,
+/// the error should be a nullptr. Otherwise, the field `exists`
+/// is filled with false, and the error is set
+///
+/// @param op The opendal_operator created previously
+/// @param path The path you want to check existence
+/// @see opendal_operator
+/// @see opendal_result_exists
+/// @see opendal_error
+/// @return Returns opendal_result_exists, the `exists` field contains whether 
the path exists.
+/// However, it the operation fails, the `exists` will contain false and the 
error will be set.
+///
+/// # Example
+///
+/// ```C
+/// // .. you previously wrote some data to path "/mytest/obj"
+/// opendal_result_exists e = opendal_operator_exists(op, "/mytest/obj");
+/// assert(e.error == NULL);
+/// assert(e.exists);
+///
+/// // but you previously did **not** write any data to path "/yourtest/obj"
+/// opendal_result_exists e = opendal_operator_exists(op, "/yourtest/obj");
+/// assert(e.error == NULL);
+/// assert(!e.exists);
+/// ```
+///
+/// # Safety
+///
+/// It is **safe** under the cases below
+/// * The memory pointed to by `path` must contain a valid nul terminator at 
the end of
+///   the string.
+///
+/// # Panic
+///
+/// * If the `path` points to NULL, this function panics, i.e. exits with 
information
+#[no_mangle]
+pub unsafe extern "C" fn opendal_operator_exists(
+    op: &opendal_operator,
+    path: *const c_char,
+) -> opendal_result_exists {
+    assert!(!path.is_null());
+    let path = std::ffi::CStr::from_ptr(path)
+        .to_str()
+        .expect("malformed path");
+    match op.deref().exists(path) {
+        Ok(e) => opendal_result_exists {
+            exists: e,
+            error: std::ptr::null_mut(),
+        },
+        Err(e) => opendal_result_exists {
+            exists: false,
+            error: opendal_error::new(e),
+        },
+    }
+}
+
 /// \brief Stat the path, return its metadata.
 ///
 /// Error is NULL if successful, otherwise it contains the error code and 
error message.
diff --git a/bindings/c/src/result.rs b/bindings/c/src/result.rs
index e9aede5d47..50a2b2fa5e 100644
--- a/bindings/c/src/result.rs
+++ b/bindings/c/src/result.rs
@@ -70,6 +70,22 @@ pub struct opendal_result_is_exist {
     pub error: *mut opendal_error,
 }
 
+/// \brief The result type returned by opendal_operator_exists().
+///
+/// The result type for opendal_operator_exists(), the field `exists`
+/// contains whether the path exists, and the field `error` contains the
+/// corresponding error. If successful, the `error` field is null.
+///
+/// \note If the opendal_operator_exists() fails, the `exists` field
+/// will be set to false.
+#[repr(C)]
+pub struct opendal_result_exists {
+    /// Whether the path exists
+    pub exists: bool,
+    /// The error, if ok, it is null
+    pub error: *mut opendal_error,
+}
+
 /// \brief The result type returned by opendal_operator_stat().
 ///
 /// The result type for opendal_operator_stat(), the field `meta` contains the 
metadata
diff --git a/bindings/c/tests/bdd.cpp b/bindings/c/tests/bdd.cpp
index 16bea5f10e..be218cf6b3 100644
--- a/bindings/c/tests/bdd.cpp
+++ b/bindings/c/tests/bdd.cpp
@@ -65,9 +65,9 @@ TEST_F(OpendalBddTest, FeatureTest)
     EXPECT_EQ(error, nullptr);
 
     // The blocking file "test" should exist
-    opendal_result_is_exist e = opendal_operator_is_exist(this->p, 
this->path.c_str());
+    opendal_result_exists e = opendal_operator_exists(this->p, 
this->path.c_str());
     EXPECT_EQ(e.error, nullptr);
-    EXPECT_TRUE(e.is_exist);
+    EXPECT_TRUE(e.exists);
 
     // The blocking file "test" entry mode must be file
     opendal_result_stat s = opendal_operator_stat(this->p, this->path.c_str());
@@ -93,9 +93,9 @@ TEST_F(OpendalBddTest, FeatureTest)
     // The blocking file should be deleted
     error = opendal_operator_delete(this->p, this->path.c_str());
     EXPECT_EQ(error, nullptr);
-    e = opendal_operator_is_exist(this->p, this->path.c_str());
+    e = opendal_operator_exists(this->p, this->path.c_str());
     EXPECT_EQ(e.error, nullptr);
-    EXPECT_FALSE(e.is_exist);
+    EXPECT_FALSE(e.exists);
 
     opendal_result_operator_writer writer = opendal_operator_writer(this->p, 
this->path.c_str());
     EXPECT_EQ(writer.error, nullptr);

Reply via email to