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,258 @@
|
|
|
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
|
+
use std::str::FromStr;
|
|
21
|
+
|
|
22
|
+
use sqlx::postgres::PgConnectOptions;
|
|
23
|
+
use sqlx::PgPool;
|
|
24
|
+
use tokio::sync::OnceCell;
|
|
25
|
+
|
|
26
|
+
use crate::raw::adapters::kv;
|
|
27
|
+
use crate::raw::*;
|
|
28
|
+
use crate::services::PostgresqlConfig;
|
|
29
|
+
use crate::*;
|
|
30
|
+
|
|
31
|
+
impl Configurator for PostgresqlConfig {
|
|
32
|
+
type Builder = PostgresqlBuilder;
|
|
33
|
+
fn into_builder(self) -> Self::Builder {
|
|
34
|
+
PostgresqlBuilder { config: self }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// [PostgreSQL](https://www.postgresql.org/) services support.
|
|
39
|
+
#[doc = include_str!("docs.md")]
|
|
40
|
+
#[derive(Default)]
|
|
41
|
+
pub struct PostgresqlBuilder {
|
|
42
|
+
config: PostgresqlConfig,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
impl Debug for PostgresqlBuilder {
|
|
46
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
47
|
+
let mut d = f.debug_struct("PostgresqlBuilder");
|
|
48
|
+
|
|
49
|
+
d.field("config", &self.config);
|
|
50
|
+
d.finish()
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
impl PostgresqlBuilder {
|
|
55
|
+
/// Set the connection url string of the postgresql service.
|
|
56
|
+
///
|
|
57
|
+
/// The URL should be with a scheme of either `postgres://` or `postgresql://`.
|
|
58
|
+
///
|
|
59
|
+
/// - `postgresql://user@localhost`
|
|
60
|
+
/// - `postgresql://user:password@%2Fvar%2Flib%2Fpostgresql/mydb?connect_timeout=10`
|
|
61
|
+
/// - `postgresql://user@host1:1234,host2,host3:5678?target_session_attrs=read-write`
|
|
62
|
+
/// - `postgresql:///mydb?user=user&host=/var/lib/postgresql`
|
|
63
|
+
///
|
|
64
|
+
/// For more information, please visit <https://docs.rs/sqlx/latest/sqlx/postgres/struct.PgConnectOptions.html>.
|
|
65
|
+
pub fn connection_string(mut self, v: &str) -> Self {
|
|
66
|
+
if !v.is_empty() {
|
|
67
|
+
self.config.connection_string = Some(v.to_string());
|
|
68
|
+
}
|
|
69
|
+
self
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// Set the working directory, all operations will be performed under it.
|
|
73
|
+
///
|
|
74
|
+
/// default: "/"
|
|
75
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
76
|
+
self.config.root = if root.is_empty() {
|
|
77
|
+
None
|
|
78
|
+
} else {
|
|
79
|
+
Some(root.to_string())
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
self
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// Set the table name of the postgresql service to read/write.
|
|
86
|
+
pub fn table(mut self, table: &str) -> Self {
|
|
87
|
+
if !table.is_empty() {
|
|
88
|
+
self.config.table = Some(table.to_string());
|
|
89
|
+
}
|
|
90
|
+
self
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/// Set the key field name of the postgresql service to read/write.
|
|
94
|
+
///
|
|
95
|
+
/// Default to `key` if not specified.
|
|
96
|
+
pub fn key_field(mut self, key_field: &str) -> Self {
|
|
97
|
+
if !key_field.is_empty() {
|
|
98
|
+
self.config.key_field = Some(key_field.to_string());
|
|
99
|
+
}
|
|
100
|
+
self
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// Set the value field name of the postgresql service to read/write.
|
|
104
|
+
///
|
|
105
|
+
/// Default to `value` if not specified.
|
|
106
|
+
pub fn value_field(mut self, value_field: &str) -> Self {
|
|
107
|
+
if !value_field.is_empty() {
|
|
108
|
+
self.config.value_field = Some(value_field.to_string());
|
|
109
|
+
}
|
|
110
|
+
self
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
impl Builder for PostgresqlBuilder {
|
|
115
|
+
type Config = PostgresqlConfig;
|
|
116
|
+
|
|
117
|
+
fn build(self) -> Result<impl Access> {
|
|
118
|
+
let conn = match self.config.connection_string {
|
|
119
|
+
Some(v) => v,
|
|
120
|
+
None => {
|
|
121
|
+
return Err(
|
|
122
|
+
Error::new(ErrorKind::ConfigInvalid, "connection_string is empty")
|
|
123
|
+
.with_context("service", Scheme::Postgresql),
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
let config = PgConnectOptions::from_str(&conn).map_err(|err| {
|
|
129
|
+
Error::new(ErrorKind::ConfigInvalid, "connection_string is invalid")
|
|
130
|
+
.with_context("service", Scheme::Postgresql)
|
|
131
|
+
.set_source(err)
|
|
132
|
+
})?;
|
|
133
|
+
|
|
134
|
+
let table = match self.config.table {
|
|
135
|
+
Some(v) => v,
|
|
136
|
+
None => {
|
|
137
|
+
return Err(Error::new(ErrorKind::ConfigInvalid, "table is empty")
|
|
138
|
+
.with_context("service", Scheme::Postgresql))
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
let key_field = self.config.key_field.unwrap_or_else(|| "key".to_string());
|
|
143
|
+
|
|
144
|
+
let value_field = self
|
|
145
|
+
.config
|
|
146
|
+
.value_field
|
|
147
|
+
.unwrap_or_else(|| "value".to_string());
|
|
148
|
+
|
|
149
|
+
let root = normalize_root(self.config.root.unwrap_or_else(|| "/".to_string()).as_str());
|
|
150
|
+
|
|
151
|
+
Ok(PostgresqlBackend::new(Adapter {
|
|
152
|
+
pool: OnceCell::new(),
|
|
153
|
+
config,
|
|
154
|
+
table,
|
|
155
|
+
key_field,
|
|
156
|
+
value_field,
|
|
157
|
+
})
|
|
158
|
+
.with_normalized_root(root))
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// Backend for Postgresql service
|
|
163
|
+
pub type PostgresqlBackend = kv::Backend<Adapter>;
|
|
164
|
+
|
|
165
|
+
#[derive(Debug, Clone)]
|
|
166
|
+
pub struct Adapter {
|
|
167
|
+
pool: OnceCell<PgPool>,
|
|
168
|
+
config: PgConnectOptions,
|
|
169
|
+
|
|
170
|
+
table: String,
|
|
171
|
+
key_field: String,
|
|
172
|
+
value_field: String,
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
impl Adapter {
|
|
176
|
+
async fn get_client(&self) -> Result<&PgPool> {
|
|
177
|
+
self.pool
|
|
178
|
+
.get_or_try_init(|| async {
|
|
179
|
+
let pool = PgPool::connect_with(self.config.clone())
|
|
180
|
+
.await
|
|
181
|
+
.map_err(parse_postgres_error)?;
|
|
182
|
+
Ok(pool)
|
|
183
|
+
})
|
|
184
|
+
.await
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
impl kv::Adapter for Adapter {
|
|
189
|
+
type Scanner = ();
|
|
190
|
+
|
|
191
|
+
fn info(&self) -> kv::Info {
|
|
192
|
+
kv::Info::new(
|
|
193
|
+
Scheme::Postgresql,
|
|
194
|
+
&self.table,
|
|
195
|
+
Capability {
|
|
196
|
+
read: true,
|
|
197
|
+
write: true,
|
|
198
|
+
shared: true,
|
|
199
|
+
..Default::default()
|
|
200
|
+
},
|
|
201
|
+
)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async fn get(&self, path: &str) -> Result<Option<Buffer>> {
|
|
205
|
+
let pool = self.get_client().await?;
|
|
206
|
+
|
|
207
|
+
let value: Option<Vec<u8>> = sqlx::query_scalar(&format!(
|
|
208
|
+
r#"SELECT "{}" FROM "{}" WHERE "{}" = $1 LIMIT 1"#,
|
|
209
|
+
self.value_field, self.table, self.key_field
|
|
210
|
+
))
|
|
211
|
+
.bind(path)
|
|
212
|
+
.fetch_optional(pool)
|
|
213
|
+
.await
|
|
214
|
+
.map_err(parse_postgres_error)?;
|
|
215
|
+
|
|
216
|
+
Ok(value.map(Buffer::from))
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async fn set(&self, path: &str, value: Buffer) -> Result<()> {
|
|
220
|
+
let pool = self.get_client().await?;
|
|
221
|
+
|
|
222
|
+
let table = &self.table;
|
|
223
|
+
let key_field = &self.key_field;
|
|
224
|
+
let value_field = &self.value_field;
|
|
225
|
+
sqlx::query(&format!(
|
|
226
|
+
r#"INSERT INTO "{table}" ("{key_field}", "{value_field}")
|
|
227
|
+
VALUES ($1, $2)
|
|
228
|
+
ON CONFLICT ("{key_field}")
|
|
229
|
+
DO UPDATE SET "{value_field}" = EXCLUDED."{value_field}""#,
|
|
230
|
+
))
|
|
231
|
+
.bind(path)
|
|
232
|
+
.bind(value.to_vec())
|
|
233
|
+
.execute(pool)
|
|
234
|
+
.await
|
|
235
|
+
.map_err(parse_postgres_error)?;
|
|
236
|
+
|
|
237
|
+
Ok(())
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async fn delete(&self, path: &str) -> Result<()> {
|
|
241
|
+
let pool = self.get_client().await?;
|
|
242
|
+
|
|
243
|
+
sqlx::query(&format!(
|
|
244
|
+
"DELETE FROM {} WHERE {} = $1",
|
|
245
|
+
self.table, self.key_field
|
|
246
|
+
))
|
|
247
|
+
.bind(path)
|
|
248
|
+
.execute(pool)
|
|
249
|
+
.await
|
|
250
|
+
.map_err(parse_postgres_error)?;
|
|
251
|
+
|
|
252
|
+
Ok(())
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
fn parse_postgres_error(err: sqlx::Error) -> Error {
|
|
257
|
+
Error::new(ErrorKind::Unexpected, "unhandled error from postgresql").set_source(err)
|
|
258
|
+
}
|
|
@@ -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 PostgreSQL services support.
|
|
25
|
+
#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
26
|
+
#[serde(default)]
|
|
27
|
+
#[non_exhaustive]
|
|
28
|
+
pub struct PostgresqlConfig {
|
|
29
|
+
/// Root of this backend.
|
|
30
|
+
///
|
|
31
|
+
/// All operations will happen under this root.
|
|
32
|
+
///
|
|
33
|
+
/// Default to `/` if not set.
|
|
34
|
+
pub root: Option<String>,
|
|
35
|
+
/// The URL should be with a scheme of either `postgres://` or `postgresql://`.
|
|
36
|
+
///
|
|
37
|
+
/// - `postgresql://user@localhost`
|
|
38
|
+
/// - `postgresql://user:password@%2Fvar%2Flib%2Fpostgresql/mydb?connect_timeout=10`
|
|
39
|
+
/// - `postgresql://user@host1:1234,host2,host3:5678?target_session_attrs=read-write`
|
|
40
|
+
/// - `postgresql:///mydb?user=user&host=/var/lib/postgresql`
|
|
41
|
+
///
|
|
42
|
+
/// For more information, please visit <https://docs.rs/sqlx/latest/sqlx/postgres/struct.PgConnectOptions.html>.
|
|
43
|
+
pub connection_string: Option<String>,
|
|
44
|
+
/// the table of postgresql
|
|
45
|
+
pub table: Option<String>,
|
|
46
|
+
/// the key field of postgresql
|
|
47
|
+
pub key_field: Option<String>,
|
|
48
|
+
/// the value field of postgresql
|
|
49
|
+
pub value_field: Option<String>,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
impl Debug for PostgresqlConfig {
|
|
53
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
54
|
+
let mut d = f.debug_struct("PostgresqlConfig");
|
|
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
|
+
}
|
|
@@ -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
|
+
- [x] 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
|
+
- `connection_string`: Set the connection string of postgres server
|
|
20
|
+
- `table`: Set the table of postgresql
|
|
21
|
+
- `key_field`: Set the key field of postgresql
|
|
22
|
+
- `value_field`: Set the value field of postgresql
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
### Via Builder
|
|
27
|
+
|
|
28
|
+
```rust,no_run
|
|
29
|
+
use anyhow::Result;
|
|
30
|
+
use opendal::services::Postgresql;
|
|
31
|
+
use opendal::Operator;
|
|
32
|
+
|
|
33
|
+
#[tokio::main]
|
|
34
|
+
async fn main() -> Result<()> {
|
|
35
|
+
let mut builder = Postgresql::default()
|
|
36
|
+
.root("/")
|
|
37
|
+
.connection_string("postgresql://you_username:your_password@127.0.0.1:5432/your_database")
|
|
38
|
+
.table("your_table")
|
|
39
|
+
// key field type in the table should be compatible with Rust's &str like text
|
|
40
|
+
.key_field("key")
|
|
41
|
+
// value field type in the table should be compatible with Rust's Vec<u8> like bytea
|
|
42
|
+
.value_field("value");
|
|
43
|
+
|
|
44
|
+
let op = Operator::new(builder)?.finish();
|
|
45
|
+
Ok(())
|
|
46
|
+
}
|
|
47
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
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-postgresql")]
|
|
19
|
+
mod backend;
|
|
20
|
+
#[cfg(feature = "services-postgresql")]
|
|
21
|
+
pub use backend::PostgresqlBuilder as Postgresql;
|
|
22
|
+
|
|
23
|
+
mod config;
|
|
24
|
+
pub use config::PostgresqlConfig;
|
|
@@ -0,0 +1,280 @@
|
|
|
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
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use crate::raw::adapters::kv;
|
|
23
|
+
use crate::raw::*;
|
|
24
|
+
use crate::services::RedbConfig;
|
|
25
|
+
use crate::Builder;
|
|
26
|
+
use crate::Error;
|
|
27
|
+
use crate::ErrorKind;
|
|
28
|
+
use crate::Scheme;
|
|
29
|
+
use crate::*;
|
|
30
|
+
|
|
31
|
+
impl Configurator for RedbConfig {
|
|
32
|
+
type Builder = RedbBuilder;
|
|
33
|
+
fn into_builder(self) -> Self::Builder {
|
|
34
|
+
RedbBuilder {
|
|
35
|
+
config: self,
|
|
36
|
+
database: None,
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Redb service support.
|
|
42
|
+
#[doc = include_str!("docs.md")]
|
|
43
|
+
#[derive(Default, Debug)]
|
|
44
|
+
pub struct RedbBuilder {
|
|
45
|
+
config: RedbConfig,
|
|
46
|
+
|
|
47
|
+
database: Option<Arc<redb::Database>>,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
impl RedbBuilder {
|
|
51
|
+
/// Set the database for Redb.
|
|
52
|
+
///
|
|
53
|
+
/// This method should be called when you want to
|
|
54
|
+
/// use multiple tables of one database because
|
|
55
|
+
/// Redb doesn't allow opening a database that have been opened.
|
|
56
|
+
///
|
|
57
|
+
/// <div class="warning">
|
|
58
|
+
///
|
|
59
|
+
/// `datadir` and `database` should not be set simultaneously.
|
|
60
|
+
/// If both are set, `database` will take precedence.
|
|
61
|
+
///
|
|
62
|
+
/// </div>
|
|
63
|
+
pub fn database(mut self, db: Arc<redb::Database>) -> Self {
|
|
64
|
+
self.database = Some(db);
|
|
65
|
+
self
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// Set the path to the redb data directory. Will create if not exists.
|
|
69
|
+
///
|
|
70
|
+
///
|
|
71
|
+
/// <div class="warning">
|
|
72
|
+
///
|
|
73
|
+
/// Opening redb database via `datadir` takes away the ability to access multiple redb tables.
|
|
74
|
+
/// If you need to access multiple redb tables, the correct solution is to
|
|
75
|
+
/// create an `Arc<redb::database>` beforehand and then share it via [`database`]
|
|
76
|
+
/// with multiple builders where every builder will open one redb table.
|
|
77
|
+
///
|
|
78
|
+
/// </div>
|
|
79
|
+
///
|
|
80
|
+
/// [`database`]: RedbBuilder::database
|
|
81
|
+
pub fn datadir(mut self, path: &str) -> Self {
|
|
82
|
+
self.config.datadir = Some(path.into());
|
|
83
|
+
self
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// Set the table name for Redb. Will create if not exists.
|
|
87
|
+
pub fn table(mut self, table: &str) -> Self {
|
|
88
|
+
self.config.table = Some(table.into());
|
|
89
|
+
self
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Set the root for Redb.
|
|
93
|
+
pub fn root(mut self, path: &str) -> Self {
|
|
94
|
+
self.config.root = Some(path.into());
|
|
95
|
+
self
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
impl Builder for RedbBuilder {
|
|
100
|
+
type Config = RedbConfig;
|
|
101
|
+
|
|
102
|
+
fn build(self) -> Result<impl Access> {
|
|
103
|
+
let table_name = self.config.table.ok_or_else(|| {
|
|
104
|
+
Error::new(ErrorKind::ConfigInvalid, "table is required but not set")
|
|
105
|
+
.with_context("service", Scheme::Redb)
|
|
106
|
+
})?;
|
|
107
|
+
|
|
108
|
+
let (datadir, db) = if let Some(db) = self.database {
|
|
109
|
+
(None, db)
|
|
110
|
+
} else {
|
|
111
|
+
let datadir = self.config.datadir.ok_or_else(|| {
|
|
112
|
+
Error::new(ErrorKind::ConfigInvalid, "datadir is required but not set")
|
|
113
|
+
.with_context("service", Scheme::Redb)
|
|
114
|
+
})?;
|
|
115
|
+
|
|
116
|
+
let db = redb::Database::create(&datadir)
|
|
117
|
+
.map_err(parse_database_error)?
|
|
118
|
+
.into();
|
|
119
|
+
|
|
120
|
+
(Some(datadir), db)
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
create_table(&db, &table_name)?;
|
|
124
|
+
|
|
125
|
+
Ok(RedbBackend::new(Adapter {
|
|
126
|
+
datadir,
|
|
127
|
+
table: table_name,
|
|
128
|
+
db,
|
|
129
|
+
})
|
|
130
|
+
.with_root(self.config.root.as_deref().unwrap_or_default()))
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// Backend for Redb services.
|
|
135
|
+
pub type RedbBackend = kv::Backend<Adapter>;
|
|
136
|
+
|
|
137
|
+
#[derive(Clone)]
|
|
138
|
+
pub struct Adapter {
|
|
139
|
+
datadir: Option<String>,
|
|
140
|
+
table: String,
|
|
141
|
+
db: Arc<redb::Database>,
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
impl Debug for Adapter {
|
|
145
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
146
|
+
let mut ds = f.debug_struct("Adapter");
|
|
147
|
+
ds.field("path", &self.datadir);
|
|
148
|
+
ds.finish()
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
impl kv::Adapter for Adapter {
|
|
153
|
+
type Scanner = ();
|
|
154
|
+
|
|
155
|
+
fn info(&self) -> kv::Info {
|
|
156
|
+
kv::Info::new(
|
|
157
|
+
Scheme::Redb,
|
|
158
|
+
&self.table,
|
|
159
|
+
Capability {
|
|
160
|
+
read: true,
|
|
161
|
+
write: true,
|
|
162
|
+
shared: false,
|
|
163
|
+
..Default::default()
|
|
164
|
+
},
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async fn get(&self, path: &str) -> Result<Option<Buffer>> {
|
|
169
|
+
let read_txn = self.db.begin_read().map_err(parse_transaction_error)?;
|
|
170
|
+
|
|
171
|
+
let table_define: redb::TableDefinition<&str, &[u8]> =
|
|
172
|
+
redb::TableDefinition::new(&self.table);
|
|
173
|
+
|
|
174
|
+
let table = read_txn
|
|
175
|
+
.open_table(table_define)
|
|
176
|
+
.map_err(parse_table_error)?;
|
|
177
|
+
|
|
178
|
+
let result = match table.get(path) {
|
|
179
|
+
Ok(Some(v)) => Ok(Some(v.value().to_vec())),
|
|
180
|
+
Ok(None) => Ok(None),
|
|
181
|
+
Err(e) => Err(parse_storage_error(e)),
|
|
182
|
+
}?;
|
|
183
|
+
Ok(result.map(Buffer::from))
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async fn set(&self, path: &str, value: Buffer) -> Result<()> {
|
|
187
|
+
let write_txn = self.db.begin_write().map_err(parse_transaction_error)?;
|
|
188
|
+
|
|
189
|
+
let table_define: redb::TableDefinition<&str, &[u8]> =
|
|
190
|
+
redb::TableDefinition::new(&self.table);
|
|
191
|
+
|
|
192
|
+
{
|
|
193
|
+
let mut table = write_txn
|
|
194
|
+
.open_table(table_define)
|
|
195
|
+
.map_err(parse_table_error)?;
|
|
196
|
+
|
|
197
|
+
table
|
|
198
|
+
.insert(path, &*value.to_vec())
|
|
199
|
+
.map_err(parse_storage_error)?;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
write_txn.commit().map_err(parse_commit_error)?;
|
|
203
|
+
Ok(())
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async fn delete(&self, path: &str) -> Result<()> {
|
|
207
|
+
let write_txn = self.db.begin_write().map_err(parse_transaction_error)?;
|
|
208
|
+
|
|
209
|
+
let table_define: redb::TableDefinition<&str, &[u8]> =
|
|
210
|
+
redb::TableDefinition::new(&self.table);
|
|
211
|
+
|
|
212
|
+
{
|
|
213
|
+
let mut table = write_txn
|
|
214
|
+
.open_table(table_define)
|
|
215
|
+
.map_err(parse_table_error)?;
|
|
216
|
+
|
|
217
|
+
table.remove(path).map_err(parse_storage_error)?;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
write_txn.commit().map_err(parse_commit_error)?;
|
|
221
|
+
Ok(())
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
fn parse_transaction_error(e: redb::TransactionError) -> Error {
|
|
226
|
+
Error::new(ErrorKind::Unexpected, "error from redb").set_source(e)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
fn parse_table_error(e: redb::TableError) -> Error {
|
|
230
|
+
match e {
|
|
231
|
+
redb::TableError::TableDoesNotExist(_) => {
|
|
232
|
+
Error::new(ErrorKind::NotFound, "error from redb").set_source(e)
|
|
233
|
+
}
|
|
234
|
+
_ => Error::new(ErrorKind::Unexpected, "error from redb").set_source(e),
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
fn parse_storage_error(e: redb::StorageError) -> Error {
|
|
239
|
+
Error::new(ErrorKind::Unexpected, "error from redb").set_source(e)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
fn parse_database_error(e: redb::DatabaseError) -> Error {
|
|
243
|
+
Error::new(ErrorKind::Unexpected, "error from redb").set_source(e)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
fn parse_commit_error(e: redb::CommitError) -> Error {
|
|
247
|
+
Error::new(ErrorKind::Unexpected, "error from redb").set_source(e)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/// Check if a table exists, otherwise create it.
|
|
251
|
+
fn create_table(db: &redb::Database, table: &str) -> Result<()> {
|
|
252
|
+
// Only one `WriteTransaction` is permitted at same time,
|
|
253
|
+
// applying new one will block until it available.
|
|
254
|
+
//
|
|
255
|
+
// So we first try checking table existence via `ReadTransaction`.
|
|
256
|
+
{
|
|
257
|
+
let read_txn = db.begin_read().map_err(parse_transaction_error)?;
|
|
258
|
+
|
|
259
|
+
let table_define: redb::TableDefinition<&str, &[u8]> = redb::TableDefinition::new(table);
|
|
260
|
+
|
|
261
|
+
match read_txn.open_table(table_define) {
|
|
262
|
+
Ok(_) => return Ok(()),
|
|
263
|
+
Err(redb::TableError::TableDoesNotExist(_)) => (),
|
|
264
|
+
Err(e) => return Err(parse_table_error(e)),
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
{
|
|
269
|
+
let write_txn = db.begin_write().map_err(parse_transaction_error)?;
|
|
270
|
+
|
|
271
|
+
let table_define: redb::TableDefinition<&str, &[u8]> = redb::TableDefinition::new(table);
|
|
272
|
+
|
|
273
|
+
write_txn
|
|
274
|
+
.open_table(table_define)
|
|
275
|
+
.map_err(parse_table_error)?;
|
|
276
|
+
write_txn.commit().map_err(parse_commit_error)?;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
Ok(())
|
|
280
|
+
}
|