lora-python 0.10.1__tar.gz → 0.11.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 (306) hide show
  1. {lora_python-0.10.1 → lora_python-0.11.0}/Cargo.lock +17 -17
  2. {lora_python-0.10.1 → lora_python-0.11.0}/Cargo.toml +11 -11
  3. {lora_python-0.10.1 → lora_python-0.11.0}/PKG-INFO +1 -1
  4. lora_python-0.11.0/crates/lora-database/tests/docs_examples.rs +65 -0
  5. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/lock.rs +85 -30
  6. {lora_python-0.10.1 → lora_python-0.11.0}/pyproject.toml +1 -1
  7. {lora_python-0.10.1 → lora_python-0.11.0}/LICENSE +0 -0
  8. {lora_python-0.10.1 → lora_python-0.11.0}/README.md +0 -0
  9. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/.gitignore +0 -0
  10. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  11. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/LICENSE +0 -0
  12. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/README.md +0 -0
  13. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/build.rs +0 -0
  14. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  15. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  16. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  17. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  18. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  19. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  20. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  21. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  22. {lora_python-0.10.1 → lora_python-0.11.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  23. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/Cargo.toml +0 -0
  24. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  25. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  26. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  27. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  28. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  29. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  30. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  31. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/errors.rs +0 -0
  32. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/lib.rs +0 -0
  33. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/resolved.rs +0 -0
  34. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/scope.rs +0 -0
  35. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/src/symbols.rs +0 -0
  36. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  37. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-ast/Cargo.toml +0 -0
  38. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-ast/src/ast.rs +0 -0
  39. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-ast/src/lib.rs +0 -0
  40. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/Cargo.toml +0 -0
  41. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/lib.rs +0 -0
  42. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/logical.rs +0 -0
  43. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/optimizer.rs +0 -0
  44. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/pattern.rs +0 -0
  45. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/physical.rs +0 -0
  46. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/plan_tree.rs +0 -0
  47. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-compiler/src/planner.rs +0 -0
  48. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/Cargo.toml +0 -0
  49. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/README.md +0 -0
  50. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/advanced.rs +0 -0
  51. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  52. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/concurrent.rs +0 -0
  53. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/engine.rs +0 -0
  54. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/fixtures.rs +0 -0
  55. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  56. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  57. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  58. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  59. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/realistic.rs +0 -0
  60. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/scale.rs +0 -0
  61. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  62. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/benches/wal.rs +0 -0
  63. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/builder.rs +0 -0
  64. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/compile.rs +0 -0
  65. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/execute.rs +0 -0
  66. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/explain.rs +0 -0
  67. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  68. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/mod.rs +0 -0
  69. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/occ.rs +0 -0
  70. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/procedures.rs +0 -0
  71. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/profile.rs +0 -0
  72. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/pull_mode.rs +0 -0
  73. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/replay.rs +0 -0
  74. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  75. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/schema.rs +0 -0
  76. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  77. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/stream.rs +0 -0
  78. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/database/write_guard.rs +0 -0
  79. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/durable_io.rs +0 -0
  80. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/error.rs +0 -0
  81. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/explain.rs +0 -0
  82. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/lib.rs +0 -0
  83. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/live_store.rs +0 -0
  84. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/named.rs +0 -0
  85. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/plan_cache.rs +0 -0
  86. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  87. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
  88. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/snapshot/store.rs +0 -0
  89. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/stream.rs +0 -0
  90. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/transaction.rs +0 -0
  91. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/admin.rs +0 -0
  92. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
  93. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  94. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  95. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  96. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  97. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/archive.rs +0 -0
  98. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/mod.rs +0 -0
  99. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
  100. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  101. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/aggregation.rs +0 -0
  102. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/backend_stub.rs +0 -0
  103. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/binary.rs +0 -0
  104. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  105. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/constraints.rs +0 -0
  106. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/create.rs +0 -0
  107. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/error_messages.rs +0 -0
  108. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/errors.rs +0 -0
  109. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  110. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/expressions.rs +0 -0
  111. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  112. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  113. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  114. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/invariants.rs +0 -0
  115. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  116. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/match.rs +0 -0
  117. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/merge.rs +0 -0
  118. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/ordering.rs +0 -0
  119. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/parameters.rs +0 -0
  120. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/parser.rs +0 -0
  121. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/paths.rs +0 -0
  122. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/projection.rs +0 -0
  123. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/scale.rs +0 -0
  124. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/schema.rs +0 -0
  125. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/seeds.rs +0 -0
  126. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/snapshot.rs +0 -0
  127. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/spatial.rs +0 -0
  128. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/temporal.rs +0 -0
  129. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  130. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/transactions.rs +0 -0
  131. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  132. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/union.rs +0 -0
  133. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/update.rs +0 -0
  134. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/vector_index.rs +0 -0
  135. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/vectors.rs +0 -0
  136. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/wal.rs +0 -0
  137. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/where_clause.rs +0 -0
  138. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-database/tests/with.rs +0 -0
  139. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/Cargo.toml +0 -0
  140. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/errors.rs +0 -0
  141. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/binops.rs +0 -0
  142. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  143. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  144. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  145. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  146. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  147. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  148. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  149. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  150. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  151. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  152. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  153. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  154. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  155. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  156. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  157. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  158. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  159. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  160. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  161. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  162. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  163. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  164. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/expr.rs +0 -0
  165. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  166. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/mod.rs +0 -0
  167. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/point.rs +0 -0
  168. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  169. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  170. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  171. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/helpers.rs +0 -0
  172. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/immutable.rs +0 -0
  173. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/mod.rs +0 -0
  174. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/mutable.rs +0 -0
  175. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/optional.rs +0 -0
  176. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  177. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/lib.rs +0 -0
  178. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/profile.rs +0 -0
  179. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  180. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  181. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/columns.rs +0 -0
  182. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/context.rs +0 -0
  183. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/expand.rs +0 -0
  184. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/filter.rs +0 -0
  185. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
  186. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/mod.rs +0 -0
  187. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
  188. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/optional.rs +0 -0
  189. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/path.rs +0 -0
  190. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/projection.rs +0 -0
  191. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/scan.rs +0 -0
  192. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  193. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  194. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/source.rs +0 -0
  195. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/tests.rs +0 -0
  196. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/traits.rs +0 -0
  197. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/pull/union.rs +0 -0
  198. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/src/value.rs +0 -0
  199. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  200. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/Cargo.toml +0 -0
  201. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/cypher.pest +0 -0
  202. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/errors.rs +0 -0
  203. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/lib.rs +0 -0
  204. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  205. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
  206. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/literals.rs +0 -0
  207. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  208. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  209. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/query.rs +0 -0
  210. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  211. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/tests.rs +0 -0
  212. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/src/parser/util.rs +0 -0
  213. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  214. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/Cargo.toml +0 -0
  215. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/body.rs +0 -0
  216. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/codec.rs +0 -0
  217. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/columnar.rs +0 -0
  218. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/envelope.rs +0 -0
  219. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/errors.rs +0 -0
  220. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/format.rs +0 -0
  221. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/lib.rs +0 -0
  222. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/options.rs +0 -0
  223. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/tests.rs +0 -0
  224. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/transform.rs +0 -0
  225. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/src/view.rs +0 -0
  226. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  227. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/Cargo.toml +0 -0
  228. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/codec.rs +0 -0
  229. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/lib.rs +0 -0
  230. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/lock_table.rs +0 -0
  231. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  232. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  233. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  234. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  235. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/graph.rs +0 -0
  236. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/impls.rs +0 -0
  237. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  238. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/mod.rs +0 -0
  239. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/point_index.rs +0 -0
  240. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/property_index.rs +0 -0
  241. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  242. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/snapshot.rs +0 -0
  243. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  244. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/stats.rs +0 -0
  245. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/tests.rs +0 -0
  246. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/memory/text_index.rs +0 -0
  247. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/mutation.rs +0 -0
  248. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/snapshot.rs +0 -0
  249. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/traits.rs +0 -0
  250. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  251. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  252. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  253. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  254. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/graph.rs +0 -0
  255. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/mod.rs +0 -0
  256. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/property_value.rs +0 -0
  257. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  258. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  259. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
  260. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  261. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  262. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  263. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
  264. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  265. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  266. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  267. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  268. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  269. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
  270. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  271. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  272. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  273. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  274. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  275. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-store/tests/error_messages.rs +0 -0
  276. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/Cargo.toml +0 -0
  277. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/codec/decode.rs +0 -0
  278. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  279. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/codec/format.rs +0 -0
  280. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  281. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  282. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/config.rs +0 -0
  283. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/dir.rs +0 -0
  284. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/errors.rs +0 -0
  285. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/io.rs +0 -0
  286. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/lib.rs +0 -0
  287. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/lsn.rs +0 -0
  288. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/record.rs +0 -0
  289. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  290. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  291. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  292. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  293. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  294. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/replay.rs +0 -0
  295. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/segment.rs +0 -0
  296. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/testing.rs +0 -0
  297. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  298. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  299. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  300. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/src/wal/wal.rs +0 -0
  301. {lora_python-0.10.1 → lora_python-0.11.0}/crates/lora-wal/tests/error_messages.rs +0 -0
  302. {lora_python-0.10.1 → lora_python-0.11.0}/python/lora_python/__init__.py +0 -0
  303. {lora_python-0.10.1 → lora_python-0.11.0}/python/lora_python/_async.py +0 -0
  304. {lora_python-0.10.1 → lora_python-0.11.0}/python/lora_python/_native.pyi +0 -0
  305. {lora_python-0.10.1 → lora_python-0.11.0}/python/lora_python/py.typed +0 -0
  306. {lora_python-0.10.1 → lora_python-0.11.0}/python/lora_python/types.py +0 -0
@@ -773,7 +773,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
773
773
 
774
774
  [[package]]
775
775
  name = "lora-analyzer"
776
- version = "0.10.1"
776
+ version = "0.11.0"
777
777
  dependencies = [
778
778
  "lora-ast",
779
779
  "lora-parser",
@@ -783,14 +783,14 @@ dependencies = [
783
783
 
784
784
  [[package]]
785
785
  name = "lora-ast"
786
- version = "0.10.1"
786
+ version = "0.11.0"
787
787
  dependencies = [
788
788
  "smallvec 2.0.0-alpha.12",
789
789
  ]
790
790
 
791
791
  [[package]]
792
792
  name = "lora-binding-buffer"
793
- version = "0.10.1"
793
+ version = "0.11.0"
794
794
  dependencies = [
795
795
  "lora-database",
796
796
  "lora-store",
@@ -798,7 +798,7 @@ dependencies = [
798
798
 
799
799
  [[package]]
800
800
  name = "lora-compiler"
801
- version = "0.10.1"
801
+ version = "0.11.0"
802
802
  dependencies = [
803
803
  "lora-analyzer",
804
804
  "lora-ast",
@@ -807,7 +807,7 @@ dependencies = [
807
807
 
808
808
  [[package]]
809
809
  name = "lora-database"
810
- version = "0.10.1"
810
+ version = "0.11.0"
811
811
  dependencies = [
812
812
  "anyhow",
813
813
  "chacha20poly1305",
@@ -830,7 +830,7 @@ dependencies = [
830
830
 
831
831
  [[package]]
832
832
  name = "lora-executor"
833
- version = "0.10.1"
833
+ version = "0.11.0"
834
834
  dependencies = [
835
835
  "blake3",
836
836
  "crc32fast",
@@ -852,7 +852,7 @@ dependencies = [
852
852
 
853
853
  [[package]]
854
854
  name = "lora-ffi"
855
- version = "0.10.1"
855
+ version = "0.11.0"
856
856
  dependencies = [
857
857
  "anyhow",
858
858
  "lora-binding-buffer",
@@ -864,7 +864,7 @@ dependencies = [
864
864
 
865
865
  [[package]]
866
866
  name = "lora-node"
867
- version = "0.10.1"
867
+ version = "0.11.0"
868
868
  dependencies = [
869
869
  "anyhow",
870
870
  "lora-binding-buffer",
@@ -879,7 +879,7 @@ dependencies = [
879
879
 
880
880
  [[package]]
881
881
  name = "lora-parser"
882
- version = "0.10.1"
882
+ version = "0.11.0"
883
883
  dependencies = [
884
884
  "lora-ast",
885
885
  "pest",
@@ -890,7 +890,7 @@ dependencies = [
890
890
 
891
891
  [[package]]
892
892
  name = "lora-python"
893
- version = "0.10.1"
893
+ version = "0.11.0"
894
894
  dependencies = [
895
895
  "anyhow",
896
896
  "lora-database",
@@ -902,7 +902,7 @@ dependencies = [
902
902
 
903
903
  [[package]]
904
904
  name = "lora-query-wasm"
905
- version = "0.10.1"
905
+ version = "0.11.0"
906
906
  dependencies = [
907
907
  "console_error_panic_hook",
908
908
  "js-sys",
@@ -915,7 +915,7 @@ dependencies = [
915
915
 
916
916
  [[package]]
917
917
  name = "lora-server"
918
- version = "0.10.1"
918
+ version = "0.11.0"
919
919
  dependencies = [
920
920
  "anyhow",
921
921
  "axum",
@@ -929,7 +929,7 @@ dependencies = [
929
929
 
930
930
  [[package]]
931
931
  name = "lora-snapshot"
932
- version = "0.10.1"
932
+ version = "0.11.0"
933
933
  dependencies = [
934
934
  "argon2",
935
935
  "blake3",
@@ -943,7 +943,7 @@ dependencies = [
943
943
 
944
944
  [[package]]
945
945
  name = "lora-store"
946
- version = "0.10.1"
946
+ version = "0.11.0"
947
947
  dependencies = [
948
948
  "crc32fast",
949
949
  "js-sys",
@@ -954,7 +954,7 @@ dependencies = [
954
954
 
955
955
  [[package]]
956
956
  name = "lora-wal"
957
- version = "0.10.1"
957
+ version = "0.11.0"
958
958
  dependencies = [
959
959
  "crc32fast",
960
960
  "lora-store",
@@ -964,7 +964,7 @@ dependencies = [
964
964
 
965
965
  [[package]]
966
966
  name = "lora-wasm"
967
- version = "0.10.1"
967
+ version = "0.11.0"
968
968
  dependencies = [
969
969
  "anyhow",
970
970
  "console_error_panic_hook",
@@ -980,7 +980,7 @@ dependencies = [
980
980
 
981
981
  [[package]]
982
982
  name = "lora_ruby"
983
- version = "0.10.1"
983
+ version = "0.11.0"
984
984
  dependencies = [
985
985
  "anyhow",
986
986
  "lora-database",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.10.1"
7
+ version = "0.11.0"
8
8
  license = "BUSL-1.1"
9
9
  authors = ["LoraDB, Inc."]
10
10
  repository = "https://github.com/lora-db/lora"
@@ -15,16 +15,16 @@ rust-version = "1.87"
15
15
  # Internal crates — versions are kept in lockstep with [workspace.package].version
16
16
  # by `scripts/sync-versions.mjs`. Both `path` and `version` are set so that
17
17
  # `cargo publish` works (crates.io cannot resolve path-only deps).
18
- lora-ast = { path = "crates/lora-ast", version = "=0.10.1" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.10.1" }
20
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.10.1" }
21
- lora-compiler = { path = "crates/lora-compiler", version = "=0.10.1" }
22
- lora-store = { path = "crates/lora-store", version = "=0.10.1" }
23
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.10.1", default-features = false }
24
- lora-wal = { path = "crates/lora-wal", version = "=0.10.1" }
25
- lora-executor = { path = "crates/lora-executor", version = "=0.10.1", default-features = false }
26
- lora-database = { path = "crates/lora-database", version = "=0.10.1" }
27
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.10.1" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.11.0" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.11.0" }
20
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.11.0" }
21
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.11.0" }
22
+ lora-store = { path = "crates/lora-store", version = "=0.11.0" }
23
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.11.0", default-features = false }
24
+ lora-wal = { path = "crates/lora-wal", version = "=0.11.0" }
25
+ lora-executor = { path = "crates/lora-executor", version = "=0.11.0", default-features = false }
26
+ lora-database = { path = "crates/lora-database", version = "=0.11.0" }
27
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.11.0" }
28
28
 
29
29
  # External crates.
30
30
  anyhow = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.10.1
3
+ Version: 0.11.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -0,0 +1,65 @@
1
+ use std::path::Path;
2
+
3
+ use lora_database::{Database, ExecuteOptions, InMemoryGraph, ResultFormat};
4
+
5
+ fn extract_query_examples(markdown: &str) -> Vec<String> {
6
+ let mut examples = Vec::new();
7
+ let mut rest = markdown;
8
+ let marker = "<QueryCodeBlock code={String.raw`";
9
+
10
+ while let Some(start) = rest.find(marker) {
11
+ let body_start = start + marker.len();
12
+ let body = &rest[body_start..];
13
+ let Some(end) = body.find("`} />") else {
14
+ panic!("unterminated QueryCodeBlock in examples documentation");
15
+ };
16
+ examples.push(body[..end].to_string());
17
+ rest = &body[end + "`} />".len()..];
18
+ }
19
+
20
+ examples
21
+ }
22
+
23
+ fn execute(db: &Database<InMemoryGraph>, query: &str) {
24
+ db.execute(
25
+ query,
26
+ Some(ExecuteOptions {
27
+ format: ResultFormat::Rows,
28
+ }),
29
+ )
30
+ .unwrap_or_else(|err| panic!("documentation query failed:\n{query}\n\nerror: {err}"));
31
+ }
32
+
33
+ #[test]
34
+ fn query_examples_run_against_documented_seed_graph() {
35
+ let docs_path = Path::new(env!("CARGO_MANIFEST_DIR"))
36
+ .join("../../apps/loradb.com/docs/queries/examples.md");
37
+ let markdown = std::fs::read_to_string(&docs_path).unwrap_or_else(|err| {
38
+ panic!("failed to read {}: {err}", docs_path.display());
39
+ });
40
+ let examples = extract_query_examples(&markdown);
41
+
42
+ assert!(
43
+ examples.len() > 20,
44
+ "expected the examples page to contain runnable QueryCodeBlock snippets"
45
+ );
46
+
47
+ let seed = &examples[0];
48
+ execute(&Database::in_memory(), seed);
49
+
50
+ for (index, query) in examples.iter().enumerate().skip(1) {
51
+ let db = Database::in_memory();
52
+ execute(&db, seed);
53
+ db.execute(
54
+ query,
55
+ Some(ExecuteOptions {
56
+ format: ResultFormat::Rows,
57
+ }),
58
+ )
59
+ .unwrap_or_else(|err| {
60
+ panic!(
61
+ "documentation query #{index} failed against the seed graph:\n{query}\n\nerror: {err}"
62
+ )
63
+ });
64
+ }
65
+ }
@@ -7,11 +7,21 @@
7
7
  use std::fs::{File, OpenOptions};
8
8
  use std::io;
9
9
  use std::path::Path;
10
+ use std::time::{Duration, Instant};
10
11
 
11
12
  use crate::errors::WalError;
12
13
 
13
14
  const LOCK_FILE_NAME: &str = ".lora-wal.lock";
14
15
 
16
+ /// Brief window for swallowing transient `EWOULDBLOCK` between a clean
17
+ /// drop and a subsequent re-open of the same directory. Under load on
18
+ /// Linux we have observed the close+flock-release of the previous
19
+ /// owner racing with a new `flock()` attempt; a few short retries
20
+ /// absorb that without weakening the invariant — a real concurrent
21
+ /// owner still surfaces as `AlreadyOpen` after the window elapses.
22
+ const ACQUIRE_RETRY_BUDGET: Duration = Duration::from_millis(100);
23
+ const ACQUIRE_RETRY_INITIAL_BACKOFF: Duration = Duration::from_micros(100);
24
+
15
25
  /// RAII guard for a WAL directory lock.
16
26
  pub(crate) struct DirLock {
17
27
  _file: File,
@@ -31,14 +41,8 @@ impl DirLock {
31
41
  .create(true)
32
42
  .truncate(false)
33
43
  .open(&lock_path)?;
34
- lock_exclusive_nonblocking(&file).map_err(|err| {
35
- if err.kind() == io::ErrorKind::WouldBlock {
36
- WalError::AlreadyOpen {
37
- dir: dir.to_path_buf(),
38
- }
39
- } else {
40
- WalError::Io(err)
41
- }
44
+ retry_on_contention(dir, || {
45
+ lock_exclusive_nonblocking(&file).map_err(classify_unix_lock_err)
42
46
  })?;
43
47
  Ok(Self { _file: file })
44
48
  }
@@ -51,14 +55,8 @@ impl DirLock {
51
55
  .create(true)
52
56
  .truncate(false)
53
57
  .open(&lock_path)?;
54
- lock_exclusive_nonblocking(&file).map_err(|err| {
55
- if is_windows_lock_conflict(&err) {
56
- WalError::AlreadyOpen {
57
- dir: dir.to_path_buf(),
58
- }
59
- } else {
60
- WalError::Io(err)
61
- }
58
+ retry_on_contention(dir, || {
59
+ lock_exclusive_nonblocking(&file).map_err(classify_windows_lock_err)
62
60
  })?;
63
61
  Ok(Self { _file: file })
64
62
  }
@@ -70,22 +68,79 @@ impl DirLock {
70
68
  // LoraDB handles from opening the same WAL concurrently, although
71
69
  // a process crash can leave a stale lock file that operators must
72
70
  // remove manually.
73
- match OpenOptions::new()
74
- .read(true)
75
- .write(true)
76
- .create_new(true)
77
- .open(&lock_path)
78
- {
79
- Ok(file) => Ok(Self {
80
- _file: file,
81
- path: lock_path,
82
- }),
83
- Err(err) if err.kind() == io::ErrorKind::AlreadyExists => {
84
- Err(WalError::AlreadyOpen {
85
- dir: dir.to_path_buf(),
71
+ let file = retry_on_contention(dir, || {
72
+ OpenOptions::new()
73
+ .read(true)
74
+ .write(true)
75
+ .create_new(true)
76
+ .open(&lock_path)
77
+ .map_err(|err| {
78
+ if err.kind() == io::ErrorKind::AlreadyExists {
79
+ LockAttemptError::Contended
80
+ } else {
81
+ LockAttemptError::Io(err)
82
+ }
86
83
  })
84
+ })?;
85
+ Ok(Self {
86
+ _file: file,
87
+ path: lock_path,
88
+ })
89
+ }
90
+ }
91
+ }
92
+
93
+ /// Result of a single platform-specific lock attempt, classified so the
94
+ /// retry helper can distinguish "another live owner" (try again, briefly)
95
+ /// from real I/O errors (fail immediately).
96
+ enum LockAttemptError {
97
+ Contended,
98
+ Io(io::Error),
99
+ }
100
+
101
+ #[cfg(unix)]
102
+ fn classify_unix_lock_err(err: io::Error) -> LockAttemptError {
103
+ if err.kind() == io::ErrorKind::WouldBlock {
104
+ LockAttemptError::Contended
105
+ } else {
106
+ LockAttemptError::Io(err)
107
+ }
108
+ }
109
+
110
+ #[cfg(windows)]
111
+ fn classify_windows_lock_err(err: io::Error) -> LockAttemptError {
112
+ if is_windows_lock_conflict(&err) {
113
+ LockAttemptError::Contended
114
+ } else {
115
+ LockAttemptError::Io(err)
116
+ }
117
+ }
118
+
119
+ /// Run `attempt` repeatedly until it succeeds, returns a non-contention
120
+ /// I/O error, or the retry budget is exhausted. Contention is the
121
+ /// expected signal "another live owner" — under load on Linux we have
122
+ /// observed the close+flock-release of a previous owner racing with a
123
+ /// new `flock()` attempt; a short retry window absorbs that without
124
+ /// weakening the invariant. A real concurrent owner persists past the
125
+ /// window and surfaces as `AlreadyOpen` to the caller.
126
+ fn retry_on_contention<T, F>(dir: &Path, mut attempt: F) -> Result<T, WalError>
127
+ where
128
+ F: FnMut() -> Result<T, LockAttemptError>,
129
+ {
130
+ let start = Instant::now();
131
+ let mut backoff = ACQUIRE_RETRY_INITIAL_BACKOFF;
132
+ loop {
133
+ match attempt() {
134
+ Ok(value) => return Ok(value),
135
+ Err(LockAttemptError::Io(err)) => return Err(WalError::Io(err)),
136
+ Err(LockAttemptError::Contended) => {
137
+ if start.elapsed() >= ACQUIRE_RETRY_BUDGET {
138
+ return Err(WalError::AlreadyOpen {
139
+ dir: dir.to_path_buf(),
140
+ });
87
141
  }
88
- Err(err) => Err(WalError::Io(err)),
142
+ std::thread::sleep(backoff);
143
+ backoff = (backoff * 2).min(Duration::from_millis(5));
89
144
  }
90
145
  }
91
146
  }
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "lora-python"
7
- version = "0.10.1"
7
+ version = "0.11.0"
8
8
  description = "Python bindings for the Lora in-memory graph database"
9
9
  readme = "README.md"
10
10
  license = { text = "BUSL-1.1" }
File without changes
File without changes