diff --git a/Cargo.lock b/Cargo.lock index 8967681..5b7fc02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,6 +126,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "anstream" version = "0.3.2" @@ -489,7 +495,7 @@ dependencies = [ "fxhash", "hex", "im", - "itertools", + "itertools 0.12.1", "leb128", "serde", "sha2 0.10.7", @@ -781,6 +787,12 @@ dependencies = [ "toml", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" version = "1.0.79" @@ -872,6 +884,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "cipher" version = "0.4.4" @@ -983,6 +1022,28 @@ dependencies = [ "objc", ] +[[package]] +name = "codspeed" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a104ac948e0188b921eb3fcbdd55dcf62e542df4c7ab7e660623f6288302089" +dependencies = [ + "colored", + "libc", + "serde_json", +] + +[[package]] +name = "codspeed-criterion-compat" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722c36bdc62d9436d027256ce2627af81ac7a596dfc7d13d849d0d212448d7fe" +dependencies = [ + "codspeed", + "colored", + "criterion", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -995,6 +1056,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "combine" version = "4.6.6" @@ -1107,6 +1178,42 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + [[package]] name = "critical-section" version = "1.1.1" @@ -2581,6 +2688,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -3258,6 +3374,36 @@ dependencies = [ "web-time", ] +[[package]] +name = "ng-oxigraph" +version = "0.4.0-alpha.7-ng" +dependencies = [ + "codspeed-criterion-compat", + "digest 0.10.7", + "getrandom 0.2.10", + "hex", + "js-sys", + "json-event-parser", + "libc", + "md-5", + "oxilangtag", + "oxiri", + "oxrdf", + "oxrdfio", + "oxsdatatypes", + "rand 0.8.5", + "regex", + "rocksdb", + "sha1", + "sha2 0.10.7", + "siphasher 0.3.10", + "sparesults", + "spargebra", + "sparopt", + "thiserror", + "zstd", +] + [[package]] name = "ng-repo" version = "0.1.0" @@ -3336,9 +3482,9 @@ dependencies = [ "futures", "getrandom 0.2.10", "ng-net", + "ng-oxigraph", "ng-repo", "ng-storage-rocksdb", - "oxigraph", "rand 0.7.3", "serde", "serde_bare", @@ -3627,6 +3773,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -3714,34 +3866,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "oxigraph" -version = "0.4.0-alpha.7-dev" -source = "git+https://git.nextgraph.org/NextGraph/oxigraph.git?branch=main#a4e2847810c384811c3efc0b844c1cbdb997cb71" -dependencies = [ - "digest 0.10.7", - "getrandom 0.2.10", - "hex", - "json-event-parser", - "libc", - "md-5", - "oxilangtag", - "oxiri", - "oxrdf", - "oxrdfio", - "oxsdatatypes", - "rand 0.8.5", - "regex", - "rocksdb", - "sha1", - "sha2 0.10.7", - "siphasher 0.3.10", - "sparesults", - "spargebra", - "sparopt", - "thiserror", -] - [[package]] name = "oxilangtag" version = "0.1.5" @@ -3797,6 +3921,7 @@ name = "oxsdatatypes" version = "0.2.0-alpha.1" source = "git+https://git.nextgraph.org/NextGraph/oxigraph.git?branch=main#a4e2847810c384811c3efc0b844c1cbdb997cb71" dependencies = [ + "js-sys", "thiserror", ] @@ -4121,6 +4246,34 @@ dependencies = [ "time 0.3.23", ] +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + [[package]] name = "png" version = "0.17.9" @@ -4740,9 +4893,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.164" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] @@ -4787,9 +4940,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", @@ -4798,9 +4951,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.97" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa 1.0.6", "ryu", @@ -5679,6 +5832,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -6946,6 +7109,34 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "zstd" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.10+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/Cargo.toml b/Cargo.toml index 96b9b4c..82ecd81 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ "ngaccount", "ng-sdk-js", "ng-app/src-tauri", + "ng-oxigraph", ] default-members = [ "nextgraph", "ngcli", "ngd" ] diff --git a/README.md b/README.md index 9523e9b..46abe75 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ [![Apache 2.0 Licensed][license-image]][license-link] [![MIT Licensed][license-image2]][license-link2] [![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://forum.nextgraph.org) -![Crates.io Version](https://img.shields.io/crates/v/nextgraph) -![docs.rs](https://img.shields.io/docsrs/nextgraph) -![NPM Version](https://img.shields.io/npm/v/ng-sdk-node) +[![Crates.io Version](https://img.shields.io/crates/v/nextgraph)](https://crates.io/crates/nextgraph) +[![docs.rs](https://img.shields.io/docsrs/nextgraph)](https://docs.rs/nextgraph) +[![NPM Version](https://img.shields.io/npm/v/ng-sdk-node)](https://www.npmjs.com/package/ng-sdk-node) Rust implementation of NextGraph diff --git a/nextgraph/README.md b/nextgraph/README.md index af39f5f..2ddc162 100644 --- a/nextgraph/README.md +++ b/nextgraph/README.md @@ -8,9 +8,9 @@ [![Apache 2.0 Licensed][license-image]][license-link] [![MIT Licensed][license-image2]][license-link2] [![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://forum.nextgraph.org) -![Crates.io Version](https://img.shields.io/crates/v/nextgraph) -![docs.rs](https://img.shields.io/docsrs/nextgraph) -![NPM Version](https://img.shields.io/npm/v/ng-sdk-node) +[![Crates.io Version](https://img.shields.io/crates/v/nextgraph)](https://crates.io/crates/nextgraph) +[![docs.rs](https://img.shields.io/docsrs/nextgraph)](https://docs.rs/nextgraph) +[![NPM Version](https://img.shields.io/npm/v/ng-sdk-node)](https://www.npmjs.com/package/ng-sdk-node) Rust client library for NextGraph framework diff --git a/ng-oxigraph/Cargo.toml b/ng-oxigraph/Cargo.toml new file mode 100644 index 0000000..70934af --- /dev/null +++ b/ng-oxigraph/Cargo.toml @@ -0,0 +1,239 @@ +[package] +name = "ng-oxigraph" +version = "0.4.0-alpha.7-ng" +authors = ["Tpt ", "Niko PLP "] +license = "MIT OR Apache-2.0" +readme = "README.md" +keywords = ["RDF", "SPARQL", "graph-database", "database"] +categories = ["database-implementations"] +repository = "https://git.nextgraph.org/NextGraph/nextgraph-rs" +homepage = "https://nextgraph.org" +documentation = "https://docs.nextgraph.org/" +description = """ +a SPARQL database and RDF toolkit. fork for NextGraph +""" +edition = "2021" +rust-version = "1.70" + +[features] +js = ["getrandom/js", "oxsdatatypes/js", "js-sys"] + + +[dependencies] +digest = "0.10" +hex = "0.4" +json-event-parser = "0.2.0-alpha.2" +md-5 = "0.10" +oxilangtag = "0.1" +oxiri = "0.2.3" +oxrdf = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main", features = ["rdf-star", "oxsdatatypes"] } +oxrdfio = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main", features = ["rdf-star"] } +oxsdatatypes = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main" } +rand = "0.8" +regex = "1.7" +sha1 = "0.10" +sha2 = "0.10" +siphasher = ">=0.3, <2.0" +sparesults = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main", features = ["rdf-star"] } +spargebra = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main", features = ["rdf-star", "sep-0002", "sep-0006"] } +sparopt = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main", features = ["rdf-star", "sep-0002", "sep-0006"] } +thiserror = "1.0.50" + +[target.'cfg(not(target_family = "wasm"))'.dependencies] +libc = "0.2" +rocksdb = { git = "https://git.nextgraph.org/NextGraph/rust-rocksdb.git", branch = "master", features = [ ] } + +[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] +getrandom = "0.2.8" +js-sys = { version = "0.3.60", optional = true } + +[target.'cfg(not(target_family = "wasm"))'.dev-dependencies] +codspeed-criterion-compat = "2.3.3" +zstd = ">=0.12, <0.14" + +[lints.rust] +absolute_paths_not_starting_with_crate = "warn" +elided_lifetimes_in_paths = "warn" +explicit_outlives_requirements = "warn" +let_underscore_drop = "warn" +macro_use_extern_crate = "warn" +# TODO missing_docs = "warn" +trivial_casts = "warn" +trivial_numeric_casts = "warn" +unsafe_code = "warn" +unused_import_braces = "warn" +unused_lifetimes = "warn" +unused_macro_rules = "warn" +unused_qualifications = "warn" + +[lints.clippy] +allow_attributes = "warn" +allow_attributes_without_reason = "warn" +as_underscore = "warn" +assertions_on_result_states = "warn" +bool_to_int_with_if = "warn" +borrow_as_ptr = "warn" +case_sensitive_file_extension_comparisons = "warn" +cast_lossless = "warn" +cast_possible_truncation = "warn" +cast_possible_wrap = "warn" +cast_precision_loss = "warn" +cast_ptr_alignment = "warn" +cast_sign_loss = "warn" +checked_conversions = "warn" +clone_on_ref_ptr = "warn" +cloned_instead_of_copied = "warn" +copy_iterator = "warn" +create_dir = "warn" +dbg_macro = "warn" +decimal_literal_representation = "warn" +default_trait_access = "warn" +default_union_representation = "warn" +deref_by_slicing = "warn" +disallowed_script_idents = "warn" +doc_link_with_quotes = "warn" +empty_drop = "warn" +empty_enum = "warn" +empty_structs_with_brackets = "warn" +enum_glob_use = "warn" +error_impl_error = "warn" +exit = "warn" +expect_used = "warn" +expl_impl_clone_on_copy = "warn" +explicit_deref_methods = "warn" +explicit_into_iter_loop = "warn" +explicit_iter_loop = "warn" +filetype_is_file = "warn" +filter_map_next = "warn" +flat_map_option = "warn" +fn_params_excessive_bools = "warn" +fn_to_numeric_cast_any = "warn" +format_push_string = "warn" +from_iter_instead_of_collect = "warn" +get_unwrap = "warn" +host_endian_bytes = "warn" +if_not_else = "warn" +if_then_some_else_none = "warn" +ignored_unit_patterns = "warn" +implicit_clone = "warn" +implicit_hasher = "warn" +inconsistent_struct_constructor = "warn" +index_refutable_slice = "warn" +inefficient_to_string = "warn" +infinite_loop = "warn" +inline_always = "warn" +inline_asm_x86_att_syntax = "warn" +inline_asm_x86_intel_syntax = "warn" +into_iter_without_iter = "warn" +invalid_upcast_comparisons = "warn" +items_after_statements = "warn" +iter_not_returning_iterator = "warn" +iter_without_into_iter = "warn" +large_digit_groups = "warn" +large_futures = "warn" +large_include_file = "warn" +large_stack_arrays = "warn" +large_types_passed_by_value = "warn" +let_underscore_must_use = "warn" +let_underscore_untyped = "warn" +linkedlist = "warn" +lossy_float_literal = "warn" +macro_use_imports = "warn" +manual_assert = "warn" +manual_instant_elapsed = "warn" +manual_let_else = "warn" +manual_ok_or = "warn" +manual_string_new = "warn" +many_single_char_names = "warn" +map_unwrap_or = "warn" +match_bool = "warn" +match_on_vec_items = "warn" +match_same_arms = "warn" +match_wild_err_arm = "warn" +match_wildcard_for_single_variants = "warn" +maybe_infinite_iter = "warn" +mem_forget = "warn" +mismatching_type_param_order = "warn" +missing_assert_message = "warn" +missing_asserts_for_indexing = "warn" +missing_fields_in_debug = "warn" +multiple_inherent_impl = "warn" +mut_mut = "warn" +mutex_atomic = "warn" +naive_bytecount = "warn" +needless_bitwise_bool = "warn" +needless_continue = "warn" +needless_for_each = "warn" +needless_pass_by_value = "warn" +needless_raw_string_hashes = "warn" +needless_raw_strings = "warn" +negative_feature_names = "warn" +no_effect_underscore_binding = "warn" +no_mangle_with_rust_abi = "warn" +non_ascii_literal = "warn" +panic = "warn" +panic_in_result_fn = "warn" +partial_pub_fields = "warn" +print_stderr = "warn" +print_stdout = "warn" +ptr_as_ptr = "warn" +ptr_cast_constness = "warn" +pub_without_shorthand = "warn" +range_minus_one = "warn" +range_plus_one = "warn" +rc_buffer = "warn" +rc_mutex = "warn" +redundant_closure_for_method_calls = "warn" +redundant_else = "warn" +redundant_feature_names = "warn" +redundant_type_annotations = "warn" +ref_binding_to_reference = "warn" +ref_option_ref = "warn" +ref_patterns = "warn" +rest_pat_in_fully_bound_structs = "warn" +return_self_not_must_use = "warn" +same_functions_in_if_condition = "warn" +same_name_method = "warn" +semicolon_inside_block = "warn" +shadow_same = "warn" +should_panic_without_expect = "warn" +single_match_else = "warn" +stable_sort_primitive = "warn" +str_to_string = "warn" +string_add = "warn" +string_add_assign = "warn" +string_lit_chars_any = "warn" +string_to_string = "warn" +struct_excessive_bools = "warn" +struct_field_names = "warn" +suspicious_xor_used_as_pow = "warn" +tests_outside_test_module = "warn" +todo = "warn" +transmute_ptr_to_ptr = "warn" +trivially_copy_pass_by_ref = "warn" +try_err = "warn" +unchecked_duration_subtraction = "warn" +undocumented_unsafe_blocks = "warn" +unicode_not_nfc = "warn" +unimplemented = "warn" +uninlined_format_args = "warn" +unnecessary_box_returns = "warn" +unnecessary_join = "warn" +unnecessary_safety_comment = "warn" +unnecessary_safety_doc = "warn" +unnecessary_self_imports = "warn" +unnecessary_wraps = "warn" +unneeded_field_pattern = "warn" +unnested_or_patterns = "warn" +unreadable_literal = "warn" +unsafe_derive_deserialize = "warn" +unseparated_literal_suffix = "warn" +unused_async = "warn" +unused_self = "warn" +unwrap_in_result = "warn" +use_debug = "warn" +used_underscore_binding = "warn" +verbose_bit_mask = "warn" +verbose_file_reads = "warn" +wildcard_dependencies = "warn" +zero_sized_map_values = "warn" diff --git a/ng-oxigraph/README.md b/ng-oxigraph/README.md new file mode 100644 index 0000000..0b98575 --- /dev/null +++ b/ng-oxigraph/README.md @@ -0,0 +1,25 @@ +# Oxigraph + +Oxigraph is a graph database library implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. + +The official upstream project is here: https://oxigraph.org/ + +https://github.com/oxigraph/oxigraph/ + +https://crates.io/crates/oxigraph + +This package (ng-oxigraph) is a fork used internally by NextGraph.org project. + +If you are interested to know more about NextGraph: https://nextgraph.org + +https://git.nextgraph.org/NextGraph/nextgraph-rs + +https://crates.io/crates/nextgraph + +## NextGraph + +> NextGraph brings about the convergence of P2P and Semantic Web technologies, towards a decentralized, secure and privacy-preserving cloud, based on CRDTs. +> +> This open source ecosystem provides solutions for end-users (a platform) and software developers (a framework), wishing to use or create **decentralized** apps featuring: **live collaboration** on rich-text documents, peer to peer communication with **end-to-end encryption**, offline-first, **local-first**, portable and interoperable data, total ownership of data and software, security and privacy. Centered on repositories containing **semantic data** (RDF), **rich text**, and structured data formats like **JSON**, synced between peers belonging to permissioned groups of users, it offers strong eventual consistency, thanks to the use of **CRDTs**. Documents can be linked together, signed, shared securely, queried using the **SPARQL** language and organized into sites and containers. +> +> More info here [https://nextgraph.org](https://nextgraph.org) diff --git a/oxigraph/src/io/format.rs b/ng-oxigraph/src/io/format.rs similarity index 100% rename from oxigraph/src/io/format.rs rename to ng-oxigraph/src/io/format.rs diff --git a/oxigraph/src/io/mod.rs b/ng-oxigraph/src/io/mod.rs similarity index 100% rename from oxigraph/src/io/mod.rs rename to ng-oxigraph/src/io/mod.rs diff --git a/oxigraph/src/io/read.rs b/ng-oxigraph/src/io/read.rs similarity index 100% rename from oxigraph/src/io/read.rs rename to ng-oxigraph/src/io/read.rs diff --git a/oxigraph/src/io/write.rs b/ng-oxigraph/src/io/write.rs similarity index 100% rename from oxigraph/src/io/write.rs rename to ng-oxigraph/src/io/write.rs diff --git a/oxigraph/src/lib.rs b/ng-oxigraph/src/lib.rs similarity index 100% rename from oxigraph/src/lib.rs rename to ng-oxigraph/src/lib.rs diff --git a/oxigraph/src/model.rs b/ng-oxigraph/src/model.rs similarity index 100% rename from oxigraph/src/model.rs rename to ng-oxigraph/src/model.rs diff --git a/oxigraph/src/sparql/algebra.rs b/ng-oxigraph/src/sparql/algebra.rs similarity index 100% rename from oxigraph/src/sparql/algebra.rs rename to ng-oxigraph/src/sparql/algebra.rs diff --git a/oxigraph/src/sparql/dataset.rs b/ng-oxigraph/src/sparql/dataset.rs similarity index 100% rename from oxigraph/src/sparql/dataset.rs rename to ng-oxigraph/src/sparql/dataset.rs diff --git a/oxigraph/src/sparql/error.rs b/ng-oxigraph/src/sparql/error.rs similarity index 100% rename from oxigraph/src/sparql/error.rs rename to ng-oxigraph/src/sparql/error.rs diff --git a/oxigraph/src/sparql/eval.rs b/ng-oxigraph/src/sparql/eval.rs similarity index 100% rename from oxigraph/src/sparql/eval.rs rename to ng-oxigraph/src/sparql/eval.rs diff --git a/oxigraph/src/sparql/http/dummy.rs b/ng-oxigraph/src/sparql/http/dummy.rs similarity index 100% rename from oxigraph/src/sparql/http/dummy.rs rename to ng-oxigraph/src/sparql/http/dummy.rs diff --git a/oxigraph/src/sparql/http/mod.rs b/ng-oxigraph/src/sparql/http/mod.rs similarity index 100% rename from oxigraph/src/sparql/http/mod.rs rename to ng-oxigraph/src/sparql/http/mod.rs diff --git a/oxigraph/src/sparql/http/simple.rs b/ng-oxigraph/src/sparql/http/simple.rs similarity index 100% rename from oxigraph/src/sparql/http/simple.rs rename to ng-oxigraph/src/sparql/http/simple.rs diff --git a/oxigraph/src/sparql/mod.rs b/ng-oxigraph/src/sparql/mod.rs similarity index 100% rename from oxigraph/src/sparql/mod.rs rename to ng-oxigraph/src/sparql/mod.rs diff --git a/oxigraph/src/sparql/model.rs b/ng-oxigraph/src/sparql/model.rs similarity index 100% rename from oxigraph/src/sparql/model.rs rename to ng-oxigraph/src/sparql/model.rs diff --git a/oxigraph/src/sparql/results.rs b/ng-oxigraph/src/sparql/results.rs similarity index 100% rename from oxigraph/src/sparql/results.rs rename to ng-oxigraph/src/sparql/results.rs diff --git a/oxigraph/src/sparql/service.rs b/ng-oxigraph/src/sparql/service.rs similarity index 100% rename from oxigraph/src/sparql/service.rs rename to ng-oxigraph/src/sparql/service.rs diff --git a/oxigraph/src/sparql/update.rs b/ng-oxigraph/src/sparql/update.rs similarity index 100% rename from oxigraph/src/sparql/update.rs rename to ng-oxigraph/src/sparql/update.rs diff --git a/oxigraph/src/storage/backend/fallback.rs b/ng-oxigraph/src/storage/backend/fallback.rs similarity index 100% rename from oxigraph/src/storage/backend/fallback.rs rename to ng-oxigraph/src/storage/backend/fallback.rs diff --git a/oxigraph/src/storage/backend/mod.rs b/ng-oxigraph/src/storage/backend/mod.rs similarity index 100% rename from oxigraph/src/storage/backend/mod.rs rename to ng-oxigraph/src/storage/backend/mod.rs diff --git a/oxigraph/src/storage/backend/oxi_rocksdb.rs b/ng-oxigraph/src/storage/backend/oxi_rocksdb.rs similarity index 97% rename from oxigraph/src/storage/backend/oxi_rocksdb.rs rename to ng-oxigraph/src/storage/backend/oxi_rocksdb.rs index 1019d97..7b3c0b7 100644 --- a/oxigraph/src/storage/backend/oxi_rocksdb.rs +++ b/ng-oxigraph/src/storage/backend/oxi_rocksdb.rs @@ -24,7 +24,7 @@ use std::marker::PhantomData; use std::ops::Deref; use std::path::{Path, PathBuf}; use std::rc::{Rc, Weak}; -use std::sync::{Arc, OnceLock}; +use std::sync::Arc; use std::thread::{available_parallelism, yield_now}; use std::{fmt, io, ptr, slice}; @@ -72,6 +72,7 @@ enum DbKind { struct RwDbHandler { db: *mut rocksdb_transactiondb_t, + env: UnsafeEnv, options: *mut rocksdb_options_t, transaction_options: *mut rocksdb_transaction_options_t, transactiondb_options: *mut rocksdb_transactiondb_options_t, @@ -113,6 +114,7 @@ impl Drop for RwDbHandler { rocksdb_transactiondb_options_destroy(self.transactiondb_options); rocksdb_options_destroy(self.options); rocksdb_block_based_options_destroy(self.block_based_table_options); + rocksdb_env_destroy(self.env.0); } if self.in_memory { drop(remove_dir_all(&self.path)); @@ -122,6 +124,7 @@ impl Drop for RwDbHandler { struct RoDbHandler { db: *mut rocksdb_t, + env: UnsafeEnv, options: *mut rocksdb_options_t, read_options: *mut rocksdb_readoptions_t, column_family_names: Vec<&'static str>, @@ -147,6 +150,7 @@ impl Drop for RoDbHandler { } rocksdb_readoptions_destroy(self.read_options); rocksdb_options_destroy(self.options); + rocksdb_env_destroy(self.env.0); } if let Some(path) = &self.path_to_remove { drop(remove_dir_all(path)); @@ -171,7 +175,8 @@ impl Db { }; let c_path = path_to_cstring(&path)?; unsafe { - let options = Self::db_options(true, in_memory, key)?; + let unsafe_env = Self::create_env(in_memory, key); + let options = Self::db_options(true, &unsafe_env)?; rocksdb_options_set_create_if_missing(options, 1); rocksdb_options_set_create_missing_column_families(options, 1); rocksdb_options_set_compression( @@ -294,6 +299,7 @@ impl Db { Ok(Self { inner: DbKind::ReadWrite(Arc::new(RwDbHandler { db, + env: unsafe_env, options, transaction_options, transactiondb_options, @@ -390,7 +396,8 @@ impl Db { ) -> Result { unsafe { let c_path = path_to_cstring(path)?; - let options = Self::db_options(true, false, key)?; + let unsafe_env = Self::create_env(false, key); + let options = Self::db_options(true, &unsafe_env)?; let (column_family_names, c_column_family_names, cf_options) = Self::column_families_names_and_options(column_families, options); let mut cf_handles: Vec<*mut rocksdb_column_family_handle_t> = @@ -435,6 +442,7 @@ impl Db { Ok(Self { inner: DbKind::ReadOnly(Arc::new(RoDbHandler { db, + env: unsafe_env, options, read_options, column_family_names, @@ -447,14 +455,27 @@ impl Db { } } + fn create_env(in_memory: bool, key: Option<[u8; 32]>) -> UnsafeEnv { + unsafe { + if in_memory { + let env = rocksdb_create_mem_env(); + assert!(!env.is_null(), "rocksdb_create_mem_env returned null"); + UnsafeEnv(env) + } else { + let env = match key { + Some(_) => rocksdb_create_encrypted_env(opt_bytes_to_ptr(key.as_ref())), + None => rocksdb_create_default_env(), + }; + assert!(!env.is_null(), "rocksdb_create_encrypted_env returned null"); + UnsafeEnv(env) + } + } + } + fn db_options( limit_max_open_files: bool, - in_memory: bool, - key: Option<[u8; 32]>, + unsafe_env: &UnsafeEnv, ) -> Result<*mut rocksdb_options_t, StorageError> { - static ROCKSDB_ENV: OnceLock = OnceLock::new(); - static ROCKSDB_MEM_ENV: OnceLock = OnceLock::new(); - unsafe { let options = rocksdb_options_create(); assert!(!options.is_null(), "rocksdb_options_create returned null"); @@ -488,26 +509,7 @@ impl Db { rocksdb_options_set_info_log_level(options, 2); // We only log warnings rocksdb_options_set_max_log_file_size(options, 1024 * 1024); // Only 1MB log size rocksdb_options_set_recycle_log_file_num(options, 10); // We do not keep more than 10 log files - rocksdb_options_set_env( - options, - if in_memory { - ROCKSDB_MEM_ENV.get_or_init(|| { - let env = rocksdb_create_mem_env(); - assert!(!env.is_null(), "rocksdb_create_mem_env returned null"); - UnsafeEnv(env) - }) - } else { - ROCKSDB_ENV.get_or_init(|| { - let env = match key { - Some(_) => rocksdb_create_encrypted_env(opt_bytes_to_ptr(key.as_ref())), - None => rocksdb_create_default_env(), - }; - assert!(!env.is_null(), "rocksdb_create_encrypted_env returned null"); - UnsafeEnv(env) - }) - } - .0, - ); + rocksdb_options_set_env(options, unsafe_env.0); Ok(options) } } diff --git a/oxigraph/src/storage/binary_encoder.rs b/ng-oxigraph/src/storage/binary_encoder.rs similarity index 100% rename from oxigraph/src/storage/binary_encoder.rs rename to ng-oxigraph/src/storage/binary_encoder.rs diff --git a/oxigraph/src/storage/error.rs b/ng-oxigraph/src/storage/error.rs similarity index 100% rename from oxigraph/src/storage/error.rs rename to ng-oxigraph/src/storage/error.rs diff --git a/oxigraph/src/storage/mod.rs b/ng-oxigraph/src/storage/mod.rs similarity index 100% rename from oxigraph/src/storage/mod.rs rename to ng-oxigraph/src/storage/mod.rs diff --git a/oxigraph/src/storage/numeric_encoder.rs b/ng-oxigraph/src/storage/numeric_encoder.rs similarity index 100% rename from oxigraph/src/storage/numeric_encoder.rs rename to ng-oxigraph/src/storage/numeric_encoder.rs diff --git a/oxigraph/src/storage/small_string.rs b/ng-oxigraph/src/storage/small_string.rs similarity index 100% rename from oxigraph/src/storage/small_string.rs rename to ng-oxigraph/src/storage/small_string.rs diff --git a/oxigraph/src/store.rs b/ng-oxigraph/src/store.rs similarity index 100% rename from oxigraph/src/store.rs rename to ng-oxigraph/src/store.rs diff --git a/oxigraph/tests/rocksdb_bc_data/000003.log b/ng-oxigraph/tests/rocksdb_bc_data/000003.log similarity index 100% rename from oxigraph/tests/rocksdb_bc_data/000003.log rename to ng-oxigraph/tests/rocksdb_bc_data/000003.log diff --git a/oxigraph/tests/rocksdb_bc_data/CURRENT b/ng-oxigraph/tests/rocksdb_bc_data/CURRENT similarity index 100% rename from oxigraph/tests/rocksdb_bc_data/CURRENT rename to ng-oxigraph/tests/rocksdb_bc_data/CURRENT diff --git a/oxigraph/tests/rocksdb_bc_data/IDENTITY b/ng-oxigraph/tests/rocksdb_bc_data/IDENTITY similarity index 100% rename from oxigraph/tests/rocksdb_bc_data/IDENTITY rename to ng-oxigraph/tests/rocksdb_bc_data/IDENTITY diff --git a/oxigraph/tests/rocksdb_bc_data/LOCK b/ng-oxigraph/tests/rocksdb_bc_data/LOCK similarity index 100% rename from oxigraph/tests/rocksdb_bc_data/LOCK rename to ng-oxigraph/tests/rocksdb_bc_data/LOCK diff --git a/oxigraph/tests/rocksdb_bc_data/MANIFEST-000004 b/ng-oxigraph/tests/rocksdb_bc_data/MANIFEST-000004 similarity index 100% rename from oxigraph/tests/rocksdb_bc_data/MANIFEST-000004 rename to ng-oxigraph/tests/rocksdb_bc_data/MANIFEST-000004 diff --git a/oxigraph/tests/rocksdb_bc_data/OPTIONS-000026 b/ng-oxigraph/tests/rocksdb_bc_data/OPTIONS-000026 similarity index 100% rename from oxigraph/tests/rocksdb_bc_data/OPTIONS-000026 rename to ng-oxigraph/tests/rocksdb_bc_data/OPTIONS-000026 diff --git a/oxigraph/tests/store.rs b/ng-oxigraph/tests/store.rs similarity index 99% rename from oxigraph/tests/store.rs rename to ng-oxigraph/tests/store.rs index 9ba1db5..198e5f7 100644 --- a/oxigraph/tests/store.rs +++ b/ng-oxigraph/tests/store.rs @@ -1,10 +1,10 @@ #![cfg(test)] #![allow(clippy::panic_in_result_fn)] -use oxigraph::io::RdfFormat; -use oxigraph::model::vocab::{rdf, xsd}; -use oxigraph::model::*; -use oxigraph::store::Store; +use ng_oxigraph::io::RdfFormat; +use ng_oxigraph::model::vocab::{rdf, xsd}; +use ng_oxigraph::model::*; +use ng_oxigraph::store::Store; #[cfg(all(not(target_family = "wasm")))] use rand::random; #[cfg(all(not(target_family = "wasm")))] diff --git a/ng-sdk-js/app-node/index.js b/ng-sdk-js/app-node/index.js index 02c8b7e..3490aa0 100644 --- a/ng-sdk-js/app-node/index.js +++ b/ng-sdk-js/app-node/index.js @@ -21,9 +21,10 @@ let config = { ng.init_headless(config).then( async() => { try { - //let user_id = "AC6ukMzC_ig85A0y-ivFOI_VXBB_EQJjTz2XnMn9d0nT"; - - let user_id = await ng.admin_create_user(config); + //let user_id = "ABIojb8XGAGCL4R_-81Kix8vJnSsfpvu8jwi6T-wTQWt"; + //let user_id = "ABA1FBm8ofqCXutaf96pRTWvgXDaCG2JLuRlthzoV4a2"; + let user_id = "AJQ5gCLoXXjalC9diTDCvxxWu5ZQUcYWEE821nhVRMcE"; + //let user_id = await ng.admin_create_user(config); console.log("user created: ",user_id); let session = await ng.session_headless_start(user_id); diff --git a/ng-verifier/Cargo.toml b/ng-verifier/Cargo.toml index c63581c..095eb3a 100644 --- a/ng-verifier/Cargo.toml +++ b/ng-verifier/Cargo.toml @@ -28,12 +28,12 @@ either = "1.8.1" futures = "0.3.24" async-trait = "0.1.64" async-std = { version = "1.12.0", features = [ "attributes", "unstable" ] } -oxigraph = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main" } automerge = "0.5.9" yrs = "0.18.2" bloomfilter = { version = "1.0.13", features = ["random","serde"] } ng-repo = { path = "../ng-repo", version = "0.1.0" } ng-net = { path = "../ng-net", version = "0.1.0" } +ng-oxigraph = { path = "../ng-oxigraph", version = "0.4.0-alpha.7-ng" } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] ng-storage-rocksdb = { path = "../ng-storage-rocksdb", version = "0.1.0" } diff --git a/ng-verifier/src/verifier.rs b/ng-verifier/src/verifier.rs index 9116bab..27eed42 100644 --- a/ng-verifier/src/verifier.rs +++ b/ng-verifier/src/verifier.rs @@ -28,9 +28,9 @@ use ng_repo::object::Object; use serde::{Deserialize, Serialize}; use web_time::SystemTime; -//use oxigraph::io::{RdfFormat, RdfParser, RdfSerializer}; -//use oxigraph::store::Store; -//use oxigraph::model::GroundQuad; +//use ng_oxigraph::io::{RdfFormat, RdfParser, RdfSerializer}; +//use ng_oxigraph::store::Store; +//use ng_oxigraph::model::GroundQuad; //use yrs::{StateVector, Update}; use ng_repo::file::ReadFile; @@ -79,7 +79,7 @@ pub struct Verifier { pub(crate) config: VerifierConfig, pub connected_broker: BrokerPeerId, #[allow(dead_code)] - graph_dataset: Option, + graph_dataset: Option, pub(crate) user_storage: Option>>, block_storage: Option>>, last_seq_num: u64, @@ -2014,7 +2014,7 @@ impl Verifier { ) -> Result { let (graph, user, block) = match &config.config_type { VerifierConfigType::Memory | VerifierConfigType::JsSaveSession(_) => ( - Some(oxigraph::store::Store::new().unwrap()), + Some(ng_oxigraph::store::Store::new().unwrap()), Some(Box::new(InMemoryUserStorage::new()) as Box), Some(block_storage), ), @@ -2031,7 +2031,7 @@ impl Verifier { // this is very temporary, until we remove the code in oxi_rocksdb of oxigraph, // and have oxigraph use directly the UserStorage Some( - oxigraph::store::Store::open_with_key(path_oxi, config.user_master_key) + ng_oxigraph::store::Store::open_with_key(path_oxi, config.user_master_key) .map_err(|e| NgError::OxiGraphError(e.to_string()))?, ), Some(Box::new(RocksDbUserStorage::open( diff --git a/oxigraph/Cargo.toml b/oxigraph/Cargo.toml deleted file mode 100644 index 52caf88..0000000 --- a/oxigraph/Cargo.toml +++ /dev/null @@ -1,59 +0,0 @@ -[package] -name = "oxigraph" -version.workspace = true -authors.workspace = true -license.workspace = true -readme = "README.md" -keywords = ["RDF", "SPARQL", "graph-database", "database"] -categories = ["database-implementations"] -repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/oxigraph" -homepage = "https://oxigraph.org/" -documentation = "https://docs.rs/oxigraph" -description = """ -a SPARQL database and RDF toolkit -""" -edition.workspace = true -rust-version.workspace = true - -[features] -js = ["getrandom/js", "oxsdatatypes/js", "js-sys"] - - -[dependencies] -digest.workspace = true -hex.workspace = true -json-event-parser.workspace = true -md-5.workspace = true -oxilangtag.workspace = true -oxiri.workspace = true -oxrdf = { workspace = true, features = ["rdf-star", "oxsdatatypes"] } -oxrdfio = { workspace = true, features = ["rdf-star"] } -oxsdatatypes.workspace = true -rand.workspace = true -regex.workspace = true -sha1.workspace = true -sha2.workspace = true -siphasher.workspace = true -sparesults = { workspace = true, features = ["rdf-star"] } -spargebra = { workspace = true, features = ["rdf-star", "sep-0002", "sep-0006"] } -sparopt = { workspace = true, features = ["rdf-star", "sep-0002", "sep-0006"] } -thiserror.workspace = true - -[target.'cfg(not(target_family = "wasm"))'.dependencies] -libc = "0.2" -rocksdb.workspace = true - -[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] -getrandom.workspace = true -js-sys = { workspace = true, optional = true } - -[target.'cfg(not(target_family = "wasm"))'.dev-dependencies] -codspeed-criterion-compat.workspace = true -zstd.workspace = true - -[lints] -workspace = true - -[package.metadata.docs.rs] -rustdoc-args = ["--cfg", "docsrs"] - diff --git a/oxigraph/README.md b/oxigraph/README.md deleted file mode 100644 index 293d7cd..0000000 --- a/oxigraph/README.md +++ /dev/null @@ -1,82 +0,0 @@ -Oxigraph -======== - -[![Latest Version](https://img.shields.io/crates/v/oxigraph.svg)](https://crates.io/crates/oxigraph) -[![Released API docs](https://docs.rs/oxigraph/badge.svg)](https://docs.rs/oxigraph) -[![Crates.io downloads](https://img.shields.io/crates/d/oxigraph)](https://crates.io/crates/oxigraph) -[![actions status](https://github.com/oxigraph/oxigraph/workflows/build/badge.svg)](https://github.com/oxigraph/oxigraph/actions) -[![Gitter](https://badges.gitter.im/oxigraph/community.svg)](https://gitter.im/oxigraph/community) - -Oxigraph is a graph database library implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. - -Its goal is to provide a compliant, safe and fast on-disk graph database. -It also provides a set of utility functions for reading, writing, and processing RDF files. - -Oxigraph is in heavy development and SPARQL query evaluation has not been optimized yet. - -Oxigraph also provides [a CLI tool](https://crates.io/crates/oxigraph-cli) and [a Python library](https://pyoxigraph.readthedocs.io/) based on this library. - - -Oxigraph implements the following specifications: -* [SPARQL 1.1 Query](https://www.w3.org/TR/sparql11-query/), [SPARQL 1.1 Update](https://www.w3.org/TR/sparql11-update/), and [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/). -* [Turtle](https://www.w3.org/TR/turtle/), [TriG](https://www.w3.org/TR/trig/), [N-Triples](https://www.w3.org/TR/n-triples/), [N-Quads](https://www.w3.org/TR/n-quads/), and [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) RDF serialization formats for both data ingestion and retrieval. -* [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/), [SPARQL 1.1 Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) and [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/). - -A preliminary benchmark [is provided](../bench/README.md). Oxigraph internal design [is described on the wiki](https://github.com/oxigraph/oxigraph/wiki/Architecture). - -The main entry point of Oxigraph is the [`Store`](store::Store) struct: -```rust -use oxigraph::store::Store; -use oxigraph::model::*; -use oxigraph::sparql::QueryResults; - -let store = Store::new().unwrap(); - -// insertion -let ex = NamedNode::new("http://example.com").unwrap(); -let quad = Quad::new(ex.clone(), ex.clone(), ex.clone(), GraphName::DefaultGraph); -store.insert(&quad).unwrap(); - -// quad filter -let results = store.quads_for_pattern(Some(ex.as_ref().into()), None, None, None).collect::,_>>().unwrap(); -assert_eq!(vec![quad], results); - -// SPARQL query -if let QueryResults::Solutions(mut solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }").unwrap() { - assert_eq!(solutions.next().unwrap().unwrap().get("s"), Some(&ex.into())); -} -``` - -It is based on these crates that can be used separately: -* [`oxrdf`](https://crates.io/crates/oxrdf), datastructures encoding RDF basic concepts (the [`oxigraph::model`](crate::model) module). -* [`oxrdfio`](https://crates.io/crates/oxrdfio), a unified parser and serializer API for RDF formats (the [`oxigraph::io`](crate::io) module). It itself relies on: - * [`oxttl`](https://crates.io/crates/oxttl), N-Triple, N-Quad, Turtle, TriG and N3 parsing and serialization. - * [`oxrdfxml`](https://crates.io/crates/oxrdfxml), RDF/XML parsing and serialization. -* [`spargebra`](https://crates.io/crates/spargebra), a SPARQL parser. -* [`sparesults`](https://crates.io/crates/sparesults), parsers and serializers for SPARQL result formats (the [`oxigraph::sparql::results`](crate::sparql::results) module). -* [`sparopt`](https://crates.io/crates/sparesults), a SPARQL optimizer. -* [`oxsdatatypes`](https://crates.io/crates/oxsdatatypes), an implementation of some XML Schema datatypes. - -To build the library locally, don't forget to clone the submodules using `git clone --recursive https://github.com/oxigraph/oxigraph.git` to clone the repository including submodules or `git submodule update --init` to add submodules to the already cloned repository. - -It is possible to disable the RocksDB storage backend to only use the in-memory fallback by disabling the `rocksdb` default feature: -```toml -oxigraph = { version = "*", default-features = false } -``` -This is the default behavior when compiling Oxigraph to WASM. - -## License - -This project is licensed under either of - -* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or - ``) -* MIT license ([LICENSE-MIT](../LICENSE-MIT) or - ``) - -at your option. - - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.