wavedb 0.1.0__tar.gz
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.
- wavedb-0.1.0/LICENSE +21 -0
- wavedb-0.1.0/MANIFEST.in +12 -0
- wavedb-0.1.0/PKG-INFO +225 -0
- wavedb-0.1.0/README.md +189 -0
- wavedb-0.1.0/c_src/CMakeLists.txt +644 -0
- wavedb-0.1.0/c_src/cmake/WaveDBConfig.cmake.in +16 -0
- wavedb-0.1.0/c_src/deps/hashmap/include/hashmap.h +491 -0
- wavedb-0.1.0/c_src/deps/hashmap/include/hashmap_base.h +59 -0
- wavedb-0.1.0/c_src/deps/hashmap/src/hashmap.c +729 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Continuous.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Continuous.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousStart.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousTest.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Experimental.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Experimental.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Nightly.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Nightly.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyBuild.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyStart.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyStart.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlySubmit.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyTest.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyTest.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake +18 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/Makefile.cmake +46 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/boo.dir/DependInfo.cmake +20 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/boo.dir/cmake_clean.cmake +11 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/foo.dir/DependInfo.cmake +19 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/foo.dir/cmake_clean.cmake +11 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/foo.dir/cmake_clean_target.cmake +3 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/cmake_install.cmake +49 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/src/CMakeLists.txt +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/src/foo.c +4 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/src/main.c +6 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/Makefile.cmake +46 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/boo.dir/DependInfo.cmake +20 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/boo.dir/cmake_clean.cmake +11 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/foo.dir/DependInfo.cmake +19 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/foo.dir/cmake_clean.cmake +11 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/foo.dir/cmake_clean_target.cmake +3 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/cmake_install.cmake +49 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/src/CMakeLists.txt +8 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeLists.txt +268 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/FindCJSON.cmake +9 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/FindCMocka.cmake +57 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/JoinPaths.cmake +23 -0
- wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/LibFindMacros.cmake +120 -0
- wavedb-0.1.0/c_src/deps/libcbor/CTestTestfile.cmake +7 -0
- wavedb-0.1.0/c_src/deps/libcbor/cbor/configuration.h +14 -0
- wavedb-0.1.0/c_src/deps/libcbor/cmake_install.cmake +54 -0
- wavedb-0.1.0/c_src/deps/libcbor/doc/source/requirements.in +5 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/Export/lib/cmake/libcbor/libcborTargets-release.cmake +19 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/Export/lib/cmake/libcbor/libcborTargets.cmake +95 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/cbor.dir/DependInfo.cmake +38 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/cbor.dir/cmake_clean.cmake +49 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/cbor.dir/cmake_clean_target.cmake +3 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CMakeLists.txt +130 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/CTestTestfile.cmake +6 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/allocators.c +19 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/arrays.c +136 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/arrays.h +138 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/bytestrings.c +119 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/bytestrings.h +150 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/callbacks.c +121 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/callbacks.h +189 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/cbor_export.h +42 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/common.c +167 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/common.h +367 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/configuration.h.in +14 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/data.h +264 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/encoding.c +215 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/encoding.h +145 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/floats_ctrls.c +193 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/floats_ctrls.h +241 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/builder_callbacks.c +422 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/builder_callbacks.h +85 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/encoders.c +99 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/encoders.h +41 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/loaders.c +86 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/loaders.h +43 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/memory_utils.c +57 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/memory_utils.h +50 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/stack.c +33 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/stack.h +53 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/unicode.c +95 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/unicode.h +33 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/ints.c +194 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/ints.h +211 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/maps.c +125 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/maps.h +121 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/serialization.c +399 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/serialization.h +169 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/streaming.c +607 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/streaming.h +37 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/strings.c +144 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/strings.h +184 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/tags.c +52 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor/tags.h +78 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor.c +578 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cbor.h +85 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/cmake_install.cmake +90 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/libcbor.pc.in +11 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/libcborConfig.cmake +35 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/libcborConfig.cmake.in +11 -0
- wavedb-0.1.0/c_src/deps/libcbor/src/libcborConfigVersion.cmake +70 -0
- wavedb-0.1.0/c_src/deps/xxhash/xxh3.h +55 -0
- wavedb-0.1.0/c_src/deps/xxhash/xxh_x86dispatch.c +821 -0
- wavedb-0.1.0/c_src/deps/xxhash/xxh_x86dispatch.h +93 -0
- wavedb-0.1.0/c_src/deps/xxhash/xxhash.c +42 -0
- wavedb-0.1.0/c_src/deps/xxhash/xxhash.h +7490 -0
- wavedb-0.1.0/c_src/src/Buffer/buffer.c +205 -0
- wavedb-0.1.0/c_src/src/Buffer/buffer.h +43 -0
- wavedb-0.1.0/c_src/src/Database/batch.c +261 -0
- wavedb-0.1.0/c_src/src/Database/batch.h +136 -0
- wavedb-0.1.0/c_src/src/Database/crc32.h +63 -0
- wavedb-0.1.0/c_src/src/Database/database.c +3113 -0
- wavedb-0.1.0/c_src/src/Database/database.h +389 -0
- wavedb-0.1.0/c_src/src/Database/database_config.c +749 -0
- wavedb-0.1.0/c_src/src/Database/database_config.h +223 -0
- wavedb-0.1.0/c_src/src/Database/database_iterator.c +514 -0
- wavedb-0.1.0/c_src/src/Database/database_iterator.h +97 -0
- wavedb-0.1.0/c_src/src/Database/database_lru.c +635 -0
- wavedb-0.1.0/c_src/src/Database/database_lru.h +166 -0
- wavedb-0.1.0/c_src/src/Database/database_subtree.c +1296 -0
- wavedb-0.1.0/c_src/src/Database/database_subtree.h +504 -0
- wavedb-0.1.0/c_src/src/Database/eviction_queue.c +35 -0
- wavedb-0.1.0/c_src/src/Database/eviction_queue.h +28 -0
- wavedb-0.1.0/c_src/src/Database/wal.c +515 -0
- wavedb-0.1.0/c_src/src/Database/wal.h +212 -0
- wavedb-0.1.0/c_src/src/Database/wal_compactor.c +125 -0
- wavedb-0.1.0/c_src/src/Database/wal_compactor.h +56 -0
- wavedb-0.1.0/c_src/src/Database/wal_manager.c +2106 -0
- wavedb-0.1.0/c_src/src/Database/wal_manager.h +235 -0
- wavedb-0.1.0/c_src/src/HBTrie/bnode.c +774 -0
- wavedb-0.1.0/c_src/src/HBTrie/bnode.h +504 -0
- wavedb-0.1.0/c_src/src/HBTrie/bs_array.c +181 -0
- wavedb-0.1.0/c_src/src/HBTrie/bs_array.h +129 -0
- wavedb-0.1.0/c_src/src/HBTrie/chunk.c +128 -0
- wavedb-0.1.0/c_src/src/HBTrie/chunk.h +141 -0
- wavedb-0.1.0/c_src/src/HBTrie/hbtrie.c +3767 -0
- wavedb-0.1.0/c_src/src/HBTrie/hbtrie.h +439 -0
- wavedb-0.1.0/c_src/src/HBTrie/hbtrie_viz.c +592 -0
- wavedb-0.1.0/c_src/src/HBTrie/hbtrie_viz.h +30 -0
- wavedb-0.1.0/c_src/src/HBTrie/identifier.c +352 -0
- wavedb-0.1.0/c_src/src/HBTrie/identifier.h +183 -0
- wavedb-0.1.0/c_src/src/HBTrie/mvcc.c +362 -0
- wavedb-0.1.0/c_src/src/HBTrie/mvcc.h +175 -0
- wavedb-0.1.0/c_src/src/HBTrie/path.c +261 -0
- wavedb-0.1.0/c_src/src/HBTrie/path.h +177 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph.c +808 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph.h +144 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_internal.h +175 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_ops.c +746 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_optimizer.c +280 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_parser.c +527 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_schema_parser.c +735 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_set.c +187 -0
- wavedb-0.1.0/c_src/src/Layers/graph/graph_stats.c +230 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql.h +166 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_lexer.c +291 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_lexer.h +147 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_parser.c +1351 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_parser.h +98 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_plan.c +729 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_plan.h +86 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_resolve.c +1860 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_resolve.h +77 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_result.c +211 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_result.h +64 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_schema.c +1416 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_schema.h +78 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_types.c +520 -0
- wavedb-0.1.0/c_src/src/Layers/graphql/graphql_types.h +470 -0
- wavedb-0.1.0/c_src/src/RefCounter/refcounter.c +62 -0
- wavedb-0.1.0/c_src/src/RefCounter/refcounter.h +36 -0
- wavedb-0.1.0/c_src/src/Storage/bnode_cache.c +694 -0
- wavedb-0.1.0/c_src/src/Storage/bnode_cache.h +89 -0
- wavedb-0.1.0/c_src/src/Storage/encryption.c +538 -0
- wavedb-0.1.0/c_src/src/Storage/encryption.h +116 -0
- wavedb-0.1.0/c_src/src/Storage/node_serializer.c +995 -0
- wavedb-0.1.0/c_src/src/Storage/node_serializer.h +183 -0
- wavedb-0.1.0/c_src/src/Storage/page_file.c +782 -0
- wavedb-0.1.0/c_src/src/Storage/page_file.h +109 -0
- wavedb-0.1.0/c_src/src/Storage/stale_region.c +213 -0
- wavedb-0.1.0/c_src/src/Storage/stale_region.h +54 -0
- wavedb-0.1.0/c_src/src/Time/debouncer.c +120 -0
- wavedb-0.1.0/c_src/src/Time/debouncer.h +66 -0
- wavedb-0.1.0/c_src/src/Time/ticker.c +17 -0
- wavedb-0.1.0/c_src/src/Time/ticker.h +13 -0
- wavedb-0.1.0/c_src/src/Time/wheel.c +546 -0
- wavedb-0.1.0/c_src/src/Time/wheel.h +131 -0
- wavedb-0.1.0/c_src/src/Util/allocator.c +24 -0
- wavedb-0.1.0/c_src/src/Util/allocator.h +11 -0
- wavedb-0.1.0/c_src/src/Util/atomic_compat.h +260 -0
- wavedb-0.1.0/c_src/src/Util/dirent_compat.h +122 -0
- wavedb-0.1.0/c_src/src/Util/endian.h +60 -0
- wavedb-0.1.0/c_src/src/Util/fs_block_size.c +52 -0
- wavedb-0.1.0/c_src/src/Util/fs_block_size.h +28 -0
- wavedb-0.1.0/c_src/src/Util/get_dir.c +61 -0
- wavedb-0.1.0/c_src/src/Util/get_dir.h +12 -0
- wavedb-0.1.0/c_src/src/Util/hash.c +109 -0
- wavedb-0.1.0/c_src/src/Util/hash.h +24 -0
- wavedb-0.1.0/c_src/src/Util/log.c +168 -0
- wavedb-0.1.0/c_src/src/Util/log.h +82 -0
- wavedb-0.1.0/c_src/src/Util/memory_pool.c +449 -0
- wavedb-0.1.0/c_src/src/Util/memory_pool.h +127 -0
- wavedb-0.1.0/c_src/src/Util/mkdir_p.c +59 -0
- wavedb-0.1.0/c_src/src/Util/mkdir_p.h +8 -0
- wavedb-0.1.0/c_src/src/Util/path_join.c +77 -0
- wavedb-0.1.0/c_src/src/Util/path_join.h +18 -0
- wavedb-0.1.0/c_src/src/Util/perf_counters.c +357 -0
- wavedb-0.1.0/c_src/src/Util/perf_counters.h +147 -0
- wavedb-0.1.0/c_src/src/Util/portable_endian.h +197 -0
- wavedb-0.1.0/c_src/src/Util/rm_rf.c +86 -0
- wavedb-0.1.0/c_src/src/Util/rm_rf.h +8 -0
- wavedb-0.1.0/c_src/src/Util/threadding.c +244 -0
- wavedb-0.1.0/c_src/src/Util/threadding.h +172 -0
- wavedb-0.1.0/c_src/src/Util/unistd_compat.h +121 -0
- wavedb-0.1.0/c_src/src/Util/vec.c +113 -0
- wavedb-0.1.0/c_src/src/Util/vec.h +181 -0
- wavedb-0.1.0/c_src/src/Util/windows_compat.h +21 -0
- wavedb-0.1.0/c_src/src/Workers/error.c +51 -0
- wavedb-0.1.0/c_src/src/Workers/error.h +43 -0
- wavedb-0.1.0/c_src/src/Workers/join.c +62 -0
- wavedb-0.1.0/c_src/src/Workers/join.h +64 -0
- wavedb-0.1.0/c_src/src/Workers/pool.c +157 -0
- wavedb-0.1.0/c_src/src/Workers/pool.h +45 -0
- wavedb-0.1.0/c_src/src/Workers/promise.c +48 -0
- wavedb-0.1.0/c_src/src/Workers/promise.h +32 -0
- wavedb-0.1.0/c_src/src/Workers/queue.c +96 -0
- wavedb-0.1.0/c_src/src/Workers/queue.h +42 -0
- wavedb-0.1.0/c_src/src/Workers/transaction_id.c +161 -0
- wavedb-0.1.0/c_src/src/Workers/transaction_id.h +62 -0
- wavedb-0.1.0/c_src/src/Workers/work.c +26 -0
- wavedb-0.1.0/c_src/src/Workers/work.h +19 -0
- wavedb-0.1.0/pyproject.toml +26 -0
- wavedb-0.1.0/scripts/copy_sources.py +99 -0
- wavedb-0.1.0/setup.cfg +4 -0
- wavedb-0.1.0/setup.py +101 -0
- wavedb-0.1.0/src/wavedb/__init__.py +36 -0
- wavedb-0.1.0/src/wavedb/_async.py +314 -0
- wavedb-0.1.0/src/wavedb/_cffi_build.py +266 -0
- wavedb-0.1.0/src/wavedb/_errors.py +49 -0
- wavedb-0.1.0/src/wavedb/_lib/__init__.py +1 -0
- wavedb-0.1.0/src/wavedb/_lib/libwavedb.so +0 -0
- wavedb-0.1.0/src/wavedb/_native.py +16 -0
- wavedb-0.1.0/src/wavedb/_native_abi.py +280 -0
- wavedb-0.1.0/src/wavedb/config.py +49 -0
- wavedb-0.1.0/src/wavedb/database.py +603 -0
- wavedb-0.1.0/src/wavedb/exceptions.py +25 -0
- wavedb-0.1.0/src/wavedb/graph_layer.py +230 -0
- wavedb-0.1.0/src/wavedb/graphql_layer.py +276 -0
- wavedb-0.1.0/src/wavedb/iterator.py +117 -0
- wavedb-0.1.0/src/wavedb/object_ops.py +93 -0
- wavedb-0.1.0/src/wavedb/subtree.py +230 -0
- wavedb-0.1.0/src/wavedb.egg-info/PKG-INFO +225 -0
- wavedb-0.1.0/src/wavedb.egg-info/SOURCES.txt +320 -0
- wavedb-0.1.0/src/wavedb.egg-info/dependency_links.txt +1 -0
- wavedb-0.1.0/src/wavedb.egg-info/requires.txt +5 -0
- wavedb-0.1.0/src/wavedb.egg-info/top_level.txt +1 -0
- wavedb-0.1.0/tests/test_async_bridge.py +42 -0
- wavedb-0.1.0/tests/test_async_core.py +39 -0
- wavedb-0.1.0/tests/test_batch.py +67 -0
- wavedb-0.1.0/tests/test_batched_helpers.py +127 -0
- wavedb-0.1.0/tests/test_config.py +83 -0
- wavedb-0.1.0/tests/test_encryption.py +49 -0
- wavedb-0.1.0/tests/test_errors.py +75 -0
- wavedb-0.1.0/tests/test_graph.py +51 -0
- wavedb-0.1.0/tests/test_graphql.py +153 -0
- wavedb-0.1.0/tests/test_iterator.py +33 -0
- wavedb-0.1.0/tests/test_mvcc.py +38 -0
- wavedb-0.1.0/tests/test_native.py +25 -0
- wavedb-0.1.0/tests/test_object_ops.py +41 -0
- wavedb-0.1.0/tests/test_persistence.py +54 -0
- wavedb-0.1.0/tests/test_stress_async.py +159 -0
- wavedb-0.1.0/tests/test_subtree.py +43 -0
- wavedb-0.1.0/tests/test_wavedb.py +78 -0
wavedb-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Victor Morrow
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
wavedb-0.1.0/MANIFEST.in
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# MANIFEST.in — paths relative to bindings/python/.
|
|
2
|
+
# c_src/ is populated by scripts/copy_sources.py before building the sdist.
|
|
3
|
+
# Run: python scripts/copy_sources.py && python -m build --sdist
|
|
4
|
+
include README.md LICENSE
|
|
5
|
+
recursive-include src *.py
|
|
6
|
+
include scripts/copy_sources.py
|
|
7
|
+
# Vendored C sources (generated by copy_sources.py, included in sdist)
|
|
8
|
+
recursive-include c_src *.h *.c CMakeLists.txt *.cmake *.in
|
|
9
|
+
graft c_src/cmake
|
|
10
|
+
# Prune build artifacts and large dirs from vendored tree
|
|
11
|
+
prune c_src/deps/googletest
|
|
12
|
+
global-exclude .git __pycache__ *.pyc
|
wavedb-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: wavedb
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python bindings for WaveDB - Hierarchical B+Trie Database
|
|
5
|
+
Author-email: Victor Morrow <victor.j.morrow@gmail.com>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Victor Morrow
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Requires-Python: >=3.10
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Requires-Dist: cffi>=1.16
|
|
32
|
+
Provides-Extra: test
|
|
33
|
+
Requires-Dist: pytest>=7.4; extra == "test"
|
|
34
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "test"
|
|
35
|
+
Dynamic: license-file
|
|
36
|
+
|
|
37
|
+
# WaveDB Python Bindings
|
|
38
|
+
|
|
39
|
+
Python bindings for [WaveDB](../../README.md) — a hierarchical key-value
|
|
40
|
+
database with MVCC, WAL durability, and schema layer access.
|
|
41
|
+
|
|
42
|
+
## Installation
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install wavedb
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The install step builds `libwavedb.so` (Linux) / `libwavedb.dylib` (macOS) /
|
|
49
|
+
`wavedb.dll` (Windows) from source via CMake. Requirements:
|
|
50
|
+
|
|
51
|
+
- Python 3.10+
|
|
52
|
+
- CMake 3.14+
|
|
53
|
+
- A C compiler (gcc, clang, or MSVC)
|
|
54
|
+
|
|
55
|
+
To use a pre-built library instead, set `WAVEDB_LIB_PATH` before importing:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
export WAVEDB_LIB_PATH=/path/to/libwavedb.so
|
|
59
|
+
pip install wavedb --no-build-isolation
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Quick Start
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from wavedb import WaveDB
|
|
66
|
+
|
|
67
|
+
db = WaveDB("/path/to/db", delimiter="/")
|
|
68
|
+
|
|
69
|
+
# Sync (blocking)
|
|
70
|
+
db.put_sync("users/alice/name", "Alice")
|
|
71
|
+
name = db.get_sync("users/alice/name") # b"Alice"
|
|
72
|
+
|
|
73
|
+
# Async (non-blocking, uses C worker pool)
|
|
74
|
+
import asyncio
|
|
75
|
+
async def main():
|
|
76
|
+
await db.put("users/bob/name", "Bob")
|
|
77
|
+
name = await db.get("users/bob/name")
|
|
78
|
+
asyncio.run(main())
|
|
79
|
+
|
|
80
|
+
# Batched async — 8x faster than individual puts
|
|
81
|
+
await db.put_many([("users/alice/name", "Alice"), ("users/bob/name", "Bob")])
|
|
82
|
+
results = await db.get_many(["users/alice/name", "users/bob/name"])
|
|
83
|
+
await db.delete_many(["users/alice/name"])
|
|
84
|
+
|
|
85
|
+
# Object operations (nested dict <-> flattened paths)
|
|
86
|
+
db.put_object_sync("users/alice", {"name": "Alice", "age": "30"})
|
|
87
|
+
user = db.get_object_sync("users/alice")
|
|
88
|
+
|
|
89
|
+
# Batch
|
|
90
|
+
db.batch_sync([
|
|
91
|
+
{"type": "put", "key": "counter/a", "value": "1"},
|
|
92
|
+
{"type": "del", "key": "old/key"},
|
|
93
|
+
])
|
|
94
|
+
|
|
95
|
+
# Streaming
|
|
96
|
+
for key, value in db.create_read_stream(start="users/", end="users/~"):
|
|
97
|
+
print(key, value)
|
|
98
|
+
|
|
99
|
+
# Subtree
|
|
100
|
+
with db.open_subtree("users") as st:
|
|
101
|
+
st.put_sync("alice/name", "Alice")
|
|
102
|
+
|
|
103
|
+
db.close()
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Configuration
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from wavedb import WaveDB, WaveDBConfig
|
|
110
|
+
|
|
111
|
+
db = WaveDB(
|
|
112
|
+
"/path/to/db",
|
|
113
|
+
config=WaveDBConfig(
|
|
114
|
+
lru_memory_mb=100,
|
|
115
|
+
lru_shards=0, # auto-scale
|
|
116
|
+
wal_sync_mode="debounced",
|
|
117
|
+
wal_debounce_ms=250,
|
|
118
|
+
),
|
|
119
|
+
)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
| Setting | Default | Description |
|
|
123
|
+
|---------|---------|-------------|
|
|
124
|
+
| `chunk_size` | `4` | HBTrie chunk size (immutable) |
|
|
125
|
+
| `btree_node_size` | `4096` | B+tree node size (immutable) |
|
|
126
|
+
| `enable_persist` | `True` | Persist to disk (immutable, page-file only) |
|
|
127
|
+
| `in_memory` | `False` | True ephemeral mode (no WAL, no page file) |
|
|
128
|
+
| `lru_memory_mb` | `50` | LRU cache size in MB |
|
|
129
|
+
| `lru_shards` | `0` | LRU shard count (0 = auto) |
|
|
130
|
+
| `wal_sync_mode` | `"debounced"` | `debounced` / `immediate` / `none` |
|
|
131
|
+
| `wal_debounce_ms` | `250` | WAL debounce interval |
|
|
132
|
+
| `worker_threads` | `4` | C work pool size |
|
|
133
|
+
| `sync_only` | `False` | Skip concurrency control |
|
|
134
|
+
|
|
135
|
+
## Encryption
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from wavedb import WaveDB, WaveDBEncryption
|
|
139
|
+
|
|
140
|
+
db = WaveDB(
|
|
141
|
+
"/path/to/db",
|
|
142
|
+
encryption=WaveDBEncryption(
|
|
143
|
+
type="aes-256-gcm",
|
|
144
|
+
symmetric_key=b"32-byte-key-here",
|
|
145
|
+
),
|
|
146
|
+
)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Graph and GraphQL
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from wavedb import WaveDB, GraphLayer
|
|
153
|
+
|
|
154
|
+
db = WaveDB("/path/to/db")
|
|
155
|
+
g = GraphLayer("graph", db)
|
|
156
|
+
g.insert_sync("alice", "knows", "bob")
|
|
157
|
+
result = g.query().vertex("alice").out("knows").execute_sync()
|
|
158
|
+
print(result.vertices) # ["bob"]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Async Model
|
|
162
|
+
|
|
163
|
+
Async methods (`put`, `get`, `delete`, `batch`, `put_object`, `get_object`) drive
|
|
164
|
+
the C work pool via `promise_t` and marshal results back to the calling asyncio
|
|
165
|
+
loop via `loop.call_soon_threadsafe`. Use them within an asyncio program:
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
async def main():
|
|
169
|
+
async with WaveDB("/path/to/db") as db:
|
|
170
|
+
await db.put("k", "v")
|
|
171
|
+
print(await db.get("k"))
|
|
172
|
+
|
|
173
|
+
asyncio.run(main())
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Batched Helpers
|
|
177
|
+
|
|
178
|
+
For throughput-sensitive workloads, use the batched helpers:
|
|
179
|
+
|
|
180
|
+
```python
|
|
181
|
+
async def main():
|
|
182
|
+
async with WaveDB("/path/to/db") as db:
|
|
183
|
+
# put_many / delete_many forward to a single C batch call — atomic,
|
|
184
|
+
# ~16x faster than individual await db.put() calls.
|
|
185
|
+
await db.put_many([("k1", "v1"), ("k2", "v2"), ("k3", "v3")])
|
|
186
|
+
await db.delete_many(["k1", "k2"])
|
|
187
|
+
|
|
188
|
+
# get_many fires N concurrent get() calls (there is no batched C
|
|
189
|
+
# get API). It's a concurrency helper, not an atomic batch — the
|
|
190
|
+
# speedup over sequential get is bounded by C work-pool parallelism
|
|
191
|
+
# and varies with cache state (typically 1-3x).
|
|
192
|
+
results = await db.get_many(["k1", "k2", "k3"])
|
|
193
|
+
|
|
194
|
+
asyncio.run(main())
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Performance
|
|
198
|
+
|
|
199
|
+
Benchmark results (in-memory, `in_memory=True`, BATCH_SIZE=1000):
|
|
200
|
+
|
|
201
|
+
| Operation | ops/sec | us/op |
|
|
202
|
+
|-----------|---------|-------|
|
|
203
|
+
| sync put | 195K | 5.1 |
|
|
204
|
+
| sync get | 576K | 1.7 |
|
|
205
|
+
| async put (sequential) | 19K | 52 |
|
|
206
|
+
| async get (sequential) | 14K | 74 |
|
|
207
|
+
| async put_many (1000/batch) | 231K | 4.3 |
|
|
208
|
+
| async get_many (concurrent) | 37K | 27 |
|
|
209
|
+
| async delete_many (1000/batch) | 419K | 2.4 |
|
|
210
|
+
| batch (1000/batch) | 417K | 2.4 |
|
|
211
|
+
| stream scan | 801K entries/sec | |
|
|
212
|
+
|
|
213
|
+
`put_many`/`delete_many` are ~12-30x faster than individual `put`/`del`
|
|
214
|
+
because they forward to a single atomic C batch call. `get_many` is
|
|
215
|
+
~2.6x faster than sequential `get` here — it has no batched C
|
|
216
|
+
equivalent, just `asyncio.gather` over individual `get()`s, so the
|
|
217
|
+
speedup is bounded by C work-pool parallelism and varies with cache
|
|
218
|
+
state (1-3x is typical). Numbers vary run-to-run by ~30% due to
|
|
219
|
+
tree-size and LRU-cache effects; reproduce with `python benchmark.py`.
|
|
220
|
+
|
|
221
|
+
Run `python benchmark.py` with `WAVEDB_LIB_PATH` set to reproduce.
|
|
222
|
+
|
|
223
|
+
## License
|
|
224
|
+
|
|
225
|
+
MIT. See [LICENSE](LICENSE).
|
wavedb-0.1.0/README.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# WaveDB Python Bindings
|
|
2
|
+
|
|
3
|
+
Python bindings for [WaveDB](../../README.md) — a hierarchical key-value
|
|
4
|
+
database with MVCC, WAL durability, and schema layer access.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pip install wavedb
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The install step builds `libwavedb.so` (Linux) / `libwavedb.dylib` (macOS) /
|
|
13
|
+
`wavedb.dll` (Windows) from source via CMake. Requirements:
|
|
14
|
+
|
|
15
|
+
- Python 3.10+
|
|
16
|
+
- CMake 3.14+
|
|
17
|
+
- A C compiler (gcc, clang, or MSVC)
|
|
18
|
+
|
|
19
|
+
To use a pre-built library instead, set `WAVEDB_LIB_PATH` before importing:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
export WAVEDB_LIB_PATH=/path/to/libwavedb.so
|
|
23
|
+
pip install wavedb --no-build-isolation
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Quick Start
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from wavedb import WaveDB
|
|
30
|
+
|
|
31
|
+
db = WaveDB("/path/to/db", delimiter="/")
|
|
32
|
+
|
|
33
|
+
# Sync (blocking)
|
|
34
|
+
db.put_sync("users/alice/name", "Alice")
|
|
35
|
+
name = db.get_sync("users/alice/name") # b"Alice"
|
|
36
|
+
|
|
37
|
+
# Async (non-blocking, uses C worker pool)
|
|
38
|
+
import asyncio
|
|
39
|
+
async def main():
|
|
40
|
+
await db.put("users/bob/name", "Bob")
|
|
41
|
+
name = await db.get("users/bob/name")
|
|
42
|
+
asyncio.run(main())
|
|
43
|
+
|
|
44
|
+
# Batched async — 8x faster than individual puts
|
|
45
|
+
await db.put_many([("users/alice/name", "Alice"), ("users/bob/name", "Bob")])
|
|
46
|
+
results = await db.get_many(["users/alice/name", "users/bob/name"])
|
|
47
|
+
await db.delete_many(["users/alice/name"])
|
|
48
|
+
|
|
49
|
+
# Object operations (nested dict <-> flattened paths)
|
|
50
|
+
db.put_object_sync("users/alice", {"name": "Alice", "age": "30"})
|
|
51
|
+
user = db.get_object_sync("users/alice")
|
|
52
|
+
|
|
53
|
+
# Batch
|
|
54
|
+
db.batch_sync([
|
|
55
|
+
{"type": "put", "key": "counter/a", "value": "1"},
|
|
56
|
+
{"type": "del", "key": "old/key"},
|
|
57
|
+
])
|
|
58
|
+
|
|
59
|
+
# Streaming
|
|
60
|
+
for key, value in db.create_read_stream(start="users/", end="users/~"):
|
|
61
|
+
print(key, value)
|
|
62
|
+
|
|
63
|
+
# Subtree
|
|
64
|
+
with db.open_subtree("users") as st:
|
|
65
|
+
st.put_sync("alice/name", "Alice")
|
|
66
|
+
|
|
67
|
+
db.close()
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Configuration
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
from wavedb import WaveDB, WaveDBConfig
|
|
74
|
+
|
|
75
|
+
db = WaveDB(
|
|
76
|
+
"/path/to/db",
|
|
77
|
+
config=WaveDBConfig(
|
|
78
|
+
lru_memory_mb=100,
|
|
79
|
+
lru_shards=0, # auto-scale
|
|
80
|
+
wal_sync_mode="debounced",
|
|
81
|
+
wal_debounce_ms=250,
|
|
82
|
+
),
|
|
83
|
+
)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
| Setting | Default | Description |
|
|
87
|
+
|---------|---------|-------------|
|
|
88
|
+
| `chunk_size` | `4` | HBTrie chunk size (immutable) |
|
|
89
|
+
| `btree_node_size` | `4096` | B+tree node size (immutable) |
|
|
90
|
+
| `enable_persist` | `True` | Persist to disk (immutable, page-file only) |
|
|
91
|
+
| `in_memory` | `False` | True ephemeral mode (no WAL, no page file) |
|
|
92
|
+
| `lru_memory_mb` | `50` | LRU cache size in MB |
|
|
93
|
+
| `lru_shards` | `0` | LRU shard count (0 = auto) |
|
|
94
|
+
| `wal_sync_mode` | `"debounced"` | `debounced` / `immediate` / `none` |
|
|
95
|
+
| `wal_debounce_ms` | `250` | WAL debounce interval |
|
|
96
|
+
| `worker_threads` | `4` | C work pool size |
|
|
97
|
+
| `sync_only` | `False` | Skip concurrency control |
|
|
98
|
+
|
|
99
|
+
## Encryption
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from wavedb import WaveDB, WaveDBEncryption
|
|
103
|
+
|
|
104
|
+
db = WaveDB(
|
|
105
|
+
"/path/to/db",
|
|
106
|
+
encryption=WaveDBEncryption(
|
|
107
|
+
type="aes-256-gcm",
|
|
108
|
+
symmetric_key=b"32-byte-key-here",
|
|
109
|
+
),
|
|
110
|
+
)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Graph and GraphQL
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from wavedb import WaveDB, GraphLayer
|
|
117
|
+
|
|
118
|
+
db = WaveDB("/path/to/db")
|
|
119
|
+
g = GraphLayer("graph", db)
|
|
120
|
+
g.insert_sync("alice", "knows", "bob")
|
|
121
|
+
result = g.query().vertex("alice").out("knows").execute_sync()
|
|
122
|
+
print(result.vertices) # ["bob"]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Async Model
|
|
126
|
+
|
|
127
|
+
Async methods (`put`, `get`, `delete`, `batch`, `put_object`, `get_object`) drive
|
|
128
|
+
the C work pool via `promise_t` and marshal results back to the calling asyncio
|
|
129
|
+
loop via `loop.call_soon_threadsafe`. Use them within an asyncio program:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
async def main():
|
|
133
|
+
async with WaveDB("/path/to/db") as db:
|
|
134
|
+
await db.put("k", "v")
|
|
135
|
+
print(await db.get("k"))
|
|
136
|
+
|
|
137
|
+
asyncio.run(main())
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Batched Helpers
|
|
141
|
+
|
|
142
|
+
For throughput-sensitive workloads, use the batched helpers:
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
async def main():
|
|
146
|
+
async with WaveDB("/path/to/db") as db:
|
|
147
|
+
# put_many / delete_many forward to a single C batch call — atomic,
|
|
148
|
+
# ~16x faster than individual await db.put() calls.
|
|
149
|
+
await db.put_many([("k1", "v1"), ("k2", "v2"), ("k3", "v3")])
|
|
150
|
+
await db.delete_many(["k1", "k2"])
|
|
151
|
+
|
|
152
|
+
# get_many fires N concurrent get() calls (there is no batched C
|
|
153
|
+
# get API). It's a concurrency helper, not an atomic batch — the
|
|
154
|
+
# speedup over sequential get is bounded by C work-pool parallelism
|
|
155
|
+
# and varies with cache state (typically 1-3x).
|
|
156
|
+
results = await db.get_many(["k1", "k2", "k3"])
|
|
157
|
+
|
|
158
|
+
asyncio.run(main())
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Performance
|
|
162
|
+
|
|
163
|
+
Benchmark results (in-memory, `in_memory=True`, BATCH_SIZE=1000):
|
|
164
|
+
|
|
165
|
+
| Operation | ops/sec | us/op |
|
|
166
|
+
|-----------|---------|-------|
|
|
167
|
+
| sync put | 195K | 5.1 |
|
|
168
|
+
| sync get | 576K | 1.7 |
|
|
169
|
+
| async put (sequential) | 19K | 52 |
|
|
170
|
+
| async get (sequential) | 14K | 74 |
|
|
171
|
+
| async put_many (1000/batch) | 231K | 4.3 |
|
|
172
|
+
| async get_many (concurrent) | 37K | 27 |
|
|
173
|
+
| async delete_many (1000/batch) | 419K | 2.4 |
|
|
174
|
+
| batch (1000/batch) | 417K | 2.4 |
|
|
175
|
+
| stream scan | 801K entries/sec | |
|
|
176
|
+
|
|
177
|
+
`put_many`/`delete_many` are ~12-30x faster than individual `put`/`del`
|
|
178
|
+
because they forward to a single atomic C batch call. `get_many` is
|
|
179
|
+
~2.6x faster than sequential `get` here — it has no batched C
|
|
180
|
+
equivalent, just `asyncio.gather` over individual `get()`s, so the
|
|
181
|
+
speedup is bounded by C work-pool parallelism and varies with cache
|
|
182
|
+
state (1-3x is typical). Numbers vary run-to-run by ~30% due to
|
|
183
|
+
tree-size and LRU-cache effects; reproduce with `python benchmark.py`.
|
|
184
|
+
|
|
185
|
+
Run `python benchmark.py` with `WAVEDB_LIB_PATH` set to reproduce.
|
|
186
|
+
|
|
187
|
+
## License
|
|
188
|
+
|
|
189
|
+
MIT. See [LICENSE](LICENSE).
|