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,68 @@
|
|
|
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::CloudflareKvCore;
|
|
23
|
+
use super::error::parse_error;
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::services::cloudflare_kv::model::CfKvMetadata;
|
|
26
|
+
use crate::*;
|
|
27
|
+
|
|
28
|
+
pub struct CloudflareWriter {
|
|
29
|
+
core: Arc<CloudflareKvCore>,
|
|
30
|
+
path: String,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
impl CloudflareWriter {
|
|
34
|
+
pub fn new(core: Arc<CloudflareKvCore>, path: String) -> Self {
|
|
35
|
+
CloudflareWriter { core, path }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
impl oio::OneShotWrite for CloudflareWriter {
|
|
40
|
+
async fn write_once(&self, bs: Buffer) -> Result<Metadata> {
|
|
41
|
+
let cf_kv_metadata = CfKvMetadata {
|
|
42
|
+
etag: build_tmp_path_of(&self.path),
|
|
43
|
+
last_modified: chrono::Local::now().to_rfc3339(),
|
|
44
|
+
content_length: bs.len(),
|
|
45
|
+
is_dir: self.path.ends_with('/'),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
let resp = self
|
|
49
|
+
.core
|
|
50
|
+
.set(&self.path, bs, cf_kv_metadata.clone())
|
|
51
|
+
.await?;
|
|
52
|
+
|
|
53
|
+
let status = resp.status();
|
|
54
|
+
|
|
55
|
+
match status {
|
|
56
|
+
StatusCode::OK => {
|
|
57
|
+
let mut metadata = Metadata::default();
|
|
58
|
+
metadata.set_etag(&cf_kv_metadata.etag);
|
|
59
|
+
metadata
|
|
60
|
+
.set_last_modified(parse_datetime_from_rfc3339(&cf_kv_metadata.last_modified)?);
|
|
61
|
+
metadata.set_content_length(cf_kv_metadata.content_length as u64);
|
|
62
|
+
|
|
63
|
+
Ok(metadata)
|
|
64
|
+
}
|
|
65
|
+
_ => Err(parse_error(resp)),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
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::Cursor;
|
|
19
|
+
use std::sync::Arc;
|
|
20
|
+
|
|
21
|
+
use compio::dispatcher::Dispatcher;
|
|
22
|
+
use compio::fs::OpenOptions;
|
|
23
|
+
|
|
24
|
+
use super::core::CompfsCore;
|
|
25
|
+
use super::delete::CompfsDeleter;
|
|
26
|
+
use super::lister::CompfsLister;
|
|
27
|
+
use super::reader::CompfsReader;
|
|
28
|
+
use super::writer::CompfsWriter;
|
|
29
|
+
use super::DEFAULT_SCHEME;
|
|
30
|
+
use crate::raw::oio::OneShotDeleter;
|
|
31
|
+
use crate::raw::*;
|
|
32
|
+
use crate::services::CompfsConfig;
|
|
33
|
+
use crate::*;
|
|
34
|
+
impl Configurator for CompfsConfig {
|
|
35
|
+
type Builder = CompfsBuilder;
|
|
36
|
+
fn into_builder(self) -> Self::Builder {
|
|
37
|
+
CompfsBuilder { config: self }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// [`compio`]-based file system support.
|
|
42
|
+
#[derive(Debug, Clone, Default)]
|
|
43
|
+
pub struct CompfsBuilder {
|
|
44
|
+
config: CompfsConfig,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
impl CompfsBuilder {
|
|
48
|
+
/// Set root for Compfs
|
|
49
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
50
|
+
self.config.root = if root.is_empty() {
|
|
51
|
+
None
|
|
52
|
+
} else {
|
|
53
|
+
Some(root.to_string())
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
self
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
impl Builder for CompfsBuilder {
|
|
61
|
+
type Config = CompfsConfig;
|
|
62
|
+
|
|
63
|
+
fn build(self) -> Result<impl Access> {
|
|
64
|
+
let root = match self.config.root {
|
|
65
|
+
Some(root) => Ok(root),
|
|
66
|
+
None => Err(Error::new(
|
|
67
|
+
ErrorKind::ConfigInvalid,
|
|
68
|
+
"root is not specified",
|
|
69
|
+
)),
|
|
70
|
+
}?;
|
|
71
|
+
|
|
72
|
+
// If root dir does not exist, we must create it.
|
|
73
|
+
if let Err(e) = std::fs::metadata(&root) {
|
|
74
|
+
if e.kind() == std::io::ErrorKind::NotFound {
|
|
75
|
+
std::fs::create_dir_all(&root).map_err(|e| {
|
|
76
|
+
Error::new(ErrorKind::Unexpected, "create root dir failed")
|
|
77
|
+
.with_operation("Builder::build")
|
|
78
|
+
.with_context("root", root.as_str())
|
|
79
|
+
.set_source(e)
|
|
80
|
+
})?;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let dispatcher = Dispatcher::new().map_err(|_| {
|
|
85
|
+
Error::new(
|
|
86
|
+
ErrorKind::Unexpected,
|
|
87
|
+
"failed to initiate compio dispatcher",
|
|
88
|
+
)
|
|
89
|
+
})?;
|
|
90
|
+
let core = CompfsCore {
|
|
91
|
+
info: {
|
|
92
|
+
let am = AccessorInfo::default();
|
|
93
|
+
am.set_scheme(DEFAULT_SCHEME)
|
|
94
|
+
.set_root(&root)
|
|
95
|
+
.set_native_capability(Capability {
|
|
96
|
+
stat: true,
|
|
97
|
+
|
|
98
|
+
read: true,
|
|
99
|
+
|
|
100
|
+
write: true,
|
|
101
|
+
write_can_empty: true,
|
|
102
|
+
write_can_multi: true,
|
|
103
|
+
create_dir: true,
|
|
104
|
+
delete: true,
|
|
105
|
+
|
|
106
|
+
list: true,
|
|
107
|
+
|
|
108
|
+
copy: true,
|
|
109
|
+
rename: true,
|
|
110
|
+
|
|
111
|
+
shared: true,
|
|
112
|
+
|
|
113
|
+
..Default::default()
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
am.into()
|
|
117
|
+
},
|
|
118
|
+
root: root.into(),
|
|
119
|
+
dispatcher,
|
|
120
|
+
buf_pool: oio::PooledBuf::new(16),
|
|
121
|
+
};
|
|
122
|
+
Ok(CompfsBackend {
|
|
123
|
+
core: Arc::new(core),
|
|
124
|
+
})
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
#[derive(Debug)]
|
|
129
|
+
pub struct CompfsBackend {
|
|
130
|
+
core: Arc<CompfsCore>,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
impl Access for CompfsBackend {
|
|
134
|
+
type Reader = CompfsReader;
|
|
135
|
+
type Writer = CompfsWriter;
|
|
136
|
+
type Lister = Option<CompfsLister>;
|
|
137
|
+
type Deleter = OneShotDeleter<CompfsDeleter>;
|
|
138
|
+
|
|
139
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
140
|
+
self.core.info.clone()
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async fn create_dir(&self, path: &str, _: OpCreateDir) -> Result<RpCreateDir> {
|
|
144
|
+
let path = self.core.prepare_path(path);
|
|
145
|
+
|
|
146
|
+
self.core
|
|
147
|
+
.exec(move || async move { compio::fs::create_dir_all(path).await })
|
|
148
|
+
.await?;
|
|
149
|
+
|
|
150
|
+
Ok(RpCreateDir::default())
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
|
|
154
|
+
let path = self.core.prepare_path(path);
|
|
155
|
+
|
|
156
|
+
let meta = self
|
|
157
|
+
.core
|
|
158
|
+
.exec(move || async move { compio::fs::metadata(path).await })
|
|
159
|
+
.await?;
|
|
160
|
+
let ty = meta.file_type();
|
|
161
|
+
let mode = if ty.is_dir() {
|
|
162
|
+
EntryMode::DIR
|
|
163
|
+
} else if ty.is_file() {
|
|
164
|
+
EntryMode::FILE
|
|
165
|
+
} else {
|
|
166
|
+
EntryMode::Unknown
|
|
167
|
+
};
|
|
168
|
+
let last_mod = meta.modified().map_err(new_std_io_error)?.into();
|
|
169
|
+
let ret = Metadata::new(mode)
|
|
170
|
+
.with_last_modified(last_mod)
|
|
171
|
+
.with_content_length(meta.len());
|
|
172
|
+
|
|
173
|
+
Ok(RpStat::new(ret))
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
177
|
+
Ok((
|
|
178
|
+
RpDelete::default(),
|
|
179
|
+
OneShotDeleter::new(CompfsDeleter::new(self.core.clone())),
|
|
180
|
+
))
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async fn copy(&self, from: &str, to: &str, _: OpCopy) -> Result<RpCopy> {
|
|
184
|
+
let from = self.core.prepare_path(from);
|
|
185
|
+
let to = self.core.prepare_path(to);
|
|
186
|
+
|
|
187
|
+
self.core
|
|
188
|
+
.exec(move || async move {
|
|
189
|
+
let from = OpenOptions::new().read(true).open(from).await?;
|
|
190
|
+
if let Some(parent) = to.parent() {
|
|
191
|
+
compio::fs::create_dir_all(parent).await?;
|
|
192
|
+
}
|
|
193
|
+
let to = OpenOptions::new()
|
|
194
|
+
.write(true)
|
|
195
|
+
.create(true)
|
|
196
|
+
.truncate(true)
|
|
197
|
+
.open(to)
|
|
198
|
+
.await?;
|
|
199
|
+
|
|
200
|
+
let (mut from, mut to) = (Cursor::new(from), Cursor::new(to));
|
|
201
|
+
compio::io::copy(&mut from, &mut to).await?;
|
|
202
|
+
|
|
203
|
+
Ok(())
|
|
204
|
+
})
|
|
205
|
+
.await?;
|
|
206
|
+
|
|
207
|
+
Ok(RpCopy::default())
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async fn rename(&self, from: &str, to: &str, _: OpRename) -> Result<RpRename> {
|
|
211
|
+
let from = self.core.prepare_path(from);
|
|
212
|
+
let to = self.core.prepare_path(to);
|
|
213
|
+
|
|
214
|
+
self.core
|
|
215
|
+
.exec(move || async move {
|
|
216
|
+
if let Some(parent) = to.parent() {
|
|
217
|
+
compio::fs::create_dir_all(parent).await?;
|
|
218
|
+
}
|
|
219
|
+
compio::fs::rename(from, to).await
|
|
220
|
+
})
|
|
221
|
+
.await?;
|
|
222
|
+
|
|
223
|
+
Ok(RpRename::default())
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async fn read(&self, path: &str, op: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
227
|
+
let path = self.core.prepare_path(path);
|
|
228
|
+
|
|
229
|
+
let file = self
|
|
230
|
+
.core
|
|
231
|
+
.exec(|| async move { compio::fs::OpenOptions::new().read(true).open(&path).await })
|
|
232
|
+
.await?;
|
|
233
|
+
|
|
234
|
+
let r = CompfsReader::new(self.core.clone(), file, op.range());
|
|
235
|
+
Ok((RpRead::new(), r))
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
239
|
+
let path = self.core.prepare_path(path);
|
|
240
|
+
let append = args.append();
|
|
241
|
+
let file = self
|
|
242
|
+
.core
|
|
243
|
+
.exec(move || async move {
|
|
244
|
+
if let Some(parent) = path.parent() {
|
|
245
|
+
compio::fs::create_dir_all(parent).await?;
|
|
246
|
+
}
|
|
247
|
+
let file = compio::fs::OpenOptions::new()
|
|
248
|
+
.create(true)
|
|
249
|
+
.write(true)
|
|
250
|
+
.truncate(!append)
|
|
251
|
+
.open(path)
|
|
252
|
+
.await?;
|
|
253
|
+
let mut file = Cursor::new(file);
|
|
254
|
+
if append {
|
|
255
|
+
let len = file.get_ref().metadata().await?.len();
|
|
256
|
+
file.set_position(len);
|
|
257
|
+
}
|
|
258
|
+
Ok(file)
|
|
259
|
+
})
|
|
260
|
+
.await?;
|
|
261
|
+
|
|
262
|
+
let w = CompfsWriter::new(self.core.clone(), file);
|
|
263
|
+
Ok((RpWrite::new(), w))
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
|
|
267
|
+
let path = self.core.prepare_path(path);
|
|
268
|
+
|
|
269
|
+
let read_dir = match self
|
|
270
|
+
.core
|
|
271
|
+
.exec_blocking({
|
|
272
|
+
let path = path.clone();
|
|
273
|
+
move || std::fs::read_dir(path)
|
|
274
|
+
})
|
|
275
|
+
.await?
|
|
276
|
+
{
|
|
277
|
+
Ok(rd) => rd,
|
|
278
|
+
Err(e) => {
|
|
279
|
+
return if e.kind() == std::io::ErrorKind::NotFound {
|
|
280
|
+
Ok((RpList::default(), None))
|
|
281
|
+
} else {
|
|
282
|
+
Err(new_std_io_error(e))
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
let lister = CompfsLister::new(self.core.clone(), &path, read_dir);
|
|
288
|
+
Ok((RpList::default(), Some(lister)))
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
/// compio-based file system support.
|
|
24
|
+
#[derive(Default, Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
25
|
+
pub struct CompfsConfig {
|
|
26
|
+
/// root of this backend.
|
|
27
|
+
///
|
|
28
|
+
/// All operations will happen under this root.
|
|
29
|
+
pub root: Option<String>,
|
|
30
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
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::future::Future;
|
|
19
|
+
use std::path::PathBuf;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use compio::buf::IoBuf;
|
|
23
|
+
use compio::dispatcher::Dispatcher;
|
|
24
|
+
|
|
25
|
+
use crate::raw::*;
|
|
26
|
+
use crate::*;
|
|
27
|
+
|
|
28
|
+
unsafe impl IoBuf for Buffer {
|
|
29
|
+
fn as_buf_ptr(&self) -> *const u8 {
|
|
30
|
+
self.current().as_ptr()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fn buf_len(&self) -> usize {
|
|
34
|
+
self.current().len()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fn buf_capacity(&self) -> usize {
|
|
38
|
+
// `Bytes` doesn't expose uninitialized capacity, so treat it as the same as `len`
|
|
39
|
+
self.current().len()
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#[derive(Debug)]
|
|
44
|
+
pub(super) struct CompfsCore {
|
|
45
|
+
pub info: Arc<AccessorInfo>,
|
|
46
|
+
|
|
47
|
+
pub root: PathBuf,
|
|
48
|
+
pub dispatcher: Dispatcher,
|
|
49
|
+
pub buf_pool: oio::PooledBuf,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
impl CompfsCore {
|
|
53
|
+
pub fn prepare_path(&self, path: &str) -> PathBuf {
|
|
54
|
+
self.root.join(path.trim_end_matches('/'))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
pub async fn exec<Fn, Fut, R>(&self, f: Fn) -> crate::Result<R>
|
|
58
|
+
where
|
|
59
|
+
Fn: FnOnce() -> Fut + Send + 'static,
|
|
60
|
+
Fut: Future<Output = std::io::Result<R>> + 'static,
|
|
61
|
+
R: Send + 'static,
|
|
62
|
+
{
|
|
63
|
+
self.dispatcher
|
|
64
|
+
.dispatch(f)
|
|
65
|
+
.map_err(|_| Error::new(ErrorKind::Unexpected, "compio spawn io task failed"))?
|
|
66
|
+
.await
|
|
67
|
+
.map_err(|_| Error::new(ErrorKind::Unexpected, "compio task cancelled"))?
|
|
68
|
+
.map_err(new_std_io_error)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
pub async fn exec_blocking<Fn, R>(&self, f: Fn) -> Result<R>
|
|
72
|
+
where
|
|
73
|
+
Fn: FnOnce() -> R + Send + 'static,
|
|
74
|
+
R: Send + 'static,
|
|
75
|
+
{
|
|
76
|
+
self.dispatcher
|
|
77
|
+
.dispatch_blocking(f)
|
|
78
|
+
.map_err(|_| Error::new(ErrorKind::Unexpected, "compio spawn blocking task failed"))?
|
|
79
|
+
.await
|
|
80
|
+
.map_err(|_| Error::new(ErrorKind::Unexpected, "compio task cancelled"))
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// TODO: impl IoVectoredBuf for Buffer
|
|
85
|
+
// impl IoVectoredBuf for Buffer {
|
|
86
|
+
// fn as_dyn_bufs(&self) -> impl Iterator<Item = &dyn IoBuf> {}
|
|
87
|
+
//
|
|
88
|
+
// fn owned_iter(self) -> Result<OwnedIter<impl OwnedIterator<Inner = Self>>, Self> {
|
|
89
|
+
// Ok(OwnedIter::new(BufferIter {
|
|
90
|
+
// current: self.current(),
|
|
91
|
+
// buf: self,
|
|
92
|
+
// }))
|
|
93
|
+
// }
|
|
94
|
+
// }
|
|
95
|
+
|
|
96
|
+
// #[derive(Debug, Clone)]
|
|
97
|
+
// struct BufferIter {
|
|
98
|
+
// buf: Buffer,
|
|
99
|
+
// current: Bytes,
|
|
100
|
+
// }
|
|
101
|
+
|
|
102
|
+
// impl IntoInner for BufferIter {
|
|
103
|
+
// type Inner = Buffer;
|
|
104
|
+
//
|
|
105
|
+
// fn into_inner(self) -> Self::Inner {
|
|
106
|
+
// self.buf
|
|
107
|
+
// }
|
|
108
|
+
// }
|
|
109
|
+
|
|
110
|
+
// impl OwnedIterator for BufferIter {
|
|
111
|
+
// fn next(mut self) -> Result<Self, Self::Inner> {
|
|
112
|
+
// let Some(current) = self.buf.next() else {
|
|
113
|
+
// return Err(self.buf);
|
|
114
|
+
// };
|
|
115
|
+
// self.current = current;
|
|
116
|
+
// Ok(self)
|
|
117
|
+
// }
|
|
118
|
+
//
|
|
119
|
+
// fn current(&self) -> &dyn IoBuf {
|
|
120
|
+
// &self.current
|
|
121
|
+
// }
|
|
122
|
+
// }
|
|
123
|
+
|
|
124
|
+
#[cfg(test)]
|
|
125
|
+
mod tests {
|
|
126
|
+
use bytes::Buf;
|
|
127
|
+
use bytes::Bytes;
|
|
128
|
+
use rand::thread_rng;
|
|
129
|
+
use rand::Rng;
|
|
130
|
+
|
|
131
|
+
use super::*;
|
|
132
|
+
|
|
133
|
+
fn setup_buffer() -> (Buffer, usize, Bytes) {
|
|
134
|
+
let mut rng = thread_rng();
|
|
135
|
+
|
|
136
|
+
let bs = (0..100)
|
|
137
|
+
.map(|_| {
|
|
138
|
+
let len = rng.gen_range(1..100);
|
|
139
|
+
let mut buf = vec![0; len];
|
|
140
|
+
rng.fill(&mut buf[..]);
|
|
141
|
+
Bytes::from(buf)
|
|
142
|
+
})
|
|
143
|
+
.collect::<Vec<_>>();
|
|
144
|
+
|
|
145
|
+
let total_size = bs.iter().map(|b| b.len()).sum::<usize>();
|
|
146
|
+
let total_content = bs.iter().flatten().copied().collect::<Bytes>();
|
|
147
|
+
let buf = Buffer::from(bs);
|
|
148
|
+
|
|
149
|
+
(buf, total_size, total_content)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
#[test]
|
|
153
|
+
fn test_io_buf() {
|
|
154
|
+
let (buf, _len, _bytes) = setup_buffer();
|
|
155
|
+
let slice = IoBuf::as_slice(&buf);
|
|
156
|
+
|
|
157
|
+
assert_eq!(slice, buf.current().chunk())
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -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 CompfsDeleter {
|
|
25
|
+
core: Arc<CompfsCore>,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
impl CompfsDeleter {
|
|
29
|
+
pub fn new(core: Arc<CompfsCore>) -> Self {
|
|
30
|
+
Self { core }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
impl oio::OneShotDelete for CompfsDeleter {
|
|
35
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
36
|
+
let res = if path.ends_with('/') {
|
|
37
|
+
let path = self.core.prepare_path(&path);
|
|
38
|
+
self.core
|
|
39
|
+
.exec(move || async move { compio::fs::remove_dir(path).await })
|
|
40
|
+
.await
|
|
41
|
+
} else {
|
|
42
|
+
let path = self.core.prepare_path(&path);
|
|
43
|
+
self.core
|
|
44
|
+
.exec(move || async move { compio::fs::remove_file(path).await })
|
|
45
|
+
.await
|
|
46
|
+
};
|
|
47
|
+
match res {
|
|
48
|
+
Ok(()) => Ok(()),
|
|
49
|
+
Err(e) if e.kind() == ErrorKind::NotFound => Ok(()),
|
|
50
|
+
Err(e) => Err(e),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
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::fs::ReadDir;
|
|
19
|
+
use std::path::Path;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use super::core::CompfsCore;
|
|
23
|
+
use crate::raw::*;
|
|
24
|
+
use crate::*;
|
|
25
|
+
|
|
26
|
+
#[derive(Debug)]
|
|
27
|
+
pub struct CompfsLister {
|
|
28
|
+
core: Arc<CompfsCore>,
|
|
29
|
+
root: Option<String>,
|
|
30
|
+
read_dir: Option<ReadDir>,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
impl CompfsLister {
|
|
34
|
+
pub(super) fn new(core: Arc<CompfsCore>, root: &Path, read_dir: ReadDir) -> Self {
|
|
35
|
+
let root = normalize(root, &core.root);
|
|
36
|
+
Self {
|
|
37
|
+
core,
|
|
38
|
+
root: Some(root),
|
|
39
|
+
read_dir: Some(read_dir),
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
fn normalize(path: &Path, root: &Path) -> String {
|
|
45
|
+
normalize_path(
|
|
46
|
+
&path
|
|
47
|
+
.strip_prefix(root)
|
|
48
|
+
.expect("cannot fail because the prefix is iterated")
|
|
49
|
+
.to_string_lossy()
|
|
50
|
+
.replace('\\', "/"),
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fn next_entry(read_dir: &mut ReadDir, root: &Path) -> std::io::Result<Option<oio::Entry>> {
|
|
55
|
+
let Some(entry) = read_dir.next().transpose()? else {
|
|
56
|
+
return Ok(None);
|
|
57
|
+
};
|
|
58
|
+
let path = entry.path();
|
|
59
|
+
let rel_path = normalize(&path, root);
|
|
60
|
+
|
|
61
|
+
let file_type = entry.file_type()?;
|
|
62
|
+
|
|
63
|
+
let entry = if file_type.is_file() {
|
|
64
|
+
oio::Entry::new(&rel_path, Metadata::new(EntryMode::FILE))
|
|
65
|
+
} else if file_type.is_dir() {
|
|
66
|
+
oio::Entry::new(&format!("{rel_path}/"), Metadata::new(EntryMode::DIR))
|
|
67
|
+
} else {
|
|
68
|
+
oio::Entry::new(&rel_path, Metadata::new(EntryMode::Unknown))
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
Ok(Some(entry))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
impl oio::List for CompfsLister {
|
|
75
|
+
async fn next(&mut self) -> Result<Option<oio::Entry>> {
|
|
76
|
+
if let Some(root) = self.root.take() {
|
|
77
|
+
return Ok(Some(oio::Entry::new(
|
|
78
|
+
&format!("{root}/"),
|
|
79
|
+
Metadata::new(EntryMode::DIR),
|
|
80
|
+
)));
|
|
81
|
+
}
|
|
82
|
+
let Some(mut read_dir) = self.read_dir.take() else {
|
|
83
|
+
return Ok(None);
|
|
84
|
+
};
|
|
85
|
+
let root = self.core.root.clone();
|
|
86
|
+
let (entry, read_dir) = self
|
|
87
|
+
.core
|
|
88
|
+
.exec_blocking(move || {
|
|
89
|
+
let entry = next_entry(&mut read_dir, &root).map_err(new_std_io_error);
|
|
90
|
+
(entry, read_dir)
|
|
91
|
+
})
|
|
92
|
+
.await?;
|
|
93
|
+
if !matches!(entry, Ok(None)) {
|
|
94
|
+
self.read_dir = Some(read_dir);
|
|
95
|
+
}
|
|
96
|
+
entry
|
|
97
|
+
}
|
|
98
|
+
}
|