tigerbeetle 0.0.40 → 0.17.9

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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -25
  3. data/README.md +672 -80
  4. data/docs/migration.md +201 -0
  5. data/sig/tigerbeetle.rbs +372 -0
  6. data/src/ext/tigerbeetle/extconf.rb +47 -0
  7. data/src/ext/tigerbeetle/lib/aarch64-linux-gnu.2.27/libtb_client.so +0 -0
  8. data/src/ext/tigerbeetle/lib/aarch64-linux-musl/libtb_client.so +0 -0
  9. data/src/ext/tigerbeetle/lib/aarch64-macos/libtb_client.dylib +0 -0
  10. data/src/ext/tigerbeetle/lib/x86_64-linux-gnu.2.27/libtb_client.so +0 -0
  11. data/src/ext/tigerbeetle/lib/x86_64-linux-musl/libtb_client.so +0 -0
  12. data/src/ext/tigerbeetle/lib/x86_64-macos/libtb_client.dylib +0 -0
  13. data/src/ext/tigerbeetle/lib/x86_64-windows/tb_client.dll +0 -0
  14. data/src/ext/tigerbeetle/rb_tb_gen.h +677 -0
  15. data/{ext/tb_client/tigerbeetle/src/clients/rust/assets → src/ext/tigerbeetle}/tb_client.h +18 -16
  16. data/src/ext/tigerbeetle/tigerbeetle.c +310 -0
  17. data/src/tigerbeetle/bindings.rb +355 -0
  18. data/src/tigerbeetle/client.rb +129 -0
  19. data/src/tigerbeetle/completion_dispatcher.rb +108 -0
  20. data/src/tigerbeetle/id.rb +40 -0
  21. data/src/tigerbeetle/tb.rb +3 -0
  22. data/src/tigerbeetle/version.rb +3 -0
  23. data/src/tigerbeetle.rb +39 -0
  24. metadata +33 -350
  25. data/CHANGELOG.md +0 -162
  26. data/ext/tb_client/extconf.rb +0 -41
  27. data/ext/tb_client/tigerbeetle/LICENSE +0 -177
  28. data/ext/tb_client/tigerbeetle/build.zig +0 -2296
  29. data/ext/tb_client/tigerbeetle/src/aof.zig +0 -1000
  30. data/ext/tb_client/tigerbeetle/src/build/fetch.zig +0 -112
  31. data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +0 -808
  32. data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +0 -1283
  33. data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +0 -1704
  34. data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +0 -341
  35. data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +0 -1450
  36. data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +0 -1659
  37. data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +0 -406
  38. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +0 -1092
  39. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +0 -286
  40. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +0 -158
  41. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +0 -229
  42. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +0 -110
  43. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +0 -386
  44. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +0 -34
  45. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +0 -281
  46. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +0 -312
  47. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +0 -138
  48. data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +0 -466
  49. data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +0 -157
  50. data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +0 -90
  51. data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +0 -203
  52. data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +0 -79
  53. data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +0 -542
  54. data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +0 -109
  55. data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +0 -86
  56. data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +0 -370
  57. data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +0 -386
  58. data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +0 -167
  59. data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +0 -126
  60. data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +0 -996
  61. data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +0 -748
  62. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +0 -3238
  63. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +0 -1718
  64. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +0 -190
  65. data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +0 -104
  66. data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +0 -75
  67. data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +0 -522
  68. data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +0 -267
  69. data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +0 -3
  70. data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +0 -379
  71. data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +0 -131
  72. data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +0 -63
  73. data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +0 -588
  74. data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +0 -73
  75. data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +0 -106
  76. data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +0 -305
  77. data/ext/tb_client/tigerbeetle/src/config.zig +0 -296
  78. data/ext/tb_client/tigerbeetle/src/constants.zig +0 -790
  79. data/ext/tb_client/tigerbeetle/src/copyhound.zig +0 -202
  80. data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +0 -72
  81. data/ext/tb_client/tigerbeetle/src/direction.zig +0 -120
  82. data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +0 -158
  83. data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +0 -156
  84. data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +0 -252
  85. data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +0 -313
  86. data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +0 -87
  87. data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +0 -63
  88. data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +0 -47
  89. data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +0 -28
  90. data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +0 -61
  91. data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +0 -169
  92. data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +0 -46
  93. data/ext/tb_client/tigerbeetle/src/ewah.zig +0 -445
  94. data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +0 -128
  95. data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +0 -171
  96. data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +0 -179
  97. data/ext/tb_client/tigerbeetle/src/integration_tests.zig +0 -662
  98. data/ext/tb_client/tigerbeetle/src/io/common.zig +0 -155
  99. data/ext/tb_client/tigerbeetle/src/io/darwin.zig +0 -1093
  100. data/ext/tb_client/tigerbeetle/src/io/linux.zig +0 -1880
  101. data/ext/tb_client/tigerbeetle/src/io/test.zig +0 -1005
  102. data/ext/tb_client/tigerbeetle/src/io/windows.zig +0 -1598
  103. data/ext/tb_client/tigerbeetle/src/io.zig +0 -34
  104. data/ext/tb_client/tigerbeetle/src/iops.zig +0 -134
  105. data/ext/tb_client/tigerbeetle/src/list.zig +0 -236
  106. data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +0 -848
  107. data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +0 -179
  108. data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +0 -424
  109. data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +0 -420
  110. data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +0 -2114
  111. data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +0 -185
  112. data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +0 -1146
  113. data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +0 -1102
  114. data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +0 -200
  115. data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +0 -1495
  116. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +0 -739
  117. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +0 -166
  118. data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +0 -754
  119. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +0 -1294
  120. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +0 -510
  121. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +0 -1241
  122. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -628
  123. data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +0 -247
  124. data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +0 -116
  125. data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +0 -543
  126. data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +0 -938
  127. data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +0 -293
  128. data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +0 -359
  129. data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +0 -99
  130. data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +0 -17
  131. data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +0 -962
  132. data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +0 -617
  133. data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +0 -84
  134. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +0 -1500
  135. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -149
  136. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -7
  137. data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +0 -865
  138. data/ext/tb_client/tigerbeetle/src/lsm/table.zig +0 -607
  139. data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +0 -843
  140. data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +0 -90
  141. data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +0 -40
  142. data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +0 -629
  143. data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +0 -933
  144. data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +0 -534
  145. data/ext/tb_client/tigerbeetle/src/message_buffer.zig +0 -469
  146. data/ext/tb_client/tigerbeetle/src/message_bus.zig +0 -1219
  147. data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +0 -936
  148. data/ext/tb_client/tigerbeetle/src/message_pool.zig +0 -343
  149. data/ext/tb_client/tigerbeetle/src/multiversion.zig +0 -2195
  150. data/ext/tb_client/tigerbeetle/src/queue.zig +0 -390
  151. data/ext/tb_client/tigerbeetle/src/repl/completion.zig +0 -201
  152. data/ext/tb_client/tigerbeetle/src/repl/parser.zig +0 -1356
  153. data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +0 -496
  154. data/ext/tb_client/tigerbeetle/src/repl.zig +0 -1034
  155. data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +0 -973
  156. data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +0 -1866
  157. data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +0 -304
  158. data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +0 -227
  159. data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +0 -658
  160. data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +0 -466
  161. data/ext/tb_client/tigerbeetle/src/scripts/release.zig +0 -1058
  162. data/ext/tb_client/tigerbeetle/src/scripts.zig +0 -105
  163. data/ext/tb_client/tigerbeetle/src/shell.zig +0 -1195
  164. data/ext/tb_client/tigerbeetle/src/stack.zig +0 -260
  165. data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +0 -911
  166. data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +0 -2079
  167. data/ext/tb_client/tigerbeetle/src/state_machine.zig +0 -4872
  168. data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +0 -288
  169. data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +0 -3128
  170. data/ext/tb_client/tigerbeetle/src/static_allocator.zig +0 -82
  171. data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +0 -157
  172. data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +0 -292
  173. data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +0 -65
  174. data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +0 -1414
  175. data/ext/tb_client/tigerbeetle/src/stdx/huge_page_allocator.zig +0 -115
  176. data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +0 -92
  177. data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +0 -677
  178. data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +0 -336
  179. data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +0 -511
  180. data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +0 -112
  181. data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +0 -1163
  182. data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +0 -142
  183. data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +0 -361
  184. data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +0 -275
  185. data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +0 -295
  186. data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +0 -436
  187. data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +0 -48
  188. data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +0 -402
  189. data/ext/tb_client/tigerbeetle/src/storage.zig +0 -489
  190. data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +0 -180
  191. data/ext/tb_client/tigerbeetle/src/testing/bench.zig +0 -146
  192. data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +0 -53
  193. data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +0 -61
  194. data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +0 -76
  195. data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +0 -110
  196. data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +0 -412
  197. data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +0 -331
  198. data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -458
  199. data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +0 -1198
  200. data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +0 -128
  201. data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +0 -181
  202. data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +0 -144
  203. data/ext/tb_client/tigerbeetle/src/testing/id.zig +0 -97
  204. data/ext/tb_client/tigerbeetle/src/testing/io.zig +0 -317
  205. data/ext/tb_client/tigerbeetle/src/testing/marks.zig +0 -126
  206. data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +0 -533
  207. data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +0 -154
  208. data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +0 -389
  209. data/ext/tb_client/tigerbeetle/src/testing/storage.zig +0 -1247
  210. data/ext/tb_client/tigerbeetle/src/testing/table.zig +0 -249
  211. data/ext/tb_client/tigerbeetle/src/testing/time.zig +0 -98
  212. data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +0 -212
  213. data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +0 -26
  214. data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +0 -579
  215. data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +0 -39
  216. data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +0 -214
  217. data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +0 -34
  218. data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +0 -785
  219. data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +0 -543
  220. data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +0 -181
  221. data/ext/tb_client/tigerbeetle/src/tidy.zig +0 -1449
  222. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +0 -227
  223. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +0 -1069
  224. data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +0 -1422
  225. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +0 -1658
  226. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +0 -518
  227. data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +0 -36
  228. data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +0 -646
  229. data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +0 -958
  230. data/ext/tb_client/tigerbeetle/src/time.zig +0 -236
  231. data/ext/tb_client/tigerbeetle/src/trace/event.zig +0 -745
  232. data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +0 -462
  233. data/ext/tb_client/tigerbeetle/src/trace.zig +0 -556
  234. data/ext/tb_client/tigerbeetle/src/unit_tests.zig +0 -321
  235. data/ext/tb_client/tigerbeetle/src/vopr.zig +0 -1785
  236. data/ext/tb_client/tigerbeetle/src/vortex.zig +0 -101
  237. data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +0 -473
  238. data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +0 -208
  239. data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +0 -43
  240. data/ext/tb_client/tigerbeetle/src/vsr/client.zig +0 -768
  241. data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +0 -532
  242. data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +0 -338
  243. data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +0 -1019
  244. data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +0 -279
  245. data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +0 -1381
  246. data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +0 -315
  247. data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +0 -1460
  248. data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +0 -757
  249. data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +0 -797
  250. data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +0 -2586
  251. data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +0 -308
  252. data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +0 -1777
  253. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +0 -715
  254. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +0 -185
  255. data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +0 -333
  256. data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +0 -12356
  257. data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +0 -416
  258. data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +0 -165
  259. data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +0 -2928
  260. data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +0 -1075
  261. data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +0 -1603
  262. data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -484
  263. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +0 -405
  264. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -355
  265. data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +0 -29
  266. data/ext/tb_client/tigerbeetle/src/vsr.zig +0 -1727
  267. data/lib/tb_client/shared_lib.rb +0 -66
  268. data/lib/tb_client.rb +0 -282
  269. data/lib/tigerbeetle/account.rb +0 -38
  270. data/lib/tigerbeetle/account_balance.rb +0 -23
  271. data/lib/tigerbeetle/account_filter.rb +0 -31
  272. data/lib/tigerbeetle/atomic_counter.rb +0 -14
  273. data/lib/tigerbeetle/client.rb +0 -214
  274. data/lib/tigerbeetle/converters/account.rb +0 -63
  275. data/lib/tigerbeetle/converters/account_balance.rb +0 -31
  276. data/lib/tigerbeetle/converters/account_filter.rb +0 -32
  277. data/lib/tigerbeetle/converters/base.rb +0 -35
  278. data/lib/tigerbeetle/converters/create_accounts_result.rb +0 -21
  279. data/lib/tigerbeetle/converters/create_transfers_result.rb +0 -21
  280. data/lib/tigerbeetle/converters/query_filter.rb +0 -33
  281. data/lib/tigerbeetle/converters/time.rb +0 -23
  282. data/lib/tigerbeetle/converters/transfer.rb +0 -64
  283. data/lib/tigerbeetle/converters/uint_128.rb +0 -24
  284. data/lib/tigerbeetle/converters.rb +0 -12
  285. data/lib/tigerbeetle/error.rb +0 -4
  286. data/lib/tigerbeetle/id.rb +0 -30
  287. data/lib/tigerbeetle/platforms.rb +0 -9
  288. data/lib/tigerbeetle/query_filter.rb +0 -31
  289. data/lib/tigerbeetle/request.rb +0 -7
  290. data/lib/tigerbeetle/transfer.rb +0 -40
  291. data/lib/tigerbeetle/version.rb +0 -4
  292. data/lib/tigerbeetle.rb +0 -13
  293. data/tigerbeetle.gemspec +0 -60
data/README.md CHANGED
@@ -1,130 +1,722 @@
1
- # Ruby Client for TigerBeetle
1
+ <!-- This file is generated by [/src/scripts/client_readmes.zig](/src/scripts/client_readmes.zig). -->
2
+ # tigerbeetle
2
3
 
3
- [![Gem](https://badge.fury.io/rb/tigerbeetle.svg)](https://rubygems.org/gems/tigerbeetle)
4
- [![CI](https://github.com/antstorm/tigerbeetle-ruby/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/antstorm/tigerbeetle-ruby/actions/workflows/ci.yml)
5
- [![License](https://img.shields.io/github/license/antstorm/tigerbeetle-ruby.svg)](https://opensource.org/licenses/apache-2-0)
4
+ The TigerBeetle client for Ruby.
6
5
 
7
- Are you looking to integrate [Tigebeetle](https://tigerbeetle.com/) into your Ruby (or Rails) stack?
8
- You've come to the right place!
6
+ >[!IMPORTANT]
7
+ >This gem changed ownership from [Anthony D](https://github.com/antstorm)
8
+ to TigerBeetle. If you're upgrading from a 0.0.x version, please consult
9
+ the [migration guide](
10
+ https://github.com/tigerbeetle/tigerbeetle/blob/main/src/clients/ruby/docs/migration.md
11
+ ) for the necessary code changes.
9
12
 
10
- TigerBeetle is a high performance financial transaction database (i.e. Ledger) designed to power
11
- the next 30 years of Online Transaction Processing. And this is a feature complete Ruby client for
12
- it that leverages [the native Zig client](https://tigerbeetle.com/blog/2023-02-21-writing-high-performance-clients-for-tigerbeetle/).
13
+ ## Prerequisites
13
14
 
15
+ Linux >= 5.6 is the only production environment we
16
+ support. But for ease of development we also support macOS and Windows.
17
+ * Ruby >= `3.3`
14
18
 
15
- ## Usage
19
+ ## Setup
16
20
 
17
- Start by adding the TigerBeetle gem to your Gemfile:
21
+ First, create a directory for your project and `cd` into the directory.
22
+
23
+ Then, install the TigerBeetle client:
24
+
25
+ ```console
26
+ gem install tigerbeetle
27
+ ```
28
+
29
+ Now, create `main.rb` and copy this into it:
18
30
 
19
31
  ```ruby
20
- gem 'tigerbeetle'
32
+ require "tigerbeetle"
33
+
34
+ puts("Import OK!")
21
35
  ```
22
36
 
23
- Ensure TigerBeetle is running ([more on this](https://docs.tigerbeetle.com/start/)):
37
+ Finally, build and run:
38
+
39
+ ```console
40
+ ruby main.rb
41
+ ```
42
+
43
+ Now that all prerequisites and dependencies are correctly set
44
+ up, let's dig into using TigerBeetle.
45
+
46
+ ## Sample projects
47
+
48
+ This document is primarily a reference guide to
49
+ the client. Below are various sample projects demonstrating
50
+ features of TigerBeetle.
51
+
52
+ * [Basic](/src/clients/ruby/samples/basic/): Create two accounts and transfer an amount between them.
53
+ * [Two-Phase Transfer](/src/clients/ruby/samples/two-phase/): Create two accounts and start a pending transfer between
54
+ them, then post the transfer.
55
+ * [Many Two-Phase Transfers](/src/clients/ruby/samples/two-phase-many/): Create two accounts and start a number of pending transfers
56
+ between them, posting and voiding alternating transfers.
24
57
 
25
- ```bash
26
- $ curl -Lo tigerbeetle.zip https://linux.tigerbeetle.com && unzip tigerbeetle.zip && ./tigerbeetle version
27
- $ ./tigerbeetle format --cluster=0 --replica=0 --replica-count=1 --development 0_0.tigerbeetle
28
- $ ./tigerbeetle start --addresses=3000 --development 0_0.tigerbeetle
58
+ ## Creating a Client
59
+
60
+ A client is created with a cluster ID and replica
61
+ addresses for all replicas in the cluster. The cluster
62
+ ID and replica addresses are both chosen by the system that
63
+ starts the TigerBeetle cluster.
64
+
65
+ Clients are thread-safe and a single instance should be shared
66
+ between multiple concurrent tasks. This allows events to be
67
+ [automatically batched](https://docs.tigerbeetle.com/coding/requests/#batching-events).
68
+
69
+ Multiple clients are useful when connecting to more than
70
+ one TigerBeetle cluster.
71
+
72
+ In this example the cluster ID is `0` and there is one
73
+ replica. The address is read from the `TB_ADDRESS`
74
+ environment variable and defaults to port `3000`.
75
+
76
+ ```ruby
77
+ replica_addresses = ENV.fetch("TB_ADDRESS", "3000")
78
+
79
+ TigerBeetle::Client.open(cluster_id: 0, replica_addresses:) do |client|
80
+ # Use the client.
81
+ end
29
82
  ```
30
83
 
31
- Connect your Ruby client and start using it:
84
+ The gem also provides an optional top-level alias.
85
+ Require `tigerbeetle/tb` to use `TB` as a shorthand for `TigerBeetle`:
32
86
 
33
87
  ```ruby
34
- client = TigerBeetle.connect # using default cluster_id (0) and address (127.0.0.1:3000)
88
+ require "tigerbeetle/tb"
89
+
90
+ account = TB::Account.new(id: TB.id, ledger: 1, code: 1)
91
+ ```
92
+
93
+ The alias is opt-in and is not defined by `require "tigerbeetle"`.
94
+
95
+ The `TigerBeetle::Client` is fiber-scheduler aware, so it works with e.g.
96
+ the `async` gem without requiring code changes.
97
+
98
+ ```ruby
99
+ require "async"
100
+ require "async/semaphore"
101
+ require "tigerbeetle"
102
+
103
+ semaphore = Async::Semaphore.new(16)
104
+
105
+ account_batches = Array.new(16) do
106
+ Array.new(1_000) do
107
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1)
108
+ end
109
+ end
110
+
111
+ TigerBeetle::Client.open(cluster_id: 0, replica_addresses: "3000") do |client|
112
+ Async do
113
+ account_batches
114
+ .map { |batch| semaphore.async { client.create_accounts(batch) } }
115
+ .each(&:wait)
116
+ end
117
+ end
118
+ ```
119
+
120
+ The following are valid addresses:
121
+ * `3000` (interpreted as `127.0.0.1:3000`)
122
+ * `127.0.0.1:3000` (interpreted as `127.0.0.1:3000`)
123
+ * `127.0.0.1` (interpreted as `127.0.0.1:3001`, `3001` is the default port)
124
+
125
+ ## Creating Accounts
126
+
127
+ See details for account fields in the [Accounts
128
+ reference](https://docs.tigerbeetle.com/reference/account).
129
+
130
+ ```ruby
131
+ account = TigerBeetle::Account.new(
132
+ id: TigerBeetle.id,
133
+ debits_pending: 0,
134
+ debits_posted: 0,
135
+ credits_pending: 0,
136
+ credits_posted: 0,
137
+ user_data_128: 0,
138
+ user_data_64: 0,
139
+ user_data_32: 0,
140
+ ledger: 1,
141
+ code: 718,
142
+ flags: TigerBeetle::AccountFlags::NONE,
143
+ timestamp: 0
144
+ )
145
+
146
+ account_results = client.create_accounts([account])
147
+ # Results handling omitted.
148
+ ```
149
+
150
+ See details for the recommended ID scheme in
151
+ [time-based identifiers](https://docs.tigerbeetle.com/coding/data-modeling#tigerbeetle-time-based-identifiers-recommended).
152
+
153
+ ### Account Flags
154
+
155
+ The account flags value is a bitfield. See details for
156
+ these flags in the [Accounts
157
+ reference](https://docs.tigerbeetle.com/reference/account#flags).
158
+
159
+ To toggle behavior for an account, combine constants from the
160
+ `TigerBeetle::AccountFlags` module with bitwise-or:
35
161
 
36
- # create accounts
37
- client.create_accounts(
38
- TigerBeetle::Account.new(id: 100, ledger: 1, code: 1),
39
- TigerBeetle::Account.new(id: 101, ledger: 1, code: 1)
162
+ * `AccountFlags::LINKED`
163
+ * `AccountFlags::DEBITS_MUST_NOT_EXCEED_CREDITS`
164
+ * `AccountFlags::CREDITS_MUST_NOT_EXCEED_DEBITS`
165
+ * `AccountFlags::HISTORY`
166
+
167
+
168
+ For example, to link two accounts where the first account
169
+ additionally has the `debits_must_not_exceed_credits` constraint:
170
+
171
+ ```ruby
172
+ account0 = TigerBeetle::Account.new(
173
+ id: TigerBeetle.id,
174
+ ledger: 1,
175
+ code: 1,
176
+ flags: TigerBeetle::AccountFlags::LINKED |
177
+ TigerBeetle::AccountFlags::DEBITS_MUST_NOT_EXCEED_CREDITS
178
+ )
179
+ account1 = TigerBeetle::Account.new(
180
+ id: TigerBeetle.id,
181
+ ledger: 1,
182
+ code: 1,
183
+ flags: TigerBeetle::AccountFlags::HISTORY
40
184
  )
41
185
 
42
- # move funds between accounts
43
- client.create_transfers(
186
+ account_results = client.create_accounts([account0, account1])
187
+ # Results handling omitted.
188
+ ```
189
+
190
+ ### Response and Errors
191
+
192
+ The response is an array containing the _status code_ and the _timestamp_ of
193
+ each account in the request batch:
194
+ - Successfully created accounts with the status
195
+ [`created`](https://docs.tigerbeetle.com/reference/requests/create_accounts#created)
196
+ return the timestamp assigned to the `Account` object.
197
+ - Already existing accounts with the result
198
+ [`exists`](https://docs.tigerbeetle.com/reference/requests/create_accounts#exists)
199
+ return the timestamp of the original existing object.
200
+ - Failed accounts return the status code along with the timestamp when the validation
201
+ occurred. See all error conditions in the
202
+ [create_accounts reference](https://docs.tigerbeetle.com/reference/requests/create_accounts#status).
203
+
204
+ ```ruby
205
+ accounts = [
206
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1),
207
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1),
208
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1)
209
+ ]
210
+
211
+ account_results = client.create_accounts(accounts)
212
+ account_results.each_with_index do |result, index|
213
+ case result.status
214
+ when TigerBeetle::CreateAccountStatus::CREATED
215
+ puts("Batch account at #{index} successfully created with timestamp #{result.timestamp}.")
216
+ when TigerBeetle::CreateAccountStatus::EXISTS
217
+ puts("Batch account at #{index} already exists with timestamp #{result.timestamp}.")
218
+ else
219
+ puts("Batch account at #{index} failed to create: #{result.status}.")
220
+ end
221
+ end
222
+ ```
223
+
224
+ To handle errors you can compare the result status returned
225
+ from `client.create_accounts` with constants in the
226
+ `TigerBeetle::CreateAccountStatus` module.
227
+
228
+ ## Account Lookup
229
+
230
+ Account lookup is batched, like account creation. Pass
231
+ in all IDs to fetch. The account for each matched ID is returned.
232
+
233
+ If no account matches an ID, no object is returned for
234
+ that account. So the order of accounts in the response is
235
+ not necessarily the same as the order of IDs in the
236
+ request. You can refer to the ID field in the response to
237
+ distinguish accounts.
238
+
239
+ ```ruby
240
+ accounts = client.lookup_accounts([account0.id, account1.id])
241
+ ```
242
+
243
+ ## Create Transfers
244
+
245
+ This creates a journal entry between two accounts.
246
+
247
+ See details for transfer fields in the [Transfers
248
+ reference](https://docs.tigerbeetle.com/reference/transfer).
249
+
250
+ ```ruby
251
+ transfers = [
44
252
  TigerBeetle::Transfer.new(
45
- id: 100,
46
- debit_account_id: 100,
47
- credit_account_id: 101,
48
- amount: 999,
253
+ id: TigerBeetle.id,
254
+ debit_account_id: transfer_debit_account_id,
255
+ credit_account_id: transfer_credit_account_id,
256
+ amount: 10,
257
+ pending_id: 0,
258
+ user_data_128: 0,
259
+ user_data_64: 0,
260
+ user_data_32: 0,
261
+ timeout: 0,
49
262
  ledger: 1,
50
- code: 10
263
+ code: 720,
264
+ flags: TigerBeetle::TransferFlags::NONE,
265
+ timestamp: 0
51
266
  )
267
+ ]
268
+
269
+ transfer_results = client.create_transfers(transfers)
270
+ # Results handling omitted.
271
+ ```
272
+
273
+ See details for the recommended ID scheme in
274
+ [time-based identifiers](https://docs.tigerbeetle.com/coding/data-modeling#tigerbeetle-time-based-identifiers-recommended).
275
+
276
+ ### Response and Errors
277
+
278
+ The response is an array containing the _status code_ and the _timestamp_ of
279
+ each transfer in the request batch:
280
+ - Successfully created transfers with the result
281
+ [`created`](https://docs.tigerbeetle.com/reference/requests/create_transfers#created)
282
+ return the timestamp assigned to the `Transfer` object.
283
+ - Already existing transfers with the result
284
+ [`exists`](https://docs.tigerbeetle.com/reference/requests/create_transfers#exists)
285
+ return the timestamp of the original existing object.
286
+ - Failed transfers return the status code along with the timestamp when the validation
287
+ occurred. See all error conditions in the
288
+ [create_transfers reference](https://docs.tigerbeetle.com/reference/requests/create_transfers#status).
289
+
290
+ ```ruby
291
+ batch = [
292
+ TigerBeetle::Transfer.new(
293
+ id: TigerBeetle.id,
294
+ debit_account_id: transfer_debit_account_id,
295
+ credit_account_id: transfer_credit_account_id,
296
+ amount: 10,
297
+ ledger: 1,
298
+ code: 720
299
+ ),
300
+ TigerBeetle::Transfer.new(
301
+ id: TigerBeetle.id,
302
+ debit_account_id: transfer_debit_account_id,
303
+ credit_account_id: transfer_credit_account_id,
304
+ amount: 10,
305
+ ledger: 1,
306
+ code: 720
307
+ ),
308
+ TigerBeetle::Transfer.new(
309
+ id: TigerBeetle.id,
310
+ debit_account_id: transfer_debit_account_id,
311
+ credit_account_id: transfer_credit_account_id,
312
+ amount: 10,
313
+ ledger: 1,
314
+ code: 720
315
+ )
316
+ ]
317
+
318
+ transfer_results = client.create_transfers(batch)
319
+ transfer_results.each_with_index do |result, index|
320
+ case result.status
321
+ when TigerBeetle::CreateTransferStatus::CREATED
322
+ puts("Batch transfer at #{index} successfully created with timestamp #{result.timestamp}.")
323
+ when TigerBeetle::CreateTransferStatus::EXISTS
324
+ puts("Batch transfer at #{index} already exists with timestamp #{result.timestamp}.")
325
+ else
326
+ puts("Batch transfer at #{index} failed to create: #{result.status}.")
327
+ end
328
+ end
329
+ ```
330
+
331
+ To handle errors you can compare the result status returned
332
+ from `client.create_transfers` with constants in the
333
+ `TigerBeetle::CreateTransferStatus` module.
334
+
335
+ ## Batching
336
+
337
+ TigerBeetle performance is maximized when you batch
338
+ API requests.
339
+
340
+ A client instance shared across multiple threads/tasks can automatically
341
+ batch concurrent requests, but the application must still send as many events
342
+ as possible in a single call.
343
+
344
+ For example, if you insert 1 million transfers sequentially, one at a time,
345
+ the insert rate will be a *fraction* of the potential, because the client will
346
+ wait for a reply between each one.
347
+ Instead, **always batch as much as you can**.
348
+
349
+ The maximum batch size is set in the TigerBeetle server. The default is 8189.
350
+
351
+ ```ruby
352
+ # Array of transfers to create.
353
+ batch = []
354
+ batch.each_slice(8189) do |slice|
355
+ transfer_results = client.create_transfers(slice)
356
+ # Results handling omitted.
357
+ end
358
+ ```
359
+
360
+ ### Queues and Workers
361
+
362
+ If you are making requests to TigerBeetle from workers
363
+ pulling jobs from a queue, you can batch requests to
364
+ TigerBeetle by having the worker act on multiple jobs from
365
+ the queue at once rather than one at a time. i.e. pulling
366
+ multiple jobs from the queue rather than just one.
367
+
368
+ ## Transfer Flags
369
+
370
+ The transfer `flags` value is a bitfield. See details for these flags in
371
+ the [Transfers
372
+ reference](https://docs.tigerbeetle.com/reference/transfer#flags).
373
+
374
+ To toggle behavior for a transfer, combine constants from the
375
+ `TigerBeetle::TransferFlags` module with bitwise-or:
376
+
377
+ * `TransferFlags::LINKED`
378
+ * `TransferFlags::PENDING`
379
+ * `TransferFlags::POST_PENDING_TRANSFER`
380
+ * `TransferFlags::VOID_PENDING_TRANSFER`
381
+
382
+ For example, to link `transfer0` and `transfer1`:
383
+
384
+ ```ruby
385
+ transfer0 = TigerBeetle::Transfer.new(
386
+ id: TigerBeetle.id,
387
+ debit_account_id: transfer_debit_account_id,
388
+ credit_account_id: transfer_credit_account_id,
389
+ amount: 10,
390
+ ledger: 1,
391
+ code: 720,
392
+ flags: TigerBeetle::TransferFlags::LINKED
393
+ )
394
+ transfer1 = TigerBeetle::Transfer.new(
395
+ id: TigerBeetle.id,
396
+ debit_account_id: transfer_debit_account_id,
397
+ credit_account_id: transfer_credit_account_id,
398
+ amount: 10,
399
+ ledger: 1,
400
+ code: 720
52
401
  )
53
402
 
54
- # check balances
55
- account_1, account_2 = client.lookup_accounts(100, 101)
56
- account_1.debits_posted # 999
57
- account_2.credits_posted # 999
403
+ transfer_results = client.create_transfers([transfer0, transfer1])
404
+ # Results handling omitted.
58
405
  ```
59
406
 
60
- *More information on the `ledger` and `code` attributes can be found
61
- [here](https://docs.tigerbeetle.com/coding/data-modeling/).*
407
+ ### Two-Phase Transfers
62
408
 
63
- ### Connecting to a cluster
409
+ Two-phase transfers are supported natively by toggling the appropriate
410
+ flag. TigerBeetle will then adjust the `credits_pending` and
411
+ `debits_pending` fields of the appropriate accounts. A corresponding
412
+ post pending transfer then needs to be sent to post or void the
413
+ transfer.
64
414
 
65
- When connecting to a TigerBeetle cluster (multiple replicas) you need to specify all the replica
66
- addresses ordered and separated by a comma, e.g. `127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002`.
415
+ #### Post a Pending Transfer
67
416
 
68
- *NOTE: Currently TigerBeetle does not support domain names, only IPv4 addresses.*
417
+ With `flags` set to `post_pending_transfer`,
418
+ TigerBeetle will post the transfer. TigerBeetle will atomically roll
419
+ back the changes to `debits_pending` and `credits_pending` of the
420
+ appropriate accounts and apply them to the `debits_posted` and
421
+ `credits_posted` balances.
69
422
 
70
- ## IDs
423
+ ```ruby
424
+ pending_transfer = TigerBeetle::Transfer.new(
425
+ id: TigerBeetle.id,
426
+ debit_account_id: transfer_debit_account_id,
427
+ credit_account_id: transfer_credit_account_id,
428
+ amount: 10,
429
+ ledger: 1,
430
+ code: 720,
431
+ flags: TigerBeetle::TransferFlags::PENDING
432
+ )
71
433
 
72
- You can choose whatever IDs you want when creating accounts and transfers (as long as they are
73
- unique per cluster). However to leverage the maximum performance TigerBeetle recommends using
74
- strictly increasing decentralized 128-bit IDs. To generate such an ID you can use the provided
75
- `TigerBeetle.id` method.
434
+ transfer_results = client.create_transfers([pending_transfer])
435
+ # Results handling omitted.
436
+
437
+ post_transfer = TigerBeetle::Transfer.new(
438
+ id: TigerBeetle.id,
439
+ debit_account_id: transfer_debit_account_id,
440
+ credit_account_id: transfer_credit_account_id,
441
+ amount: 10,
442
+ pending_id: pending_transfer.id,
443
+ ledger: 1,
444
+ code: 720,
445
+ flags: TigerBeetle::TransferFlags::POST_PENDING_TRANSFER
446
+ )
447
+
448
+ transfer_results = client.create_transfers([post_transfer])
449
+ # Results handling omitted.
450
+ ```
451
+
452
+ #### Void a Pending Transfer
453
+
454
+ In contrast, with `flags` set to `void_pending_transfer`,
455
+ TigerBeetle will void the transfer. TigerBeetle will roll
456
+ back the changes to `debits_pending` and `credits_pending` of the
457
+ appropriate accounts and **not** apply them to the `debits_posted` and
458
+ `credits_posted` balances.
76
459
 
77
460
  ```ruby
78
- client.create_accounts(
79
- TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1)
461
+ pending_transfer = TigerBeetle::Transfer.new(
462
+ id: TigerBeetle.id,
463
+ debit_account_id: transfer_debit_account_id,
464
+ credit_account_id: transfer_credit_account_id,
465
+ amount: 10,
466
+ ledger: 1,
467
+ code: 720,
468
+ flags: TigerBeetle::TransferFlags::PENDING
469
+ )
470
+
471
+ transfer_results = client.create_transfers([pending_transfer])
472
+ # Results handling omitted.
473
+
474
+ void_transfer = TigerBeetle::Transfer.new(
475
+ id: TigerBeetle.id,
476
+ debit_account_id: transfer_debit_account_id,
477
+ credit_account_id: transfer_credit_account_id,
478
+ amount: 0,
479
+ pending_id: pending_transfer.id,
480
+ ledger: 1,
481
+ code: 720,
482
+ flags: TigerBeetle::TransferFlags::VOID_PENDING_TRANSFER
80
483
  )
484
+
485
+ transfer_results = client.create_transfers([void_transfer])
486
+ # Results handling omitted.
81
487
  ```
82
488
 
83
- *More on how to approach this — https://docs.tigerbeetle.com/coding/data-modeling/#id.*
489
+ ## Transfer Lookup
84
490
 
491
+ NOTE: While transfer lookup exists, it is not a flexible query API. We
492
+ are developing query APIs and there will be new methods for querying
493
+ transfers in the future.
85
494
 
86
- ## Async
495
+ Transfer lookup is batched, like transfer creation. Pass in all `id`s to
496
+ fetch, and matched transfers are returned.
87
497
 
88
- All the lower level calls executed by the client are non-blocking. However, since async calls are
89
- much less common in Ruby, these are made blocking by default. In order to use the client
90
- asynchronously all you need to do is provide your own callback to any method on the client:
498
+ If no transfer matches an `id`, no object is returned for that
499
+ transfer. So the order of transfers in the response is not necessarily
500
+ the same as the order of `id`s in the request. You can refer to the
501
+ `id` field in the response to distinguish transfers.
91
502
 
92
503
  ```ruby
93
- # default blocking call
94
- result = client.lookup_accounts(100)
95
- result # [#<struct TigerBeetle::Account id=100, ... >]
504
+ transfers = client.lookup_transfers([transfer0.id, transfer1.id])
505
+ ```
96
506
 
97
- # async non-blocking call
98
- client.lookup_accounts(100) do |result|
99
- result # [#<struct TigerBeetle::Account id=100, ... >]
100
- end
507
+ ## Get Account Transfers
508
+
509
+ NOTE: This is a preview API that is subject to breaking changes once we have
510
+ a stable querying API.
511
+
512
+ Fetches the transfers involving a given account, allowing basic filter and pagination
513
+ capabilities.
514
+
515
+ The transfers in the response are sorted by `timestamp` in chronological or
516
+ reverse-chronological order.
517
+
518
+ ```ruby
519
+ filter = TigerBeetle::AccountFilter.new(
520
+ account_id: account1.id,
521
+ user_data_128: 0,
522
+ user_data_64: 0,
523
+ user_data_32: 0,
524
+ code: 0,
525
+ timestamp_min: 0,
526
+ timestamp_max: 0,
527
+ limit: 10,
528
+ flags: TigerBeetle::AccountFilterFlags::DEBITS |
529
+ TigerBeetle::AccountFilterFlags::CREDITS |
530
+ TigerBeetle::AccountFilterFlags::REVERSED
531
+ )
532
+
533
+ account_transfers = client.get_account_transfers(filter)
101
534
  ```
102
535
 
103
- *In the example above the first call will block until TigerBeetle responds and the return value of
104
- the call will contain the result. The second call however will return `nil` straight away (and keep
105
- executing your code) while calling the provided block only once TigerBeetle has responded, passing
106
- in the result as an argument to the block.*
536
+ ## Get Account Balances
107
537
 
538
+ NOTE: This is a preview API that is subject to breaking changes once we have
539
+ a stable querying API.
108
540
 
109
- ## Contributing
541
+ Fetches the point-in-time balances of a given account, allowing basic filter and
542
+ pagination capabilities.
110
543
 
111
- We'd love your help building the TigerBeetle Ruby gem.
544
+ Only accounts created with the flag
545
+ [`history`](https://docs.tigerbeetle.com/reference/account#flagshistory) set retain
546
+ [historical balances](https://docs.tigerbeetle.com/reference/requests/get_account_balances).
112
547
 
113
- - Join the [official Slack](https://slack.tigerbeetle.com/join) for general questions on TigerBeetle
114
- - For any discovered problems or questions about the Ruby client — [open a new issue](https://github.com/antstorm/tigerbeetle-ruby/issues/new)
115
- - For codebase improvements:
116
- - Fork this repo
117
- - Unpack the native ext with `bundle exec rake compile`
118
- - Implement your changes
119
- - Ensure the tests pass by running `bundle exec rspec`
120
- - Open a new pull request
121
- - If you're making changes to the native code, you might need to build TigerBeetle C client
122
- - Pull in the TigerBeetle submodule with `git submodule update --init --recursive --remote`
123
- - Install Zig `cd ext/tb_client/tigerbeetle && zig/download.sh`
124
- - Add `zig` to your PATH `export PATH=$PATH:<PATH-TO-THIS-REPO>/ext/tb_client/tigerbeetle/zig`
125
- - Compile the client `bundle exec rake clean compile`
548
+ The balances in the response are sorted by `timestamp` in chronological or
549
+ reverse-chronological order.
550
+
551
+ ```ruby
552
+ filter = TigerBeetle::AccountFilter.new(
553
+ account_id: account1.id,
554
+ user_data_128: 0,
555
+ user_data_64: 0,
556
+ user_data_32: 0,
557
+ code: 0,
558
+ timestamp_min: 0,
559
+ timestamp_max: 0,
560
+ limit: 10,
561
+ flags: TigerBeetle::AccountFilterFlags::DEBITS |
562
+ TigerBeetle::AccountFilterFlags::CREDITS |
563
+ TigerBeetle::AccountFilterFlags::REVERSED
564
+ )
565
+
566
+ account_balances = client.get_account_balances(filter)
567
+ ```
126
568
 
569
+ ## Query Accounts
570
+
571
+ NOTE: This is a preview API that is subject to breaking changes once we have
572
+ a stable querying API.
573
+
574
+ Query accounts by the intersection of some fields and by timestamp range.
575
+
576
+ The accounts in the response are sorted by `timestamp` in chronological or
577
+ reverse-chronological order.
578
+
579
+ ```ruby
580
+ query_filter = TigerBeetle::QueryFilter.new(
581
+ user_data_128: 0,
582
+ user_data_64: 0,
583
+ user_data_32: 0,
584
+ ledger: 1,
585
+ code: 1,
586
+ timestamp_min: 0,
587
+ timestamp_max: 0,
588
+ limit: 10,
589
+ flags: TigerBeetle::QueryFilterFlags::REVERSED
590
+ )
591
+
592
+ query_accounts = client.query_accounts(query_filter)
593
+ ```
594
+
595
+ ## Query Transfers
596
+
597
+ NOTE: This is a preview API that is subject to breaking changes once we have
598
+ a stable querying API.
599
+
600
+ Query transfers by the intersection of some fields and by timestamp range.
601
+
602
+ The transfers in the response are sorted by `timestamp` in chronological or
603
+ reverse-chronological order.
604
+
605
+ ```ruby
606
+ query_filter = TigerBeetle::QueryFilter.new(
607
+ user_data_128: 0,
608
+ user_data_64: 0,
609
+ user_data_32: 0,
610
+ ledger: 1,
611
+ code: 720,
612
+ timestamp_min: 0,
613
+ timestamp_max: 0,
614
+ limit: 10,
615
+ flags: TigerBeetle::QueryFilterFlags::REVERSED
616
+ )
617
+
618
+ query_transfers = client.query_transfers(query_filter)
619
+ ```
620
+
621
+ ## Linked Events
622
+
623
+ When the `linked` flag is specified for an account when creating accounts or
624
+ a transfer when creating transfers, it links that event with the next event in the
625
+ batch, to create a chain of events, of arbitrary length, which all
626
+ succeed or fail together. The tail of a chain is denoted by the first
627
+ event without this flag. The last event in a batch may therefore never
628
+ have the `linked` flag set as this would leave a chain
629
+ open-ended. Multiple chains or individual events may coexist within a
630
+ batch to succeed or fail independently.
631
+
632
+ Events within a chain are executed within order, or are rolled back on
633
+ error, so that the effect of each event in the chain is visible to the
634
+ next, and so that the chain is either visible or invisible as a unit
635
+ to subsequent events after the chain. The event that was the first to
636
+ break the chain will have a unique error result. Other events in the
637
+ chain will have their error result set to `linked_event_failed`.
638
+
639
+ ```ruby
640
+ linked_flag = TigerBeetle::TransferFlags::LINKED
641
+ batch = [
642
+ TigerBeetle::Transfer.new(
643
+ id: TigerBeetle.id,
644
+ debit_account_id: transfer_debit_account_id,
645
+ credit_account_id: transfer_credit_account_id,
646
+ amount: 1,
647
+ ledger: 1,
648
+ code: 720,
649
+ flags: linked_flag
650
+ ),
651
+ TigerBeetle::Transfer.new(
652
+ id: TigerBeetle.id,
653
+ debit_account_id: transfer_debit_account_id,
654
+ credit_account_id: transfer_credit_account_id,
655
+ amount: 1,
656
+ ledger: 1,
657
+ code: 720
658
+ )
659
+ ]
660
+
661
+ transfer_results = client.create_transfers(batch)
662
+ # Results handling omitted.
663
+ ```
664
+
665
+ ## Imported Events
666
+
667
+ When the `imported` flag is specified for an account when creating accounts or
668
+ a transfer when creating transfers, it allows importing historical events with
669
+ a user-defined timestamp.
670
+
671
+ The entire batch of events must be set with the flag `imported`.
672
+
673
+ It's recommended to submit the whole batch as a `linked` chain of events, ensuring that
674
+ if any event fails, none of them are committed, preserving the last timestamp unchanged.
675
+ This approach gives the application a chance to correct failed imported events, re-submitting
676
+ the batch again with the same user-defined timestamps.
677
+
678
+ ```ruby
679
+ historical_timestamp = 0
680
+ # Loaded from an external source.
681
+ historical_accounts = []
682
+ # Loaded from an external source.
683
+ historical_transfers = []
684
+
685
+ accounts_to_import = historical_accounts.map.with_index do |historical_account, index|
686
+ historical_timestamp += 1
687
+ historical_account.timestamp = historical_timestamp
688
+ historical_account.flags = TigerBeetle::AccountFlags::IMPORTED
689
+ if index < historical_accounts.length - 1
690
+ historical_account.flags |= TigerBeetle::AccountFlags::LINKED
691
+ end
692
+
693
+ historical_account
694
+ end
695
+
696
+ account_results = client.create_accounts(accounts_to_import)
697
+ # Results handling omitted.
698
+
699
+ transfers_to_import = historical_transfers.map.with_index do |historical_transfer, index|
700
+ historical_timestamp += 1
701
+ historical_transfer.timestamp = historical_timestamp
702
+ historical_transfer.flags = TigerBeetle::TransferFlags::IMPORTED
703
+ if index < historical_transfers.length - 1
704
+ historical_transfer.flags |= TigerBeetle::TransferFlags::LINKED
705
+ end
706
+
707
+ historical_transfer
708
+ end
709
+
710
+ transfer_results = client.create_transfers(transfers_to_import)
711
+ # Results handling omitted.
712
+ ```
127
713
 
128
- ## License
714
+ ## Timeouts And Cancellation
129
715
 
130
- This project is licensed under [Apache 2.0 license](https://github.com/temporalio/temporal/blob/main/LICENSE).
716
+ The Client retries indefinitely and doesn't impose any per-request timeout. Cancellation is
717
+ provided as a mechanism, and the specific cancellation policy is left to the
718
+ application. A Client instance can be closed at any time. On close, all in-flight
719
+ requests are canceled and return an error to the caller. Even if an error is returned,
720
+ a request might still be processed by the TigerBeetle server.
721
+ [Reliable transaction submission](https://docs.tigerbeetle.com/coding/reliable-transaction-submission/)
722
+ explains how to make transfers retry-proof using IDs for end-to-end idempotency.