opendal 0.1.6.pre.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/Cargo.toml +65 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/performance/mod.rs +32 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- metadata +857 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use bytes::Buf;
|
|
21
|
+
use serde::Deserialize;
|
|
22
|
+
use serde_json::de;
|
|
23
|
+
|
|
24
|
+
use super::core::AzdlsCore;
|
|
25
|
+
use super::error::parse_error;
|
|
26
|
+
use crate::raw::*;
|
|
27
|
+
use crate::*;
|
|
28
|
+
|
|
29
|
+
pub struct AzdlsLister {
|
|
30
|
+
core: Arc<AzdlsCore>,
|
|
31
|
+
|
|
32
|
+
path: String,
|
|
33
|
+
limit: Option<usize>,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
impl AzdlsLister {
|
|
37
|
+
pub fn new(core: Arc<AzdlsCore>, path: String, limit: Option<usize>) -> Self {
|
|
38
|
+
Self { core, path, limit }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
impl oio::PageList for AzdlsLister {
|
|
43
|
+
async fn next_page(&self, ctx: &mut oio::PageContext) -> Result<()> {
|
|
44
|
+
let resp = self
|
|
45
|
+
.core
|
|
46
|
+
.azdls_list(&self.path, &ctx.token, self.limit)
|
|
47
|
+
.await?;
|
|
48
|
+
|
|
49
|
+
// azdls will return not found for not-exist path.
|
|
50
|
+
if resp.status() == http::StatusCode::NOT_FOUND {
|
|
51
|
+
ctx.done = true;
|
|
52
|
+
return Ok(());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if resp.status() != http::StatusCode::OK {
|
|
56
|
+
return Err(parse_error(resp));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Return self at the first page.
|
|
60
|
+
if ctx.token.is_empty() && !ctx.done {
|
|
61
|
+
let e = oio::Entry::new(&self.path, Metadata::new(EntryMode::DIR));
|
|
62
|
+
ctx.entries.push_back(e);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Check whether this list is done.
|
|
66
|
+
if let Some(value) = resp.headers().get("x-ms-continuation") {
|
|
67
|
+
let value = value.to_str().map_err(|err| {
|
|
68
|
+
Error::new(ErrorKind::Unexpected, "header value is not valid string")
|
|
69
|
+
.set_source(err)
|
|
70
|
+
})?;
|
|
71
|
+
ctx.token = value.to_string();
|
|
72
|
+
} else {
|
|
73
|
+
ctx.token = "".to_string();
|
|
74
|
+
ctx.done = true;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let bs = resp.into_body();
|
|
78
|
+
|
|
79
|
+
let output: Output = de::from_reader(bs.reader()).map_err(new_json_deserialize_error)?;
|
|
80
|
+
|
|
81
|
+
for object in output.paths {
|
|
82
|
+
// Azdls will return `"true"` and `"false"` for is_directory.
|
|
83
|
+
let mode = if &object.is_directory == "true" {
|
|
84
|
+
EntryMode::DIR
|
|
85
|
+
} else {
|
|
86
|
+
EntryMode::FILE
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
let meta = Metadata::new(mode)
|
|
90
|
+
// Keep fit with ETag header.
|
|
91
|
+
.with_etag(format!("\"{}\"", &object.etag))
|
|
92
|
+
.with_content_length(object.content_length.parse().map_err(|err| {
|
|
93
|
+
Error::new(ErrorKind::Unexpected, "content length is not valid integer")
|
|
94
|
+
.set_source(err)
|
|
95
|
+
})?)
|
|
96
|
+
.with_last_modified(parse_datetime_from_rfc2822(&object.last_modified)?);
|
|
97
|
+
|
|
98
|
+
let mut path = build_rel_path(&self.core.root, &object.name);
|
|
99
|
+
if mode.is_dir() {
|
|
100
|
+
path += "/"
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
let de = oio::Entry::new(&path, meta);
|
|
104
|
+
|
|
105
|
+
ctx.entries.push_back(de);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
Ok(())
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/// # Examples
|
|
113
|
+
///
|
|
114
|
+
/// ```json
|
|
115
|
+
/// {"paths":[{"contentLength":"1977097","etag":"0x8DACF9B0061305F","group":"$superuser","lastModified":"Sat, 26 Nov 2022 10:43:05 GMT","name":"c3b3ef48-7783-4946-81bc-dc07e1728878/d4ea21d7-a533-4011-8b1f-d0e566d63725","owner":"$superuser","permissions":"rw-r-----"}]}
|
|
116
|
+
/// ```
|
|
117
|
+
#[derive(Default, Debug, Deserialize)]
|
|
118
|
+
#[serde(default)]
|
|
119
|
+
struct Output {
|
|
120
|
+
paths: Vec<Path>,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
#[derive(Default, Debug, Deserialize, PartialEq, Eq)]
|
|
124
|
+
#[serde(default)]
|
|
125
|
+
struct Path {
|
|
126
|
+
#[serde(rename = "contentLength")]
|
|
127
|
+
content_length: String,
|
|
128
|
+
#[serde(rename = "etag")]
|
|
129
|
+
etag: String,
|
|
130
|
+
/// Azdls will return `"true"` and `"false"` for is_directory.
|
|
131
|
+
#[serde(rename = "isDirectory")]
|
|
132
|
+
is_directory: String,
|
|
133
|
+
#[serde(rename = "lastModified")]
|
|
134
|
+
last_modified: String,
|
|
135
|
+
#[serde(rename = "name")]
|
|
136
|
+
name: String,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
#[cfg(test)]
|
|
140
|
+
mod tests {
|
|
141
|
+
use bytes::Bytes;
|
|
142
|
+
|
|
143
|
+
use super::*;
|
|
144
|
+
|
|
145
|
+
#[test]
|
|
146
|
+
fn test_parse_path() {
|
|
147
|
+
let bs = Bytes::from(
|
|
148
|
+
r#"{"paths":[{"contentLength":"1977097","etag":"0x8DACF9B0061305F","group":"$superuser","lastModified":"Sat, 26 Nov 2022 10:43:05 GMT","name":"c3b3ef48-7783-4946-81bc-dc07e1728878/d4ea21d7-a533-4011-8b1f-d0e566d63725","owner":"$superuser","permissions":"rw-r-----"}]}"#,
|
|
149
|
+
);
|
|
150
|
+
let out: Output = de::from_slice(&bs).expect("must success");
|
|
151
|
+
println!("{out:?}");
|
|
152
|
+
|
|
153
|
+
assert_eq!(
|
|
154
|
+
out.paths[0],
|
|
155
|
+
Path {
|
|
156
|
+
content_length: "1977097".to_string(),
|
|
157
|
+
etag: "0x8DACF9B0061305F".to_string(),
|
|
158
|
+
is_directory: "".to_string(),
|
|
159
|
+
last_modified: "Sat, 26 Nov 2022 10:43:05 GMT".to_string(),
|
|
160
|
+
name: "c3b3ef48-7783-4946-81bc-dc07e1728878/d4ea21d7-a533-4011-8b1f-d0e566d63725"
|
|
161
|
+
.to_string()
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
/// Default scheme for azdls service.
|
|
19
|
+
#[cfg(feature = "services-azdls")]
|
|
20
|
+
pub(super) const DEFAULT_SCHEME: &str = "azdls";
|
|
21
|
+
#[cfg(feature = "services-azdls")]
|
|
22
|
+
mod backend;
|
|
23
|
+
#[cfg(feature = "services-azdls")]
|
|
24
|
+
mod core;
|
|
25
|
+
#[cfg(feature = "services-azdls")]
|
|
26
|
+
mod delete;
|
|
27
|
+
#[cfg(feature = "services-azdls")]
|
|
28
|
+
mod error;
|
|
29
|
+
#[cfg(feature = "services-azdls")]
|
|
30
|
+
mod lister;
|
|
31
|
+
#[cfg(feature = "services-azdls")]
|
|
32
|
+
mod writer;
|
|
33
|
+
|
|
34
|
+
#[cfg(feature = "services-azdls")]
|
|
35
|
+
pub use backend::AzdlsBuilder as Azdls;
|
|
36
|
+
|
|
37
|
+
mod config;
|
|
38
|
+
pub use config::AzdlsConfig;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use http::StatusCode;
|
|
21
|
+
|
|
22
|
+
use super::core::AzdlsCore;
|
|
23
|
+
use super::core::FILE;
|
|
24
|
+
use super::core::X_MS_VERSION_ID;
|
|
25
|
+
use super::error::parse_error;
|
|
26
|
+
use crate::raw::*;
|
|
27
|
+
use crate::*;
|
|
28
|
+
|
|
29
|
+
pub type AzdlsWriters = TwoWays<oio::OneShotWriter<AzdlsWriter>, oio::AppendWriter<AzdlsWriter>>;
|
|
30
|
+
|
|
31
|
+
pub struct AzdlsWriter {
|
|
32
|
+
core: Arc<AzdlsCore>,
|
|
33
|
+
|
|
34
|
+
op: OpWrite,
|
|
35
|
+
path: String,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
impl AzdlsWriter {
|
|
39
|
+
pub fn new(core: Arc<AzdlsCore>, op: OpWrite, path: String) -> Self {
|
|
40
|
+
AzdlsWriter { core, op, path }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fn parse_metadata(headers: &http::HeaderMap) -> Result<Metadata> {
|
|
44
|
+
let mut metadata = Metadata::default();
|
|
45
|
+
|
|
46
|
+
if let Some(last_modified) = parse_last_modified(headers)? {
|
|
47
|
+
metadata.set_last_modified(last_modified);
|
|
48
|
+
}
|
|
49
|
+
let etag = parse_etag(headers)?;
|
|
50
|
+
if let Some(etag) = etag {
|
|
51
|
+
metadata.set_etag(etag);
|
|
52
|
+
}
|
|
53
|
+
let version_id = parse_header_to_str(headers, X_MS_VERSION_ID)?;
|
|
54
|
+
if let Some(version_id) = version_id {
|
|
55
|
+
metadata.set_version(version_id);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Ok(metadata)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
impl oio::OneShotWrite for AzdlsWriter {
|
|
63
|
+
async fn write_once(&self, bs: Buffer) -> Result<Metadata> {
|
|
64
|
+
let resp = self.core.azdls_create(&self.path, FILE, &self.op).await?;
|
|
65
|
+
|
|
66
|
+
let status = resp.status();
|
|
67
|
+
match status {
|
|
68
|
+
StatusCode::CREATED | StatusCode::OK => {}
|
|
69
|
+
_ => {
|
|
70
|
+
return Err(parse_error(resp).with_operation("Backend::azdls_create_request"));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let resp = self
|
|
75
|
+
.core
|
|
76
|
+
.azdls_update(&self.path, Some(bs.len() as u64), 0, bs)
|
|
77
|
+
.await?;
|
|
78
|
+
|
|
79
|
+
let status = resp.status();
|
|
80
|
+
match status {
|
|
81
|
+
StatusCode::OK | StatusCode::ACCEPTED => Ok(Metadata::default()),
|
|
82
|
+
_ => Err(parse_error(resp).with_operation("Backend::azdls_update_request")),
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
impl oio::AppendWrite for AzdlsWriter {
|
|
88
|
+
async fn offset(&self) -> Result<u64> {
|
|
89
|
+
let resp = self.core.azdls_get_properties(&self.path).await?;
|
|
90
|
+
|
|
91
|
+
let status = resp.status();
|
|
92
|
+
let headers = resp.headers();
|
|
93
|
+
|
|
94
|
+
match status {
|
|
95
|
+
StatusCode::OK => Ok(parse_content_length(headers)?.unwrap_or_default()),
|
|
96
|
+
StatusCode::NOT_FOUND => Ok(0),
|
|
97
|
+
_ => Err(parse_error(resp)),
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async fn append(&self, offset: u64, size: u64, body: Buffer) -> Result<Metadata> {
|
|
102
|
+
if offset == 0 {
|
|
103
|
+
let resp = self.core.azdls_create(&self.path, FILE, &self.op).await?;
|
|
104
|
+
let status = resp.status();
|
|
105
|
+
match status {
|
|
106
|
+
StatusCode::CREATED | StatusCode::OK => {}
|
|
107
|
+
_ => {
|
|
108
|
+
return Err(parse_error(resp).with_operation("Backend::azdls_create_request"));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let resp = self
|
|
114
|
+
.core
|
|
115
|
+
.azdls_update(&self.path, Some(size), offset, body)
|
|
116
|
+
.await?;
|
|
117
|
+
|
|
118
|
+
let mut meta = AzdlsWriter::parse_metadata(resp.headers())?;
|
|
119
|
+
let md5 = parse_content_md5(resp.headers())?;
|
|
120
|
+
if let Some(md5) = md5 {
|
|
121
|
+
meta.set_content_md5(md5);
|
|
122
|
+
}
|
|
123
|
+
let status = resp.status();
|
|
124
|
+
match status {
|
|
125
|
+
StatusCode::OK | StatusCode::ACCEPTED => Ok(meta),
|
|
126
|
+
_ => Err(parse_error(resp).with_operation("Backend::azdls_update_request")),
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use http::Response;
|
|
23
|
+
use http::StatusCode;
|
|
24
|
+
use log::debug;
|
|
25
|
+
use reqsign::AzureStorageConfig;
|
|
26
|
+
use reqsign::AzureStorageLoader;
|
|
27
|
+
use reqsign::AzureStorageSigner;
|
|
28
|
+
|
|
29
|
+
use super::core::AzfileCore;
|
|
30
|
+
use super::delete::AzfileDeleter;
|
|
31
|
+
use super::error::parse_error;
|
|
32
|
+
use super::lister::AzfileLister;
|
|
33
|
+
use super::writer::AzfileWriter;
|
|
34
|
+
use super::writer::AzfileWriters;
|
|
35
|
+
use super::DEFAULT_SCHEME;
|
|
36
|
+
use crate::raw::*;
|
|
37
|
+
use crate::services::AzfileConfig;
|
|
38
|
+
use crate::*;
|
|
39
|
+
impl From<AzureStorageConfig> for AzfileConfig {
|
|
40
|
+
fn from(config: AzureStorageConfig) -> Self {
|
|
41
|
+
AzfileConfig {
|
|
42
|
+
account_name: config.account_name,
|
|
43
|
+
account_key: config.account_key,
|
|
44
|
+
sas_token: config.sas_token,
|
|
45
|
+
endpoint: config.endpoint,
|
|
46
|
+
root: None, // root is not part of AzureStorageConfig
|
|
47
|
+
share_name: String::new(), // share_name is not part of AzureStorageConfig
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
impl Configurator for AzfileConfig {
|
|
53
|
+
type Builder = AzfileBuilder;
|
|
54
|
+
|
|
55
|
+
#[allow(deprecated)]
|
|
56
|
+
fn into_builder(self) -> Self::Builder {
|
|
57
|
+
AzfileBuilder {
|
|
58
|
+
config: self,
|
|
59
|
+
http_client: None,
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// Azure File services support.
|
|
65
|
+
#[doc = include_str!("docs.md")]
|
|
66
|
+
#[derive(Default, Clone)]
|
|
67
|
+
pub struct AzfileBuilder {
|
|
68
|
+
config: AzfileConfig,
|
|
69
|
+
|
|
70
|
+
#[deprecated(since = "0.53.0", note = "Use `Operator::update_http_client` instead")]
|
|
71
|
+
http_client: Option<HttpClient>,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
impl Debug for AzfileBuilder {
|
|
75
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
76
|
+
let mut ds = f.debug_struct("AzfileBuilder");
|
|
77
|
+
|
|
78
|
+
ds.field("config", &self.config);
|
|
79
|
+
|
|
80
|
+
ds.finish()
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
impl AzfileBuilder {
|
|
85
|
+
/// Set root of this backend.
|
|
86
|
+
///
|
|
87
|
+
/// All operations will happen under this root.
|
|
88
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
89
|
+
self.config.root = if root.is_empty() {
|
|
90
|
+
None
|
|
91
|
+
} else {
|
|
92
|
+
Some(root.to_string())
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
self
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/// Set endpoint of this backend.
|
|
99
|
+
pub fn endpoint(mut self, endpoint: &str) -> Self {
|
|
100
|
+
if !endpoint.is_empty() {
|
|
101
|
+
// Trim trailing `/` so that we can accept `http://127.0.0.1:9000/`
|
|
102
|
+
self.config.endpoint = Some(endpoint.trim_end_matches('/').to_string());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
self
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/// Set account_name of this backend.
|
|
109
|
+
///
|
|
110
|
+
/// - If account_name is set, we will take user's input first.
|
|
111
|
+
/// - If not, we will try to load it from environment.
|
|
112
|
+
pub fn account_name(mut self, account_name: &str) -> Self {
|
|
113
|
+
if !account_name.is_empty() {
|
|
114
|
+
self.config.account_name = Some(account_name.to_string());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
self
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Set account_key of this backend.
|
|
121
|
+
///
|
|
122
|
+
/// - If account_key is set, we will take user's input first.
|
|
123
|
+
/// - If not, we will try to load it from environment.
|
|
124
|
+
pub fn account_key(mut self, account_key: &str) -> Self {
|
|
125
|
+
if !account_key.is_empty() {
|
|
126
|
+
self.config.account_key = Some(account_key.to_string());
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
self
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// Set file share name of this backend.
|
|
133
|
+
///
|
|
134
|
+
/// # Notes
|
|
135
|
+
/// You can find more about from: <https://learn.microsoft.com/en-us/rest/api/storageservices/operations-on-shares--file-service>
|
|
136
|
+
pub fn share_name(mut self, share_name: &str) -> Self {
|
|
137
|
+
if !share_name.is_empty() {
|
|
138
|
+
self.config.share_name = share_name.to_string();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
self
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/// Specify the http client that used by this service.
|
|
145
|
+
///
|
|
146
|
+
/// # Notes
|
|
147
|
+
///
|
|
148
|
+
/// This API is part of OpenDAL's Raw API. `HttpClient` could be changed
|
|
149
|
+
/// during minor updates.
|
|
150
|
+
#[deprecated(since = "0.53.0", note = "Use `Operator::update_http_client` instead")]
|
|
151
|
+
#[allow(deprecated)]
|
|
152
|
+
pub fn http_client(mut self, client: HttpClient) -> Self {
|
|
153
|
+
self.http_client = Some(client);
|
|
154
|
+
self
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// Create a new `AfileBuilder` instance from an [Azure Storage connection string][1].
|
|
158
|
+
///
|
|
159
|
+
/// [1]: https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string
|
|
160
|
+
///
|
|
161
|
+
/// # Example
|
|
162
|
+
/// ```
|
|
163
|
+
/// use opendal::Builder;
|
|
164
|
+
/// use opendal::services::Azfile;
|
|
165
|
+
///
|
|
166
|
+
/// let conn_str = "AccountName=example;DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net";
|
|
167
|
+
///
|
|
168
|
+
/// let mut config = Azfile::from_connection_string(&conn_str)
|
|
169
|
+
/// .unwrap()
|
|
170
|
+
/// // Add additional configuration if needed
|
|
171
|
+
/// .share_name("myShare")
|
|
172
|
+
/// .build()
|
|
173
|
+
/// .unwrap();
|
|
174
|
+
/// ```
|
|
175
|
+
pub fn from_connection_string(conn_str: &str) -> Result<Self> {
|
|
176
|
+
let config =
|
|
177
|
+
raw::azure_config_from_connection_string(conn_str, raw::AzureStorageService::File)?;
|
|
178
|
+
|
|
179
|
+
Ok(AzfileConfig::from(config).into_builder())
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
impl Builder for AzfileBuilder {
|
|
184
|
+
type Config = AzfileConfig;
|
|
185
|
+
|
|
186
|
+
fn build(self) -> Result<impl Access> {
|
|
187
|
+
debug!("backend build started: {:?}", &self);
|
|
188
|
+
|
|
189
|
+
let root = normalize_root(&self.config.root.unwrap_or_default());
|
|
190
|
+
debug!("backend use root {root}");
|
|
191
|
+
|
|
192
|
+
let endpoint = match &self.config.endpoint {
|
|
193
|
+
Some(endpoint) => Ok(endpoint.clone()),
|
|
194
|
+
None => Err(Error::new(ErrorKind::ConfigInvalid, "endpoint is empty")
|
|
195
|
+
.with_operation("Builder::build")
|
|
196
|
+
.with_context("service", Scheme::Azfile)),
|
|
197
|
+
}?;
|
|
198
|
+
debug!("backend use endpoint {}", &endpoint);
|
|
199
|
+
|
|
200
|
+
let account_name_option = self
|
|
201
|
+
.config
|
|
202
|
+
.account_name
|
|
203
|
+
.clone()
|
|
204
|
+
.or_else(|| raw::azure_account_name_from_endpoint(endpoint.as_str()));
|
|
205
|
+
|
|
206
|
+
let account_name = match account_name_option {
|
|
207
|
+
Some(account_name) => Ok(account_name),
|
|
208
|
+
None => Err(
|
|
209
|
+
Error::new(ErrorKind::ConfigInvalid, "account_name is empty")
|
|
210
|
+
.with_operation("Builder::build")
|
|
211
|
+
.with_context("service", Scheme::Azfile),
|
|
212
|
+
),
|
|
213
|
+
}?;
|
|
214
|
+
|
|
215
|
+
let config_loader = AzureStorageConfig {
|
|
216
|
+
account_name: Some(account_name),
|
|
217
|
+
account_key: self.config.account_key.clone(),
|
|
218
|
+
sas_token: self.config.sas_token.clone(),
|
|
219
|
+
..Default::default()
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
let cred_loader = AzureStorageLoader::new(config_loader);
|
|
223
|
+
let signer = AzureStorageSigner::new();
|
|
224
|
+
Ok(AzfileBackend {
|
|
225
|
+
core: Arc::new(AzfileCore {
|
|
226
|
+
info: {
|
|
227
|
+
let am = AccessorInfo::default();
|
|
228
|
+
am.set_scheme(DEFAULT_SCHEME)
|
|
229
|
+
.set_root(&root)
|
|
230
|
+
.set_native_capability(Capability {
|
|
231
|
+
stat: true,
|
|
232
|
+
|
|
233
|
+
read: true,
|
|
234
|
+
|
|
235
|
+
write: true,
|
|
236
|
+
create_dir: true,
|
|
237
|
+
delete: true,
|
|
238
|
+
rename: true,
|
|
239
|
+
|
|
240
|
+
list: true,
|
|
241
|
+
|
|
242
|
+
shared: true,
|
|
243
|
+
|
|
244
|
+
..Default::default()
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// allow deprecated api here for compatibility
|
|
248
|
+
#[allow(deprecated)]
|
|
249
|
+
if let Some(client) = self.http_client {
|
|
250
|
+
am.update_http_client(|_| client);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
am.into()
|
|
254
|
+
},
|
|
255
|
+
root,
|
|
256
|
+
endpoint,
|
|
257
|
+
loader: cred_loader,
|
|
258
|
+
signer,
|
|
259
|
+
share_name: self.config.share_name.clone(),
|
|
260
|
+
}),
|
|
261
|
+
})
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/// Backend for azfile services.
|
|
266
|
+
#[derive(Debug, Clone)]
|
|
267
|
+
pub struct AzfileBackend {
|
|
268
|
+
core: Arc<AzfileCore>,
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
impl Access for AzfileBackend {
|
|
272
|
+
type Reader = HttpBody;
|
|
273
|
+
type Writer = AzfileWriters;
|
|
274
|
+
type Lister = oio::PageLister<AzfileLister>;
|
|
275
|
+
type Deleter = oio::OneShotDeleter<AzfileDeleter>;
|
|
276
|
+
|
|
277
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
278
|
+
self.core.info.clone()
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
async fn create_dir(&self, path: &str, _: OpCreateDir) -> Result<RpCreateDir> {
|
|
282
|
+
self.core.ensure_parent_dir_exists(path).await?;
|
|
283
|
+
let resp = self.core.azfile_create_dir(path).await?;
|
|
284
|
+
let status = resp.status();
|
|
285
|
+
|
|
286
|
+
match status {
|
|
287
|
+
StatusCode::CREATED => Ok(RpCreateDir::default()),
|
|
288
|
+
_ => {
|
|
289
|
+
// we cannot just check status code because 409 Conflict has two meaning:
|
|
290
|
+
// 1. If a directory by the same name is being deleted when Create Directory is called, the server returns status code 409 (Conflict)
|
|
291
|
+
// 2. If a directory or file with the same name already exists, the operation fails with status code 409 (Conflict).
|
|
292
|
+
// but we just need case 2 (already exists)
|
|
293
|
+
// ref: https://learn.microsoft.com/en-us/rest/api/storageservices/create-directory
|
|
294
|
+
if resp
|
|
295
|
+
.headers()
|
|
296
|
+
.get("x-ms-error-code")
|
|
297
|
+
.map(|value| value.to_str().unwrap_or(""))
|
|
298
|
+
.unwrap_or_else(|| "")
|
|
299
|
+
== "ResourceAlreadyExists"
|
|
300
|
+
{
|
|
301
|
+
Ok(RpCreateDir::default())
|
|
302
|
+
} else {
|
|
303
|
+
Err(parse_error(resp))
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
|
|
310
|
+
let resp = if path.ends_with('/') {
|
|
311
|
+
self.core.azfile_get_directory_properties(path).await?
|
|
312
|
+
} else {
|
|
313
|
+
self.core.azfile_get_file_properties(path).await?
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
let status = resp.status();
|
|
317
|
+
match status {
|
|
318
|
+
StatusCode::OK => {
|
|
319
|
+
let meta = parse_into_metadata(path, resp.headers())?;
|
|
320
|
+
Ok(RpStat::new(meta))
|
|
321
|
+
}
|
|
322
|
+
_ => Err(parse_error(resp)),
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
327
|
+
let resp = self.core.azfile_read(path, args.range()).await?;
|
|
328
|
+
|
|
329
|
+
let status = resp.status();
|
|
330
|
+
match status {
|
|
331
|
+
StatusCode::OK | StatusCode::PARTIAL_CONTENT => Ok((RpRead::new(), resp.into_body())),
|
|
332
|
+
_ => {
|
|
333
|
+
let (part, mut body) = resp.into_parts();
|
|
334
|
+
let buf = body.to_buffer().await?;
|
|
335
|
+
Err(parse_error(Response::from_parts(part, buf)))
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
341
|
+
self.core.ensure_parent_dir_exists(path).await?;
|
|
342
|
+
let w = AzfileWriter::new(self.core.clone(), args.clone(), path.to_string());
|
|
343
|
+
let w = if args.append() {
|
|
344
|
+
AzfileWriters::Two(oio::AppendWriter::new(w))
|
|
345
|
+
} else {
|
|
346
|
+
AzfileWriters::One(oio::OneShotWriter::new(w))
|
|
347
|
+
};
|
|
348
|
+
Ok((RpWrite::default(), w))
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
352
|
+
Ok((
|
|
353
|
+
RpDelete::default(),
|
|
354
|
+
oio::OneShotDeleter::new(AzfileDeleter::new(self.core.clone())),
|
|
355
|
+
))
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
359
|
+
let l = AzfileLister::new(self.core.clone(), path.to_string(), args.limit());
|
|
360
|
+
|
|
361
|
+
Ok((RpList::default(), oio::PageLister::new(l)))
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async fn rename(&self, from: &str, to: &str, _: OpRename) -> Result<RpRename> {
|
|
365
|
+
self.core.ensure_parent_dir_exists(to).await?;
|
|
366
|
+
let resp = self.core.azfile_rename(from, to).await?;
|
|
367
|
+
let status = resp.status();
|
|
368
|
+
match status {
|
|
369
|
+
StatusCode::OK => Ok(RpRename::default()),
|
|
370
|
+
_ => Err(parse_error(resp)),
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|