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,164 @@
|
|
|
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::future::ready;
|
|
20
|
+
use std::ops::DerefMut;
|
|
21
|
+
|
|
22
|
+
use futures::Future;
|
|
23
|
+
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::Capability;
|
|
26
|
+
use crate::Scheme;
|
|
27
|
+
use crate::*;
|
|
28
|
+
|
|
29
|
+
/// Scan is the async iterator returned by `Adapter::scan`.
|
|
30
|
+
pub trait Scan: Send + Sync + Unpin {
|
|
31
|
+
/// Fetch the next key in the current key prefix
|
|
32
|
+
///
|
|
33
|
+
/// `Ok(None)` means no further key will be returned
|
|
34
|
+
fn next(&mut self) -> impl Future<Output = Result<Option<String>>> + MaybeSend;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// A noop implementation of Scan
|
|
38
|
+
impl Scan for () {
|
|
39
|
+
async fn next(&mut self) -> Result<Option<String>> {
|
|
40
|
+
Ok(None)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/// A Scan implementation for all trivial non-async iterators
|
|
45
|
+
pub struct ScanStdIter<I>(I);
|
|
46
|
+
|
|
47
|
+
#[cfg(any(feature = "services-rocksdb", feature = "services-sled"))]
|
|
48
|
+
impl<I> ScanStdIter<I>
|
|
49
|
+
where
|
|
50
|
+
I: Iterator<Item = Result<String>> + Unpin + Send + Sync,
|
|
51
|
+
{
|
|
52
|
+
/// Create a new ScanStdIter from an Iterator
|
|
53
|
+
pub(crate) fn new(inner: I) -> Self {
|
|
54
|
+
Self(inner)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
impl<I> Scan for ScanStdIter<I>
|
|
59
|
+
where
|
|
60
|
+
I: Iterator<Item = Result<String>> + Unpin + Send + Sync,
|
|
61
|
+
{
|
|
62
|
+
async fn next(&mut self) -> Result<Option<String>> {
|
|
63
|
+
self.0.next().transpose()
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// A type-erased wrapper of Scan
|
|
68
|
+
pub type Scanner = Box<dyn ScanDyn>;
|
|
69
|
+
|
|
70
|
+
pub trait ScanDyn: Unpin + Send + Sync {
|
|
71
|
+
fn next_dyn(&mut self) -> BoxedFuture<'_, Result<Option<String>>>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
impl<T: Scan + ?Sized> ScanDyn for T {
|
|
75
|
+
fn next_dyn(&mut self) -> BoxedFuture<'_, Result<Option<String>>> {
|
|
76
|
+
Box::pin(self.next())
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
impl<T: ScanDyn + ?Sized> Scan for Box<T> {
|
|
81
|
+
async fn next(&mut self) -> Result<Option<String>> {
|
|
82
|
+
self.deref_mut().next_dyn().await
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// KvAdapter is the adapter to underlying kv services.
|
|
87
|
+
///
|
|
88
|
+
/// By implement this trait, any kv service can work as an OpenDAL Service.
|
|
89
|
+
pub trait Adapter: Send + Sync + Debug + Unpin + 'static {
|
|
90
|
+
/// TODO: use default associate type `= ()` after stabilized
|
|
91
|
+
type Scanner: Scan;
|
|
92
|
+
|
|
93
|
+
/// Return the info of this key value accessor.
|
|
94
|
+
fn info(&self) -> Info;
|
|
95
|
+
|
|
96
|
+
/// Get a key from service.
|
|
97
|
+
///
|
|
98
|
+
/// - return `Ok(None)` if this key is not exist.
|
|
99
|
+
fn get(&self, path: &str) -> impl Future<Output = Result<Option<Buffer>>> + MaybeSend;
|
|
100
|
+
|
|
101
|
+
/// Set a key into service.
|
|
102
|
+
fn set(&self, path: &str, value: Buffer) -> impl Future<Output = Result<()>> + MaybeSend;
|
|
103
|
+
|
|
104
|
+
/// Delete a key from service.
|
|
105
|
+
///
|
|
106
|
+
/// - return `Ok(())` even if this key is not exist.
|
|
107
|
+
fn delete(&self, path: &str) -> impl Future<Output = Result<()>> + MaybeSend;
|
|
108
|
+
|
|
109
|
+
/// Scan a key prefix to get all keys that start with this key.
|
|
110
|
+
fn scan(&self, path: &str) -> impl Future<Output = Result<Self::Scanner>> + MaybeSend {
|
|
111
|
+
let _ = path;
|
|
112
|
+
|
|
113
|
+
ready(Err(Error::new(
|
|
114
|
+
ErrorKind::Unsupported,
|
|
115
|
+
"kv adapter doesn't support this operation",
|
|
116
|
+
)
|
|
117
|
+
.with_operation("kv::Adapter::scan")))
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Append a key into service
|
|
121
|
+
fn append(&self, path: &str, value: &[u8]) -> impl Future<Output = Result<()>> + MaybeSend {
|
|
122
|
+
let _ = path;
|
|
123
|
+
let _ = value;
|
|
124
|
+
|
|
125
|
+
ready(Err(Error::new(
|
|
126
|
+
ErrorKind::Unsupported,
|
|
127
|
+
"kv adapter doesn't support this operation",
|
|
128
|
+
)
|
|
129
|
+
.with_operation("kv::Adapter::append")))
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/// Info for this key value accessor.
|
|
134
|
+
pub struct Info {
|
|
135
|
+
scheme: Scheme,
|
|
136
|
+
name: String,
|
|
137
|
+
capabilities: Capability,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
impl Info {
|
|
141
|
+
/// Create a new KeyValueAccessorInfo.
|
|
142
|
+
pub fn new(scheme: Scheme, name: &str, capabilities: Capability) -> Self {
|
|
143
|
+
Self {
|
|
144
|
+
scheme,
|
|
145
|
+
name: name.to_string(),
|
|
146
|
+
capabilities,
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// Get the scheme.
|
|
151
|
+
pub fn scheme(&self) -> Scheme {
|
|
152
|
+
self.scheme
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Get the name.
|
|
156
|
+
pub fn name(&self) -> &str {
|
|
157
|
+
&self.name
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/// Get the capabilities.
|
|
161
|
+
pub fn capabilities(&self) -> Capability {
|
|
162
|
+
self.capabilities
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
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::Adapter;
|
|
21
|
+
use super::Scan;
|
|
22
|
+
use crate::raw::oio::HierarchyLister;
|
|
23
|
+
use crate::raw::oio::QueueBuf;
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
/// Backend of kv service. If the storage service is one k-v-like service, it should implement this kv [`Backend`] by right.
|
|
28
|
+
///
|
|
29
|
+
/// `Backend` implements one general logic on how to read, write, scan the data from one kv store efficiently.
|
|
30
|
+
/// And the [`Adapter`] held by `Backend` will handle how to communicate with one k-v-like service really and provides
|
|
31
|
+
/// a series of basic operation for this service.
|
|
32
|
+
///
|
|
33
|
+
/// OpenDAL developer can implement one new k-v store backend easily with help of this Backend.
|
|
34
|
+
#[derive(Debug, Clone)]
|
|
35
|
+
pub struct Backend<S: Adapter> {
|
|
36
|
+
kv: Arc<S>,
|
|
37
|
+
root: String,
|
|
38
|
+
info: Arc<AccessorInfo>,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
impl<S> Backend<S>
|
|
42
|
+
where
|
|
43
|
+
S: Adapter,
|
|
44
|
+
{
|
|
45
|
+
/// Create a new kv backend.
|
|
46
|
+
pub fn new(kv: S) -> Self {
|
|
47
|
+
let kv_info = kv.info();
|
|
48
|
+
Self {
|
|
49
|
+
kv: Arc::new(kv),
|
|
50
|
+
root: "/".to_string(),
|
|
51
|
+
info: {
|
|
52
|
+
let am: AccessorInfo = AccessorInfo::default();
|
|
53
|
+
am.set_root("/");
|
|
54
|
+
am.set_scheme(kv_info.scheme().into_static());
|
|
55
|
+
am.set_name(kv_info.name());
|
|
56
|
+
|
|
57
|
+
let mut cap = kv_info.capabilities();
|
|
58
|
+
if cap.read {
|
|
59
|
+
cap.stat = true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if cap.write {
|
|
63
|
+
cap.write_can_empty = true;
|
|
64
|
+
cap.delete = true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if cap.list {
|
|
68
|
+
cap.list_with_recursive = true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
am.set_native_capability(cap);
|
|
72
|
+
|
|
73
|
+
am.into()
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Configure root within this backend.
|
|
79
|
+
pub fn with_root(self, root: &str) -> Self {
|
|
80
|
+
self.with_normalized_root(normalize_root(root))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// Configure root within this backend.
|
|
84
|
+
///
|
|
85
|
+
/// This method assumes root is normalized.
|
|
86
|
+
pub(crate) fn with_normalized_root(mut self, root: String) -> Self {
|
|
87
|
+
let root = normalize_root(&root);
|
|
88
|
+
self.info.set_root(&root);
|
|
89
|
+
self.root = root;
|
|
90
|
+
self
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
impl<S: Adapter> Access for Backend<S> {
|
|
95
|
+
type Reader = Buffer;
|
|
96
|
+
type Writer = KvWriter<S>;
|
|
97
|
+
type Lister = HierarchyLister<KvLister<S::Scanner>>;
|
|
98
|
+
type Deleter = oio::OneShotDeleter<KvDeleter<S>>;
|
|
99
|
+
|
|
100
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
101
|
+
self.info.clone()
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
|
|
105
|
+
let p = build_abs_path(&self.root, path);
|
|
106
|
+
|
|
107
|
+
if p == build_abs_path(&self.root, "") {
|
|
108
|
+
Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
|
|
109
|
+
} else {
|
|
110
|
+
let bs = self.kv.get(&p).await?;
|
|
111
|
+
match bs {
|
|
112
|
+
Some(bs) => Ok(RpStat::new(
|
|
113
|
+
Metadata::new(EntryMode::FILE).with_content_length(bs.len() as u64),
|
|
114
|
+
)),
|
|
115
|
+
None => Err(Error::new(ErrorKind::NotFound, "kv doesn't have this path")),
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
121
|
+
let p = build_abs_path(&self.root, path);
|
|
122
|
+
let bs = match self.kv.get(&p).await? {
|
|
123
|
+
Some(bs) => bs,
|
|
124
|
+
None => return Err(Error::new(ErrorKind::NotFound, "kv doesn't have this path")),
|
|
125
|
+
};
|
|
126
|
+
Ok((RpRead::new(), bs.slice(args.range().to_range_as_usize())))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async fn write(&self, path: &str, _: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
130
|
+
let p = build_abs_path(&self.root, path);
|
|
131
|
+
|
|
132
|
+
Ok((RpWrite::new(), KvWriter::new(self.kv.clone(), p)))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
136
|
+
Ok((
|
|
137
|
+
RpDelete::default(),
|
|
138
|
+
oio::OneShotDeleter::new(KvDeleter::new(self.kv.clone(), self.root.clone())),
|
|
139
|
+
))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
143
|
+
let p = build_abs_path(&self.root, path);
|
|
144
|
+
let res = self.kv.scan(&p).await?;
|
|
145
|
+
let lister = KvLister::new(&self.root, res);
|
|
146
|
+
let lister = HierarchyLister::new(lister, path, args.recursive());
|
|
147
|
+
|
|
148
|
+
Ok((RpList::default(), lister))
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
pub struct KvLister<Iter> {
|
|
153
|
+
root: String,
|
|
154
|
+
inner: Iter,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
impl<Iter> KvLister<Iter>
|
|
158
|
+
where
|
|
159
|
+
Iter: Scan,
|
|
160
|
+
{
|
|
161
|
+
fn new(root: &str, inner: Iter) -> Self {
|
|
162
|
+
Self {
|
|
163
|
+
root: root.to_string(),
|
|
164
|
+
inner,
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async fn inner_next(&mut self) -> Result<Option<oio::Entry>> {
|
|
169
|
+
Ok(self.inner.next().await?.map(|v| {
|
|
170
|
+
let mode = if v.ends_with('/') {
|
|
171
|
+
EntryMode::DIR
|
|
172
|
+
} else {
|
|
173
|
+
EntryMode::FILE
|
|
174
|
+
};
|
|
175
|
+
let mut path = build_rel_path(&self.root, &v);
|
|
176
|
+
if path.is_empty() {
|
|
177
|
+
path = "/".to_string();
|
|
178
|
+
}
|
|
179
|
+
oio::Entry::new(&path, Metadata::new(mode))
|
|
180
|
+
}))
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
impl<Iter> oio::List for KvLister<Iter>
|
|
185
|
+
where
|
|
186
|
+
Iter: Scan,
|
|
187
|
+
{
|
|
188
|
+
async fn next(&mut self) -> Result<Option<oio::Entry>> {
|
|
189
|
+
self.inner_next().await
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
pub struct KvWriter<S> {
|
|
194
|
+
kv: Arc<S>,
|
|
195
|
+
path: String,
|
|
196
|
+
buffer: QueueBuf,
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
impl<S> KvWriter<S> {
|
|
200
|
+
fn new(kv: Arc<S>, path: String) -> Self {
|
|
201
|
+
KvWriter {
|
|
202
|
+
kv,
|
|
203
|
+
path,
|
|
204
|
+
buffer: QueueBuf::new(),
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/// # Safety
|
|
210
|
+
///
|
|
211
|
+
/// We will only take `&mut Self` reference for KvWriter.
|
|
212
|
+
unsafe impl<S: Adapter> Sync for KvWriter<S> {}
|
|
213
|
+
|
|
214
|
+
impl<S: Adapter> oio::Write for KvWriter<S> {
|
|
215
|
+
async fn write(&mut self, bs: Buffer) -> Result<()> {
|
|
216
|
+
self.buffer.push(bs);
|
|
217
|
+
Ok(())
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async fn close(&mut self) -> Result<Metadata> {
|
|
221
|
+
let buf = self.buffer.clone().collect();
|
|
222
|
+
let length = buf.len() as u64;
|
|
223
|
+
self.kv.set(&self.path, buf).await?;
|
|
224
|
+
|
|
225
|
+
let meta = Metadata::new(EntryMode::from_path(&self.path)).with_content_length(length);
|
|
226
|
+
Ok(meta)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async fn abort(&mut self) -> Result<()> {
|
|
230
|
+
self.buffer.clear();
|
|
231
|
+
Ok(())
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
pub struct KvDeleter<S> {
|
|
236
|
+
kv: Arc<S>,
|
|
237
|
+
root: String,
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
impl<S> KvDeleter<S> {
|
|
241
|
+
fn new(kv: Arc<S>, root: String) -> Self {
|
|
242
|
+
KvDeleter { kv, root }
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
impl<S: Adapter> oio::OneShotDelete for KvDeleter<S> {
|
|
247
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
248
|
+
let p = build_abs_path(&self.root, &path);
|
|
249
|
+
|
|
250
|
+
self.kv.delete(&p).await?;
|
|
251
|
+
Ok(())
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
//! Providing Key Value Adapter for OpenDAL.
|
|
19
|
+
//!
|
|
20
|
+
//! Any services that implement `Adapter` can be used an OpenDAL Service.
|
|
21
|
+
|
|
22
|
+
mod api;
|
|
23
|
+
pub use api::Adapter;
|
|
24
|
+
pub use api::Info;
|
|
25
|
+
pub use api::Scan;
|
|
26
|
+
#[cfg(any(feature = "services-rocksdb", feature = "services-sled"))]
|
|
27
|
+
pub(crate) use api::ScanStdIter;
|
|
28
|
+
pub use api::Scanner;
|
|
29
|
+
|
|
30
|
+
mod backend;
|
|
31
|
+
pub use backend::Backend;
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
//! Providing adapters and its implementations.
|
|
19
|
+
//!
|
|
20
|
+
//! Adapters in OpenDAL means services that shares similar behaviors. We use
|
|
21
|
+
//! adapter to make those services been implemented more easily. For example,
|
|
22
|
+
//! with [`kv::Adapter`], users only need to implement `get`, `set` for a service.
|
|
23
|
+
//!
|
|
24
|
+
//! # Notes
|
|
25
|
+
//!
|
|
26
|
+
//! Please import the module instead of its type.
|
|
27
|
+
//!
|
|
28
|
+
//! For example, use the following:
|
|
29
|
+
//!
|
|
30
|
+
//! ```ignore
|
|
31
|
+
//! use opendal::adapters::kv;
|
|
32
|
+
//!
|
|
33
|
+
//! impl kv::Adapter for MyType {}
|
|
34
|
+
//! ```
|
|
35
|
+
//!
|
|
36
|
+
//! Instead of:
|
|
37
|
+
//!
|
|
38
|
+
//! ```ignore
|
|
39
|
+
//! use opendal::adapters::kv::Adapter;
|
|
40
|
+
//!
|
|
41
|
+
//! impl Adapter for MyType {}
|
|
42
|
+
//! ```
|
|
43
|
+
//!
|
|
44
|
+
//! # Available Adapters
|
|
45
|
+
//!
|
|
46
|
+
//! - [`kv::Adapter`]: Adapter for Key Value Services like `redis`.
|
|
47
|
+
//! - [`typed_kv::Adapter`]: Adapter key value services that in-memory.
|
|
48
|
+
|
|
49
|
+
pub mod kv;
|
|
50
|
+
pub mod typed_kv;
|
|
@@ -0,0 +1,171 @@
|
|
|
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::future::ready;
|
|
20
|
+
use std::future::Future;
|
|
21
|
+
use std::mem::size_of;
|
|
22
|
+
|
|
23
|
+
use chrono::Utc;
|
|
24
|
+
|
|
25
|
+
use crate::raw::MaybeSend;
|
|
26
|
+
use crate::Buffer;
|
|
27
|
+
use crate::EntryMode;
|
|
28
|
+
use crate::Error;
|
|
29
|
+
use crate::ErrorKind;
|
|
30
|
+
use crate::Metadata;
|
|
31
|
+
use crate::Result;
|
|
32
|
+
use crate::Scheme;
|
|
33
|
+
|
|
34
|
+
/// Adapter is the typed adapter to underlying kv services.
|
|
35
|
+
///
|
|
36
|
+
/// By implement this trait, any kv service can work as an OpenDAL Service.
|
|
37
|
+
///
|
|
38
|
+
/// # Notes
|
|
39
|
+
///
|
|
40
|
+
/// `typed_kv::Adapter` is the typed version of `kv::Adapter`. It's more
|
|
41
|
+
/// efficient if the underlying kv service can store data with its type. For
|
|
42
|
+
/// example, we can store `Bytes` along with its metadata so that we don't
|
|
43
|
+
/// need to serialize/deserialize it when we get it from the service.
|
|
44
|
+
///
|
|
45
|
+
/// Ideally, we should use `typed_kv::Adapter` instead of `kv::Adapter` for
|
|
46
|
+
/// in-memory rust libs like moka and dashmap.
|
|
47
|
+
pub trait Adapter: Send + Sync + Debug + Unpin + 'static {
|
|
48
|
+
/// Return the info of this key value accessor.
|
|
49
|
+
fn info(&self) -> Info;
|
|
50
|
+
|
|
51
|
+
/// Get a value from adapter.
|
|
52
|
+
fn get(&self, path: &str) -> impl Future<Output = Result<Option<Value>>> + MaybeSend;
|
|
53
|
+
|
|
54
|
+
/// Set a value into adapter.
|
|
55
|
+
fn set(&self, path: &str, value: Value) -> impl Future<Output = Result<()>> + MaybeSend;
|
|
56
|
+
|
|
57
|
+
/// Delete a value from adapter.
|
|
58
|
+
fn delete(&self, path: &str) -> impl Future<Output = Result<()>> + MaybeSend;
|
|
59
|
+
|
|
60
|
+
/// Scan a key prefix to get all keys that start with this key.
|
|
61
|
+
fn scan(&self, path: &str) -> impl Future<Output = Result<Vec<String>>> + MaybeSend {
|
|
62
|
+
let _ = path;
|
|
63
|
+
|
|
64
|
+
ready(Err(Error::new(
|
|
65
|
+
ErrorKind::Unsupported,
|
|
66
|
+
"typed_kv adapter doesn't support this operation",
|
|
67
|
+
)
|
|
68
|
+
.with_operation("typed_kv::Adapter::scan")))
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// Value is the typed value stored in adapter.
|
|
73
|
+
///
|
|
74
|
+
/// It's cheap to clone so that users can read data without extra copy.
|
|
75
|
+
#[derive(Debug, Clone)]
|
|
76
|
+
pub struct Value {
|
|
77
|
+
/// Metadata of this value.
|
|
78
|
+
pub metadata: Metadata,
|
|
79
|
+
/// The corresponding content of this value.
|
|
80
|
+
pub value: Buffer,
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
impl Value {
|
|
84
|
+
/// Create a new dir of value.
|
|
85
|
+
pub fn new_dir() -> Self {
|
|
86
|
+
Self {
|
|
87
|
+
metadata: Metadata::new(EntryMode::DIR)
|
|
88
|
+
.with_content_length(0)
|
|
89
|
+
.with_last_modified(Utc::now()),
|
|
90
|
+
value: Buffer::new(),
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Size returns the in-memory size of Value.
|
|
95
|
+
pub fn size(&self) -> usize {
|
|
96
|
+
size_of::<Metadata>() + self.value.len()
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// Capability is used to describe what operations are supported
|
|
101
|
+
/// by Typed KV Operator.
|
|
102
|
+
#[derive(Copy, Clone, Default)]
|
|
103
|
+
pub struct Capability {
|
|
104
|
+
/// If typed_kv operator supports get natively.
|
|
105
|
+
pub get: bool,
|
|
106
|
+
/// If typed_kv operator supports set natively.
|
|
107
|
+
pub set: bool,
|
|
108
|
+
/// If typed_kv operator supports delete natively.
|
|
109
|
+
pub delete: bool,
|
|
110
|
+
/// If typed_kv operator supports scan natively.
|
|
111
|
+
pub scan: bool,
|
|
112
|
+
/// If typed_kv operator supports shared access.
|
|
113
|
+
pub shared: bool,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
impl Debug for Capability {
|
|
117
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
118
|
+
let mut s = vec![];
|
|
119
|
+
|
|
120
|
+
if self.get {
|
|
121
|
+
s.push("Get")
|
|
122
|
+
}
|
|
123
|
+
if self.set {
|
|
124
|
+
s.push("Set");
|
|
125
|
+
}
|
|
126
|
+
if self.delete {
|
|
127
|
+
s.push("Delete");
|
|
128
|
+
}
|
|
129
|
+
if self.scan {
|
|
130
|
+
s.push("Scan");
|
|
131
|
+
}
|
|
132
|
+
if self.shared {
|
|
133
|
+
s.push("Shared");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
write!(f, "{{ {} }}", s.join(" | "))
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/// Info for this key value accessor.
|
|
141
|
+
pub struct Info {
|
|
142
|
+
scheme: Scheme,
|
|
143
|
+
name: String,
|
|
144
|
+
capabilities: Capability,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
impl Info {
|
|
148
|
+
/// Create a new KeyValueAccessorInfo.
|
|
149
|
+
pub fn new(scheme: Scheme, name: &str, capabilities: Capability) -> Self {
|
|
150
|
+
Self {
|
|
151
|
+
scheme,
|
|
152
|
+
name: name.to_string(),
|
|
153
|
+
capabilities,
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// Get the scheme.
|
|
158
|
+
pub fn scheme(&self) -> Scheme {
|
|
159
|
+
self.scheme
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// Get the name.
|
|
163
|
+
pub fn name(&self) -> &str {
|
|
164
|
+
&self.name
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/// Get the capabilities.
|
|
168
|
+
pub fn capabilities(&self) -> Capability {
|
|
169
|
+
self.capabilities
|
|
170
|
+
}
|
|
171
|
+
}
|