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,261 @@
|
|
|
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::collections::HashMap;
|
|
19
|
+
use std::fmt::Debug;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use http::header;
|
|
23
|
+
use http::Request;
|
|
24
|
+
use http::Response;
|
|
25
|
+
use serde::Deserialize;
|
|
26
|
+
|
|
27
|
+
use crate::raw::*;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
pub struct LakefsCore {
|
|
31
|
+
pub info: Arc<AccessorInfo>,
|
|
32
|
+
pub endpoint: String,
|
|
33
|
+
pub repository: String,
|
|
34
|
+
pub branch: String,
|
|
35
|
+
pub root: String,
|
|
36
|
+
pub username: String,
|
|
37
|
+
pub password: String,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
impl Debug for LakefsCore {
|
|
41
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
42
|
+
f.debug_struct("LakefsCore")
|
|
43
|
+
.field("endpoint", &self.endpoint)
|
|
44
|
+
.field("username", &self.username)
|
|
45
|
+
.field("password", &self.password)
|
|
46
|
+
.field("root", &self.root)
|
|
47
|
+
.field("repository", &self.repository)
|
|
48
|
+
.field("branch", &self.branch)
|
|
49
|
+
.finish_non_exhaustive()
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
impl LakefsCore {
|
|
54
|
+
pub async fn get_object_metadata(&self, path: &str) -> Result<Response<Buffer>> {
|
|
55
|
+
let p = build_abs_path(&self.root, path)
|
|
56
|
+
.trim_end_matches('/')
|
|
57
|
+
.to_string();
|
|
58
|
+
|
|
59
|
+
let url = format!(
|
|
60
|
+
"{}/api/v1/repositories/{}/refs/{}/objects/stat?path={}",
|
|
61
|
+
self.endpoint,
|
|
62
|
+
self.repository,
|
|
63
|
+
self.branch,
|
|
64
|
+
percent_encode_path(&p)
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
let mut req = Request::get(&url);
|
|
68
|
+
|
|
69
|
+
let auth_header_content = format_authorization_by_basic(&self.username, &self.password)?;
|
|
70
|
+
req = req.header(header::AUTHORIZATION, auth_header_content);
|
|
71
|
+
// Inject operation to the request.
|
|
72
|
+
let req = req.extension(Operation::Read);
|
|
73
|
+
let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
|
|
74
|
+
|
|
75
|
+
self.info.http_client().send(req).await
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
pub async fn get_object_content(
|
|
79
|
+
&self,
|
|
80
|
+
path: &str,
|
|
81
|
+
range: BytesRange,
|
|
82
|
+
_args: &OpRead,
|
|
83
|
+
) -> Result<Response<HttpBody>> {
|
|
84
|
+
let p = build_abs_path(&self.root, path)
|
|
85
|
+
.trim_end_matches('/')
|
|
86
|
+
.to_string();
|
|
87
|
+
|
|
88
|
+
let url = format!(
|
|
89
|
+
"{}/api/v1/repositories/{}/refs/{}/objects?path={}",
|
|
90
|
+
self.endpoint,
|
|
91
|
+
self.repository,
|
|
92
|
+
self.branch,
|
|
93
|
+
percent_encode_path(&p)
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
let mut req = Request::get(&url);
|
|
97
|
+
|
|
98
|
+
let auth_header_content = format_authorization_by_basic(&self.username, &self.password)?;
|
|
99
|
+
req = req.header(header::AUTHORIZATION, auth_header_content);
|
|
100
|
+
|
|
101
|
+
if !range.is_full() {
|
|
102
|
+
req = req.header(header::RANGE, range.to_header());
|
|
103
|
+
}
|
|
104
|
+
// Inject operation to the request.
|
|
105
|
+
let req = req.extension(Operation::Read);
|
|
106
|
+
let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
|
|
107
|
+
|
|
108
|
+
self.info.http_client().fetch(req).await
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
pub async fn list_objects(
|
|
112
|
+
&self,
|
|
113
|
+
path: &str,
|
|
114
|
+
delimiter: &str,
|
|
115
|
+
amount: &Option<usize>,
|
|
116
|
+
after: Option<String>,
|
|
117
|
+
) -> Result<Response<Buffer>> {
|
|
118
|
+
let p = build_abs_path(&self.root, path);
|
|
119
|
+
|
|
120
|
+
let mut url = format!(
|
|
121
|
+
"{}/api/v1/repositories/{}/refs/{}/objects/ls?",
|
|
122
|
+
self.endpoint, self.repository, self.branch
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if !p.is_empty() {
|
|
126
|
+
url.push_str(&format!("&prefix={}", percent_encode_path(&p)));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if !delimiter.is_empty() {
|
|
130
|
+
url.push_str(&format!("&delimiter={delimiter}"));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if let Some(amount) = amount {
|
|
134
|
+
url.push_str(&format!("&amount={amount}"));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if let Some(after) = after {
|
|
138
|
+
url.push_str(&format!("&after={after}"));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let mut req = Request::get(&url);
|
|
142
|
+
|
|
143
|
+
let auth_header_content = format_authorization_by_basic(&self.username, &self.password)?;
|
|
144
|
+
req = req.header(header::AUTHORIZATION, auth_header_content);
|
|
145
|
+
// Inject operation to the request.
|
|
146
|
+
let req = req.extension(Operation::Read);
|
|
147
|
+
let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
|
|
148
|
+
|
|
149
|
+
self.info.http_client().send(req).await
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
pub async fn upload_object(
|
|
153
|
+
&self,
|
|
154
|
+
path: &str,
|
|
155
|
+
_args: &OpWrite,
|
|
156
|
+
body: Buffer,
|
|
157
|
+
) -> Result<Response<Buffer>> {
|
|
158
|
+
let p = build_abs_path(&self.root, path)
|
|
159
|
+
.trim_end_matches('/')
|
|
160
|
+
.to_string();
|
|
161
|
+
|
|
162
|
+
let url = format!(
|
|
163
|
+
"{}/api/v1/repositories/{}/branches/{}/objects?path={}",
|
|
164
|
+
self.endpoint,
|
|
165
|
+
self.repository,
|
|
166
|
+
self.branch,
|
|
167
|
+
percent_encode_path(&p)
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
let mut req = Request::post(&url);
|
|
171
|
+
|
|
172
|
+
let auth_header_content = format_authorization_by_basic(&self.username, &self.password)?;
|
|
173
|
+
req = req.header(header::AUTHORIZATION, auth_header_content);
|
|
174
|
+
// Inject operation to the request.
|
|
175
|
+
let req = req.extension(Operation::Write);
|
|
176
|
+
let req = req.body(body).map_err(new_request_build_error)?;
|
|
177
|
+
|
|
178
|
+
self.info.http_client().send(req).await
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
pub async fn delete_object(&self, path: &str, _args: &OpDelete) -> Result<Response<Buffer>> {
|
|
182
|
+
let p = build_abs_path(&self.root, path)
|
|
183
|
+
.trim_end_matches('/')
|
|
184
|
+
.to_string();
|
|
185
|
+
|
|
186
|
+
let url = format!(
|
|
187
|
+
"{}/api/v1/repositories/{}/branches/{}/objects?path={}",
|
|
188
|
+
self.endpoint,
|
|
189
|
+
self.repository,
|
|
190
|
+
self.branch,
|
|
191
|
+
percent_encode_path(&p)
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
let mut req = Request::delete(&url);
|
|
195
|
+
|
|
196
|
+
let auth_header_content = format_authorization_by_basic(&self.username, &self.password)?;
|
|
197
|
+
req = req.header(header::AUTHORIZATION, auth_header_content);
|
|
198
|
+
// Inject operation to the request.
|
|
199
|
+
let req = req.extension(Operation::Delete);
|
|
200
|
+
let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
|
|
201
|
+
|
|
202
|
+
self.info.http_client().send(req).await
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
pub async fn copy_object(&self, path: &str, dest: &str) -> Result<Response<Buffer>> {
|
|
206
|
+
let p = build_abs_path(&self.root, path)
|
|
207
|
+
.trim_end_matches('/')
|
|
208
|
+
.to_string();
|
|
209
|
+
let d = build_abs_path(&self.root, dest)
|
|
210
|
+
.trim_end_matches('/')
|
|
211
|
+
.to_string();
|
|
212
|
+
|
|
213
|
+
let url = format!(
|
|
214
|
+
"{}/api/v1/repositories/{}/branches/{}/objects/copy?dest_path={}",
|
|
215
|
+
self.endpoint,
|
|
216
|
+
self.repository,
|
|
217
|
+
self.branch,
|
|
218
|
+
percent_encode_path(&d)
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
let mut req = Request::post(&url);
|
|
222
|
+
|
|
223
|
+
let auth_header_content = format_authorization_by_basic(&self.username, &self.password)?;
|
|
224
|
+
req = req.header(header::AUTHORIZATION, auth_header_content);
|
|
225
|
+
req = req.header(header::CONTENT_TYPE, "application/json");
|
|
226
|
+
let mut map = HashMap::new();
|
|
227
|
+
map.insert("src_path", p);
|
|
228
|
+
|
|
229
|
+
let req = req
|
|
230
|
+
// Inject operation to the request.
|
|
231
|
+
.extension(Operation::Delete)
|
|
232
|
+
.body(serde_json::to_vec(&map).unwrap().into())
|
|
233
|
+
.map_err(new_request_build_error)?;
|
|
234
|
+
self.info.http_client().send(req).await
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[derive(Deserialize, Eq, PartialEq, Debug)]
|
|
239
|
+
pub(super) struct LakefsStatus {
|
|
240
|
+
pub path: String,
|
|
241
|
+
pub path_type: String,
|
|
242
|
+
pub physical_address: String,
|
|
243
|
+
pub checksum: String,
|
|
244
|
+
pub size_bytes: Option<u64>,
|
|
245
|
+
pub mtime: i64,
|
|
246
|
+
pub content_type: Option<String>,
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#[derive(Deserialize, Eq, PartialEq, Debug)]
|
|
250
|
+
pub(super) struct LakefsListResponse {
|
|
251
|
+
pub pagination: Pagination,
|
|
252
|
+
pub results: Vec<LakefsStatus>,
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
#[derive(Deserialize, Eq, PartialEq, Debug)]
|
|
256
|
+
pub(super) struct Pagination {
|
|
257
|
+
pub has_more: bool,
|
|
258
|
+
pub max_per_page: u64,
|
|
259
|
+
pub next_offset: String,
|
|
260
|
+
pub results: u64,
|
|
261
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use http::StatusCode;
|
|
21
|
+
|
|
22
|
+
use super::core::*;
|
|
23
|
+
use super::error::parse_error;
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
pub struct LakefsDeleter {
|
|
28
|
+
core: Arc<LakefsCore>,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
impl LakefsDeleter {
|
|
32
|
+
pub fn new(core: Arc<LakefsCore>) -> Self {
|
|
33
|
+
Self { core }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
impl oio::OneShotDelete for LakefsDeleter {
|
|
38
|
+
async fn delete_once(&self, path: String, args: OpDelete) -> Result<()> {
|
|
39
|
+
// This would delete the bucket, do not perform
|
|
40
|
+
if self.core.root == "/" && path == "/" {
|
|
41
|
+
return Ok(());
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let resp = self.core.delete_object(&path, &args).await?;
|
|
45
|
+
|
|
46
|
+
let status = resp.status();
|
|
47
|
+
|
|
48
|
+
match status {
|
|
49
|
+
StatusCode::NO_CONTENT => Ok(()),
|
|
50
|
+
StatusCode::NOT_FOUND => Ok(()),
|
|
51
|
+
_ => Err(parse_error(resp)),
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
This service will visit the [Lakefs API](https://Lakefs.co/docs/Lakefs_hub/package_reference/hf_api) to access the Lakefs File System.
|
|
2
|
+
Currently, we only support the `model` and `dataset` types of repositories, and operations are limited to reading and listing/stating.
|
|
3
|
+
|
|
4
|
+
Lakefs doesn't host official HTTP API docs. Detailed HTTP request API information can be found on the [`Lakefs_hub` Source Code](https://github.com/Lakefs/Lakefs_hub).
|
|
5
|
+
|
|
6
|
+
## Capabilities
|
|
7
|
+
|
|
8
|
+
This service can be used to:
|
|
9
|
+
|
|
10
|
+
- [x] stat
|
|
11
|
+
- [x] read
|
|
12
|
+
- [x] write
|
|
13
|
+
- [ ] create_dir
|
|
14
|
+
- [x] delete
|
|
15
|
+
- [x] copy
|
|
16
|
+
- [ ] rename
|
|
17
|
+
- [x] list
|
|
18
|
+
- [ ] ~~presign~~
|
|
19
|
+
- [ ] blocking
|
|
20
|
+
|
|
21
|
+
## Configurations
|
|
22
|
+
|
|
23
|
+
- `endpoint`: The endpoint of the Lakefs repository.
|
|
24
|
+
- `repository`: The id of the repository.
|
|
25
|
+
- `branch`: The branch of the repository.
|
|
26
|
+
- `root`: Set the work directory for backend.
|
|
27
|
+
- `username`: The username for accessing the repository.
|
|
28
|
+
- `password`: The password for accessing the repository.
|
|
29
|
+
|
|
30
|
+
Refer to [`LakefsBuilder`]'s public API docs for more information.
|
|
31
|
+
|
|
32
|
+
## Examples
|
|
33
|
+
|
|
34
|
+
### Via Builder
|
|
35
|
+
|
|
36
|
+
```rust,no_run
|
|
37
|
+
use opendal::Operator;
|
|
38
|
+
use opendal::services::Lakefs;
|
|
39
|
+
use anyhow::Result;
|
|
40
|
+
|
|
41
|
+
#[tokio::main]
|
|
42
|
+
async fn main() -> Result<()> {
|
|
43
|
+
// Create Lakefs backend builder
|
|
44
|
+
let mut builder = Lakefs::default()
|
|
45
|
+
// set the type of Lakefs endpoint
|
|
46
|
+
.endpoint("https://whole-llama-mh6mux.us-east-1.lakefscloud.io")
|
|
47
|
+
// set the id of Lakefs repository
|
|
48
|
+
.repository("sample-repo")
|
|
49
|
+
// set the branch of Lakefs repository
|
|
50
|
+
.branch("main")
|
|
51
|
+
// set the username for accessing the repository
|
|
52
|
+
.username("xxx")
|
|
53
|
+
// set the password for accessing the repository
|
|
54
|
+
.password("xxx");
|
|
55
|
+
|
|
56
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
57
|
+
|
|
58
|
+
let stat = op.stat("README.md").await?;
|
|
59
|
+
println!("{:?}", stat);
|
|
60
|
+
Ok(())
|
|
61
|
+
}
|
|
62
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
|
|
20
|
+
use http::Response;
|
|
21
|
+
use http::StatusCode;
|
|
22
|
+
use serde::Deserialize;
|
|
23
|
+
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
/// LakefsError is the error returned by Lakefs File System.
|
|
28
|
+
#[derive(Default, Deserialize)]
|
|
29
|
+
struct LakefsError {
|
|
30
|
+
error: String,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
impl Debug for LakefsError {
|
|
34
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
35
|
+
let mut de = f.debug_struct("LakefsError");
|
|
36
|
+
de.field("message", &self.error.replace('\n', " "));
|
|
37
|
+
|
|
38
|
+
de.finish()
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
pub(super) fn parse_error(resp: Response<Buffer>) -> Error {
|
|
43
|
+
let (parts, body) = resp.into_parts();
|
|
44
|
+
let bs = body.to_bytes();
|
|
45
|
+
|
|
46
|
+
let (kind, retryable) = match parts.status {
|
|
47
|
+
StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
|
|
48
|
+
StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
|
|
49
|
+
StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, false),
|
|
50
|
+
StatusCode::INTERNAL_SERVER_ERROR
|
|
51
|
+
| StatusCode::BAD_GATEWAY
|
|
52
|
+
| StatusCode::SERVICE_UNAVAILABLE
|
|
53
|
+
| StatusCode::GATEWAY_TIMEOUT => (ErrorKind::Unexpected, true),
|
|
54
|
+
_ => (ErrorKind::Unexpected, false),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
let message = match serde_json::from_slice::<LakefsError>(&bs) {
|
|
58
|
+
Ok(hf_error) => format!("{:?}", hf_error.error),
|
|
59
|
+
Err(_) => String::from_utf8_lossy(&bs).into_owned(),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
let mut err = Error::new(kind, message);
|
|
63
|
+
|
|
64
|
+
err = with_error_response_context(err, parts);
|
|
65
|
+
|
|
66
|
+
if retryable {
|
|
67
|
+
err = err.set_temporary();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
err
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#[cfg(test)]
|
|
74
|
+
mod test {
|
|
75
|
+
use super::*;
|
|
76
|
+
use crate::raw::new_json_deserialize_error;
|
|
77
|
+
use crate::types::Result;
|
|
78
|
+
|
|
79
|
+
#[test]
|
|
80
|
+
fn test_parse_error() -> Result<()> {
|
|
81
|
+
let resp = r#"
|
|
82
|
+
{
|
|
83
|
+
"error": "Invalid username or password."
|
|
84
|
+
}
|
|
85
|
+
"#;
|
|
86
|
+
let decoded_response = serde_json::from_slice::<LakefsError>(resp.as_bytes())
|
|
87
|
+
.map_err(new_json_deserialize_error)?;
|
|
88
|
+
|
|
89
|
+
assert_eq!(decoded_response.error, "Invalid username or password.");
|
|
90
|
+
|
|
91
|
+
Ok(())
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use bytes::Buf;
|
|
21
|
+
use chrono::TimeZone;
|
|
22
|
+
use chrono::Utc;
|
|
23
|
+
|
|
24
|
+
use super::core::LakefsCore;
|
|
25
|
+
use super::core::LakefsListResponse;
|
|
26
|
+
use super::error::parse_error;
|
|
27
|
+
use crate::raw::*;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
pub struct LakefsLister {
|
|
31
|
+
core: Arc<LakefsCore>,
|
|
32
|
+
path: String,
|
|
33
|
+
delimiter: &'static str,
|
|
34
|
+
amount: Option<usize>,
|
|
35
|
+
after: Option<String>,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
impl LakefsLister {
|
|
39
|
+
pub fn new(
|
|
40
|
+
core: Arc<LakefsCore>,
|
|
41
|
+
path: String,
|
|
42
|
+
amount: Option<usize>,
|
|
43
|
+
after: Option<&str>,
|
|
44
|
+
recursive: bool,
|
|
45
|
+
) -> Self {
|
|
46
|
+
let delimiter = if recursive { "" } else { "/" };
|
|
47
|
+
Self {
|
|
48
|
+
core,
|
|
49
|
+
path,
|
|
50
|
+
delimiter,
|
|
51
|
+
amount,
|
|
52
|
+
after: after.map(String::from),
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
impl oio::PageList for LakefsLister {
|
|
58
|
+
async fn next_page(&self, ctx: &mut oio::PageContext) -> Result<()> {
|
|
59
|
+
let response = self
|
|
60
|
+
.core
|
|
61
|
+
.list_objects(
|
|
62
|
+
&self.path,
|
|
63
|
+
self.delimiter,
|
|
64
|
+
&self.amount,
|
|
65
|
+
// start after should only be set for the first page.
|
|
66
|
+
if ctx.token.is_empty() {
|
|
67
|
+
self.after.clone()
|
|
68
|
+
} else {
|
|
69
|
+
None
|
|
70
|
+
},
|
|
71
|
+
)
|
|
72
|
+
.await?;
|
|
73
|
+
|
|
74
|
+
let status_code = response.status();
|
|
75
|
+
if !status_code.is_success() {
|
|
76
|
+
let error = parse_error(response);
|
|
77
|
+
return Err(error);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let bytes = response.into_body();
|
|
81
|
+
|
|
82
|
+
let decoded_response: LakefsListResponse =
|
|
83
|
+
serde_json::from_reader(bytes.reader()).map_err(new_json_deserialize_error)?;
|
|
84
|
+
|
|
85
|
+
ctx.done = true;
|
|
86
|
+
|
|
87
|
+
for status in decoded_response.results {
|
|
88
|
+
let entry_type = match status.path_type.as_str() {
|
|
89
|
+
"common_prefix" => EntryMode::DIR,
|
|
90
|
+
"object" => EntryMode::FILE,
|
|
91
|
+
_ => EntryMode::Unknown,
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
let mut meta = Metadata::new(entry_type);
|
|
95
|
+
|
|
96
|
+
if status.mtime != 0 {
|
|
97
|
+
meta.set_last_modified(Utc.timestamp_opt(status.mtime, 0).unwrap());
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if entry_type == EntryMode::FILE {
|
|
101
|
+
if let Some(size_bytes) = status.size_bytes {
|
|
102
|
+
meta.set_content_length(size_bytes);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
let path = if entry_type == EntryMode::DIR {
|
|
107
|
+
format!("{}/", &status.path)
|
|
108
|
+
} else {
|
|
109
|
+
status.path.clone()
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
ctx.entries.push_back(oio::Entry::new(
|
|
113
|
+
&build_rel_path(&self.core.root, &path),
|
|
114
|
+
meta,
|
|
115
|
+
));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
Ok(())
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 lakefs service.
|
|
19
|
+
#[cfg(feature = "services-lakefs")]
|
|
20
|
+
pub(super) const DEFAULT_SCHEME: &str = "lakefs";
|
|
21
|
+
#[cfg(feature = "services-lakefs")]
|
|
22
|
+
mod core;
|
|
23
|
+
#[cfg(feature = "services-lakefs")]
|
|
24
|
+
mod delete;
|
|
25
|
+
#[cfg(feature = "services-lakefs")]
|
|
26
|
+
mod error;
|
|
27
|
+
#[cfg(feature = "services-lakefs")]
|
|
28
|
+
mod lister;
|
|
29
|
+
#[cfg(feature = "services-lakefs")]
|
|
30
|
+
mod writer;
|
|
31
|
+
|
|
32
|
+
#[cfg(feature = "services-lakefs")]
|
|
33
|
+
mod backend;
|
|
34
|
+
#[cfg(feature = "services-lakefs")]
|
|
35
|
+
pub use backend::LakefsBuilder as Lakefs;
|
|
36
|
+
|
|
37
|
+
mod config;
|
|
38
|
+
pub use config::LakefsConfig;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use http::StatusCode;
|
|
21
|
+
|
|
22
|
+
use super::core::LakefsCore;
|
|
23
|
+
use super::error::parse_error;
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
pub struct LakefsWriter {
|
|
28
|
+
core: Arc<LakefsCore>,
|
|
29
|
+
op: OpWrite,
|
|
30
|
+
path: String,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
impl LakefsWriter {
|
|
34
|
+
pub fn new(core: Arc<LakefsCore>, path: String, op: OpWrite) -> Self {
|
|
35
|
+
LakefsWriter { core, path, op }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
impl oio::OneShotWrite for LakefsWriter {
|
|
40
|
+
async fn write_once(&self, bs: Buffer) -> Result<Metadata> {
|
|
41
|
+
let resp = self.core.upload_object(&self.path, &self.op, bs).await?;
|
|
42
|
+
|
|
43
|
+
let status = resp.status();
|
|
44
|
+
|
|
45
|
+
match status {
|
|
46
|
+
StatusCode::CREATED | StatusCode::OK => Ok(Metadata::default()),
|
|
47
|
+
_ => Err(parse_error(resp)),
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|