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.
Files changed (322) hide show
  1. wavedb-0.1.0/LICENSE +21 -0
  2. wavedb-0.1.0/MANIFEST.in +12 -0
  3. wavedb-0.1.0/PKG-INFO +225 -0
  4. wavedb-0.1.0/README.md +189 -0
  5. wavedb-0.1.0/c_src/CMakeLists.txt +644 -0
  6. wavedb-0.1.0/c_src/cmake/WaveDBConfig.cmake.in +16 -0
  7. wavedb-0.1.0/c_src/deps/hashmap/include/hashmap.h +491 -0
  8. wavedb-0.1.0/c_src/deps/hashmap/include/hashmap_base.h +59 -0
  9. wavedb-0.1.0/c_src/deps/hashmap/src/hashmap.c +729 -0
  10. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  11. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Continuous.dir/DependInfo.cmake +18 -0
  12. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Continuous.dir/cmake_clean.cmake +8 -0
  13. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake +18 -0
  14. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake +8 -0
  15. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake +18 -0
  16. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake +8 -0
  17. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake +18 -0
  18. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake +8 -0
  19. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake +18 -0
  20. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake +8 -0
  21. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousStart.dir/DependInfo.cmake +18 -0
  22. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake +8 -0
  23. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake +18 -0
  24. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake +8 -0
  25. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousTest.dir/DependInfo.cmake +18 -0
  26. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake +8 -0
  27. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake +18 -0
  28. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake +8 -0
  29. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Experimental.dir/DependInfo.cmake +18 -0
  30. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Experimental.dir/cmake_clean.cmake +8 -0
  31. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake +18 -0
  32. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake +8 -0
  33. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake +18 -0
  34. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake +8 -0
  35. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake +18 -0
  36. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake +8 -0
  37. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake +18 -0
  38. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake +8 -0
  39. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake +18 -0
  40. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake +8 -0
  41. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake +18 -0
  42. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake +8 -0
  43. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake +18 -0
  44. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake +8 -0
  45. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake +18 -0
  46. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake +8 -0
  47. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Nightly.dir/DependInfo.cmake +18 -0
  48. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/Nightly.dir/cmake_clean.cmake +8 -0
  49. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyBuild.dir/DependInfo.cmake +18 -0
  50. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake +8 -0
  51. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake +18 -0
  52. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake +8 -0
  53. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake +18 -0
  54. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake +8 -0
  55. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake +18 -0
  56. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake +8 -0
  57. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake +18 -0
  58. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake +8 -0
  59. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyStart.dir/DependInfo.cmake +18 -0
  60. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyStart.dir/cmake_clean.cmake +8 -0
  61. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlySubmit.dir/DependInfo.cmake +18 -0
  62. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake +8 -0
  63. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyTest.dir/DependInfo.cmake +18 -0
  64. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyTest.dir/cmake_clean.cmake +8 -0
  65. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake +18 -0
  66. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake +8 -0
  67. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  68. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/Makefile.cmake +46 -0
  69. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/boo.dir/DependInfo.cmake +20 -0
  70. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/boo.dir/cmake_clean.cmake +11 -0
  71. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/foo.dir/DependInfo.cmake +19 -0
  72. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/foo.dir/cmake_clean.cmake +11 -0
  73. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/CMakeFiles/foo.dir/cmake_clean_target.cmake +3 -0
  74. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/bin/cmake_install.cmake +49 -0
  75. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/src/CMakeLists.txt +8 -0
  76. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/src/foo.c +4 -0
  77. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-C/src/main.c +6 -0
  78. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  79. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/Makefile.cmake +46 -0
  80. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/boo.dir/DependInfo.cmake +20 -0
  81. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/boo.dir/cmake_clean.cmake +11 -0
  82. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/foo.dir/DependInfo.cmake +19 -0
  83. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/foo.dir/cmake_clean.cmake +11 -0
  84. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/CMakeFiles/foo.dir/cmake_clean_target.cmake +3 -0
  85. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/bin/cmake_install.cmake +49 -0
  86. wavedb-0.1.0/c_src/deps/libcbor/CMakeFiles/_CMakeLTOTest-CXX/src/CMakeLists.txt +8 -0
  87. wavedb-0.1.0/c_src/deps/libcbor/CMakeLists.txt +268 -0
  88. wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/FindCJSON.cmake +9 -0
  89. wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/FindCMocka.cmake +57 -0
  90. wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/JoinPaths.cmake +23 -0
  91. wavedb-0.1.0/c_src/deps/libcbor/CMakeModules/LibFindMacros.cmake +120 -0
  92. wavedb-0.1.0/c_src/deps/libcbor/CTestTestfile.cmake +7 -0
  93. wavedb-0.1.0/c_src/deps/libcbor/cbor/configuration.h +14 -0
  94. wavedb-0.1.0/c_src/deps/libcbor/cmake_install.cmake +54 -0
  95. wavedb-0.1.0/c_src/deps/libcbor/doc/source/requirements.in +5 -0
  96. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  97. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/Export/lib/cmake/libcbor/libcborTargets-release.cmake +19 -0
  98. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/Export/lib/cmake/libcbor/libcborTargets.cmake +95 -0
  99. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/cbor.dir/DependInfo.cmake +38 -0
  100. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/cbor.dir/cmake_clean.cmake +49 -0
  101. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeFiles/cbor.dir/cmake_clean_target.cmake +3 -0
  102. wavedb-0.1.0/c_src/deps/libcbor/src/CMakeLists.txt +130 -0
  103. wavedb-0.1.0/c_src/deps/libcbor/src/CTestTestfile.cmake +6 -0
  104. wavedb-0.1.0/c_src/deps/libcbor/src/allocators.c +19 -0
  105. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/arrays.c +136 -0
  106. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/arrays.h +138 -0
  107. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/bytestrings.c +119 -0
  108. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/bytestrings.h +150 -0
  109. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/callbacks.c +121 -0
  110. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/callbacks.h +189 -0
  111. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/cbor_export.h +42 -0
  112. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/common.c +167 -0
  113. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/common.h +367 -0
  114. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/configuration.h.in +14 -0
  115. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/data.h +264 -0
  116. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/encoding.c +215 -0
  117. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/encoding.h +145 -0
  118. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/floats_ctrls.c +193 -0
  119. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/floats_ctrls.h +241 -0
  120. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/builder_callbacks.c +422 -0
  121. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/builder_callbacks.h +85 -0
  122. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/encoders.c +99 -0
  123. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/encoders.h +41 -0
  124. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/loaders.c +86 -0
  125. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/loaders.h +43 -0
  126. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/memory_utils.c +57 -0
  127. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/memory_utils.h +50 -0
  128. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/stack.c +33 -0
  129. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/stack.h +53 -0
  130. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/unicode.c +95 -0
  131. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/internal/unicode.h +33 -0
  132. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/ints.c +194 -0
  133. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/ints.h +211 -0
  134. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/maps.c +125 -0
  135. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/maps.h +121 -0
  136. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/serialization.c +399 -0
  137. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/serialization.h +169 -0
  138. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/streaming.c +607 -0
  139. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/streaming.h +37 -0
  140. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/strings.c +144 -0
  141. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/strings.h +184 -0
  142. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/tags.c +52 -0
  143. wavedb-0.1.0/c_src/deps/libcbor/src/cbor/tags.h +78 -0
  144. wavedb-0.1.0/c_src/deps/libcbor/src/cbor.c +578 -0
  145. wavedb-0.1.0/c_src/deps/libcbor/src/cbor.h +85 -0
  146. wavedb-0.1.0/c_src/deps/libcbor/src/cmake_install.cmake +90 -0
  147. wavedb-0.1.0/c_src/deps/libcbor/src/libcbor.pc.in +11 -0
  148. wavedb-0.1.0/c_src/deps/libcbor/src/libcborConfig.cmake +35 -0
  149. wavedb-0.1.0/c_src/deps/libcbor/src/libcborConfig.cmake.in +11 -0
  150. wavedb-0.1.0/c_src/deps/libcbor/src/libcborConfigVersion.cmake +70 -0
  151. wavedb-0.1.0/c_src/deps/xxhash/xxh3.h +55 -0
  152. wavedb-0.1.0/c_src/deps/xxhash/xxh_x86dispatch.c +821 -0
  153. wavedb-0.1.0/c_src/deps/xxhash/xxh_x86dispatch.h +93 -0
  154. wavedb-0.1.0/c_src/deps/xxhash/xxhash.c +42 -0
  155. wavedb-0.1.0/c_src/deps/xxhash/xxhash.h +7490 -0
  156. wavedb-0.1.0/c_src/src/Buffer/buffer.c +205 -0
  157. wavedb-0.1.0/c_src/src/Buffer/buffer.h +43 -0
  158. wavedb-0.1.0/c_src/src/Database/batch.c +261 -0
  159. wavedb-0.1.0/c_src/src/Database/batch.h +136 -0
  160. wavedb-0.1.0/c_src/src/Database/crc32.h +63 -0
  161. wavedb-0.1.0/c_src/src/Database/database.c +3113 -0
  162. wavedb-0.1.0/c_src/src/Database/database.h +389 -0
  163. wavedb-0.1.0/c_src/src/Database/database_config.c +749 -0
  164. wavedb-0.1.0/c_src/src/Database/database_config.h +223 -0
  165. wavedb-0.1.0/c_src/src/Database/database_iterator.c +514 -0
  166. wavedb-0.1.0/c_src/src/Database/database_iterator.h +97 -0
  167. wavedb-0.1.0/c_src/src/Database/database_lru.c +635 -0
  168. wavedb-0.1.0/c_src/src/Database/database_lru.h +166 -0
  169. wavedb-0.1.0/c_src/src/Database/database_subtree.c +1296 -0
  170. wavedb-0.1.0/c_src/src/Database/database_subtree.h +504 -0
  171. wavedb-0.1.0/c_src/src/Database/eviction_queue.c +35 -0
  172. wavedb-0.1.0/c_src/src/Database/eviction_queue.h +28 -0
  173. wavedb-0.1.0/c_src/src/Database/wal.c +515 -0
  174. wavedb-0.1.0/c_src/src/Database/wal.h +212 -0
  175. wavedb-0.1.0/c_src/src/Database/wal_compactor.c +125 -0
  176. wavedb-0.1.0/c_src/src/Database/wal_compactor.h +56 -0
  177. wavedb-0.1.0/c_src/src/Database/wal_manager.c +2106 -0
  178. wavedb-0.1.0/c_src/src/Database/wal_manager.h +235 -0
  179. wavedb-0.1.0/c_src/src/HBTrie/bnode.c +774 -0
  180. wavedb-0.1.0/c_src/src/HBTrie/bnode.h +504 -0
  181. wavedb-0.1.0/c_src/src/HBTrie/bs_array.c +181 -0
  182. wavedb-0.1.0/c_src/src/HBTrie/bs_array.h +129 -0
  183. wavedb-0.1.0/c_src/src/HBTrie/chunk.c +128 -0
  184. wavedb-0.1.0/c_src/src/HBTrie/chunk.h +141 -0
  185. wavedb-0.1.0/c_src/src/HBTrie/hbtrie.c +3767 -0
  186. wavedb-0.1.0/c_src/src/HBTrie/hbtrie.h +439 -0
  187. wavedb-0.1.0/c_src/src/HBTrie/hbtrie_viz.c +592 -0
  188. wavedb-0.1.0/c_src/src/HBTrie/hbtrie_viz.h +30 -0
  189. wavedb-0.1.0/c_src/src/HBTrie/identifier.c +352 -0
  190. wavedb-0.1.0/c_src/src/HBTrie/identifier.h +183 -0
  191. wavedb-0.1.0/c_src/src/HBTrie/mvcc.c +362 -0
  192. wavedb-0.1.0/c_src/src/HBTrie/mvcc.h +175 -0
  193. wavedb-0.1.0/c_src/src/HBTrie/path.c +261 -0
  194. wavedb-0.1.0/c_src/src/HBTrie/path.h +177 -0
  195. wavedb-0.1.0/c_src/src/Layers/graph/graph.c +808 -0
  196. wavedb-0.1.0/c_src/src/Layers/graph/graph.h +144 -0
  197. wavedb-0.1.0/c_src/src/Layers/graph/graph_internal.h +175 -0
  198. wavedb-0.1.0/c_src/src/Layers/graph/graph_ops.c +746 -0
  199. wavedb-0.1.0/c_src/src/Layers/graph/graph_optimizer.c +280 -0
  200. wavedb-0.1.0/c_src/src/Layers/graph/graph_parser.c +527 -0
  201. wavedb-0.1.0/c_src/src/Layers/graph/graph_schema_parser.c +735 -0
  202. wavedb-0.1.0/c_src/src/Layers/graph/graph_set.c +187 -0
  203. wavedb-0.1.0/c_src/src/Layers/graph/graph_stats.c +230 -0
  204. wavedb-0.1.0/c_src/src/Layers/graphql/graphql.h +166 -0
  205. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_lexer.c +291 -0
  206. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_lexer.h +147 -0
  207. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_parser.c +1351 -0
  208. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_parser.h +98 -0
  209. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_plan.c +729 -0
  210. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_plan.h +86 -0
  211. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_resolve.c +1860 -0
  212. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_resolve.h +77 -0
  213. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_result.c +211 -0
  214. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_result.h +64 -0
  215. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_schema.c +1416 -0
  216. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_schema.h +78 -0
  217. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_types.c +520 -0
  218. wavedb-0.1.0/c_src/src/Layers/graphql/graphql_types.h +470 -0
  219. wavedb-0.1.0/c_src/src/RefCounter/refcounter.c +62 -0
  220. wavedb-0.1.0/c_src/src/RefCounter/refcounter.h +36 -0
  221. wavedb-0.1.0/c_src/src/Storage/bnode_cache.c +694 -0
  222. wavedb-0.1.0/c_src/src/Storage/bnode_cache.h +89 -0
  223. wavedb-0.1.0/c_src/src/Storage/encryption.c +538 -0
  224. wavedb-0.1.0/c_src/src/Storage/encryption.h +116 -0
  225. wavedb-0.1.0/c_src/src/Storage/node_serializer.c +995 -0
  226. wavedb-0.1.0/c_src/src/Storage/node_serializer.h +183 -0
  227. wavedb-0.1.0/c_src/src/Storage/page_file.c +782 -0
  228. wavedb-0.1.0/c_src/src/Storage/page_file.h +109 -0
  229. wavedb-0.1.0/c_src/src/Storage/stale_region.c +213 -0
  230. wavedb-0.1.0/c_src/src/Storage/stale_region.h +54 -0
  231. wavedb-0.1.0/c_src/src/Time/debouncer.c +120 -0
  232. wavedb-0.1.0/c_src/src/Time/debouncer.h +66 -0
  233. wavedb-0.1.0/c_src/src/Time/ticker.c +17 -0
  234. wavedb-0.1.0/c_src/src/Time/ticker.h +13 -0
  235. wavedb-0.1.0/c_src/src/Time/wheel.c +546 -0
  236. wavedb-0.1.0/c_src/src/Time/wheel.h +131 -0
  237. wavedb-0.1.0/c_src/src/Util/allocator.c +24 -0
  238. wavedb-0.1.0/c_src/src/Util/allocator.h +11 -0
  239. wavedb-0.1.0/c_src/src/Util/atomic_compat.h +260 -0
  240. wavedb-0.1.0/c_src/src/Util/dirent_compat.h +122 -0
  241. wavedb-0.1.0/c_src/src/Util/endian.h +60 -0
  242. wavedb-0.1.0/c_src/src/Util/fs_block_size.c +52 -0
  243. wavedb-0.1.0/c_src/src/Util/fs_block_size.h +28 -0
  244. wavedb-0.1.0/c_src/src/Util/get_dir.c +61 -0
  245. wavedb-0.1.0/c_src/src/Util/get_dir.h +12 -0
  246. wavedb-0.1.0/c_src/src/Util/hash.c +109 -0
  247. wavedb-0.1.0/c_src/src/Util/hash.h +24 -0
  248. wavedb-0.1.0/c_src/src/Util/log.c +168 -0
  249. wavedb-0.1.0/c_src/src/Util/log.h +82 -0
  250. wavedb-0.1.0/c_src/src/Util/memory_pool.c +449 -0
  251. wavedb-0.1.0/c_src/src/Util/memory_pool.h +127 -0
  252. wavedb-0.1.0/c_src/src/Util/mkdir_p.c +59 -0
  253. wavedb-0.1.0/c_src/src/Util/mkdir_p.h +8 -0
  254. wavedb-0.1.0/c_src/src/Util/path_join.c +77 -0
  255. wavedb-0.1.0/c_src/src/Util/path_join.h +18 -0
  256. wavedb-0.1.0/c_src/src/Util/perf_counters.c +357 -0
  257. wavedb-0.1.0/c_src/src/Util/perf_counters.h +147 -0
  258. wavedb-0.1.0/c_src/src/Util/portable_endian.h +197 -0
  259. wavedb-0.1.0/c_src/src/Util/rm_rf.c +86 -0
  260. wavedb-0.1.0/c_src/src/Util/rm_rf.h +8 -0
  261. wavedb-0.1.0/c_src/src/Util/threadding.c +244 -0
  262. wavedb-0.1.0/c_src/src/Util/threadding.h +172 -0
  263. wavedb-0.1.0/c_src/src/Util/unistd_compat.h +121 -0
  264. wavedb-0.1.0/c_src/src/Util/vec.c +113 -0
  265. wavedb-0.1.0/c_src/src/Util/vec.h +181 -0
  266. wavedb-0.1.0/c_src/src/Util/windows_compat.h +21 -0
  267. wavedb-0.1.0/c_src/src/Workers/error.c +51 -0
  268. wavedb-0.1.0/c_src/src/Workers/error.h +43 -0
  269. wavedb-0.1.0/c_src/src/Workers/join.c +62 -0
  270. wavedb-0.1.0/c_src/src/Workers/join.h +64 -0
  271. wavedb-0.1.0/c_src/src/Workers/pool.c +157 -0
  272. wavedb-0.1.0/c_src/src/Workers/pool.h +45 -0
  273. wavedb-0.1.0/c_src/src/Workers/promise.c +48 -0
  274. wavedb-0.1.0/c_src/src/Workers/promise.h +32 -0
  275. wavedb-0.1.0/c_src/src/Workers/queue.c +96 -0
  276. wavedb-0.1.0/c_src/src/Workers/queue.h +42 -0
  277. wavedb-0.1.0/c_src/src/Workers/transaction_id.c +161 -0
  278. wavedb-0.1.0/c_src/src/Workers/transaction_id.h +62 -0
  279. wavedb-0.1.0/c_src/src/Workers/work.c +26 -0
  280. wavedb-0.1.0/c_src/src/Workers/work.h +19 -0
  281. wavedb-0.1.0/pyproject.toml +26 -0
  282. wavedb-0.1.0/scripts/copy_sources.py +99 -0
  283. wavedb-0.1.0/setup.cfg +4 -0
  284. wavedb-0.1.0/setup.py +101 -0
  285. wavedb-0.1.0/src/wavedb/__init__.py +36 -0
  286. wavedb-0.1.0/src/wavedb/_async.py +314 -0
  287. wavedb-0.1.0/src/wavedb/_cffi_build.py +266 -0
  288. wavedb-0.1.0/src/wavedb/_errors.py +49 -0
  289. wavedb-0.1.0/src/wavedb/_lib/__init__.py +1 -0
  290. wavedb-0.1.0/src/wavedb/_lib/libwavedb.so +0 -0
  291. wavedb-0.1.0/src/wavedb/_native.py +16 -0
  292. wavedb-0.1.0/src/wavedb/_native_abi.py +280 -0
  293. wavedb-0.1.0/src/wavedb/config.py +49 -0
  294. wavedb-0.1.0/src/wavedb/database.py +603 -0
  295. wavedb-0.1.0/src/wavedb/exceptions.py +25 -0
  296. wavedb-0.1.0/src/wavedb/graph_layer.py +230 -0
  297. wavedb-0.1.0/src/wavedb/graphql_layer.py +276 -0
  298. wavedb-0.1.0/src/wavedb/iterator.py +117 -0
  299. wavedb-0.1.0/src/wavedb/object_ops.py +93 -0
  300. wavedb-0.1.0/src/wavedb/subtree.py +230 -0
  301. wavedb-0.1.0/src/wavedb.egg-info/PKG-INFO +225 -0
  302. wavedb-0.1.0/src/wavedb.egg-info/SOURCES.txt +320 -0
  303. wavedb-0.1.0/src/wavedb.egg-info/dependency_links.txt +1 -0
  304. wavedb-0.1.0/src/wavedb.egg-info/requires.txt +5 -0
  305. wavedb-0.1.0/src/wavedb.egg-info/top_level.txt +1 -0
  306. wavedb-0.1.0/tests/test_async_bridge.py +42 -0
  307. wavedb-0.1.0/tests/test_async_core.py +39 -0
  308. wavedb-0.1.0/tests/test_batch.py +67 -0
  309. wavedb-0.1.0/tests/test_batched_helpers.py +127 -0
  310. wavedb-0.1.0/tests/test_config.py +83 -0
  311. wavedb-0.1.0/tests/test_encryption.py +49 -0
  312. wavedb-0.1.0/tests/test_errors.py +75 -0
  313. wavedb-0.1.0/tests/test_graph.py +51 -0
  314. wavedb-0.1.0/tests/test_graphql.py +153 -0
  315. wavedb-0.1.0/tests/test_iterator.py +33 -0
  316. wavedb-0.1.0/tests/test_mvcc.py +38 -0
  317. wavedb-0.1.0/tests/test_native.py +25 -0
  318. wavedb-0.1.0/tests/test_object_ops.py +41 -0
  319. wavedb-0.1.0/tests/test_persistence.py +54 -0
  320. wavedb-0.1.0/tests/test_stress_async.py +159 -0
  321. wavedb-0.1.0/tests/test_subtree.py +43 -0
  322. 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.
@@ -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).