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,24 @@
|
|
|
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
|
+
#[cfg(feature = "services-foundationdb")]
|
|
19
|
+
mod backend;
|
|
20
|
+
#[cfg(feature = "services-foundationdb")]
|
|
21
|
+
pub use backend::FoundationdbBuilder as Foundationdb;
|
|
22
|
+
|
|
23
|
+
mod config;
|
|
24
|
+
pub use config::FoundationdbConfig;
|
|
@@ -0,0 +1,299 @@
|
|
|
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::collections::HashMap;
|
|
19
|
+
use std::path::PathBuf;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use log::debug;
|
|
23
|
+
|
|
24
|
+
use http::Uri;
|
|
25
|
+
use percent_encoding::percent_decode_str;
|
|
26
|
+
|
|
27
|
+
use super::core::*;
|
|
28
|
+
use super::delete::FsDeleter;
|
|
29
|
+
use super::lister::FsLister;
|
|
30
|
+
use super::reader::FsReader;
|
|
31
|
+
use super::writer::FsWriter;
|
|
32
|
+
use super::writer::FsWriters;
|
|
33
|
+
use super::FS_SCHEME;
|
|
34
|
+
use crate::raw::*;
|
|
35
|
+
use crate::services::FsConfig;
|
|
36
|
+
use crate::*;
|
|
37
|
+
impl Configurator for FsConfig {
|
|
38
|
+
type Builder = FsBuilder;
|
|
39
|
+
fn from_uri(uri: &Uri, options: &HashMap<String, String>) -> Result<Self> {
|
|
40
|
+
let mut map = options.clone();
|
|
41
|
+
|
|
42
|
+
if !map.contains_key("root") {
|
|
43
|
+
let path = percent_decode_str(uri.path()).decode_utf8_lossy();
|
|
44
|
+
if path.is_empty() || path == "/" {
|
|
45
|
+
return Err(Error::new(
|
|
46
|
+
ErrorKind::ConfigInvalid,
|
|
47
|
+
"fs uri requires absolute path",
|
|
48
|
+
));
|
|
49
|
+
}
|
|
50
|
+
if !path.starts_with('/') {
|
|
51
|
+
return Err(Error::new(
|
|
52
|
+
ErrorKind::ConfigInvalid,
|
|
53
|
+
"fs uri root must be absolute",
|
|
54
|
+
));
|
|
55
|
+
}
|
|
56
|
+
map.insert("root".to_string(), path.to_string());
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
Self::from_iter(map)
|
|
60
|
+
}
|
|
61
|
+
fn into_builder(self) -> Self::Builder {
|
|
62
|
+
FsBuilder { config: self }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// POSIX file system support.
|
|
67
|
+
#[doc = include_str!("docs.md")]
|
|
68
|
+
#[derive(Default, Debug)]
|
|
69
|
+
pub struct FsBuilder {
|
|
70
|
+
config: FsConfig,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
impl FsBuilder {
|
|
74
|
+
/// Set root for backend.
|
|
75
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
76
|
+
self.config.root = if root.is_empty() {
|
|
77
|
+
None
|
|
78
|
+
} else {
|
|
79
|
+
Some(root.to_string())
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
self
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// Set temp dir for atomic write.
|
|
86
|
+
///
|
|
87
|
+
/// # Notes
|
|
88
|
+
///
|
|
89
|
+
/// - When append is enabled, we will not use atomic write
|
|
90
|
+
/// to avoid data loss and performance issue.
|
|
91
|
+
pub fn atomic_write_dir(mut self, dir: &str) -> Self {
|
|
92
|
+
if !dir.is_empty() {
|
|
93
|
+
self.config.atomic_write_dir = Some(dir.to_string());
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
self
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
impl Builder for FsBuilder {
|
|
101
|
+
type Config = FsConfig;
|
|
102
|
+
|
|
103
|
+
fn build(self) -> Result<impl Access> {
|
|
104
|
+
debug!("backend build started: {:?}", &self);
|
|
105
|
+
|
|
106
|
+
let root = match self.config.root.map(PathBuf::from) {
|
|
107
|
+
Some(root) => Ok(root),
|
|
108
|
+
None => Err(Error::new(
|
|
109
|
+
ErrorKind::ConfigInvalid,
|
|
110
|
+
"root is not specified",
|
|
111
|
+
)),
|
|
112
|
+
}?;
|
|
113
|
+
debug!("backend use root {}", root.to_string_lossy());
|
|
114
|
+
|
|
115
|
+
// If root dir is not exist, we must create it.
|
|
116
|
+
if let Err(e) = std::fs::metadata(&root) {
|
|
117
|
+
if e.kind() == std::io::ErrorKind::NotFound {
|
|
118
|
+
std::fs::create_dir_all(&root).map_err(|e| {
|
|
119
|
+
Error::new(ErrorKind::Unexpected, "create root dir failed")
|
|
120
|
+
.with_operation("Builder::build")
|
|
121
|
+
.with_context("root", root.to_string_lossy())
|
|
122
|
+
.set_source(e)
|
|
123
|
+
})?;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
let atomic_write_dir = self.config.atomic_write_dir.map(PathBuf::from);
|
|
128
|
+
|
|
129
|
+
// If atomic write dir is not exist, we must create it.
|
|
130
|
+
if let Some(d) = &atomic_write_dir {
|
|
131
|
+
if let Err(e) = std::fs::metadata(d) {
|
|
132
|
+
if e.kind() == std::io::ErrorKind::NotFound {
|
|
133
|
+
std::fs::create_dir_all(d).map_err(|e| {
|
|
134
|
+
Error::new(ErrorKind::Unexpected, "create atomic write dir failed")
|
|
135
|
+
.with_operation("Builder::build")
|
|
136
|
+
.with_context("atomic_write_dir", d.to_string_lossy())
|
|
137
|
+
.set_source(e)
|
|
138
|
+
})?;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Canonicalize the root directory. This should work since we already know that we can
|
|
144
|
+
// get the metadata of the path.
|
|
145
|
+
let root = root.canonicalize().map_err(|e| {
|
|
146
|
+
Error::new(
|
|
147
|
+
ErrorKind::Unexpected,
|
|
148
|
+
"canonicalize of root directory failed",
|
|
149
|
+
)
|
|
150
|
+
.set_source(e)
|
|
151
|
+
})?;
|
|
152
|
+
|
|
153
|
+
// Canonicalize the atomic_write_dir directory. This should work since we already know that
|
|
154
|
+
// we can get the metadata of the path.
|
|
155
|
+
let atomic_write_dir = atomic_write_dir
|
|
156
|
+
.map(|p| {
|
|
157
|
+
p.canonicalize().map(Some).map_err(|e| {
|
|
158
|
+
Error::new(
|
|
159
|
+
ErrorKind::Unexpected,
|
|
160
|
+
"canonicalize of atomic_write_dir directory failed",
|
|
161
|
+
)
|
|
162
|
+
.with_operation("Builder::build")
|
|
163
|
+
.with_context("root", root.to_string_lossy())
|
|
164
|
+
.set_source(e)
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
.unwrap_or(Ok(None))?;
|
|
168
|
+
|
|
169
|
+
Ok(FsBackend {
|
|
170
|
+
core: Arc::new(FsCore {
|
|
171
|
+
info: {
|
|
172
|
+
let am = AccessorInfo::default();
|
|
173
|
+
am.set_scheme(FS_SCHEME)
|
|
174
|
+
.set_root(&root.to_string_lossy())
|
|
175
|
+
.set_native_capability(Capability {
|
|
176
|
+
stat: true,
|
|
177
|
+
|
|
178
|
+
read: true,
|
|
179
|
+
|
|
180
|
+
write: true,
|
|
181
|
+
write_can_empty: true,
|
|
182
|
+
write_can_append: true,
|
|
183
|
+
write_can_multi: true,
|
|
184
|
+
write_with_if_not_exists: true,
|
|
185
|
+
|
|
186
|
+
create_dir: true,
|
|
187
|
+
delete: true,
|
|
188
|
+
|
|
189
|
+
list: true,
|
|
190
|
+
|
|
191
|
+
copy: true,
|
|
192
|
+
rename: true,
|
|
193
|
+
|
|
194
|
+
shared: true,
|
|
195
|
+
|
|
196
|
+
..Default::default()
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
am.into()
|
|
200
|
+
},
|
|
201
|
+
root,
|
|
202
|
+
atomic_write_dir,
|
|
203
|
+
buf_pool: oio::PooledBuf::new(16).with_initial_capacity(256 * 1024),
|
|
204
|
+
}),
|
|
205
|
+
})
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/// Backend is used to serve `Accessor` support for posix-like fs.
|
|
210
|
+
#[derive(Debug, Clone)]
|
|
211
|
+
pub struct FsBackend {
|
|
212
|
+
core: Arc<FsCore>,
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
impl Access for FsBackend {
|
|
216
|
+
type Reader = FsReader<tokio::fs::File>;
|
|
217
|
+
type Writer = FsWriters;
|
|
218
|
+
type Lister = Option<FsLister<tokio::fs::ReadDir>>;
|
|
219
|
+
type Deleter = oio::OneShotDeleter<FsDeleter>;
|
|
220
|
+
|
|
221
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
222
|
+
self.core.info.clone()
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async fn create_dir(&self, path: &str, _: OpCreateDir) -> Result<RpCreateDir> {
|
|
226
|
+
self.core.fs_create_dir(path).await?;
|
|
227
|
+
Ok(RpCreateDir::default())
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
|
|
231
|
+
let m = self.core.fs_stat(path).await?;
|
|
232
|
+
Ok(RpStat::new(m))
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/// # Notes
|
|
236
|
+
///
|
|
237
|
+
/// There are three ways to get the total file length:
|
|
238
|
+
///
|
|
239
|
+
/// - call std::fs::metadata directly and then open. (400ns)
|
|
240
|
+
/// - open file first, and then use `f.metadata()` (300ns)
|
|
241
|
+
/// - open file first, and then use `seek`. (100ns)
|
|
242
|
+
///
|
|
243
|
+
/// Benchmark could be found [here](https://gist.github.com/Xuanwo/48f9cfbc3022ea5f865388bb62e1a70f)
|
|
244
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
245
|
+
let f = self.core.fs_read(path, &args).await?;
|
|
246
|
+
let r = FsReader::new(
|
|
247
|
+
self.core.clone(),
|
|
248
|
+
f,
|
|
249
|
+
args.range().size().unwrap_or(u64::MAX) as _,
|
|
250
|
+
);
|
|
251
|
+
Ok((RpRead::new(), r))
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async fn write(&self, path: &str, op: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
255
|
+
let is_append = op.append();
|
|
256
|
+
let concurrent = op.concurrent();
|
|
257
|
+
|
|
258
|
+
let writer = FsWriter::create(self.core.clone(), path, op).await?;
|
|
259
|
+
|
|
260
|
+
let writer = if is_append {
|
|
261
|
+
FsWriters::One(writer)
|
|
262
|
+
} else {
|
|
263
|
+
FsWriters::Two(oio::PositionWriter::new(
|
|
264
|
+
self.info().clone(),
|
|
265
|
+
writer,
|
|
266
|
+
concurrent,
|
|
267
|
+
))
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
Ok((RpWrite::default(), writer))
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
274
|
+
Ok((
|
|
275
|
+
RpDelete::default(),
|
|
276
|
+
oio::OneShotDeleter::new(FsDeleter::new(self.core.clone())),
|
|
277
|
+
))
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
|
|
281
|
+
match self.core.fs_list(path).await? {
|
|
282
|
+
Some(f) => {
|
|
283
|
+
let rd = FsLister::new(&self.core.root, path, f);
|
|
284
|
+
Ok((RpList::default(), Some(rd)))
|
|
285
|
+
}
|
|
286
|
+
None => Ok((RpList::default(), None)),
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async fn copy(&self, from: &str, to: &str, _args: OpCopy) -> Result<RpCopy> {
|
|
291
|
+
self.core.fs_copy(from, to).await?;
|
|
292
|
+
Ok(RpCopy::default())
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async fn rename(&self, from: &str, to: &str, _args: OpRename) -> Result<RpRename> {
|
|
296
|
+
self.core.fs_rename(from, to).await?;
|
|
297
|
+
Ok(RpRename::default())
|
|
298
|
+
}
|
|
299
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
|
|
20
|
+
use serde::Deserialize;
|
|
21
|
+
use serde::Serialize;
|
|
22
|
+
|
|
23
|
+
/// config for file system
|
|
24
|
+
#[derive(Default, Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
25
|
+
#[serde(default)]
|
|
26
|
+
#[non_exhaustive]
|
|
27
|
+
pub struct FsConfig {
|
|
28
|
+
/// root dir for backend
|
|
29
|
+
pub root: Option<String>,
|
|
30
|
+
|
|
31
|
+
/// tmp dir for atomic write
|
|
32
|
+
pub atomic_write_dir: Option<String>,
|
|
33
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
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::io::SeekFrom;
|
|
19
|
+
use std::path::Path;
|
|
20
|
+
use std::path::PathBuf;
|
|
21
|
+
use std::sync::Arc;
|
|
22
|
+
|
|
23
|
+
use chrono::DateTime;
|
|
24
|
+
|
|
25
|
+
use super::error::*;
|
|
26
|
+
use crate::raw::*;
|
|
27
|
+
use crate::*;
|
|
28
|
+
|
|
29
|
+
#[derive(Debug)]
|
|
30
|
+
pub struct FsCore {
|
|
31
|
+
pub info: Arc<AccessorInfo>,
|
|
32
|
+
pub root: PathBuf,
|
|
33
|
+
pub atomic_write_dir: Option<PathBuf>,
|
|
34
|
+
pub buf_pool: oio::PooledBuf,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
impl FsCore {
|
|
38
|
+
// Build write path and ensure the parent dirs created
|
|
39
|
+
pub async fn ensure_write_abs_path(&self, parent: &Path, path: &str) -> Result<PathBuf> {
|
|
40
|
+
let p = parent.join(path);
|
|
41
|
+
|
|
42
|
+
// Create dir before write path.
|
|
43
|
+
//
|
|
44
|
+
// TODO(xuanwo): There are many works to do here:
|
|
45
|
+
// - Is it safe to create dir concurrently?
|
|
46
|
+
// - Do we need to extract this logic as new util functions?
|
|
47
|
+
// - Is it better to check the parent dir exists before call mkdir?
|
|
48
|
+
let parent = PathBuf::from(&p)
|
|
49
|
+
.parent()
|
|
50
|
+
.ok_or_else(|| {
|
|
51
|
+
Error::new(
|
|
52
|
+
ErrorKind::Unexpected,
|
|
53
|
+
"path should have parent but not, it must be malformed",
|
|
54
|
+
)
|
|
55
|
+
.with_context("input", p.to_string_lossy())
|
|
56
|
+
})?
|
|
57
|
+
.to_path_buf();
|
|
58
|
+
|
|
59
|
+
tokio::fs::create_dir_all(&parent)
|
|
60
|
+
.await
|
|
61
|
+
.map_err(new_std_io_error)?;
|
|
62
|
+
|
|
63
|
+
Ok(p)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
pub async fn fs_create_dir(&self, path: &str) -> Result<()> {
|
|
67
|
+
let p = self.root.join(path.trim_end_matches('/'));
|
|
68
|
+
tokio::fs::create_dir_all(&p)
|
|
69
|
+
.await
|
|
70
|
+
.map_err(new_std_io_error)?;
|
|
71
|
+
Ok(())
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
pub async fn fs_stat(&self, path: &str) -> Result<Metadata> {
|
|
75
|
+
let p = self.root.join(path.trim_end_matches('/'));
|
|
76
|
+
let meta = tokio::fs::metadata(&p).await.map_err(new_std_io_error)?;
|
|
77
|
+
|
|
78
|
+
let mode = if meta.is_dir() {
|
|
79
|
+
EntryMode::DIR
|
|
80
|
+
} else if meta.is_file() {
|
|
81
|
+
EntryMode::FILE
|
|
82
|
+
} else {
|
|
83
|
+
EntryMode::Unknown
|
|
84
|
+
};
|
|
85
|
+
let m = Metadata::new(mode)
|
|
86
|
+
.with_content_length(meta.len())
|
|
87
|
+
.with_last_modified(
|
|
88
|
+
meta.modified()
|
|
89
|
+
.map(DateTime::from)
|
|
90
|
+
.map_err(new_std_io_error)?,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
Ok(m)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
pub async fn fs_read(&self, path: &str, args: &OpRead) -> Result<tokio::fs::File> {
|
|
97
|
+
let p = self.root.join(path.trim_end_matches('/'));
|
|
98
|
+
|
|
99
|
+
let mut f = tokio::fs::OpenOptions::new()
|
|
100
|
+
.read(true)
|
|
101
|
+
.open(&p)
|
|
102
|
+
.await
|
|
103
|
+
.map_err(new_std_io_error)?;
|
|
104
|
+
|
|
105
|
+
if args.range().offset() != 0 {
|
|
106
|
+
use tokio::io::AsyncSeekExt;
|
|
107
|
+
f.seek(SeekFrom::Start(args.range().offset()))
|
|
108
|
+
.await
|
|
109
|
+
.map_err(new_std_io_error)?;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
Ok(f)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
pub async fn fs_write(&self, path: &PathBuf, op: &OpWrite) -> Result<tokio::fs::File> {
|
|
116
|
+
let mut open_options = tokio::fs::OpenOptions::new();
|
|
117
|
+
if op.if_not_exists() {
|
|
118
|
+
open_options.create_new(true);
|
|
119
|
+
} else {
|
|
120
|
+
open_options.create(true);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
open_options.write(true);
|
|
124
|
+
|
|
125
|
+
if op.append() {
|
|
126
|
+
open_options.append(true);
|
|
127
|
+
} else {
|
|
128
|
+
open_options.truncate(true);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let f = open_options.open(path).await.map_err(parse_error)?;
|
|
132
|
+
|
|
133
|
+
Ok(f)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// This function is used to build a tempfile for writing.
|
|
137
|
+
///
|
|
138
|
+
/// We don't care about the OpWrite since every check should be performed on target path directly.
|
|
139
|
+
pub async fn fs_tempfile_write(
|
|
140
|
+
&self,
|
|
141
|
+
path: &str,
|
|
142
|
+
) -> Result<(tokio::fs::File, Option<PathBuf>)> {
|
|
143
|
+
let Some(atomic_write_dir) = self.atomic_write_dir.as_ref() else {
|
|
144
|
+
return Err(Error::new(ErrorKind::Unexpected, "fs didn't configure atomic_write_dir, but we're still entering the tempfile logic. This might be a bug."));
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
let tmp_path = self
|
|
148
|
+
.ensure_write_abs_path(atomic_write_dir, &build_tmp_path_of(path))
|
|
149
|
+
.await?;
|
|
150
|
+
|
|
151
|
+
let mut open_options = tokio::fs::OpenOptions::new();
|
|
152
|
+
|
|
153
|
+
// tempfile should always be new file.
|
|
154
|
+
open_options.create_new(true);
|
|
155
|
+
open_options.write(true);
|
|
156
|
+
open_options.truncate(true);
|
|
157
|
+
|
|
158
|
+
let f = open_options.open(&tmp_path).await.map_err(parse_error)?;
|
|
159
|
+
|
|
160
|
+
Ok((f, Some(tmp_path)))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
pub async fn fs_list(&self, path: &str) -> Result<Option<tokio::fs::ReadDir>> {
|
|
164
|
+
let p = self.root.join(path.trim_end_matches('/'));
|
|
165
|
+
|
|
166
|
+
match tokio::fs::read_dir(&p).await {
|
|
167
|
+
Ok(rd) => Ok(Some(rd)),
|
|
168
|
+
Err(e) => {
|
|
169
|
+
match e.kind() {
|
|
170
|
+
// Return empty list if the directory not found
|
|
171
|
+
std::io::ErrorKind::NotFound => Ok(None),
|
|
172
|
+
// TODO: enable after our MSRV has been raised to 1.83
|
|
173
|
+
//
|
|
174
|
+
// If the path is not a directory, return an empty list
|
|
175
|
+
//
|
|
176
|
+
// The path could be a file or a symbolic link in this case.
|
|
177
|
+
// Returning a NotADirectory error to the user isn't helpful; instead,
|
|
178
|
+
// providing an empty directory is a more user-friendly. In fact, the dir
|
|
179
|
+
// `path/` does not exist.
|
|
180
|
+
// std::io::ErrorKind::NotADirectory => Ok((RpList::default(), None)),
|
|
181
|
+
_ => {
|
|
182
|
+
// TODO: remove this after we have MSRV 1.83
|
|
183
|
+
#[cfg(unix)]
|
|
184
|
+
if e.raw_os_error() == Some(20) {
|
|
185
|
+
// On unix 20: Not a directory
|
|
186
|
+
return Ok(None);
|
|
187
|
+
}
|
|
188
|
+
#[cfg(windows)]
|
|
189
|
+
if e.raw_os_error() == Some(267) {
|
|
190
|
+
// On windows 267: DIRECTORY
|
|
191
|
+
return Ok(None);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
Err(new_std_io_error(e))
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
pub async fn fs_copy(&self, from: &str, to: &str) -> Result<()> {
|
|
202
|
+
let from = self.root.join(from.trim_end_matches('/'));
|
|
203
|
+
// try to get the metadata of the source file to ensure it exists
|
|
204
|
+
tokio::fs::metadata(&from).await.map_err(new_std_io_error)?;
|
|
205
|
+
|
|
206
|
+
let to = self
|
|
207
|
+
.ensure_write_abs_path(&self.root, to.trim_end_matches('/'))
|
|
208
|
+
.await?;
|
|
209
|
+
|
|
210
|
+
tokio::fs::copy(from, to).await.map_err(new_std_io_error)?;
|
|
211
|
+
Ok(())
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
pub async fn fs_rename(&self, from: &str, to: &str) -> Result<()> {
|
|
215
|
+
let from = self.root.join(from.trim_end_matches('/'));
|
|
216
|
+
tokio::fs::metadata(&from).await.map_err(new_std_io_error)?;
|
|
217
|
+
|
|
218
|
+
let to = self
|
|
219
|
+
.ensure_write_abs_path(&self.root, to.trim_end_matches('/'))
|
|
220
|
+
.await?;
|
|
221
|
+
|
|
222
|
+
tokio::fs::rename(from, to)
|
|
223
|
+
.await
|
|
224
|
+
.map_err(new_std_io_error)?;
|
|
225
|
+
Ok(())
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
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 super::core::*;
|
|
21
|
+
use crate::raw::*;
|
|
22
|
+
use crate::*;
|
|
23
|
+
|
|
24
|
+
pub struct FsDeleter {
|
|
25
|
+
core: Arc<FsCore>,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
impl FsDeleter {
|
|
29
|
+
pub fn new(core: Arc<FsCore>) -> Self {
|
|
30
|
+
Self { core }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
impl oio::OneShotDelete for FsDeleter {
|
|
35
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
36
|
+
let p = self.core.root.join(path.trim_end_matches('/'));
|
|
37
|
+
|
|
38
|
+
let meta = tokio::fs::metadata(&p).await;
|
|
39
|
+
|
|
40
|
+
match meta {
|
|
41
|
+
Ok(meta) => {
|
|
42
|
+
if meta.is_dir() {
|
|
43
|
+
tokio::fs::remove_dir(&p).await.map_err(new_std_io_error)?;
|
|
44
|
+
} else {
|
|
45
|
+
tokio::fs::remove_file(&p).await.map_err(new_std_io_error)?;
|
|
46
|
+
}
|
|
47
|
+
Ok(())
|
|
48
|
+
}
|
|
49
|
+
Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(()),
|
|
50
|
+
Err(err) => Err(new_std_io_error(err)),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [x] append
|
|
9
|
+
- [x] create_dir
|
|
10
|
+
- [x] delete
|
|
11
|
+
- [x] copy
|
|
12
|
+
- [x] rename
|
|
13
|
+
- [x] list
|
|
14
|
+
- [ ] ~~presign~~
|
|
15
|
+
- [x] blocking
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
- `root`: Set the work dir for backend.
|
|
20
|
+
-
|
|
21
|
+
You can refer to [`FsBuilder`]'s docs for more information
|
|
22
|
+
|
|
23
|
+
## Example
|
|
24
|
+
|
|
25
|
+
### Via Builder
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
```rust,no_run
|
|
29
|
+
use std::sync::Arc;
|
|
30
|
+
|
|
31
|
+
use anyhow::Result;
|
|
32
|
+
use opendal::services::Fs;
|
|
33
|
+
use opendal::Operator;
|
|
34
|
+
|
|
35
|
+
#[tokio::main]
|
|
36
|
+
async fn main() -> Result<()> {
|
|
37
|
+
// Create fs backend builder.
|
|
38
|
+
let mut builder = Fs::default()
|
|
39
|
+
// Set the root for fs, all operations will happen under this root.
|
|
40
|
+
//
|
|
41
|
+
// NOTE: the root must be absolute path.
|
|
42
|
+
.root("/tmp");
|
|
43
|
+
|
|
44
|
+
// `Accessor` provides the low level APIs, we will use `Operator` normally.
|
|
45
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
46
|
+
|
|
47
|
+
Ok(())
|
|
48
|
+
}
|
|
49
|
+
```
|