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,284 @@
|
|
|
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::time::Duration;
|
|
19
|
+
|
|
20
|
+
use bb8::RunError;
|
|
21
|
+
use tokio::net::TcpStream;
|
|
22
|
+
use tokio::sync::OnceCell;
|
|
23
|
+
|
|
24
|
+
use super::binary;
|
|
25
|
+
use crate::raw::adapters::kv;
|
|
26
|
+
use crate::raw::*;
|
|
27
|
+
use crate::services::MemcachedConfig;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
impl Configurator for MemcachedConfig {
|
|
31
|
+
type Builder = MemcachedBuilder;
|
|
32
|
+
fn into_builder(self) -> Self::Builder {
|
|
33
|
+
MemcachedBuilder { config: self }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// [Memcached](https://memcached.org/) service support.
|
|
38
|
+
#[doc = include_str!("docs.md")]
|
|
39
|
+
#[derive(Clone, Default)]
|
|
40
|
+
pub struct MemcachedBuilder {
|
|
41
|
+
config: MemcachedConfig,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
impl MemcachedBuilder {
|
|
45
|
+
/// set the network address of memcached service.
|
|
46
|
+
///
|
|
47
|
+
/// For example: "tcp://localhost:11211"
|
|
48
|
+
pub fn endpoint(mut self, endpoint: &str) -> Self {
|
|
49
|
+
if !endpoint.is_empty() {
|
|
50
|
+
self.config.endpoint = Some(endpoint.to_owned());
|
|
51
|
+
}
|
|
52
|
+
self
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/// set the working directory, all operations will be performed under it.
|
|
56
|
+
///
|
|
57
|
+
/// default: "/"
|
|
58
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
59
|
+
self.config.root = if root.is_empty() {
|
|
60
|
+
None
|
|
61
|
+
} else {
|
|
62
|
+
Some(root.to_string())
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
self
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// set the username.
|
|
69
|
+
pub fn username(mut self, username: &str) -> Self {
|
|
70
|
+
self.config.username = Some(username.to_string());
|
|
71
|
+
self
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// set the password.
|
|
75
|
+
pub fn password(mut self, password: &str) -> Self {
|
|
76
|
+
self.config.password = Some(password.to_string());
|
|
77
|
+
self
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Set the default ttl for memcached services.
|
|
81
|
+
pub fn default_ttl(mut self, ttl: Duration) -> Self {
|
|
82
|
+
self.config.default_ttl = Some(ttl);
|
|
83
|
+
self
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
impl Builder for MemcachedBuilder {
|
|
88
|
+
type Config = MemcachedConfig;
|
|
89
|
+
|
|
90
|
+
fn build(self) -> Result<impl Access> {
|
|
91
|
+
let endpoint = self.config.endpoint.clone().ok_or_else(|| {
|
|
92
|
+
Error::new(ErrorKind::ConfigInvalid, "endpoint is empty")
|
|
93
|
+
.with_context("service", Scheme::Memcached)
|
|
94
|
+
})?;
|
|
95
|
+
let uri = http::Uri::try_from(&endpoint).map_err(|err| {
|
|
96
|
+
Error::new(ErrorKind::ConfigInvalid, "endpoint is invalid")
|
|
97
|
+
.with_context("service", Scheme::Memcached)
|
|
98
|
+
.with_context("endpoint", &endpoint)
|
|
99
|
+
.set_source(err)
|
|
100
|
+
})?;
|
|
101
|
+
|
|
102
|
+
match uri.scheme_str() {
|
|
103
|
+
// If scheme is none, we will use tcp by default.
|
|
104
|
+
None => (),
|
|
105
|
+
Some(scheme) => {
|
|
106
|
+
// We only support tcp by now.
|
|
107
|
+
if scheme != "tcp" {
|
|
108
|
+
return Err(Error::new(
|
|
109
|
+
ErrorKind::ConfigInvalid,
|
|
110
|
+
"endpoint is using invalid scheme",
|
|
111
|
+
)
|
|
112
|
+
.with_context("service", Scheme::Memcached)
|
|
113
|
+
.with_context("endpoint", &endpoint)
|
|
114
|
+
.with_context("scheme", scheme.to_string()));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
let host = if let Some(host) = uri.host() {
|
|
120
|
+
host.to_string()
|
|
121
|
+
} else {
|
|
122
|
+
return Err(
|
|
123
|
+
Error::new(ErrorKind::ConfigInvalid, "endpoint doesn't have host")
|
|
124
|
+
.with_context("service", Scheme::Memcached)
|
|
125
|
+
.with_context("endpoint", &endpoint),
|
|
126
|
+
);
|
|
127
|
+
};
|
|
128
|
+
let port = if let Some(port) = uri.port_u16() {
|
|
129
|
+
port
|
|
130
|
+
} else {
|
|
131
|
+
return Err(
|
|
132
|
+
Error::new(ErrorKind::ConfigInvalid, "endpoint doesn't have port")
|
|
133
|
+
.with_context("service", Scheme::Memcached)
|
|
134
|
+
.with_context("endpoint", &endpoint),
|
|
135
|
+
);
|
|
136
|
+
};
|
|
137
|
+
let endpoint = format!("{host}:{port}",);
|
|
138
|
+
|
|
139
|
+
let root = normalize_root(
|
|
140
|
+
self.config
|
|
141
|
+
.root
|
|
142
|
+
.clone()
|
|
143
|
+
.unwrap_or_else(|| "/".to_string())
|
|
144
|
+
.as_str(),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
let conn = OnceCell::new();
|
|
148
|
+
Ok(MemcachedBackend::new(Adapter {
|
|
149
|
+
endpoint,
|
|
150
|
+
username: self.config.username.clone(),
|
|
151
|
+
password: self.config.password.clone(),
|
|
152
|
+
conn,
|
|
153
|
+
default_ttl: self.config.default_ttl,
|
|
154
|
+
})
|
|
155
|
+
.with_normalized_root(root))
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/// Backend for memcached services.
|
|
160
|
+
pub type MemcachedBackend = kv::Backend<Adapter>;
|
|
161
|
+
|
|
162
|
+
#[derive(Clone, Debug)]
|
|
163
|
+
pub struct Adapter {
|
|
164
|
+
endpoint: String,
|
|
165
|
+
username: Option<String>,
|
|
166
|
+
password: Option<String>,
|
|
167
|
+
default_ttl: Option<Duration>,
|
|
168
|
+
conn: OnceCell<bb8::Pool<MemcacheConnectionManager>>,
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
impl Adapter {
|
|
172
|
+
async fn conn(&self) -> Result<bb8::PooledConnection<'_, MemcacheConnectionManager>> {
|
|
173
|
+
let pool = self
|
|
174
|
+
.conn
|
|
175
|
+
.get_or_try_init(|| async {
|
|
176
|
+
let mgr = MemcacheConnectionManager::new(
|
|
177
|
+
&self.endpoint,
|
|
178
|
+
self.username.clone(),
|
|
179
|
+
self.password.clone(),
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
bb8::Pool::builder().build(mgr).await.map_err(|err| {
|
|
183
|
+
Error::new(ErrorKind::ConfigInvalid, "connect to memecached failed")
|
|
184
|
+
.set_source(err)
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
.await?;
|
|
188
|
+
|
|
189
|
+
pool.get().await.map_err(|err| match err {
|
|
190
|
+
RunError::TimedOut => {
|
|
191
|
+
Error::new(ErrorKind::Unexpected, "get connection from pool failed").set_temporary()
|
|
192
|
+
}
|
|
193
|
+
RunError::User(err) => err,
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
impl kv::Adapter for Adapter {
|
|
199
|
+
type Scanner = ();
|
|
200
|
+
|
|
201
|
+
fn info(&self) -> kv::Info {
|
|
202
|
+
kv::Info::new(
|
|
203
|
+
Scheme::Memcached,
|
|
204
|
+
"memcached",
|
|
205
|
+
Capability {
|
|
206
|
+
read: true,
|
|
207
|
+
write: true,
|
|
208
|
+
shared: true,
|
|
209
|
+
|
|
210
|
+
..Default::default()
|
|
211
|
+
},
|
|
212
|
+
)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async fn get(&self, key: &str) -> Result<Option<Buffer>> {
|
|
216
|
+
let mut conn = self.conn().await?;
|
|
217
|
+
let result = conn.get(&percent_encode_path(key)).await?;
|
|
218
|
+
Ok(result.map(Buffer::from))
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async fn set(&self, key: &str, value: Buffer) -> Result<()> {
|
|
222
|
+
let mut conn = self.conn().await?;
|
|
223
|
+
|
|
224
|
+
conn.set(
|
|
225
|
+
&percent_encode_path(key),
|
|
226
|
+
&value.to_vec(),
|
|
227
|
+
// Set expiration to 0 if ttl not set.
|
|
228
|
+
self.default_ttl
|
|
229
|
+
.map(|v| v.as_secs() as u32)
|
|
230
|
+
.unwrap_or_default(),
|
|
231
|
+
)
|
|
232
|
+
.await
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async fn delete(&self, key: &str) -> Result<()> {
|
|
236
|
+
let mut conn = self.conn().await?;
|
|
237
|
+
|
|
238
|
+
conn.delete(&percent_encode_path(key)).await
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/// A `bb8::ManageConnection` for `memcache_async::ascii::Protocol`.
|
|
243
|
+
#[derive(Clone, Debug)]
|
|
244
|
+
struct MemcacheConnectionManager {
|
|
245
|
+
address: String,
|
|
246
|
+
username: Option<String>,
|
|
247
|
+
password: Option<String>,
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
impl MemcacheConnectionManager {
|
|
251
|
+
fn new(address: &str, username: Option<String>, password: Option<String>) -> Self {
|
|
252
|
+
Self {
|
|
253
|
+
address: address.to_string(),
|
|
254
|
+
username,
|
|
255
|
+
password,
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
impl bb8::ManageConnection for MemcacheConnectionManager {
|
|
261
|
+
type Connection = binary::Connection;
|
|
262
|
+
type Error = Error;
|
|
263
|
+
|
|
264
|
+
/// TODO: Implement unix stream support.
|
|
265
|
+
async fn connect(&self) -> Result<Self::Connection, Self::Error> {
|
|
266
|
+
let conn = TcpStream::connect(&self.address)
|
|
267
|
+
.await
|
|
268
|
+
.map_err(new_std_io_error)?;
|
|
269
|
+
let mut conn = binary::Connection::new(conn);
|
|
270
|
+
|
|
271
|
+
if let (Some(username), Some(password)) = (self.username.as_ref(), self.password.as_ref()) {
|
|
272
|
+
conn.auth(username, password).await?;
|
|
273
|
+
}
|
|
274
|
+
Ok(conn)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
async fn is_valid(&self, conn: &mut Self::Connection) -> Result<(), Self::Error> {
|
|
278
|
+
conn.version().await.map(|_| ())
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
fn has_broken(&self, _: &mut Self::Connection) -> bool {
|
|
282
|
+
false
|
|
283
|
+
}
|
|
284
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
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 tokio::io::AsyncReadExt;
|
|
19
|
+
use tokio::io::AsyncWriteExt;
|
|
20
|
+
use tokio::io::BufReader;
|
|
21
|
+
use tokio::io::{self};
|
|
22
|
+
use tokio::net::TcpStream;
|
|
23
|
+
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
pub(super) mod constants {
|
|
28
|
+
pub const OK_STATUS: u16 = 0x0;
|
|
29
|
+
pub const KEY_NOT_FOUND: u16 = 0x1;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
pub enum Opcode {
|
|
33
|
+
Get = 0x00,
|
|
34
|
+
Set = 0x01,
|
|
35
|
+
Delete = 0x04,
|
|
36
|
+
Version = 0x0b,
|
|
37
|
+
StartAuth = 0x21,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
pub enum Magic {
|
|
41
|
+
Request = 0x80,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#[derive(Debug)]
|
|
45
|
+
pub struct StoreExtras {
|
|
46
|
+
pub flags: u32,
|
|
47
|
+
pub expiration: u32,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[derive(Debug, Default)]
|
|
51
|
+
pub struct PacketHeader {
|
|
52
|
+
pub magic: u8,
|
|
53
|
+
pub opcode: u8,
|
|
54
|
+
pub key_length: u16,
|
|
55
|
+
pub extras_length: u8,
|
|
56
|
+
pub data_type: u8,
|
|
57
|
+
pub vbucket_id_or_status: u16,
|
|
58
|
+
pub total_body_length: u32,
|
|
59
|
+
pub opaque: u32,
|
|
60
|
+
pub cas: u64,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
impl PacketHeader {
|
|
64
|
+
pub async fn write(self, writer: &mut TcpStream) -> io::Result<()> {
|
|
65
|
+
writer.write_u8(self.magic).await?;
|
|
66
|
+
writer.write_u8(self.opcode).await?;
|
|
67
|
+
writer.write_u16(self.key_length).await?;
|
|
68
|
+
writer.write_u8(self.extras_length).await?;
|
|
69
|
+
writer.write_u8(self.data_type).await?;
|
|
70
|
+
writer.write_u16(self.vbucket_id_or_status).await?;
|
|
71
|
+
writer.write_u32(self.total_body_length).await?;
|
|
72
|
+
writer.write_u32(self.opaque).await?;
|
|
73
|
+
writer.write_u64(self.cas).await?;
|
|
74
|
+
Ok(())
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
pub async fn read(reader: &mut TcpStream) -> Result<PacketHeader, io::Error> {
|
|
78
|
+
let header = PacketHeader {
|
|
79
|
+
magic: reader.read_u8().await?,
|
|
80
|
+
opcode: reader.read_u8().await?,
|
|
81
|
+
key_length: reader.read_u16().await?,
|
|
82
|
+
extras_length: reader.read_u8().await?,
|
|
83
|
+
data_type: reader.read_u8().await?,
|
|
84
|
+
vbucket_id_or_status: reader.read_u16().await?,
|
|
85
|
+
total_body_length: reader.read_u32().await?,
|
|
86
|
+
opaque: reader.read_u32().await?,
|
|
87
|
+
cas: reader.read_u64().await?,
|
|
88
|
+
};
|
|
89
|
+
Ok(header)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
pub struct Response {
|
|
94
|
+
header: PacketHeader,
|
|
95
|
+
_key: Vec<u8>,
|
|
96
|
+
_extras: Vec<u8>,
|
|
97
|
+
value: Vec<u8>,
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
pub struct Connection {
|
|
101
|
+
io: BufReader<TcpStream>,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
impl Connection {
|
|
105
|
+
pub fn new(io: TcpStream) -> Self {
|
|
106
|
+
Self {
|
|
107
|
+
io: BufReader::new(io),
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
pub async fn auth(&mut self, username: &str, password: &str) -> Result<()> {
|
|
112
|
+
let writer = self.io.get_mut();
|
|
113
|
+
let key = "PLAIN";
|
|
114
|
+
let request_header = PacketHeader {
|
|
115
|
+
magic: Magic::Request as u8,
|
|
116
|
+
opcode: Opcode::StartAuth as u8,
|
|
117
|
+
key_length: key.len() as u16,
|
|
118
|
+
total_body_length: (key.len() + username.len() + password.len() + 2) as u32,
|
|
119
|
+
..Default::default()
|
|
120
|
+
};
|
|
121
|
+
request_header
|
|
122
|
+
.write(writer)
|
|
123
|
+
.await
|
|
124
|
+
.map_err(new_std_io_error)?;
|
|
125
|
+
writer
|
|
126
|
+
.write_all(key.as_bytes())
|
|
127
|
+
.await
|
|
128
|
+
.map_err(new_std_io_error)?;
|
|
129
|
+
writer
|
|
130
|
+
.write_all(format!("\x00{username}\x00{password}").as_bytes())
|
|
131
|
+
.await
|
|
132
|
+
.map_err(new_std_io_error)?;
|
|
133
|
+
writer.flush().await.map_err(new_std_io_error)?;
|
|
134
|
+
parse_response(writer).await?;
|
|
135
|
+
Ok(())
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
pub async fn version(&mut self) -> Result<String> {
|
|
139
|
+
let writer = self.io.get_mut();
|
|
140
|
+
let request_header = PacketHeader {
|
|
141
|
+
magic: Magic::Request as u8,
|
|
142
|
+
opcode: Opcode::Version as u8,
|
|
143
|
+
..Default::default()
|
|
144
|
+
};
|
|
145
|
+
request_header
|
|
146
|
+
.write(writer)
|
|
147
|
+
.await
|
|
148
|
+
.map_err(new_std_io_error)?;
|
|
149
|
+
writer.flush().await.map_err(new_std_io_error)?;
|
|
150
|
+
let response = parse_response(writer).await?;
|
|
151
|
+
let version = String::from_utf8(response.value);
|
|
152
|
+
match version {
|
|
153
|
+
Ok(version) => Ok(version),
|
|
154
|
+
Err(e) => {
|
|
155
|
+
Err(Error::new(ErrorKind::Unexpected, "unexpected data received").set_source(e))
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
pub async fn get(&mut self, key: &str) -> Result<Option<Vec<u8>>> {
|
|
161
|
+
let writer = self.io.get_mut();
|
|
162
|
+
let request_header = PacketHeader {
|
|
163
|
+
magic: Magic::Request as u8,
|
|
164
|
+
opcode: Opcode::Get as u8,
|
|
165
|
+
key_length: key.len() as u16,
|
|
166
|
+
total_body_length: key.len() as u32,
|
|
167
|
+
..Default::default()
|
|
168
|
+
};
|
|
169
|
+
request_header
|
|
170
|
+
.write(writer)
|
|
171
|
+
.await
|
|
172
|
+
.map_err(new_std_io_error)?;
|
|
173
|
+
writer
|
|
174
|
+
.write_all(key.as_bytes())
|
|
175
|
+
.await
|
|
176
|
+
.map_err(new_std_io_error)?;
|
|
177
|
+
writer.flush().await.map_err(new_std_io_error)?;
|
|
178
|
+
match parse_response(writer).await {
|
|
179
|
+
Ok(response) => {
|
|
180
|
+
if response.header.vbucket_id_or_status == 0x1 {
|
|
181
|
+
return Ok(None);
|
|
182
|
+
}
|
|
183
|
+
Ok(Some(response.value))
|
|
184
|
+
}
|
|
185
|
+
Err(e) => Err(e),
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
pub async fn set(&mut self, key: &str, val: &[u8], expiration: u32) -> Result<()> {
|
|
190
|
+
let writer = self.io.get_mut();
|
|
191
|
+
let request_header = PacketHeader {
|
|
192
|
+
magic: Magic::Request as u8,
|
|
193
|
+
opcode: Opcode::Set as u8,
|
|
194
|
+
key_length: key.len() as u16,
|
|
195
|
+
extras_length: 8,
|
|
196
|
+
total_body_length: (8 + key.len() + val.len()) as u32,
|
|
197
|
+
..Default::default()
|
|
198
|
+
};
|
|
199
|
+
let extras = StoreExtras {
|
|
200
|
+
flags: 0,
|
|
201
|
+
expiration,
|
|
202
|
+
};
|
|
203
|
+
request_header
|
|
204
|
+
.write(writer)
|
|
205
|
+
.await
|
|
206
|
+
.map_err(new_std_io_error)?;
|
|
207
|
+
writer
|
|
208
|
+
.write_u32(extras.flags)
|
|
209
|
+
.await
|
|
210
|
+
.map_err(new_std_io_error)?;
|
|
211
|
+
writer
|
|
212
|
+
.write_u32(extras.expiration)
|
|
213
|
+
.await
|
|
214
|
+
.map_err(new_std_io_error)?;
|
|
215
|
+
writer
|
|
216
|
+
.write_all(key.as_bytes())
|
|
217
|
+
.await
|
|
218
|
+
.map_err(new_std_io_error)?;
|
|
219
|
+
writer.write_all(val).await.map_err(new_std_io_error)?;
|
|
220
|
+
writer.flush().await.map_err(new_std_io_error)?;
|
|
221
|
+
|
|
222
|
+
parse_response(writer).await?;
|
|
223
|
+
Ok(())
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
pub async fn delete(&mut self, key: &str) -> Result<()> {
|
|
227
|
+
let writer = self.io.get_mut();
|
|
228
|
+
let request_header = PacketHeader {
|
|
229
|
+
magic: Magic::Request as u8,
|
|
230
|
+
opcode: Opcode::Delete as u8,
|
|
231
|
+
key_length: key.len() as u16,
|
|
232
|
+
total_body_length: key.len() as u32,
|
|
233
|
+
..Default::default()
|
|
234
|
+
};
|
|
235
|
+
request_header
|
|
236
|
+
.write(writer)
|
|
237
|
+
.await
|
|
238
|
+
.map_err(new_std_io_error)?;
|
|
239
|
+
writer
|
|
240
|
+
.write_all(key.as_bytes())
|
|
241
|
+
.await
|
|
242
|
+
.map_err(new_std_io_error)?;
|
|
243
|
+
writer.flush().await.map_err(new_std_io_error)?;
|
|
244
|
+
parse_response(writer).await?;
|
|
245
|
+
Ok(())
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
pub async fn parse_response(reader: &mut TcpStream) -> Result<Response> {
|
|
250
|
+
let header = PacketHeader::read(reader).await.map_err(new_std_io_error)?;
|
|
251
|
+
|
|
252
|
+
if header.vbucket_id_or_status != constants::OK_STATUS
|
|
253
|
+
&& header.vbucket_id_or_status != constants::KEY_NOT_FOUND
|
|
254
|
+
{
|
|
255
|
+
return Err(
|
|
256
|
+
Error::new(ErrorKind::Unexpected, "unexpected status received")
|
|
257
|
+
.with_context("message", format!("{}", header.vbucket_id_or_status)),
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
let mut extras = vec![0x0; header.extras_length as usize];
|
|
262
|
+
reader
|
|
263
|
+
.read_exact(extras.as_mut_slice())
|
|
264
|
+
.await
|
|
265
|
+
.map_err(new_std_io_error)?;
|
|
266
|
+
|
|
267
|
+
let mut key = vec![0x0; header.key_length as usize];
|
|
268
|
+
reader
|
|
269
|
+
.read_exact(key.as_mut_slice())
|
|
270
|
+
.await
|
|
271
|
+
.map_err(new_std_io_error)?;
|
|
272
|
+
|
|
273
|
+
let mut value = vec![
|
|
274
|
+
0x0;
|
|
275
|
+
(header.total_body_length - u32::from(header.key_length) - u32::from(header.extras_length))
|
|
276
|
+
as usize
|
|
277
|
+
];
|
|
278
|
+
reader
|
|
279
|
+
.read_exact(value.as_mut_slice())
|
|
280
|
+
.await
|
|
281
|
+
.map_err(new_std_io_error)?;
|
|
282
|
+
|
|
283
|
+
Ok(Response {
|
|
284
|
+
header,
|
|
285
|
+
_key: key,
|
|
286
|
+
_extras: extras,
|
|
287
|
+
value,
|
|
288
|
+
})
|
|
289
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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::time::Duration;
|
|
20
|
+
|
|
21
|
+
use serde::Deserialize;
|
|
22
|
+
use serde::Serialize;
|
|
23
|
+
|
|
24
|
+
/// Config for MemCached services support
|
|
25
|
+
#[derive(Default, Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
26
|
+
#[serde(default)]
|
|
27
|
+
#[non_exhaustive]
|
|
28
|
+
pub struct MemcachedConfig {
|
|
29
|
+
/// network address of the memcached service.
|
|
30
|
+
///
|
|
31
|
+
/// For example: "tcp://localhost:11211"
|
|
32
|
+
pub endpoint: Option<String>,
|
|
33
|
+
/// the working directory of the service. Can be "/path/to/dir"
|
|
34
|
+
///
|
|
35
|
+
/// default is "/"
|
|
36
|
+
pub root: Option<String>,
|
|
37
|
+
/// Memcached username, optional.
|
|
38
|
+
pub username: Option<String>,
|
|
39
|
+
/// Memcached password, optional.
|
|
40
|
+
pub password: Option<String>,
|
|
41
|
+
/// The default ttl for put operations.
|
|
42
|
+
pub default_ttl: Option<Duration>,
|
|
43
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [ ] create_dir
|
|
9
|
+
- [x] delete
|
|
10
|
+
- [ ] copy
|
|
11
|
+
- [ ] rename
|
|
12
|
+
- [ ] ~~list~~
|
|
13
|
+
- [ ] ~~presign~~
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `root`: Set the working directory of `OpenDAL`
|
|
19
|
+
- `username`: Set the username for authentication.
|
|
20
|
+
- `password`: Set the password for authentication.
|
|
21
|
+
- `endpoint`: Set the network address of memcached server
|
|
22
|
+
- `default_ttl`: Set the ttl for memcached service.
|
|
23
|
+
|
|
24
|
+
You can refer to [`MemcachedBuilder`]'s docs for more information
|
|
25
|
+
|
|
26
|
+
## Example
|
|
27
|
+
|
|
28
|
+
### Via Builder
|
|
29
|
+
|
|
30
|
+
```rust,no_run
|
|
31
|
+
use anyhow::Result;
|
|
32
|
+
use opendal::services::Memcached;
|
|
33
|
+
use opendal::Operator;
|
|
34
|
+
|
|
35
|
+
#[tokio::main]
|
|
36
|
+
async fn main() -> Result<()> {
|
|
37
|
+
// create memcached backend builder
|
|
38
|
+
let mut builder = Memcached::default()
|
|
39
|
+
.endpoint("tcp://127.0.0.1:11211");
|
|
40
|
+
// if you enable authentication, set username and password for authentication
|
|
41
|
+
// builder.username("admin")
|
|
42
|
+
// builder.password("password");
|
|
43
|
+
|
|
44
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
45
|
+
Ok(())
|
|
46
|
+
}
|
|
47
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
#[cfg(feature = "services-memcached")]
|
|
19
|
+
mod binary;
|
|
20
|
+
|
|
21
|
+
#[cfg(feature = "services-memcached")]
|
|
22
|
+
mod backend;
|
|
23
|
+
#[cfg(feature = "services-memcached")]
|
|
24
|
+
pub use backend::MemcachedBuilder as Memcached;
|
|
25
|
+
|
|
26
|
+
mod config;
|
|
27
|
+
pub use config::MemcachedConfig;
|