tigerbeetle 0.0.34 → 0.0.37
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/tb_client/extconf.rb +13 -13
- data/ext/tb_client/tigerbeetle/LICENSE +177 -0
- data/ext/tb_client/tigerbeetle/build.zig +2327 -0
- data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
- data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
- data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
- data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
- data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
- data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
- data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
- data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
- data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
- data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
- data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
- data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
- data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
- data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
- data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
- data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
- data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
- data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
- data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
- data/lib/tb_client/shared_lib.rb +12 -5
- data/lib/tigerbeetle/client.rb +1 -1
- data/lib/tigerbeetle/platforms.rb +9 -0
- data/lib/tigerbeetle/version.rb +2 -2
- data/tigerbeetle.gemspec +22 -5
- metadata +242 -3
- data/ext/tb_client/pkg.tar.gz +0 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const vsr = @import("vsr");
|
|
3
|
+
|
|
4
|
+
const assert = std.debug.assert;
|
|
5
|
+
const stdx = vsr.stdx;
|
|
6
|
+
const tb = vsr.tigerbeetle;
|
|
7
|
+
const exports = vsr.tb_client.exports;
|
|
8
|
+
|
|
9
|
+
const TypeMapping = struct {
|
|
10
|
+
name: []const u8,
|
|
11
|
+
visibility: enum { public, internal },
|
|
12
|
+
private_fields: []const []const u8 = &.{},
|
|
13
|
+
readonly_fields: []const []const u8 = &.{},
|
|
14
|
+
docs_link: ?[]const u8 = null,
|
|
15
|
+
constants: []const u8 = "",
|
|
16
|
+
|
|
17
|
+
pub fn is_private(comptime self: @This(), name: []const u8) bool {
|
|
18
|
+
inline for (self.private_fields) |field| {
|
|
19
|
+
if (std.mem.eql(u8, field, name)) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
} else return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
pub fn is_read_only(comptime self: @This(), name: []const u8) bool {
|
|
26
|
+
inline for (self.readonly_fields) |field| {
|
|
27
|
+
if (std.mem.eql(u8, field, name)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
} else return false;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const type_mappings = .{
|
|
35
|
+
.{ tb.AccountFlags, TypeMapping{
|
|
36
|
+
.name = "AccountFlags",
|
|
37
|
+
.visibility = .public,
|
|
38
|
+
.private_fields = &.{"padding"},
|
|
39
|
+
.docs_link = "reference/account#flags",
|
|
40
|
+
} },
|
|
41
|
+
.{ tb.TransferFlags, TypeMapping{
|
|
42
|
+
.name = "TransferFlags",
|
|
43
|
+
.visibility = .public,
|
|
44
|
+
.private_fields = &.{"padding"},
|
|
45
|
+
.docs_link = "reference/transfer#flags",
|
|
46
|
+
} },
|
|
47
|
+
.{ tb.AccountFilterFlags, TypeMapping{
|
|
48
|
+
.name = "AccountFilterFlags",
|
|
49
|
+
.visibility = .public,
|
|
50
|
+
.private_fields = &.{"padding"},
|
|
51
|
+
.docs_link = "reference/account-filter#flags",
|
|
52
|
+
} },
|
|
53
|
+
.{ tb.QueryFilterFlags, TypeMapping{
|
|
54
|
+
.name = "QueryFilterFlags",
|
|
55
|
+
.visibility = .public,
|
|
56
|
+
.private_fields = &.{"padding"},
|
|
57
|
+
.docs_link = "reference/query-filter#flags",
|
|
58
|
+
} },
|
|
59
|
+
.{ tb.Account, TypeMapping{
|
|
60
|
+
.name = "Account",
|
|
61
|
+
.visibility = .public,
|
|
62
|
+
.private_fields = &.{"reserved"},
|
|
63
|
+
.readonly_fields = &.{
|
|
64
|
+
"debits_pending",
|
|
65
|
+
"credits_pending",
|
|
66
|
+
"debits_posted",
|
|
67
|
+
"credits_posted",
|
|
68
|
+
},
|
|
69
|
+
.docs_link = "reference/account#",
|
|
70
|
+
} },
|
|
71
|
+
.{
|
|
72
|
+
tb.Transfer, TypeMapping{
|
|
73
|
+
.name = "Transfer",
|
|
74
|
+
.visibility = .public,
|
|
75
|
+
.private_fields = &.{"reserved"},
|
|
76
|
+
.readonly_fields = &.{},
|
|
77
|
+
.docs_link = "reference/transfer#",
|
|
78
|
+
.constants =
|
|
79
|
+
\\ public static UInt128 AmountMax => UInt128.MaxValue;
|
|
80
|
+
\\
|
|
81
|
+
,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
.{ tb.CreateAccountResult, TypeMapping{
|
|
85
|
+
.name = "CreateAccountResult",
|
|
86
|
+
.visibility = .public,
|
|
87
|
+
.docs_link = "reference/requests/create_accounts#",
|
|
88
|
+
} },
|
|
89
|
+
.{ tb.CreateTransferResult, TypeMapping{
|
|
90
|
+
.name = "CreateTransferResult",
|
|
91
|
+
.visibility = .public,
|
|
92
|
+
.docs_link = "reference/requests/create_transfers#",
|
|
93
|
+
} },
|
|
94
|
+
.{ tb.CreateAccountsResult, TypeMapping{
|
|
95
|
+
.name = "CreateAccountsResult",
|
|
96
|
+
.visibility = .public,
|
|
97
|
+
} },
|
|
98
|
+
.{ tb.CreateTransfersResult, TypeMapping{
|
|
99
|
+
.name = "CreateTransfersResult",
|
|
100
|
+
.visibility = .public,
|
|
101
|
+
} },
|
|
102
|
+
.{ tb.AccountFilter, TypeMapping{
|
|
103
|
+
.name = "AccountFilter",
|
|
104
|
+
.visibility = .public,
|
|
105
|
+
.private_fields = &.{"reserved"},
|
|
106
|
+
.docs_link = "reference/account-filter#",
|
|
107
|
+
} },
|
|
108
|
+
.{ tb.AccountBalance, TypeMapping{
|
|
109
|
+
.name = "AccountBalance",
|
|
110
|
+
.visibility = .public,
|
|
111
|
+
.private_fields = &.{"reserved"},
|
|
112
|
+
.docs_link = "reference/account-balances#",
|
|
113
|
+
} },
|
|
114
|
+
.{ tb.QueryFilter, TypeMapping{
|
|
115
|
+
.name = "QueryFilter",
|
|
116
|
+
.visibility = .public,
|
|
117
|
+
.private_fields = &.{"reserved"},
|
|
118
|
+
.docs_link = "reference/query-filter#",
|
|
119
|
+
} },
|
|
120
|
+
.{ exports.tb_init_status, TypeMapping{
|
|
121
|
+
.name = "InitializationStatus",
|
|
122
|
+
.visibility = .public,
|
|
123
|
+
} },
|
|
124
|
+
.{ exports.tb_client_status, TypeMapping{
|
|
125
|
+
.name = "ClientStatus",
|
|
126
|
+
.visibility = .internal,
|
|
127
|
+
} },
|
|
128
|
+
.{ exports.tb_packet_status, TypeMapping{
|
|
129
|
+
.name = "PacketStatus",
|
|
130
|
+
.visibility = .public,
|
|
131
|
+
} },
|
|
132
|
+
.{ exports.tb_operation, TypeMapping{
|
|
133
|
+
.name = "TBOperation",
|
|
134
|
+
.visibility = .internal,
|
|
135
|
+
.private_fields = &.{ "reserved", "root", "register" },
|
|
136
|
+
} },
|
|
137
|
+
.{ exports.tb_client_t, TypeMapping{
|
|
138
|
+
.name = "TBClient",
|
|
139
|
+
.visibility = .internal,
|
|
140
|
+
.private_fields = &.{"opaque"},
|
|
141
|
+
} },
|
|
142
|
+
.{ exports.tb_packet_t, TypeMapping{
|
|
143
|
+
.name = "TBPacket",
|
|
144
|
+
.visibility = .internal,
|
|
145
|
+
.private_fields = &.{"opaque"},
|
|
146
|
+
} },
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
fn dotnet_type(comptime Type: type) []const u8 {
|
|
150
|
+
switch (@typeInfo(Type)) {
|
|
151
|
+
.@"enum", .@"struct" => return comptime get_mapped_type_name(Type) orelse
|
|
152
|
+
@compileError("Type " ++ @typeName(Type) ++ " not mapped."),
|
|
153
|
+
.bool => return "byte",
|
|
154
|
+
.int => |info| {
|
|
155
|
+
assert(info.signedness == .unsigned);
|
|
156
|
+
return switch (info.bits) {
|
|
157
|
+
8 => "byte",
|
|
158
|
+
16 => "ushort",
|
|
159
|
+
32 => "uint",
|
|
160
|
+
64 => "ulong",
|
|
161
|
+
128 => "UInt128",
|
|
162
|
+
else => @compileError("invalid int type"),
|
|
163
|
+
};
|
|
164
|
+
},
|
|
165
|
+
.optional => |info| switch (@typeInfo(info.child)) {
|
|
166
|
+
.pointer => return dotnet_type(info.child),
|
|
167
|
+
else => @compileError("Unsupported optional type: " ++ @typeName(Type)),
|
|
168
|
+
},
|
|
169
|
+
.pointer => |info| {
|
|
170
|
+
assert(info.size != .slice);
|
|
171
|
+
assert(!info.is_allowzero);
|
|
172
|
+
|
|
173
|
+
return if (comptime get_mapped_type_name(info.child)) |name|
|
|
174
|
+
name ++ "*"
|
|
175
|
+
else
|
|
176
|
+
dotnet_type(info.child);
|
|
177
|
+
},
|
|
178
|
+
.void, .@"opaque" => return "IntPtr",
|
|
179
|
+
else => @compileError("Unhandled type: " ++ @typeName(Type)),
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
fn get_mapped_type_name(comptime Type: type) ?[]const u8 {
|
|
184
|
+
inline for (type_mappings) |type_mapping| {
|
|
185
|
+
if (Type == type_mapping[0]) {
|
|
186
|
+
return type_mapping[1].name;
|
|
187
|
+
}
|
|
188
|
+
} else return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
fn to_case(comptime input: []const u8, comptime case: enum { camel, pascal }) []const u8 {
|
|
192
|
+
return comptime blk: {
|
|
193
|
+
var len: usize = 0;
|
|
194
|
+
var output: [input.len]u8 = undefined;
|
|
195
|
+
var iterator = std.mem.tokenizeScalar(u8, input, '_');
|
|
196
|
+
while (iterator.next()) |word| {
|
|
197
|
+
_ = std.ascii.lowerString(output[len..], word);
|
|
198
|
+
output[len] = std.ascii.toUpper(output[len]);
|
|
199
|
+
len += word.len;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
output[0] = switch (case) {
|
|
203
|
+
.camel => std.ascii.toLower(output[0]),
|
|
204
|
+
.pascal => std.ascii.toUpper(output[0]),
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
break :blk stdx.comptime_slice(&output, len);
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
fn emit_enum(
|
|
212
|
+
buffer: *std.ArrayList(u8),
|
|
213
|
+
comptime Type: type,
|
|
214
|
+
comptime type_info: anytype,
|
|
215
|
+
comptime mapping: TypeMapping,
|
|
216
|
+
comptime int_type: []const u8,
|
|
217
|
+
) !void {
|
|
218
|
+
const is_packed_struct = @TypeOf(type_info) == std.builtin.Type.Struct;
|
|
219
|
+
if (is_packed_struct) {
|
|
220
|
+
assert(type_info.layout == .@"packed");
|
|
221
|
+
// Packed structs represented as Enum needs a Flags attribute:
|
|
222
|
+
try buffer.writer().print("[Flags]\n", .{});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
try buffer.writer().print(
|
|
226
|
+
\\{s} enum {s} : {s}
|
|
227
|
+
\\{{
|
|
228
|
+
\\
|
|
229
|
+
, .{
|
|
230
|
+
@tagName(mapping.visibility),
|
|
231
|
+
mapping.name,
|
|
232
|
+
int_type,
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
if (is_packed_struct) {
|
|
236
|
+
// Packed structs represented as Enum needs a ZERO value:
|
|
237
|
+
try buffer.writer().print(
|
|
238
|
+
\\ None = 0,
|
|
239
|
+
\\
|
|
240
|
+
\\
|
|
241
|
+
, .{});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
inline for (type_info.fields, 0..) |field, i| {
|
|
245
|
+
if (comptime mapping.is_private(field.name)) continue;
|
|
246
|
+
if (comptime std.mem.startsWith(u8, field.name, "deprecated_")) continue;
|
|
247
|
+
|
|
248
|
+
try emit_docs(buffer, mapping, field.name);
|
|
249
|
+
if (is_packed_struct) {
|
|
250
|
+
try buffer.writer().print(" {s} = 1 << {},\n\n", .{
|
|
251
|
+
to_case(field.name, .pascal),
|
|
252
|
+
i,
|
|
253
|
+
});
|
|
254
|
+
} else {
|
|
255
|
+
try buffer.writer().print(" {s} = {},\n\n", .{
|
|
256
|
+
to_case(field.name, .pascal),
|
|
257
|
+
@intFromEnum(@field(Type, field.name)),
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
try buffer.writer().print(
|
|
263
|
+
\\}}
|
|
264
|
+
\\
|
|
265
|
+
\\
|
|
266
|
+
, .{});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
fn emit_struct(
|
|
270
|
+
buffer: *std.ArrayList(u8),
|
|
271
|
+
comptime type_info: anytype,
|
|
272
|
+
comptime mapping: TypeMapping,
|
|
273
|
+
comptime size: usize,
|
|
274
|
+
) !void {
|
|
275
|
+
try buffer.writer().print(
|
|
276
|
+
\\[StructLayout(LayoutKind.Sequential, Size = SIZE)]
|
|
277
|
+
\\{s} {s}struct {s}
|
|
278
|
+
\\{{
|
|
279
|
+
\\ public const int SIZE = {};
|
|
280
|
+
\\
|
|
281
|
+
\\{s}
|
|
282
|
+
\\
|
|
283
|
+
, .{
|
|
284
|
+
@tagName(mapping.visibility),
|
|
285
|
+
if (mapping.visibility == .internal) "unsafe " else "",
|
|
286
|
+
mapping.name,
|
|
287
|
+
size,
|
|
288
|
+
mapping.constants,
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
// Fixed len array are exposed as internal structs with stackalloc fields
|
|
292
|
+
// It's more efficient than exposing heap-allocated arrays using
|
|
293
|
+
// [MarshalAs(UnmanagedType.ByValArray)] attribute.
|
|
294
|
+
inline for (type_info.fields) |field| {
|
|
295
|
+
switch (@typeInfo(field.type)) {
|
|
296
|
+
.array => |array| {
|
|
297
|
+
try buffer.writer().print(
|
|
298
|
+
\\ [StructLayout(LayoutKind.Sequential, Size = {[name]s}Data.SIZE)]
|
|
299
|
+
\\ private unsafe struct {[name]s}Data
|
|
300
|
+
\\ {{
|
|
301
|
+
\\ public const int SIZE = {[size]};
|
|
302
|
+
\\ private const int LENGTH = {[len]};
|
|
303
|
+
\\
|
|
304
|
+
\\ private fixed {[child_type]s} raw[LENGTH];
|
|
305
|
+
\\
|
|
306
|
+
\\ public {[child_type]s}[] GetData()
|
|
307
|
+
\\ {{
|
|
308
|
+
\\ fixed (void* ptr = raw)
|
|
309
|
+
\\ {{
|
|
310
|
+
\\ return new ReadOnlySpan<{[child_type]s}>(ptr, LENGTH).ToArray();
|
|
311
|
+
\\ }}
|
|
312
|
+
\\ }}
|
|
313
|
+
\\
|
|
314
|
+
\\ public void SetData({[child_type]s}[] value)
|
|
315
|
+
\\ {{
|
|
316
|
+
\\ if (value == null) throw new ArgumentNullException(nameof(value));
|
|
317
|
+
\\ if (value.Length != LENGTH)
|
|
318
|
+
\\ {{
|
|
319
|
+
\\ throw new ArgumentException(
|
|
320
|
+
\\ "Expected a {[child_type]s}[" + LENGTH + "] array",
|
|
321
|
+
\\ nameof(value));
|
|
322
|
+
\\ }}
|
|
323
|
+
\\
|
|
324
|
+
\\ fixed (void* ptr = raw)
|
|
325
|
+
\\ {{
|
|
326
|
+
\\ value.CopyTo(new Span<{[child_type]s}>(ptr, LENGTH));
|
|
327
|
+
\\ }}
|
|
328
|
+
\\ }}
|
|
329
|
+
\\ }}
|
|
330
|
+
\\
|
|
331
|
+
\\
|
|
332
|
+
, .{
|
|
333
|
+
.name = to_case(field.name, .pascal),
|
|
334
|
+
.size = array.len * @sizeOf(array.child),
|
|
335
|
+
.len = array.len,
|
|
336
|
+
.child_type = dotnet_type(array.child),
|
|
337
|
+
});
|
|
338
|
+
},
|
|
339
|
+
else => {},
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Fields
|
|
344
|
+
inline for (type_info.fields) |field| {
|
|
345
|
+
const is_private = comptime mapping.is_private(field.name);
|
|
346
|
+
|
|
347
|
+
switch (@typeInfo(field.type)) {
|
|
348
|
+
.array => try buffer.writer().print(
|
|
349
|
+
\\ {s} {s}Data {s};
|
|
350
|
+
\\
|
|
351
|
+
\\
|
|
352
|
+
,
|
|
353
|
+
.{
|
|
354
|
+
if (mapping.visibility == .internal and !is_private) "public" else "private",
|
|
355
|
+
to_case(field.name, .pascal),
|
|
356
|
+
to_case(field.name, .camel),
|
|
357
|
+
},
|
|
358
|
+
),
|
|
359
|
+
else => try buffer.writer().print(
|
|
360
|
+
\\ {s} {s} {s};
|
|
361
|
+
\\
|
|
362
|
+
\\
|
|
363
|
+
,
|
|
364
|
+
.{
|
|
365
|
+
if (mapping.visibility == .internal and !is_private) "public" else "private",
|
|
366
|
+
dotnet_type(field.type),
|
|
367
|
+
to_case(field.name, .camel),
|
|
368
|
+
},
|
|
369
|
+
),
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (mapping.visibility == .public) {
|
|
374
|
+
|
|
375
|
+
// Properties
|
|
376
|
+
inline for (type_info.fields) |field| {
|
|
377
|
+
try emit_docs(buffer, mapping, field.name);
|
|
378
|
+
|
|
379
|
+
const is_private = comptime mapping.is_private(field.name);
|
|
380
|
+
const is_read_only = comptime mapping.is_read_only(field.name);
|
|
381
|
+
|
|
382
|
+
switch (@typeInfo(field.type)) {
|
|
383
|
+
.array => try buffer.writer().print(
|
|
384
|
+
\\ {s} byte[] {s} {{ get => {s}.GetData(); {s}set => {s}.SetData(value); }}
|
|
385
|
+
\\
|
|
386
|
+
\\
|
|
387
|
+
, .{
|
|
388
|
+
if (is_private) "internal" else "public",
|
|
389
|
+
to_case(field.name, .pascal),
|
|
390
|
+
to_case(field.name, .camel),
|
|
391
|
+
if (is_read_only and !is_private) "internal " else "",
|
|
392
|
+
to_case(field.name, .camel),
|
|
393
|
+
}),
|
|
394
|
+
else => try buffer.writer().print(
|
|
395
|
+
\\ {s} {s} {s} {{ get => {s}; {s}set => {s} = value; }}
|
|
396
|
+
\\
|
|
397
|
+
\\
|
|
398
|
+
, .{
|
|
399
|
+
if (is_private) "internal" else "public",
|
|
400
|
+
dotnet_type(field.type),
|
|
401
|
+
to_case(field.name, .pascal),
|
|
402
|
+
to_case(field.name, .camel),
|
|
403
|
+
if (is_read_only and !is_private) "internal " else "",
|
|
404
|
+
to_case(field.name, .camel),
|
|
405
|
+
}),
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
try buffer.writer().print(
|
|
411
|
+
\\}}
|
|
412
|
+
\\
|
|
413
|
+
\\
|
|
414
|
+
, .{});
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
fn emit_docs(buffer: anytype, comptime mapping: TypeMapping, comptime field: ?[]const u8) !void {
|
|
418
|
+
if (mapping.docs_link) |docs_link| {
|
|
419
|
+
try buffer.writer().print(
|
|
420
|
+
\\ /// <summary>
|
|
421
|
+
\\ /// https://docs.tigerbeetle.com/{s}{s}
|
|
422
|
+
\\ /// </summary>
|
|
423
|
+
\\
|
|
424
|
+
, .{
|
|
425
|
+
docs_link,
|
|
426
|
+
field orelse "",
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
pub fn generate_bindings(buffer: *std.ArrayList(u8)) !void {
|
|
432
|
+
@setEvalBranchQuota(100_000);
|
|
433
|
+
|
|
434
|
+
try buffer.writer().print(
|
|
435
|
+
\\//////////////////////////////////////////////////////////
|
|
436
|
+
\\// This file was auto-generated by dotnet_bindings.zig //
|
|
437
|
+
\\// Do not manually modify. //
|
|
438
|
+
\\//////////////////////////////////////////////////////////
|
|
439
|
+
\\
|
|
440
|
+
\\using System;
|
|
441
|
+
\\using System.Runtime.InteropServices;
|
|
442
|
+
\\
|
|
443
|
+
\\namespace TigerBeetle;
|
|
444
|
+
\\
|
|
445
|
+
\\
|
|
446
|
+
, .{});
|
|
447
|
+
|
|
448
|
+
// Emit C# declarations.
|
|
449
|
+
inline for (type_mappings) |type_mapping| {
|
|
450
|
+
const ZigType = type_mapping[0];
|
|
451
|
+
const mapping = type_mapping[1];
|
|
452
|
+
|
|
453
|
+
switch (@typeInfo(ZigType)) {
|
|
454
|
+
.@"struct" => |info| switch (info.layout) {
|
|
455
|
+
.auto => @compileError(
|
|
456
|
+
"Only packed or extern structs are supported: " ++ @typeName(ZigType),
|
|
457
|
+
),
|
|
458
|
+
.@"packed" => try emit_enum(
|
|
459
|
+
buffer,
|
|
460
|
+
ZigType,
|
|
461
|
+
info,
|
|
462
|
+
mapping,
|
|
463
|
+
comptime dotnet_type(
|
|
464
|
+
std.meta.Int(.unsigned, @bitSizeOf(ZigType)),
|
|
465
|
+
),
|
|
466
|
+
),
|
|
467
|
+
.@"extern" => try emit_struct(
|
|
468
|
+
buffer,
|
|
469
|
+
info,
|
|
470
|
+
mapping,
|
|
471
|
+
@sizeOf(ZigType),
|
|
472
|
+
),
|
|
473
|
+
},
|
|
474
|
+
.@"enum" => |info| try emit_enum(
|
|
475
|
+
buffer,
|
|
476
|
+
ZigType,
|
|
477
|
+
info,
|
|
478
|
+
mapping,
|
|
479
|
+
comptime dotnet_type(std.meta.Int(.unsigned, @bitSizeOf(ZigType))),
|
|
480
|
+
),
|
|
481
|
+
else => @compileError("Type cannot be represented: " ++ @typeName(ZigType)),
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Emit function declarations.
|
|
486
|
+
// TODO: use `std.meta.declaractions` and generate with pub + export functions.
|
|
487
|
+
// Zig 0.9.1 has `decl.data.Fn.arg_names` but it's currently/incorrectly a zero-sized slice.
|
|
488
|
+
try buffer.writer().print(
|
|
489
|
+
\\internal static class Native
|
|
490
|
+
\\{{
|
|
491
|
+
\\ private const string LIB_NAME = "tb_client";
|
|
492
|
+
\\
|
|
493
|
+
\\ [DllImport(LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
|
|
494
|
+
\\ public static unsafe extern InitializationStatus tb_client_init(
|
|
495
|
+
\\ TBClient* client_out,
|
|
496
|
+
\\ UInt128Extensions.UnsafeU128* cluster_id,
|
|
497
|
+
\\ byte* address_ptr,
|
|
498
|
+
\\ uint address_len,
|
|
499
|
+
\\ IntPtr completion_ctx,
|
|
500
|
+
\\ delegate* unmanaged[Cdecl]<IntPtr,
|
|
501
|
+
\\ TBPacket*, ulong,
|
|
502
|
+
\\ byte*, uint, void> completion_callback
|
|
503
|
+
\\ );
|
|
504
|
+
\\
|
|
505
|
+
\\ [DllImport(LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
|
|
506
|
+
\\ public static unsafe extern InitializationStatus tb_client_init_echo(
|
|
507
|
+
\\ TBClient* out_client,
|
|
508
|
+
\\ UInt128Extensions.UnsafeU128* cluster_id,
|
|
509
|
+
\\ byte* address_ptr,
|
|
510
|
+
\\ uint address_len,
|
|
511
|
+
\\ IntPtr completion_ctx,
|
|
512
|
+
\\ delegate* unmanaged[Cdecl]<IntPtr,
|
|
513
|
+
\\ TBPacket*, ulong,
|
|
514
|
+
\\ byte*, uint, void> completion_callback
|
|
515
|
+
\\ );
|
|
516
|
+
\\
|
|
517
|
+
\\ [DllImport(LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
|
|
518
|
+
\\ public static unsafe extern ClientStatus tb_client_submit(
|
|
519
|
+
\\ TBClient* client,
|
|
520
|
+
\\ TBPacket* packet
|
|
521
|
+
\\ );
|
|
522
|
+
\\
|
|
523
|
+
\\ [DllImport(LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
|
|
524
|
+
\\ public static unsafe extern ClientStatus tb_client_deinit(
|
|
525
|
+
\\ TBClient* client
|
|
526
|
+
\\ );
|
|
527
|
+
\\}}
|
|
528
|
+
\\
|
|
529
|
+
\\
|
|
530
|
+
, .{});
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
pub fn main() !void {
|
|
534
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
535
|
+
defer arena.deinit();
|
|
536
|
+
const allocator = arena.allocator();
|
|
537
|
+
|
|
538
|
+
var buffer = std.ArrayList(u8).init(allocator);
|
|
539
|
+
try generate_bindings(&buffer);
|
|
540
|
+
|
|
541
|
+
try std.io.getStdOut().writeAll(buffer.items);
|
|
542
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const builtin = @import("builtin");
|
|
2
|
+
const std = @import("std");
|
|
3
|
+
const log = std.log;
|
|
4
|
+
const assert = std.debug.assert;
|
|
5
|
+
|
|
6
|
+
const Shell = @import("../../shell.zig");
|
|
7
|
+
const TmpTigerBeetle = @import("../../testing/tmp_tigerbeetle.zig");
|
|
8
|
+
|
|
9
|
+
pub fn tests(shell: *Shell, gpa: std.mem.Allocator) !void {
|
|
10
|
+
assert(shell.file_exists("go.mod"));
|
|
11
|
+
|
|
12
|
+
const bad_formatting = try shell.exec_stdout("gofmt -l .", .{});
|
|
13
|
+
if (!std.mem.eql(u8, bad_formatting, "")) {
|
|
14
|
+
log.err("these go files need formatting:\n'{s}'", .{bad_formatting});
|
|
15
|
+
return error.GoFmt;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try shell.exec("go vet", .{});
|
|
19
|
+
|
|
20
|
+
// `go build` won't compile the native library automatically, we need to do that ourselves.
|
|
21
|
+
try shell.exec_zig("build clients:go -Drelease", .{});
|
|
22
|
+
try shell.exec_zig("build -Drelease", .{});
|
|
23
|
+
|
|
24
|
+
// Although we have compiled the TigerBeetle client library, we still need `cgo` to link it with
|
|
25
|
+
// our resulting Go binary. Strictly speaking, `CC` is controlled by the users of TigerBeetle,
|
|
26
|
+
// so ideally we should test common flavors of gcc. For simplicity, we:
|
|
27
|
+
// - use `zig cc` on Windows, as that doesn't have `gcc` out of the box
|
|
28
|
+
// - use `zig cc` on Linux. It might or might not have `gcc`, but `zig cc` makes our CI more
|
|
29
|
+
// reproducible
|
|
30
|
+
// - (implicitly) use `gcc` on Mac, as `zig cc` doesn't work there:
|
|
31
|
+
// <https://github.com/ziglang/zig/issues/15438>
|
|
32
|
+
switch (builtin.os.tag) {
|
|
33
|
+
.linux, .windows => {
|
|
34
|
+
const zig_cc = try shell.fmt("{s} cc", .{shell.zig_exe.?});
|
|
35
|
+
try shell.env.put("CC", zig_cc);
|
|
36
|
+
},
|
|
37
|
+
.macos => {},
|
|
38
|
+
else => unreachable,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
try shell.exec("go test", .{});
|
|
42
|
+
{
|
|
43
|
+
log.info("testing `types` package helpers", .{});
|
|
44
|
+
|
|
45
|
+
try shell.pushd("./pkg/types");
|
|
46
|
+
defer shell.popd();
|
|
47
|
+
|
|
48
|
+
try shell.exec("go test", .{});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
inline for (.{ "basic", "two-phase", "two-phase-many", "walkthrough" }) |sample| {
|
|
52
|
+
log.info("testing sample '{s}'", .{sample});
|
|
53
|
+
|
|
54
|
+
try shell.pushd("./samples/" ++ sample);
|
|
55
|
+
defer shell.popd();
|
|
56
|
+
|
|
57
|
+
var tmp_beetle = try TmpTigerBeetle.init(gpa, .{
|
|
58
|
+
.development = true,
|
|
59
|
+
});
|
|
60
|
+
defer tmp_beetle.deinit(gpa);
|
|
61
|
+
errdefer tmp_beetle.log_stderr();
|
|
62
|
+
|
|
63
|
+
try shell.env.put("TB_ADDRESS", tmp_beetle.port_str);
|
|
64
|
+
try shell.exec("go build main.go", .{});
|
|
65
|
+
try shell.exec("./main" ++ builtin.target.exeFileExt(), .{});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
pub fn validate_release(shell: *Shell, gpa: std.mem.Allocator, options: struct {
|
|
70
|
+
version: []const u8,
|
|
71
|
+
tigerbeetle: []const u8,
|
|
72
|
+
}) !void {
|
|
73
|
+
var tmp_beetle = try TmpTigerBeetle.init(gpa, .{
|
|
74
|
+
.development = true,
|
|
75
|
+
.prebuilt = options.tigerbeetle,
|
|
76
|
+
});
|
|
77
|
+
defer tmp_beetle.deinit(gpa);
|
|
78
|
+
errdefer tmp_beetle.log_stderr();
|
|
79
|
+
|
|
80
|
+
try shell.env.put("TB_ADDRESS", tmp_beetle.port_str);
|
|
81
|
+
|
|
82
|
+
try shell.exec("go mod init tbtest", .{});
|
|
83
|
+
try shell.exec("go get github.com/tigerbeetle/tigerbeetle-go@v{version}", .{
|
|
84
|
+
.version = options.version,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
try Shell.copy_path(
|
|
88
|
+
shell.project_root,
|
|
89
|
+
"src/clients/go/samples/basic/main.go",
|
|
90
|
+
shell.cwd,
|
|
91
|
+
"main.go",
|
|
92
|
+
);
|
|
93
|
+
const zig_cc = try shell.fmt("{s} cc", .{shell.zig_exe.?});
|
|
94
|
+
|
|
95
|
+
try shell.env.put("CC", zig_cc);
|
|
96
|
+
try shell.exec("go run main.go", .{});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
pub fn release_published_latest(shell: *Shell) ![]const u8 {
|
|
100
|
+
// Example output:
|
|
101
|
+
// github.com/tigerbeetle/tigerbeetle-go v0.9.149 v0.13.56 v0.13.57
|
|
102
|
+
const output = try shell.exec_stdout(
|
|
103
|
+
"go list -m -versions github.com/tigerbeetle/tigerbeetle-go",
|
|
104
|
+
.{},
|
|
105
|
+
);
|
|
106
|
+
const last_version = std.mem.lastIndexOf(u8, output, " v").?;
|
|
107
|
+
|
|
108
|
+
return output[last_version + 2 ..];
|
|
109
|
+
}
|