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,190 @@
|
|
|
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 percent_encoding::percent_decode_str;
|
|
19
|
+
use percent_encoding::utf8_percent_encode;
|
|
20
|
+
use percent_encoding::AsciiSet;
|
|
21
|
+
use percent_encoding::NON_ALPHANUMERIC;
|
|
22
|
+
|
|
23
|
+
use crate::*;
|
|
24
|
+
|
|
25
|
+
/// Parse http uri invalid error in to opendal::Error.
|
|
26
|
+
pub fn new_http_uri_invalid_error(err: http::uri::InvalidUri) -> Error {
|
|
27
|
+
Error::new(ErrorKind::Unexpected, "parse http uri").set_source(err)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// PATH_ENCODE_SET is the encode set for http url path.
|
|
31
|
+
///
|
|
32
|
+
/// This set follows [encodeURIComponent](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) which will encode all non-ASCII characters except `A-Z a-z 0-9 - _ . ! ~ * ' ( )`
|
|
33
|
+
///
|
|
34
|
+
/// There is a special case for `/` in path: we will allow `/` in path as
|
|
35
|
+
/// required by storage services like s3.
|
|
36
|
+
static PATH_ENCODE_SET: AsciiSet = NON_ALPHANUMERIC
|
|
37
|
+
.remove(b'/')
|
|
38
|
+
.remove(b'-')
|
|
39
|
+
.remove(b'_')
|
|
40
|
+
.remove(b'.')
|
|
41
|
+
.remove(b'!')
|
|
42
|
+
.remove(b'~')
|
|
43
|
+
.remove(b'*')
|
|
44
|
+
.remove(b'\'')
|
|
45
|
+
.remove(b'(')
|
|
46
|
+
.remove(b')');
|
|
47
|
+
|
|
48
|
+
/// percent_encode_path will do percent encoding for http encode path.
|
|
49
|
+
///
|
|
50
|
+
/// Follows [encodeURIComponent](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) which will encode all non-ASCII characters except `A-Z a-z 0-9 - _ . ! ~ * ' ( )`
|
|
51
|
+
///
|
|
52
|
+
/// There is a special case for `/` in path: we will allow `/` in path as
|
|
53
|
+
/// required by storage services like s3.
|
|
54
|
+
pub fn percent_encode_path(path: &str) -> String {
|
|
55
|
+
utf8_percent_encode(path, &PATH_ENCODE_SET).to_string()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// percent_decode_path will do percent decoding for http decode path.
|
|
59
|
+
///
|
|
60
|
+
/// If the input is not percent encoded or not valid utf8, return the input.
|
|
61
|
+
pub fn percent_decode_path(path: &str) -> String {
|
|
62
|
+
match percent_decode_str(path).decode_utf8() {
|
|
63
|
+
Ok(v) => v.to_string(),
|
|
64
|
+
Err(_) => path.to_string(),
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// QueryPairsWriter is used to write query pairs to a url.
|
|
69
|
+
pub struct QueryPairsWriter {
|
|
70
|
+
base: String,
|
|
71
|
+
has_query: bool,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
impl QueryPairsWriter {
|
|
75
|
+
/// Create a new QueryPairsWriter with the given base.
|
|
76
|
+
pub fn new(s: &str) -> Self {
|
|
77
|
+
// 256 is the average size we observed of a url
|
|
78
|
+
// in production.
|
|
79
|
+
//
|
|
80
|
+
// We eagerly allocate the string to avoid multiple
|
|
81
|
+
// allocations.
|
|
82
|
+
let mut base = String::with_capacity(256);
|
|
83
|
+
base.push_str(s);
|
|
84
|
+
|
|
85
|
+
Self {
|
|
86
|
+
base,
|
|
87
|
+
has_query: false,
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// Push a new pair of key and value to the url.
|
|
92
|
+
///
|
|
93
|
+
/// The input key and value must already been percent
|
|
94
|
+
/// encoded correctly.
|
|
95
|
+
pub fn push(mut self, key: &str, value: &str) -> Self {
|
|
96
|
+
if self.has_query {
|
|
97
|
+
self.base.push('&');
|
|
98
|
+
} else {
|
|
99
|
+
self.base.push('?');
|
|
100
|
+
self.has_query = true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Append the key and value to the base string
|
|
104
|
+
self.base.push_str(key);
|
|
105
|
+
if !value.is_empty() {
|
|
106
|
+
self.base.push('=');
|
|
107
|
+
self.base.push_str(value);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
self
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/// Finish the url and return it.
|
|
114
|
+
pub fn finish(self) -> String {
|
|
115
|
+
self.base
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
#[cfg(test)]
|
|
120
|
+
mod tests {
|
|
121
|
+
use super::*;
|
|
122
|
+
|
|
123
|
+
#[test]
|
|
124
|
+
fn test_percent_encode_path() {
|
|
125
|
+
let cases = vec![
|
|
126
|
+
(
|
|
127
|
+
"Reserved Characters",
|
|
128
|
+
";,/?:@&=+$",
|
|
129
|
+
"%3B%2C/%3F%3A%40%26%3D%2B%24",
|
|
130
|
+
),
|
|
131
|
+
("Unescaped Characters", "-_.!~*'()", "-_.!~*'()"),
|
|
132
|
+
("Number Sign", "#", "%23"),
|
|
133
|
+
(
|
|
134
|
+
"Alphanumeric Characters + Space",
|
|
135
|
+
"ABC abc 123",
|
|
136
|
+
"ABC%20abc%20123",
|
|
137
|
+
),
|
|
138
|
+
(
|
|
139
|
+
"Unicode",
|
|
140
|
+
"你好,世界!❤",
|
|
141
|
+
"%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%EF%BC%81%E2%9D%A4",
|
|
142
|
+
),
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
for (name, input, expected) in cases {
|
|
146
|
+
let actual = percent_encode_path(input);
|
|
147
|
+
|
|
148
|
+
assert_eq!(actual, expected, "{name}");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
#[test]
|
|
153
|
+
fn test_percent_decode_path() {
|
|
154
|
+
let cases = vec![
|
|
155
|
+
(
|
|
156
|
+
"Reserved Characters",
|
|
157
|
+
"%3B%2C/%3F%3A%40%26%3D%2B%24",
|
|
158
|
+
";,/?:@&=+$",
|
|
159
|
+
),
|
|
160
|
+
("Unescaped Characters", "-_.!~*'()", "-_.!~*'()"),
|
|
161
|
+
("Number Sign", "%23", "#"),
|
|
162
|
+
(
|
|
163
|
+
"Alphanumeric Characters + Space",
|
|
164
|
+
"ABC%20abc%20123",
|
|
165
|
+
"ABC abc 123",
|
|
166
|
+
),
|
|
167
|
+
(
|
|
168
|
+
"Unicode Characters",
|
|
169
|
+
"%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%EF%BC%81%E2%9D%A4",
|
|
170
|
+
"你好,世界!❤",
|
|
171
|
+
),
|
|
172
|
+
(
|
|
173
|
+
"Double Encoded Characters",
|
|
174
|
+
"Double%2520Encoded",
|
|
175
|
+
"Double%20Encoded",
|
|
176
|
+
),
|
|
177
|
+
(
|
|
178
|
+
"Not Percent Encoded Characters",
|
|
179
|
+
"/not percent encoded/path;,/?:@&=+$-",
|
|
180
|
+
"/not percent encoded/path;,/?:@&=+$-",
|
|
181
|
+
),
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
for (name, input, expected) in cases {
|
|
185
|
+
let actual = percent_decode_path(input);
|
|
186
|
+
|
|
187
|
+
assert_eq!(actual, expected, "{name}");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::sync::Arc;
|
|
20
|
+
|
|
21
|
+
use futures::Future;
|
|
22
|
+
|
|
23
|
+
use crate::raw::*;
|
|
24
|
+
use crate::*;
|
|
25
|
+
|
|
26
|
+
/// Layer is used to intercept the operations on the underlying storage.
|
|
27
|
+
///
|
|
28
|
+
/// Struct that implement this trait must accept input `Arc<dyn Accessor>` as inner,
|
|
29
|
+
/// and returns a new `Arc<dyn Accessor>` as output.
|
|
30
|
+
///
|
|
31
|
+
/// All functions in `Accessor` requires `&self`, so it's implementer's responsibility
|
|
32
|
+
/// to maintain the internal mutability. Please also keep in mind that `Accessor`
|
|
33
|
+
/// requires `Send` and `Sync`.
|
|
34
|
+
///
|
|
35
|
+
/// # Notes
|
|
36
|
+
///
|
|
37
|
+
/// ## Inner
|
|
38
|
+
///
|
|
39
|
+
/// It's required to implement `fn inner() -> Option<Arc<dyn Accessor>>` for layer's accessors.
|
|
40
|
+
///
|
|
41
|
+
/// By implement this method, all API calls will be forwarded to inner accessor instead.
|
|
42
|
+
///
|
|
43
|
+
/// # Examples
|
|
44
|
+
///
|
|
45
|
+
/// ```
|
|
46
|
+
/// use std::sync::Arc;
|
|
47
|
+
///
|
|
48
|
+
/// use opendal::raw::*;
|
|
49
|
+
/// use opendal::*;
|
|
50
|
+
///
|
|
51
|
+
/// /// Implement the real accessor logic here.
|
|
52
|
+
/// #[derive(Debug)]
|
|
53
|
+
/// struct TraceAccessor<A: Access> {
|
|
54
|
+
/// inner: A,
|
|
55
|
+
/// }
|
|
56
|
+
///
|
|
57
|
+
/// impl<A: Access> LayeredAccess for TraceAccessor<A> {
|
|
58
|
+
/// type Inner = A;
|
|
59
|
+
/// type Reader = A::Reader;
|
|
60
|
+
/// type Writer = A::Writer;
|
|
61
|
+
/// type Lister = A::Lister;
|
|
62
|
+
/// type Deleter = A::Deleter;
|
|
63
|
+
///
|
|
64
|
+
/// fn inner(&self) -> &Self::Inner {
|
|
65
|
+
/// &self.inner
|
|
66
|
+
/// }
|
|
67
|
+
///
|
|
68
|
+
/// async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
69
|
+
/// self.inner.read(path, args).await
|
|
70
|
+
/// }
|
|
71
|
+
///
|
|
72
|
+
/// async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
73
|
+
/// self.inner.write(path, args).await
|
|
74
|
+
/// }
|
|
75
|
+
///
|
|
76
|
+
/// async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
77
|
+
/// self.inner.list(path, args).await
|
|
78
|
+
/// }
|
|
79
|
+
///
|
|
80
|
+
/// async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
81
|
+
/// self.inner.delete().await
|
|
82
|
+
/// }
|
|
83
|
+
/// }
|
|
84
|
+
///
|
|
85
|
+
/// /// The public struct that exposed to users.
|
|
86
|
+
/// ///
|
|
87
|
+
/// /// Will be used like `op.layer(TraceLayer)`
|
|
88
|
+
/// struct TraceLayer;
|
|
89
|
+
///
|
|
90
|
+
/// impl<A: Access> Layer<A> for TraceLayer {
|
|
91
|
+
/// type LayeredAccess = TraceAccessor<A>;
|
|
92
|
+
///
|
|
93
|
+
/// fn layer(&self, inner: A) -> Self::LayeredAccess {
|
|
94
|
+
/// TraceAccessor { inner }
|
|
95
|
+
/// }
|
|
96
|
+
/// }
|
|
97
|
+
/// ```
|
|
98
|
+
pub trait Layer<A: Access> {
|
|
99
|
+
/// The layered accessor that returned by this layer.
|
|
100
|
+
type LayeredAccess: Access;
|
|
101
|
+
|
|
102
|
+
/// Intercept the operations on the underlying storage.
|
|
103
|
+
fn layer(&self, inner: A) -> Self::LayeredAccess;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// LayeredAccess is layered accessor that forward all not implemented
|
|
107
|
+
/// method to inner.
|
|
108
|
+
#[allow(missing_docs)]
|
|
109
|
+
pub trait LayeredAccess: Send + Sync + Debug + Unpin + 'static {
|
|
110
|
+
type Inner: Access;
|
|
111
|
+
|
|
112
|
+
type Reader: oio::Read;
|
|
113
|
+
type Writer: oio::Write;
|
|
114
|
+
type Lister: oio::List;
|
|
115
|
+
type Deleter: oio::Delete;
|
|
116
|
+
|
|
117
|
+
fn inner(&self) -> &Self::Inner;
|
|
118
|
+
|
|
119
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
120
|
+
self.inner().info()
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
fn create_dir(
|
|
124
|
+
&self,
|
|
125
|
+
path: &str,
|
|
126
|
+
args: OpCreateDir,
|
|
127
|
+
) -> impl Future<Output = Result<RpCreateDir>> + MaybeSend {
|
|
128
|
+
self.inner().create_dir(path, args)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
fn read(
|
|
132
|
+
&self,
|
|
133
|
+
path: &str,
|
|
134
|
+
args: OpRead,
|
|
135
|
+
) -> impl Future<Output = Result<(RpRead, Self::Reader)>> + MaybeSend;
|
|
136
|
+
|
|
137
|
+
fn write(
|
|
138
|
+
&self,
|
|
139
|
+
path: &str,
|
|
140
|
+
args: OpWrite,
|
|
141
|
+
) -> impl Future<Output = Result<(RpWrite, Self::Writer)>> + MaybeSend;
|
|
142
|
+
|
|
143
|
+
fn copy(
|
|
144
|
+
&self,
|
|
145
|
+
from: &str,
|
|
146
|
+
to: &str,
|
|
147
|
+
args: OpCopy,
|
|
148
|
+
) -> impl Future<Output = Result<RpCopy>> + MaybeSend {
|
|
149
|
+
self.inner().copy(from, to, args)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
fn rename(
|
|
153
|
+
&self,
|
|
154
|
+
from: &str,
|
|
155
|
+
to: &str,
|
|
156
|
+
args: OpRename,
|
|
157
|
+
) -> impl Future<Output = Result<RpRename>> + MaybeSend {
|
|
158
|
+
self.inner().rename(from, to, args)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
fn stat(&self, path: &str, args: OpStat) -> impl Future<Output = Result<RpStat>> + MaybeSend {
|
|
162
|
+
self.inner().stat(path, args)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
fn delete(&self) -> impl Future<Output = Result<(RpDelete, Self::Deleter)>> + MaybeSend;
|
|
166
|
+
|
|
167
|
+
fn list(
|
|
168
|
+
&self,
|
|
169
|
+
path: &str,
|
|
170
|
+
args: OpList,
|
|
171
|
+
) -> impl Future<Output = Result<(RpList, Self::Lister)>> + MaybeSend;
|
|
172
|
+
|
|
173
|
+
fn presign(
|
|
174
|
+
&self,
|
|
175
|
+
path: &str,
|
|
176
|
+
args: OpPresign,
|
|
177
|
+
) -> impl Future<Output = Result<RpPresign>> + MaybeSend {
|
|
178
|
+
self.inner().presign(path, args)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
impl<L: LayeredAccess> Access for L {
|
|
183
|
+
type Reader = L::Reader;
|
|
184
|
+
type Writer = L::Writer;
|
|
185
|
+
type Lister = L::Lister;
|
|
186
|
+
type Deleter = L::Deleter;
|
|
187
|
+
|
|
188
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
189
|
+
LayeredAccess::info(self)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async fn create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
|
|
193
|
+
LayeredAccess::create_dir(self, path, args).await
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
197
|
+
LayeredAccess::read(self, path, args).await
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
201
|
+
LayeredAccess::write(self, path, args).await
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async fn copy(&self, from: &str, to: &str, args: OpCopy) -> Result<RpCopy> {
|
|
205
|
+
LayeredAccess::copy(self, from, to, args).await
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async fn rename(&self, from: &str, to: &str, args: OpRename) -> Result<RpRename> {
|
|
209
|
+
LayeredAccess::rename(self, from, to, args).await
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
|
|
213
|
+
LayeredAccess::stat(self, path, args).await
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
217
|
+
LayeredAccess::delete(self).await
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
221
|
+
LayeredAccess::list(self, path, args).await
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
|
|
225
|
+
LayeredAccess::presign(self, path, args).await
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
#[cfg(test)]
|
|
230
|
+
mod tests {
|
|
231
|
+
use std::sync::Arc;
|
|
232
|
+
|
|
233
|
+
use futures::lock::Mutex;
|
|
234
|
+
|
|
235
|
+
use super::*;
|
|
236
|
+
use crate::services::Memory;
|
|
237
|
+
|
|
238
|
+
#[derive(Debug)]
|
|
239
|
+
struct Test<A: Access> {
|
|
240
|
+
#[allow(dead_code)]
|
|
241
|
+
inner: Option<A>,
|
|
242
|
+
stated: Arc<Mutex<bool>>,
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
impl<A: Access> Layer<A> for &Test<A> {
|
|
246
|
+
type LayeredAccess = Test<A>;
|
|
247
|
+
|
|
248
|
+
fn layer(&self, inner: A) -> Self::LayeredAccess {
|
|
249
|
+
Test {
|
|
250
|
+
inner: Some(inner),
|
|
251
|
+
stated: self.stated.clone(),
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
impl<A: Access> Access for Test<A> {
|
|
257
|
+
type Reader = ();
|
|
258
|
+
type Writer = ();
|
|
259
|
+
type Lister = ();
|
|
260
|
+
type Deleter = ();
|
|
261
|
+
|
|
262
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
263
|
+
let am = AccessorInfo::default();
|
|
264
|
+
am.set_scheme("test");
|
|
265
|
+
am.into()
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async fn stat(&self, _: &str, _: OpStat) -> Result<RpStat> {
|
|
269
|
+
let mut x = self.stated.lock().await;
|
|
270
|
+
*x = true;
|
|
271
|
+
|
|
272
|
+
assert!(self.inner.is_some());
|
|
273
|
+
|
|
274
|
+
// We will not call anything here to test the layer.
|
|
275
|
+
Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
#[tokio::test]
|
|
280
|
+
async fn test_layer() {
|
|
281
|
+
let test = Test {
|
|
282
|
+
inner: None,
|
|
283
|
+
stated: Arc::new(Mutex::new(false)),
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
let op = Operator::new(Memory::default())
|
|
287
|
+
.unwrap()
|
|
288
|
+
.layer(&test)
|
|
289
|
+
.finish();
|
|
290
|
+
|
|
291
|
+
op.stat("xxxxx").await.unwrap();
|
|
292
|
+
|
|
293
|
+
assert!(*test.stated.clone().lock().await);
|
|
294
|
+
}
|
|
295
|
+
}
|
data/core/src/raw/mod.rs
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
//! Raw modules provide raw APIs that used by underlying services
|
|
19
|
+
//!
|
|
20
|
+
//! ## Notes
|
|
21
|
+
//!
|
|
22
|
+
//! - Only developers who want to develop new services or layers need to
|
|
23
|
+
//! access raw APIs.
|
|
24
|
+
//! - Raw APIs should only be accessed via `opendal::raw::Xxxx`, any public
|
|
25
|
+
//! API should never expose raw API directly.
|
|
26
|
+
//! - Raw APIs are far less stable than public API, please don't rely on
|
|
27
|
+
//! them whenever possible.
|
|
28
|
+
|
|
29
|
+
mod accessor;
|
|
30
|
+
pub use accessor::*;
|
|
31
|
+
|
|
32
|
+
#[cfg(any(
|
|
33
|
+
feature = "services-azblob",
|
|
34
|
+
feature = "services-azdls",
|
|
35
|
+
feature = "services-azfile"
|
|
36
|
+
))]
|
|
37
|
+
mod azure;
|
|
38
|
+
#[cfg(any(
|
|
39
|
+
feature = "services-azblob",
|
|
40
|
+
feature = "services-azdls",
|
|
41
|
+
feature = "services-azfile"
|
|
42
|
+
))]
|
|
43
|
+
pub(crate) use azure::*;
|
|
44
|
+
|
|
45
|
+
mod layer;
|
|
46
|
+
pub use layer::*;
|
|
47
|
+
|
|
48
|
+
mod path;
|
|
49
|
+
pub use path::*;
|
|
50
|
+
|
|
51
|
+
#[cfg(feature = "internal-path-cache")]
|
|
52
|
+
mod path_cache;
|
|
53
|
+
#[cfg(feature = "internal-path-cache")]
|
|
54
|
+
pub use path_cache::*;
|
|
55
|
+
|
|
56
|
+
mod operation;
|
|
57
|
+
pub use operation::*;
|
|
58
|
+
|
|
59
|
+
mod version;
|
|
60
|
+
pub use version::VERSION;
|
|
61
|
+
|
|
62
|
+
mod rps;
|
|
63
|
+
pub use rps::*;
|
|
64
|
+
|
|
65
|
+
mod ops;
|
|
66
|
+
pub use ops::*;
|
|
67
|
+
|
|
68
|
+
mod http_util;
|
|
69
|
+
pub use http_util::*;
|
|
70
|
+
|
|
71
|
+
mod serde_util;
|
|
72
|
+
pub use serde_util::*;
|
|
73
|
+
|
|
74
|
+
mod chrono_util;
|
|
75
|
+
pub use chrono_util::*;
|
|
76
|
+
|
|
77
|
+
#[cfg(feature = "internal-tokio-rt")]
|
|
78
|
+
mod tokio_util;
|
|
79
|
+
#[cfg(feature = "internal-tokio-rt")]
|
|
80
|
+
pub use tokio_util::*;
|
|
81
|
+
|
|
82
|
+
mod std_io_util;
|
|
83
|
+
pub use std_io_util::*;
|
|
84
|
+
|
|
85
|
+
mod futures_util;
|
|
86
|
+
pub use futures_util::BoxedFuture;
|
|
87
|
+
pub use futures_util::BoxedStaticFuture;
|
|
88
|
+
pub use futures_util::ConcurrentTasks;
|
|
89
|
+
pub use futures_util::MaybeSend;
|
|
90
|
+
|
|
91
|
+
mod enum_utils;
|
|
92
|
+
pub use enum_utils::*;
|
|
93
|
+
|
|
94
|
+
mod atomic_util;
|
|
95
|
+
pub use atomic_util::*;
|
|
96
|
+
|
|
97
|
+
// Expose as a pub mod to avoid confusing.
|
|
98
|
+
pub mod adapters;
|
|
99
|
+
pub mod oio;
|
|
100
|
+
#[cfg(feature = "tests")]
|
|
101
|
+
pub mod tests;
|
|
@@ -0,0 +1,118 @@
|
|
|
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 bytes::Buf;
|
|
19
|
+
use bytes::BufMut;
|
|
20
|
+
use bytes::Bytes;
|
|
21
|
+
use bytes::BytesMut;
|
|
22
|
+
|
|
23
|
+
/// FlexBuf is a buffer that support frozen bytes and reuse existing allocated memory.
|
|
24
|
+
///
|
|
25
|
+
/// It's useful when we want to freeze the buffer and reuse the memory for the next buffer.
|
|
26
|
+
pub struct FlexBuf {
|
|
27
|
+
/// Already allocated memory size of `buf`.
|
|
28
|
+
cap: usize,
|
|
29
|
+
/// Already written bytes length inside `buf`.
|
|
30
|
+
len: usize,
|
|
31
|
+
buf: BytesMut,
|
|
32
|
+
frozen: Option<Bytes>,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
impl FlexBuf {
|
|
36
|
+
/// Initializes a new `FlexBuf` with the given capacity.
|
|
37
|
+
pub fn new(cap: usize) -> Self {
|
|
38
|
+
FlexBuf {
|
|
39
|
+
cap,
|
|
40
|
+
len: 0,
|
|
41
|
+
|
|
42
|
+
buf: BytesMut::with_capacity(cap),
|
|
43
|
+
frozen: None,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// Put slice into flex buf.
|
|
48
|
+
///
|
|
49
|
+
/// Return 0 means the buffer is frozen.
|
|
50
|
+
pub fn put(&mut self, bs: &[u8]) -> usize {
|
|
51
|
+
if self.frozen.is_some() {
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let n = (self.cap - self.len).min(bs.len());
|
|
56
|
+
self.buf.put_slice(&bs[..n]);
|
|
57
|
+
self.len += n;
|
|
58
|
+
|
|
59
|
+
if self.len >= self.cap {
|
|
60
|
+
let frozen = self.buf.split();
|
|
61
|
+
self.len = 0;
|
|
62
|
+
self.frozen = Some(frozen.freeze());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
n
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// Freeze the buffer no matter it's full or not.
|
|
69
|
+
///
|
|
70
|
+
/// It's a no-op if the buffer has already been frozen.
|
|
71
|
+
pub fn freeze(&mut self) {
|
|
72
|
+
if self.len == 0 {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
let frozen = self.buf.split();
|
|
76
|
+
self.len = 0;
|
|
77
|
+
self.frozen = Some(frozen.freeze());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Get the frozen buffer.
|
|
81
|
+
///
|
|
82
|
+
/// Return `None` if the buffer is not frozen.
|
|
83
|
+
///
|
|
84
|
+
/// # Notes
|
|
85
|
+
///
|
|
86
|
+
/// This operation did nothing to the buffer. We use `&mut self` just for make
|
|
87
|
+
/// the API consistent with other APIs.
|
|
88
|
+
pub fn get(&mut self) -> Option<Bytes> {
|
|
89
|
+
self.frozen.clone()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Advance the frozen buffer.
|
|
93
|
+
///
|
|
94
|
+
/// # Panics
|
|
95
|
+
///
|
|
96
|
+
/// Panic if the buffer is not frozen.
|
|
97
|
+
pub fn advance(&mut self, cnt: usize) {
|
|
98
|
+
debug_assert!(self.len == 0, "The buffer must be empty during advance");
|
|
99
|
+
|
|
100
|
+
let Some(bs) = self.frozen.as_mut() else {
|
|
101
|
+
unreachable!("It must be a bug to advance on not frozen buffer")
|
|
102
|
+
};
|
|
103
|
+
bs.advance(cnt);
|
|
104
|
+
|
|
105
|
+
if bs.is_empty() {
|
|
106
|
+
self.clean()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/// Cleanup the buffer, reset to the initial state.
|
|
111
|
+
#[inline]
|
|
112
|
+
pub fn clean(&mut self) {
|
|
113
|
+
self.frozen = None;
|
|
114
|
+
// This reserve cloud be cheap since we can reuse already allocated memory.
|
|
115
|
+
// (if all references to the frozen buffer are dropped)
|
|
116
|
+
self.buf.reserve(self.cap);
|
|
117
|
+
}
|
|
118
|
+
}
|