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,36 @@
|
|
|
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
|
+
/// Default scheme for monoiofs service.
|
|
19
|
+
#[cfg(feature = "services-monoiofs")]
|
|
20
|
+
pub(super) const DEFAULT_SCHEME: &str = "monoiofs";
|
|
21
|
+
#[cfg(feature = "services-monoiofs")]
|
|
22
|
+
mod core;
|
|
23
|
+
#[cfg(feature = "services-monoiofs")]
|
|
24
|
+
mod delete;
|
|
25
|
+
#[cfg(feature = "services-monoiofs")]
|
|
26
|
+
mod reader;
|
|
27
|
+
#[cfg(feature = "services-monoiofs")]
|
|
28
|
+
mod writer;
|
|
29
|
+
|
|
30
|
+
#[cfg(feature = "services-monoiofs")]
|
|
31
|
+
mod backend;
|
|
32
|
+
#[cfg(feature = "services-monoiofs")]
|
|
33
|
+
pub use backend::MonoiofsBuilder as Monoiofs;
|
|
34
|
+
|
|
35
|
+
mod config;
|
|
36
|
+
pub use config::MonoiofsConfig;
|
|
@@ -0,0 +1,147 @@
|
|
|
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::path::PathBuf;
|
|
19
|
+
use std::sync::Arc;
|
|
20
|
+
|
|
21
|
+
use bytes::BytesMut;
|
|
22
|
+
use futures::channel::mpsc;
|
|
23
|
+
use futures::channel::oneshot;
|
|
24
|
+
use futures::SinkExt;
|
|
25
|
+
use futures::StreamExt;
|
|
26
|
+
use monoio::fs::OpenOptions;
|
|
27
|
+
|
|
28
|
+
use super::core::MonoiofsCore;
|
|
29
|
+
use super::core::BUFFER_SIZE;
|
|
30
|
+
use crate::raw::*;
|
|
31
|
+
use crate::*;
|
|
32
|
+
|
|
33
|
+
enum ReaderRequest {
|
|
34
|
+
Read {
|
|
35
|
+
pos: u64,
|
|
36
|
+
buf: BytesMut,
|
|
37
|
+
tx: oneshot::Sender<Result<BytesMut>>,
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
pub struct MonoiofsReader {
|
|
42
|
+
core: Arc<MonoiofsCore>,
|
|
43
|
+
tx: mpsc::UnboundedSender<ReaderRequest>,
|
|
44
|
+
pos: u64,
|
|
45
|
+
end_pos: Option<u64>,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
impl MonoiofsReader {
|
|
49
|
+
pub async fn new(core: Arc<MonoiofsCore>, path: PathBuf, range: BytesRange) -> Result<Self> {
|
|
50
|
+
let (open_result_tx, open_result_rx) = oneshot::channel();
|
|
51
|
+
let (tx, rx) = mpsc::unbounded();
|
|
52
|
+
core.spawn(move || Self::worker_entrypoint(path, rx, open_result_tx))
|
|
53
|
+
.await;
|
|
54
|
+
core.unwrap(open_result_rx.await)?;
|
|
55
|
+
Ok(Self {
|
|
56
|
+
core,
|
|
57
|
+
tx,
|
|
58
|
+
pos: range.offset(),
|
|
59
|
+
end_pos: range.size().map(|size| range.offset() + size),
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// entrypoint of worker task that runs in context of monoio
|
|
64
|
+
async fn worker_entrypoint(
|
|
65
|
+
path: PathBuf,
|
|
66
|
+
mut rx: mpsc::UnboundedReceiver<ReaderRequest>,
|
|
67
|
+
open_result_tx: oneshot::Sender<Result<()>>,
|
|
68
|
+
) {
|
|
69
|
+
let result = OpenOptions::new().read(true).open(path).await;
|
|
70
|
+
// [`monoio::fs::File`] is non-Send, hence it is kept within
|
|
71
|
+
// worker thread
|
|
72
|
+
let file = match result {
|
|
73
|
+
Ok(file) => {
|
|
74
|
+
let Ok(()) = open_result_tx.send(Ok(())) else {
|
|
75
|
+
// MonoiofsReader::new is cancelled, exit worker task
|
|
76
|
+
return;
|
|
77
|
+
};
|
|
78
|
+
file
|
|
79
|
+
}
|
|
80
|
+
Err(e) => {
|
|
81
|
+
// discard the result if send failed due to MonoiofsReader::new
|
|
82
|
+
// cancelled since we are going to exit anyway
|
|
83
|
+
let _ = open_result_tx.send(Err(new_std_io_error(e)));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
// wait for read request and send back result to main thread
|
|
88
|
+
loop {
|
|
89
|
+
let Some(req) = rx.next().await else {
|
|
90
|
+
// MonoiofsReader is dropped, exit worker task
|
|
91
|
+
break;
|
|
92
|
+
};
|
|
93
|
+
match req {
|
|
94
|
+
ReaderRequest::Read { pos, buf, tx } => {
|
|
95
|
+
let (result, buf) = file.read_at(buf, pos).await;
|
|
96
|
+
// buf.len() will be set to n by monoio if read
|
|
97
|
+
// successfully, so n is dropped
|
|
98
|
+
let result = result.map(move |_| buf).map_err(new_std_io_error);
|
|
99
|
+
// discard the result if send failed due to
|
|
100
|
+
// MonoiofsReader::read cancelled
|
|
101
|
+
let _ = tx.send(result);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
impl oio::Read for MonoiofsReader {
|
|
109
|
+
/// Send read request to worker thread and wait for result. Actual
|
|
110
|
+
/// read happens in [`MonoiofsReader::worker_entrypoint`] running
|
|
111
|
+
/// on worker thread.
|
|
112
|
+
async fn read(&mut self) -> Result<Buffer> {
|
|
113
|
+
if let Some(end_pos) = self.end_pos {
|
|
114
|
+
if self.pos >= end_pos {
|
|
115
|
+
return Ok(Buffer::new());
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// allocate and resize buffer
|
|
120
|
+
let mut buf = self.core.buf_pool.get();
|
|
121
|
+
let size = self
|
|
122
|
+
.end_pos
|
|
123
|
+
.map_or(BUFFER_SIZE, |end_pos| (end_pos - self.pos) as usize);
|
|
124
|
+
// set capacity of buf to exact size to avoid excessive read
|
|
125
|
+
buf.reserve(size);
|
|
126
|
+
let _ = buf.split_off(size);
|
|
127
|
+
|
|
128
|
+
// send read request to worker thread and wait for result
|
|
129
|
+
let (tx, rx) = oneshot::channel();
|
|
130
|
+
self.core.unwrap(
|
|
131
|
+
self.tx
|
|
132
|
+
.send(ReaderRequest::Read {
|
|
133
|
+
pos: self.pos,
|
|
134
|
+
buf,
|
|
135
|
+
tx,
|
|
136
|
+
})
|
|
137
|
+
.await,
|
|
138
|
+
);
|
|
139
|
+
let mut buf = self.core.unwrap(rx.await)?;
|
|
140
|
+
|
|
141
|
+
// advance cursor if read successfully
|
|
142
|
+
self.pos += buf.len() as u64;
|
|
143
|
+
let buffer = Buffer::from(buf.split().freeze());
|
|
144
|
+
self.core.buf_pool.put(buf);
|
|
145
|
+
Ok(buffer)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
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::path::PathBuf;
|
|
19
|
+
use std::sync::Arc;
|
|
20
|
+
|
|
21
|
+
use bytes::Buf;
|
|
22
|
+
use bytes::Bytes;
|
|
23
|
+
use chrono::DateTime;
|
|
24
|
+
use futures::channel::mpsc;
|
|
25
|
+
use futures::channel::oneshot;
|
|
26
|
+
use futures::SinkExt;
|
|
27
|
+
use futures::StreamExt;
|
|
28
|
+
use monoio::fs::OpenOptions;
|
|
29
|
+
|
|
30
|
+
use super::core::MonoiofsCore;
|
|
31
|
+
use crate::raw::*;
|
|
32
|
+
use crate::*;
|
|
33
|
+
|
|
34
|
+
enum WriterRequest {
|
|
35
|
+
Write {
|
|
36
|
+
pos: u64,
|
|
37
|
+
buf: Bytes,
|
|
38
|
+
tx: oneshot::Sender<Result<()>>,
|
|
39
|
+
},
|
|
40
|
+
Stat {
|
|
41
|
+
tx: oneshot::Sender<Result<monoio::fs::Metadata>>,
|
|
42
|
+
},
|
|
43
|
+
Close {
|
|
44
|
+
tx: oneshot::Sender<Result<()>>,
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
pub struct MonoiofsWriter {
|
|
49
|
+
core: Arc<MonoiofsCore>,
|
|
50
|
+
tx: mpsc::UnboundedSender<WriterRequest>,
|
|
51
|
+
pos: u64,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
impl MonoiofsWriter {
|
|
55
|
+
pub async fn new(core: Arc<MonoiofsCore>, path: PathBuf, append: bool) -> Result<Self> {
|
|
56
|
+
let (open_result_tx, open_result_rx) = oneshot::channel();
|
|
57
|
+
let (tx, rx) = mpsc::unbounded();
|
|
58
|
+
core.spawn(move || Self::worker_entrypoint(path, append, rx, open_result_tx))
|
|
59
|
+
.await;
|
|
60
|
+
core.unwrap(open_result_rx.await)?;
|
|
61
|
+
Ok(Self { core, tx, pos: 0 })
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// entrypoint of worker task that runs in context of monoio
|
|
65
|
+
async fn worker_entrypoint(
|
|
66
|
+
path: PathBuf,
|
|
67
|
+
append: bool,
|
|
68
|
+
mut rx: mpsc::UnboundedReceiver<WriterRequest>,
|
|
69
|
+
open_result_tx: oneshot::Sender<Result<()>>,
|
|
70
|
+
) {
|
|
71
|
+
let result = OpenOptions::new()
|
|
72
|
+
.write(true)
|
|
73
|
+
.create(true)
|
|
74
|
+
.append(append)
|
|
75
|
+
.truncate(!append)
|
|
76
|
+
.open(path)
|
|
77
|
+
.await;
|
|
78
|
+
// [`monoio::fs::File`] is non-Send, hence it is kept within
|
|
79
|
+
// worker thread
|
|
80
|
+
let file = match result {
|
|
81
|
+
Ok(file) => {
|
|
82
|
+
let Ok(()) = open_result_tx.send(Ok(())) else {
|
|
83
|
+
// MonoiofsWriter::new is cancelled, exit worker task
|
|
84
|
+
return;
|
|
85
|
+
};
|
|
86
|
+
file
|
|
87
|
+
}
|
|
88
|
+
Err(e) => {
|
|
89
|
+
// discard the result if send failed due to MonoiofsWriter::new
|
|
90
|
+
// cancelled since we are going to exit anyway
|
|
91
|
+
let _ = open_result_tx.send(Err(new_std_io_error(e)));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
// wait for write or close request and send back result to main thread
|
|
96
|
+
loop {
|
|
97
|
+
let Some(req) = rx.next().await else {
|
|
98
|
+
// MonoiofsWriter is dropped, exit worker task
|
|
99
|
+
break;
|
|
100
|
+
};
|
|
101
|
+
match req {
|
|
102
|
+
WriterRequest::Write { pos, buf, tx } => {
|
|
103
|
+
let (result, _) = file.write_all_at(buf, pos).await;
|
|
104
|
+
// discard the result if send failed due to
|
|
105
|
+
// MonoiofsWriter::write cancelled
|
|
106
|
+
let _ = tx.send(result.map_err(new_std_io_error));
|
|
107
|
+
}
|
|
108
|
+
WriterRequest::Stat { tx } => {
|
|
109
|
+
let result = file.metadata().await;
|
|
110
|
+
let _ = tx.send(result.map_err(new_std_io_error));
|
|
111
|
+
}
|
|
112
|
+
WriterRequest::Close { tx } => {
|
|
113
|
+
let result = file.sync_all().await;
|
|
114
|
+
// discard the result if send failed due to
|
|
115
|
+
// MonoiofsWriter::close cancelled
|
|
116
|
+
let _ = tx.send(result.map_err(new_std_io_error));
|
|
117
|
+
// file is closed in background and result is useless
|
|
118
|
+
let _ = file.close().await;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
impl oio::Write for MonoiofsWriter {
|
|
127
|
+
/// Send write request to worker thread and wait for result. Actual
|
|
128
|
+
/// write happens in [`MonoiofsWriter::worker_entrypoint`] running
|
|
129
|
+
/// on worker thread.
|
|
130
|
+
async fn write(&mut self, mut bs: Buffer) -> Result<()> {
|
|
131
|
+
while bs.has_remaining() {
|
|
132
|
+
let buf = bs.current();
|
|
133
|
+
let n = buf.len();
|
|
134
|
+
let (tx, rx) = oneshot::channel();
|
|
135
|
+
self.core.unwrap(
|
|
136
|
+
self.tx
|
|
137
|
+
.send(WriterRequest::Write {
|
|
138
|
+
pos: self.pos,
|
|
139
|
+
buf,
|
|
140
|
+
tx,
|
|
141
|
+
})
|
|
142
|
+
.await,
|
|
143
|
+
);
|
|
144
|
+
self.core.unwrap(rx.await)?;
|
|
145
|
+
self.pos += n as u64;
|
|
146
|
+
bs.advance(n);
|
|
147
|
+
}
|
|
148
|
+
Ok(())
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// Send close request to worker thread and wait for result. Actual
|
|
152
|
+
/// close happens in [`MonoiofsWriter::worker_entrypoint`] running
|
|
153
|
+
/// on worker thread.
|
|
154
|
+
async fn close(&mut self) -> Result<Metadata> {
|
|
155
|
+
let (tx, rx) = oneshot::channel();
|
|
156
|
+
self.core
|
|
157
|
+
.unwrap(self.tx.send(WriterRequest::Stat { tx }).await);
|
|
158
|
+
let file_meta = self.core.unwrap(rx.await)?;
|
|
159
|
+
|
|
160
|
+
let (tx, rx) = oneshot::channel();
|
|
161
|
+
self.core
|
|
162
|
+
.unwrap(self.tx.send(WriterRequest::Close { tx }).await);
|
|
163
|
+
self.core.unwrap(rx.await)?;
|
|
164
|
+
|
|
165
|
+
let mode = if file_meta.is_dir() {
|
|
166
|
+
EntryMode::DIR
|
|
167
|
+
} else if file_meta.is_file() {
|
|
168
|
+
EntryMode::FILE
|
|
169
|
+
} else {
|
|
170
|
+
EntryMode::Unknown
|
|
171
|
+
};
|
|
172
|
+
let meta = Metadata::new(mode)
|
|
173
|
+
.with_content_length(file_meta.len())
|
|
174
|
+
.with_last_modified(
|
|
175
|
+
file_meta
|
|
176
|
+
.modified()
|
|
177
|
+
.map(DateTime::from)
|
|
178
|
+
.map_err(new_std_io_error)?,
|
|
179
|
+
);
|
|
180
|
+
Ok(meta)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async fn abort(&mut self) -> Result<()> {
|
|
184
|
+
Err(Error::new(
|
|
185
|
+
ErrorKind::Unsupported,
|
|
186
|
+
"Monoiofs doesn't support abort",
|
|
187
|
+
))
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,256 @@
|
|
|
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::str::FromStr;
|
|
20
|
+
|
|
21
|
+
use sqlx::mysql::MySqlConnectOptions;
|
|
22
|
+
use sqlx::MySqlPool;
|
|
23
|
+
use tokio::sync::OnceCell;
|
|
24
|
+
|
|
25
|
+
use crate::raw::adapters::kv;
|
|
26
|
+
use crate::raw::*;
|
|
27
|
+
use crate::services::MysqlConfig;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
impl Configurator for MysqlConfig {
|
|
31
|
+
type Builder = MysqlBuilder;
|
|
32
|
+
fn into_builder(self) -> Self::Builder {
|
|
33
|
+
MysqlBuilder { config: self }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#[doc = include_str!("docs.md")]
|
|
38
|
+
#[derive(Default)]
|
|
39
|
+
pub struct MysqlBuilder {
|
|
40
|
+
config: MysqlConfig,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
impl Debug for MysqlBuilder {
|
|
44
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
45
|
+
let mut d = f.debug_struct("MysqlBuilder");
|
|
46
|
+
|
|
47
|
+
d.field("config", &self.config).finish()
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
impl MysqlBuilder {
|
|
52
|
+
/// Set the connection_string of the mysql service.
|
|
53
|
+
///
|
|
54
|
+
/// This connection string is used to connect to the mysql service. There are url based formats:
|
|
55
|
+
///
|
|
56
|
+
/// ## Url
|
|
57
|
+
///
|
|
58
|
+
/// This format resembles the url format of the mysql client. The format is: `[scheme://][user[:[password]]@]host[:port][/schema][?attribute1=value1&attribute2=value2...`
|
|
59
|
+
///
|
|
60
|
+
/// - `mysql://user@localhost`
|
|
61
|
+
/// - `mysql://user:password@localhost`
|
|
62
|
+
/// - `mysql://user:password@localhost:3306`
|
|
63
|
+
/// - `mysql://user:password@localhost:3306/db`
|
|
64
|
+
///
|
|
65
|
+
/// For more information, please refer to <https://docs.rs/sqlx/latest/sqlx/mysql/struct.MySqlConnectOptions.html>.
|
|
66
|
+
pub fn connection_string(mut self, v: &str) -> Self {
|
|
67
|
+
if !v.is_empty() {
|
|
68
|
+
self.config.connection_string = Some(v.to_string());
|
|
69
|
+
}
|
|
70
|
+
self
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// set the working directory, all operations will be performed under it.
|
|
74
|
+
///
|
|
75
|
+
/// default: "/"
|
|
76
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
77
|
+
self.config.root = if root.is_empty() {
|
|
78
|
+
None
|
|
79
|
+
} else {
|
|
80
|
+
Some(root.to_string())
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
self
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// Set the table name of the mysql service to read/write.
|
|
87
|
+
pub fn table(mut self, table: &str) -> Self {
|
|
88
|
+
if !table.is_empty() {
|
|
89
|
+
self.config.table = Some(table.to_string());
|
|
90
|
+
}
|
|
91
|
+
self
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Set the key field name of the mysql service to read/write.
|
|
95
|
+
///
|
|
96
|
+
/// Default to `key` if not specified.
|
|
97
|
+
pub fn key_field(mut self, key_field: &str) -> Self {
|
|
98
|
+
if !key_field.is_empty() {
|
|
99
|
+
self.config.key_field = Some(key_field.to_string());
|
|
100
|
+
}
|
|
101
|
+
self
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// Set the value field name of the mysql service to read/write.
|
|
105
|
+
///
|
|
106
|
+
/// Default to `value` if not specified.
|
|
107
|
+
pub fn value_field(mut self, value_field: &str) -> Self {
|
|
108
|
+
if !value_field.is_empty() {
|
|
109
|
+
self.config.value_field = Some(value_field.to_string());
|
|
110
|
+
}
|
|
111
|
+
self
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
impl Builder for MysqlBuilder {
|
|
116
|
+
type Config = MysqlConfig;
|
|
117
|
+
|
|
118
|
+
fn build(self) -> Result<impl Access> {
|
|
119
|
+
let conn = match self.config.connection_string {
|
|
120
|
+
Some(v) => v,
|
|
121
|
+
None => {
|
|
122
|
+
return Err(
|
|
123
|
+
Error::new(ErrorKind::ConfigInvalid, "connection_string is empty")
|
|
124
|
+
.with_context("service", Scheme::Mysql),
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
let config = MySqlConnectOptions::from_str(&conn).map_err(|err| {
|
|
130
|
+
Error::new(ErrorKind::ConfigInvalid, "connection_string is invalid")
|
|
131
|
+
.with_context("service", Scheme::Mysql)
|
|
132
|
+
.set_source(err)
|
|
133
|
+
})?;
|
|
134
|
+
|
|
135
|
+
let table = match self.config.table {
|
|
136
|
+
Some(v) => v,
|
|
137
|
+
None => {
|
|
138
|
+
return Err(Error::new(ErrorKind::ConfigInvalid, "table is empty")
|
|
139
|
+
.with_context("service", Scheme::Mysql))
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
let key_field = self.config.key_field.unwrap_or_else(|| "key".to_string());
|
|
144
|
+
|
|
145
|
+
let value_field = self
|
|
146
|
+
.config
|
|
147
|
+
.value_field
|
|
148
|
+
.unwrap_or_else(|| "value".to_string());
|
|
149
|
+
|
|
150
|
+
let root = normalize_root(self.config.root.unwrap_or_else(|| "/".to_string()).as_str());
|
|
151
|
+
|
|
152
|
+
Ok(MySqlBackend::new(Adapter {
|
|
153
|
+
pool: OnceCell::new(),
|
|
154
|
+
config,
|
|
155
|
+
table,
|
|
156
|
+
key_field,
|
|
157
|
+
value_field,
|
|
158
|
+
})
|
|
159
|
+
.with_normalized_root(root))
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// Backend for mysql service
|
|
164
|
+
pub type MySqlBackend = kv::Backend<Adapter>;
|
|
165
|
+
|
|
166
|
+
#[derive(Debug, Clone)]
|
|
167
|
+
pub struct Adapter {
|
|
168
|
+
pool: OnceCell<MySqlPool>,
|
|
169
|
+
config: MySqlConnectOptions,
|
|
170
|
+
|
|
171
|
+
table: String,
|
|
172
|
+
key_field: String,
|
|
173
|
+
value_field: String,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
impl Adapter {
|
|
177
|
+
async fn get_client(&self) -> Result<&MySqlPool> {
|
|
178
|
+
self.pool
|
|
179
|
+
.get_or_try_init(|| async {
|
|
180
|
+
let pool = MySqlPool::connect_with(self.config.clone())
|
|
181
|
+
.await
|
|
182
|
+
.map_err(parse_mysql_error)?;
|
|
183
|
+
Ok(pool)
|
|
184
|
+
})
|
|
185
|
+
.await
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
impl kv::Adapter for Adapter {
|
|
190
|
+
type Scanner = ();
|
|
191
|
+
|
|
192
|
+
fn info(&self) -> kv::Info {
|
|
193
|
+
kv::Info::new(
|
|
194
|
+
Scheme::Mysql,
|
|
195
|
+
&self.table,
|
|
196
|
+
Capability {
|
|
197
|
+
read: true,
|
|
198
|
+
write: true,
|
|
199
|
+
delete: true,
|
|
200
|
+
shared: true,
|
|
201
|
+
..Default::default()
|
|
202
|
+
},
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async fn get(&self, path: &str) -> Result<Option<Buffer>> {
|
|
207
|
+
let pool = self.get_client().await?;
|
|
208
|
+
|
|
209
|
+
let value: Option<Vec<u8>> = sqlx::query_scalar(&format!(
|
|
210
|
+
"SELECT `{}` FROM `{}` WHERE `{}` = ? LIMIT 1",
|
|
211
|
+
self.value_field, self.table, self.key_field
|
|
212
|
+
))
|
|
213
|
+
.bind(path)
|
|
214
|
+
.fetch_optional(pool)
|
|
215
|
+
.await
|
|
216
|
+
.map_err(parse_mysql_error)?;
|
|
217
|
+
|
|
218
|
+
Ok(value.map(Buffer::from))
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async fn set(&self, path: &str, value: Buffer) -> Result<()> {
|
|
222
|
+
let pool = self.get_client().await?;
|
|
223
|
+
|
|
224
|
+
sqlx::query(&format!(
|
|
225
|
+
r#"INSERT INTO `{}` (`{}`, `{}`) VALUES (?, ?)
|
|
226
|
+
ON DUPLICATE KEY UPDATE `{}` = VALUES({})"#,
|
|
227
|
+
self.table, self.key_field, self.value_field, self.value_field, self.value_field
|
|
228
|
+
))
|
|
229
|
+
.bind(path)
|
|
230
|
+
.bind(value.to_vec())
|
|
231
|
+
.execute(pool)
|
|
232
|
+
.await
|
|
233
|
+
.map_err(parse_mysql_error)?;
|
|
234
|
+
|
|
235
|
+
Ok(())
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async fn delete(&self, path: &str) -> Result<()> {
|
|
239
|
+
let pool = self.get_client().await?;
|
|
240
|
+
|
|
241
|
+
sqlx::query(&format!(
|
|
242
|
+
"DELETE FROM `{}` WHERE `{}` = ?",
|
|
243
|
+
self.table, self.key_field
|
|
244
|
+
))
|
|
245
|
+
.bind(path)
|
|
246
|
+
.execute(pool)
|
|
247
|
+
.await
|
|
248
|
+
.map_err(parse_mysql_error)?;
|
|
249
|
+
|
|
250
|
+
Ok(())
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
fn parse_mysql_error(err: sqlx::Error) -> Error {
|
|
255
|
+
Error::new(ErrorKind::Unexpected, "unhandled error from mysql").set_source(err)
|
|
256
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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::fmt::Formatter;
|
|
20
|
+
|
|
21
|
+
use serde::Deserialize;
|
|
22
|
+
use serde::Serialize;
|
|
23
|
+
|
|
24
|
+
/// Config for Mysql services support.
|
|
25
|
+
#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
26
|
+
#[serde(default)]
|
|
27
|
+
#[non_exhaustive]
|
|
28
|
+
pub struct MysqlConfig {
|
|
29
|
+
/// This connection string is used to connect to the mysql service. There are url based formats.
|
|
30
|
+
///
|
|
31
|
+
/// The format of connect string resembles the url format of the mysql client.
|
|
32
|
+
/// The format is: `[scheme://][user[:[password]]@]host[:port][/schema][?attribute1=value1&attribute2=value2...`
|
|
33
|
+
///
|
|
34
|
+
/// - `mysql://user@localhost`
|
|
35
|
+
/// - `mysql://user:password@localhost`
|
|
36
|
+
/// - `mysql://user:password@localhost:3306`
|
|
37
|
+
/// - `mysql://user:password@localhost:3306/db`
|
|
38
|
+
///
|
|
39
|
+
/// For more information, please refer to <https://docs.rs/sqlx/latest/sqlx/mysql/struct.MySqlConnectOptions.html>.
|
|
40
|
+
pub connection_string: Option<String>,
|
|
41
|
+
|
|
42
|
+
/// The table name for mysql.
|
|
43
|
+
pub table: Option<String>,
|
|
44
|
+
/// The key field name for mysql.
|
|
45
|
+
pub key_field: Option<String>,
|
|
46
|
+
/// The value field name for mysql.
|
|
47
|
+
pub value_field: Option<String>,
|
|
48
|
+
/// The root for mysql.
|
|
49
|
+
pub root: Option<String>,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
impl Debug for MysqlConfig {
|
|
53
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
54
|
+
let mut d = f.debug_struct("MysqlConfig");
|
|
55
|
+
|
|
56
|
+
if self.connection_string.is_some() {
|
|
57
|
+
d.field("connection_string", &"<redacted>");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
d.field("root", &self.root)
|
|
61
|
+
.field("table", &self.table)
|
|
62
|
+
.field("key_field", &self.key_field)
|
|
63
|
+
.field("value_field", &self.value_field)
|
|
64
|
+
.finish()
|
|
65
|
+
}
|
|
66
|
+
}
|