Skip to content

Instantly share code, notes, and snippets.

@kassane
Last active October 29, 2023 16:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kassane/414fc5b0bf58acaa7855c82b29e26ea9 to your computer and use it in GitHub Desktop.
Save kassane/414fc5b0bf58acaa7855c82b29e26ea9 to your computer and use it in GitHub Desktop.
[Draft] TigerBeetle Client - Pascal binding
@nogc nothrow:
extern(C): __gshared:
//////////////////////////////////////////////////////////
// This file was auto-generated by tb_client_header.zig //
// Do not manually modify. //
//////////////////////////////////////////////////////////
import core.stdc.stdint;
import core.int128;
alias tb_uint128_t = Cent;
enum TB_ACCOUNT_FLAGS {
TB_ACCOUNT_LINKED = 1 << 0,
TB_ACCOUNT_DEBITS_MUST_NOT_EXCEED_CREDITS = 1 << 1,
TB_ACCOUNT_CREDITS_MUST_NOT_EXCEED_DEBITS = 1 << 2,
}
alias TB_ACCOUNT_LINKED = TB_ACCOUNT_FLAGS.TB_ACCOUNT_LINKED;
alias TB_ACCOUNT_DEBITS_MUST_NOT_EXCEED_CREDITS = TB_ACCOUNT_FLAGS.TB_ACCOUNT_DEBITS_MUST_NOT_EXCEED_CREDITS;
alias TB_ACCOUNT_CREDITS_MUST_NOT_EXCEED_DEBITS = TB_ACCOUNT_FLAGS.TB_ACCOUNT_CREDITS_MUST_NOT_EXCEED_DEBITS;
struct tb_account_t {
tb_uint128_t id;
tb_uint128_t debits_pending;
tb_uint128_t debits_posted;
tb_uint128_t credits_pending;
tb_uint128_t credits_posted;
tb_uint128_t user_data_128;
ulong user_data_64;
uint user_data_32;
uint reserved;
uint ledger;
ushort code;
ushort flags;
ulong timestamp;
}
enum TB_TRANSFER_FLAGS {
TB_TRANSFER_LINKED = 1 << 0,
TB_TRANSFER_PENDING = 1 << 1,
TB_TRANSFER_POST_PENDING_TRANSFER = 1 << 2,
TB_TRANSFER_VOID_PENDING_TRANSFER = 1 << 3,
TB_TRANSFER_BALANCING_DEBIT = 1 << 4,
TB_TRANSFER_BALANCING_CREDIT = 1 << 5,
}
alias TB_TRANSFER_LINKED = TB_TRANSFER_FLAGS.TB_TRANSFER_LINKED;
alias TB_TRANSFER_PENDING = TB_TRANSFER_FLAGS.TB_TRANSFER_PENDING;
alias TB_TRANSFER_POST_PENDING_TRANSFER = TB_TRANSFER_FLAGS.TB_TRANSFER_POST_PENDING_TRANSFER;
alias TB_TRANSFER_VOID_PENDING_TRANSFER = TB_TRANSFER_FLAGS.TB_TRANSFER_VOID_PENDING_TRANSFER;
alias TB_TRANSFER_BALANCING_DEBIT = TB_TRANSFER_FLAGS.TB_TRANSFER_BALANCING_DEBIT;
alias TB_TRANSFER_BALANCING_CREDIT = TB_TRANSFER_FLAGS.TB_TRANSFER_BALANCING_CREDIT;
struct tb_transfer_t {
tb_uint128_t id;
tb_uint128_t debit_account_id;
tb_uint128_t credit_account_id;
tb_uint128_t amount;
tb_uint128_t pending_id;
tb_uint128_t user_data_128;
ulong user_data_64;
uint user_data_32;
uint timeout;
uint ledger;
ushort code;
ushort flags;
ulong timestamp;
}
enum TB_CREATE_ACCOUNT_RESULT {
TB_CREATE_ACCOUNT_OK = 0,
TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = 1,
TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = 2,
TB_CREATE_ACCOUNT_TIMESTAMP_MUST_BE_ZERO = 3,
TB_CREATE_ACCOUNT_RESERVED_FIELD = 4,
TB_CREATE_ACCOUNT_RESERVED_FLAG = 5,
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = 6,
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 7,
TB_CREATE_ACCOUNT_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 8,
TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = 9,
TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = 10,
TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = 11,
TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = 12,
TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = 13,
TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = 14,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = 15,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_128 = 16,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_64 = 17,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_32 = 18,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = 19,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = 20,
TB_CREATE_ACCOUNT_EXISTS = 21,
}
alias TB_CREATE_ACCOUNT_OK = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_OK;
alias TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED;
alias TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN;
alias TB_CREATE_ACCOUNT_TIMESTAMP_MUST_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_TIMESTAMP_MUST_BE_ZERO;
alias TB_CREATE_ACCOUNT_RESERVED_FIELD = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_RESERVED_FIELD;
alias TB_CREATE_ACCOUNT_RESERVED_FLAG = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_RESERVED_FLAG;
alias TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO;
alias TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX;
alias TB_CREATE_ACCOUNT_FLAGS_ARE_MUTUALLY_EXCLUSIVE = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_FLAGS_ARE_MUTUALLY_EXCLUSIVE;
alias TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO;
alias TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO;
alias TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO;
alias TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO;
alias TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO;
alias TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO;
alias TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS;
alias TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_128 = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_128;
alias TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_64 = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_64;
alias TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_32 = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_32;
alias TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER;
alias TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE;
alias TB_CREATE_ACCOUNT_EXISTS = TB_CREATE_ACCOUNT_RESULT.TB_CREATE_ACCOUNT_EXISTS;
enum TB_CREATE_TRANSFER_RESULT {
TB_CREATE_TRANSFER_OK = 0,
TB_CREATE_TRANSFER_LINKED_EVENT_FAILED = 1,
TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN = 2,
TB_CREATE_TRANSFER_TIMESTAMP_MUST_BE_ZERO = 3,
TB_CREATE_TRANSFER_RESERVED_FLAG = 4,
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO = 5,
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX = 6,
TB_CREATE_TRANSFER_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 7,
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 8,
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 9,
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 10,
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 11,
TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT = 12,
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO = 13,
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO = 14,
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX = 15,
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT = 16,
TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER = 17,
TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO = 18,
TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO = 19,
TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO = 20,
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND = 21,
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND = 22,
TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER = 23,
TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS = 24,
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND = 25,
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING = 26,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID = 27,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID = 28,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER = 29,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE = 30,
TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT = 31,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT = 32,
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED = 33,
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED = 34,
TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED = 35,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS = 36,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID = 37,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID = 38,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT = 39,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID = 40,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_128 = 41,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_64 = 42,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_32 = 43,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT = 44,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE = 45,
TB_CREATE_TRANSFER_EXISTS = 46,
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING = 47,
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING = 48,
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED = 49,
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED = 50,
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS = 51,
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS = 52,
TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT = 53,
TB_CREATE_TRANSFER_EXCEEDS_CREDITS = 54,
TB_CREATE_TRANSFER_EXCEEDS_DEBITS = 55,
}
alias TB_CREATE_TRANSFER_OK = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OK;
alias TB_CREATE_TRANSFER_LINKED_EVENT_FAILED = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_LINKED_EVENT_FAILED;
alias TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN;
alias TB_CREATE_TRANSFER_TIMESTAMP_MUST_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_TIMESTAMP_MUST_BE_ZERO;
alias TB_CREATE_TRANSFER_RESERVED_FLAG = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_RESERVED_FLAG;
alias TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX;
alias TB_CREATE_TRANSFER_FLAGS_ARE_MUTUALLY_EXCLUSIVE = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_FLAGS_ARE_MUTUALLY_EXCLUSIVE;
alias TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX;
alias TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX;
alias TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT;
alias TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO;
alias TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX;
alias TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT;
alias TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER;
alias TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO;
alias TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND;
alias TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND;
alias TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER;
alias TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE;
alias TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED;
alias TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_128 = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_128;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_64 = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_64;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_32 = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_32;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT;
alias TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE;
alias TB_CREATE_TRANSFER_EXISTS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXISTS;
alias TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING;
alias TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING;
alias TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED;
alias TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED;
alias TB_CREATE_TRANSFER_OVERFLOWS_DEBITS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_DEBITS;
alias TB_CREATE_TRANSFER_OVERFLOWS_CREDITS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_CREDITS;
alias TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT;
alias TB_CREATE_TRANSFER_EXCEEDS_CREDITS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXCEEDS_CREDITS;
alias TB_CREATE_TRANSFER_EXCEEDS_DEBITS = TB_CREATE_TRANSFER_RESULT.TB_CREATE_TRANSFER_EXCEEDS_DEBITS;
struct tb_create_accounts_result_t {
uint index;
uint result;
}
struct tb_create_transfers_result_t {
uint index;
uint result;
}
enum TB_OPERATION {
TB_OPERATION_CREATE_ACCOUNTS = 128,
TB_OPERATION_CREATE_TRANSFERS = 129,
TB_OPERATION_LOOKUP_ACCOUNTS = 130,
TB_OPERATION_LOOKUP_TRANSFERS = 131,
}
alias TB_OPERATION_CREATE_ACCOUNTS = TB_OPERATION.TB_OPERATION_CREATE_ACCOUNTS;
alias TB_OPERATION_CREATE_TRANSFERS = TB_OPERATION.TB_OPERATION_CREATE_TRANSFERS;
alias TB_OPERATION_LOOKUP_ACCOUNTS = TB_OPERATION.TB_OPERATION_LOOKUP_ACCOUNTS;
alias TB_OPERATION_LOOKUP_TRANSFERS = TB_OPERATION.TB_OPERATION_LOOKUP_TRANSFERS;
enum TB_PACKET_STATUS {
TB_PACKET_OK = 0,
TB_PACKET_TOO_MUCH_DATA = 1,
TB_PACKET_INVALID_OPERATION = 2,
TB_PACKET_INVALID_DATA_SIZE = 3,
}
alias TB_PACKET_OK = TB_PACKET_STATUS.TB_PACKET_OK;
alias TB_PACKET_TOO_MUCH_DATA = TB_PACKET_STATUS.TB_PACKET_TOO_MUCH_DATA;
alias TB_PACKET_INVALID_OPERATION = TB_PACKET_STATUS.TB_PACKET_INVALID_OPERATION;
alias TB_PACKET_INVALID_DATA_SIZE = TB_PACKET_STATUS.TB_PACKET_INVALID_DATA_SIZE;
enum TB_PACKET_ACQUIRE_STATUS {
TB_PACKET_ACQUIRE_OK = 0,
TB_PACKET_ACQUIRE_CONCURRENCY_MAX_EXCEEDED = 1,
TB_PACKET_ACQUIRE_SHUTDOWN = 2,
}
alias TB_PACKET_ACQUIRE_OK = TB_PACKET_ACQUIRE_STATUS.TB_PACKET_ACQUIRE_OK;
alias TB_PACKET_ACQUIRE_CONCURRENCY_MAX_EXCEEDED = TB_PACKET_ACQUIRE_STATUS.TB_PACKET_ACQUIRE_CONCURRENCY_MAX_EXCEEDED;
alias TB_PACKET_ACQUIRE_SHUTDOWN = TB_PACKET_ACQUIRE_STATUS.TB_PACKET_ACQUIRE_SHUTDOWN;
struct tb_packet_t {
tb_packet_t* next;
void* user_data;
ubyte operation;
ubyte status;
uint data_size;
void* data;
}
alias tb_client_t = void*;
enum TB_STATUS {
TB_STATUS_SUCCESS = 0,
TB_STATUS_UNEXPECTED = 1,
TB_STATUS_OUT_OF_MEMORY = 2,
TB_STATUS_ADDRESS_INVALID = 3,
TB_STATUS_ADDRESS_LIMIT_EXCEEDED = 4,
TB_STATUS_CONCURRENCY_MAX_INVALID = 5,
TB_STATUS_SYSTEM_RESOURCES = 6,
TB_STATUS_NETWORK_SUBSYSTEM = 7,
}
alias TB_STATUS_SUCCESS = TB_STATUS.TB_STATUS_SUCCESS;
alias TB_STATUS_UNEXPECTED = TB_STATUS.TB_STATUS_UNEXPECTED;
alias TB_STATUS_OUT_OF_MEMORY = TB_STATUS.TB_STATUS_OUT_OF_MEMORY;
alias TB_STATUS_ADDRESS_INVALID = TB_STATUS.TB_STATUS_ADDRESS_INVALID;
alias TB_STATUS_ADDRESS_LIMIT_EXCEEDED = TB_STATUS.TB_STATUS_ADDRESS_LIMIT_EXCEEDED;
alias TB_STATUS_CONCURRENCY_MAX_INVALID = TB_STATUS.TB_STATUS_CONCURRENCY_MAX_INVALID;
alias TB_STATUS_SYSTEM_RESOURCES = TB_STATUS.TB_STATUS_SYSTEM_RESOURCES;
alias TB_STATUS_NETWORK_SUBSYSTEM = TB_STATUS.TB_STATUS_NETWORK_SUBSYSTEM;
TB_STATUS tb_client_init(tb_client_t* out_client, uint cluster_id, const(char)* address_ptr, uint address_len, uint packets_count, uintptr_t on_completion_ctx, void function(uintptr_t, tb_client_t, tb_packet_t*, const(ubyte)*, uint) on_completion_fn);
TB_STATUS tb_client_init_echo(tb_client_t* out_client, uint cluster_id, const(char)* address_ptr, uint address_len, uint packets_count, uintptr_t on_completion_ctx, void function(uintptr_t, tb_client_t, tb_packet_t*, const(ubyte)*, uint) on_completion_fn);
TB_PACKET_ACQUIRE_STATUS tb_client_acquire_packet(tb_client_t client, tb_packet_t** out_packet);
void tb_client_release_packet(tb_client_t client, tb_packet_t* packet);
void tb_client_submit(tb_client_t client, tb_packet_t* packet);
void tb_client_deinit(tb_client_t client);
/// Based on tb_client.h
unit TBClient;
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
interface
uses
ctypes;
type
tb_uint128_t = UInt64;
TB_ACCOUNT_FLAGS = (
TB_ACCOUNT_LINKED,
TB_ACCOUNT_DEBITS_MUST_NOT_EXCEED_CREDITS,
TB_ACCOUNT_CREDITS_MUST_NOT_EXCEED_DEBITS
);
tb_account_t = record
id: tb_uint128_t;
debits_pending: tb_uint128_t;
debits_posted: tb_uint128_t;
credits_pending: tb_uint128_t;
credits_posted: tb_uint128_t;
user_data_128: tb_uint128_t;
user_data_64: UInt64;
user_data_32: UInt32;
reserved: UInt32;
ledger: UInt32;
code: UInt16;
flags: UInt16;
timestamp: UInt64;
end;
TB_TRANSFER_FLAGS = (
TB_TRANSFER_LINKED,
TB_TRANSFER_PENDING,
TB_TRANSFER_POST_PENDING_TRANSFER,
TB_TRANSFER_VOID_PENDING_TRANSFER,
TB_TRANSFER_BALANCING_DEBIT,
TB_TRANSFER_BALANCING_CREDIT
);
tb_transfer_t = record
id: tb_uint128_t;
debit_account_id: tb_uint128_t;
credit_account_id: tb_uint128_t;
amount: tb_uint128_t;
pending_id: tb_uint128_t;
user_data_128: tb_uint128_t;
user_data_64: UInt64;
user_data_32: UInt32;
timeout: UInt32;
ledger: UInt32;
code: UInt16;
flags: UInt16;
timestamp: UInt64;
end;
type
TB_CREATE_ACCOUNT_RESULT = (
TB_CREATE_ACCOUNT_OK = 0,
TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = 1,
TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = 2,
TB_CREATE_ACCOUNT_TIMESTAMP_MUST_BE_ZERO = 3,
TB_CREATE_ACCOUNT_RESERVED_FLAG = 4,
TB_CREATE_ACCOUNT_RESERVED_FIELD = 5,
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = 6,
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 7,
TB_CREATE_ACCOUNT_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 8,
TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = 9,
TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = 10,
TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = 11,
TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = 12,
TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = 13,
TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = 14,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = 15,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA = 16,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = 17,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = 18,
TB_CREATE_ACCOUNT_EXISTS = 19
);
type
TB_CREATE_ACCOUNT_RESULT = (
TB_CREATE_ACCOUNT_OK = 0,
TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = 1,
TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = 2,
TB_CREATE_ACCOUNT_TIMESTAMP_MUST_BE_ZERO = 3,
TB_CREATE_ACCOUNT_RESERVED_FIELD = 4,
TB_CREATE_ACCOUNT_RESERVED_FLAG = 5,
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = 6,
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 7,
TB_CREATE_ACCOUNT_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 8,
TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = 9,
TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = 10,
TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = 11,
TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = 12,
TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = 13,
TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = 14,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = 15,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_128 = 16,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_64 = 17,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_32 = 18,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = 19,
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = 20,
TB_CREATE_ACCOUNT_EXISTS = 21
);
type
TB_CREATE_TRANSFER_RESULT = (
TB_CREATE_TRANSFER_OK = 0,
TB_CREATE_TRANSFER_LINKED_EVENT_FAILED = 1,
TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN = 2,
TB_CREATE_TRANSFER_TIMESTAMP_MUST_BE_ZERO = 3,
TB_CREATE_TRANSFER_RESERVED_FLAG = 4,
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO = 5,
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX = 6,
TB_CREATE_TRANSFER_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 7,
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 8,
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 9,
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 10,
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 11,
TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT = 12,
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO = 13,
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO = 14,
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX = 15,
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT = 16,
TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER = 17,
TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO = 18,
TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO = 19,
TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO = 20,
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND = 21,
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND = 22,
TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER = 23,
TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS = 24,
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND = 25,
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING = 26,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID = 27,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID = 28,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER = 29,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE = 30,
TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT = 31,
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT = 32,
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED = 33,
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED = 34,
TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED = 35,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS = 36,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID = 37,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID = 38,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT = 39,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID = 40,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_128 = 41,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_64 = 42,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_32 = 43,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT = 44,
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE = 45,
TB_CREATE_TRANSFER_EXISTS = 46,
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING = 47,
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING = 48,
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED = 49,
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED = 50,
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS = 51,
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS = 52,
TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT = 53,
TB_CREATE_TRANSFER_EXCEEDS_CREDITS = 54,
TB_CREATE_TRANSFER_EXCEEDS_DEBITS = 55,
);
type
tb_create_accounts_result_t = record
index: LongWord;
result: LongWord;
end;
tb_create_transfers_result_t = record
index: LongWord;
result: LongWord;
end;
TB_OPERATION = (
TB_OPERATION_CREATE_ACCOUNTS = 128,
TB_OPERATION_CREATE_TRANSFERS = 129,
TB_OPERATION_LOOKUP_ACCOUNTS = 130,
TB_OPERATION_LOOKUP_TRANSFERS = 131
);
TB_PACKET_STATUS = (
TB_PACKET_OK = 0,
TB_PACKET_TOO_MUCH_DATA = 1,
TB_PACKET_INVALID_OPERATION = 2,
TB_PACKET_INVALID_DATA_SIZE = 3
);
TB_PACKET_ACQUIRE_STATUS = (
TB_PACKET_ACQUIRE_OK = 0,
TB_PACKET_ACQUIRE_CONCURRENCY_MAX_EXCEEDED = 1,
TB_PACKET_ACQUIRE_SHUTDOWN = 2
);
tb_packet_t = record
next: ^tb_packet_t;
user_data: Pointer;
operation: Byte;
status: Byte;
data_size: LongWord;
data: Pointer;
end;
tb_client_t = Pointer;
TB_STATUS = (
TB_STATUS_SUCCESS = 0,
TB_STATUS_UNEXPECTED = 1,
TB_STATUS_OUT_OF_MEMORY = 2,
TB_STATUS_ADDRESS_INVALID = 3,
TB_STATUS_ADDRESS_LIMIT_EXCEEDED = 4,
TB_STATUS_CONCURRENCY_MAX_INVALID = 5,
TB_STATUS_SYSTEM_RESOURCES = 6,
TB_STATUS_NETWORK_SUBSYSTEM = 7
);
function tb_client_init(
out_client: ^tb_client_t;
cluster_id: Cardinal;
address_ptr: PChar;
address_len: Cardinal;
packets_count: Cardinal;
on_completion_ctx: UIntPtr;
on_completion_fn: procedure(on_completion_ctx: UIntPtr; client: tb_client_t; packet: ^tb_packet_t; const data: PByte; data_len: Cardinal)
): TB_STATUS; cdecl;
function tb_client_init_echo(
out_client: ^tb_client_t;
cluster_id: Cardinal;
address_ptr: PChar;
address_len: Cardinal;
packets_count: Cardinal;
on_completion_ctx: UIntPtr;
on_completion_fn: procedure(on_completion_ctx: UIntPtr; client: tb_client_t; packet: ^tb_packet_t; const data: PByte; data_len: Cardinal)
): TB_STATUS; cdecl;
function tb_client_acquire_packet(client: tb_client_t; out out_packet: ^tb_packet_t): TB_PACKET_ACQUIRE_STATUS; cdecl;
procedure tb_client_release_packet(client: tb_client_t; packet: ^tb_packet_t); cdecl;
procedure tb_client_submit(client: tb_client_t; packet: ^tb_packet_t); cdecl;
procedure tb_client_deinit(client: tb_client_t); cdecl;
{$IFDEF MSWINDOWS}
{$DEFINE IS_WINDOWS}
{$ENDIF}
{$IFDEF IS_WINDOWS}
{$DEFINE IS_POSIX}
{$ENDIF}
{$IFDEF IS_POSIX}
{$IFDEF FPC}
{$DEFINE USE_PTHREAD}
{$ELSE}
{$DEFINE USE_POSIX}
{$ENDIF}
{$ENDIF}
{$IFDEF USE_PTHREAD}
{$MODE Delphi}
{$ENDIF}
unit Main;
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
interface
uses
{$IFDEF USE_POSIX}
cthreads, pthreads, unixtype,
{$ENDIF}
{$IFDEF USE_WINDOWS}
Windows,
{$ENDIF}
SysUtils, tb_client;
const
MAX_MESSAGE_SIZE = (1024 * 1024) - 128;
type
completion_context_t = record
reply: array [0..MAX_MESSAGE_SIZE - 1] of Byte;
size: Integer;
completed: Boolean;
{$IFDEF USE_POSIX}
lock: pthread_mutex_t;
cv: pthread_cond_t;
{$ENDIF}
{$IFDEF USE_WINDOWS}
lock: TRTLCriticalSection;
cv: TConditionVariable;
{$ENDIF}
end;
Pcompletion_context_t = ^completion_context_t;
procedure completion_context_init(var ctx: completion_context_t);
procedure completion_context_destroy(var ctx: completion_context_t);
procedure send_request(client: tb_client_t; packet: Ptb_packet_t; ctx: Pcompletion_context_t);
function get_time_ms: Int64;
{$IFDEF USE_POSIX}
procedure on_completion(context: uintptr_t; client: tb_client_t; packet: Ptb_packet_t; data: PByte; size: uint32_t); cdecl;
{$ENDIF}
{$IFDEF USE_WINDOWS}
procedure on_completion(context: uintptr_t; client: tb_client_t; packet: Ptb_packet_t; data: PByte; size: uint32_t); stdcall;
{$ENDIF}
implementation
procedure completion_context_init(var ctx: completion_context_t);
{$IFDEF USE_POSIX}
var
attr: pthread_mutexattr_t;
{$ENDIF}
begin
ctx.completed := False;
{$IFDEF USE_POSIX}
pthread_mutexattr_init(@attr);
pthread_mutex_init(@ctx.lock, @attr);
pthread_cond_init(@ctx.cv, nil);
pthread_mutexattr_destroy(@attr);
{$ENDIF}
{$IFDEF USE_WINDOWS}
InitializeCriticalSection(ctx.lock);
InitializeConditionVariable(ctx.cv);
{$ENDIF}
end;
procedure completion_context_destroy(var ctx: completion_context_t);
begin
{$IFDEF USE_POSIX}
pthread_cond_destroy(@ctx.cv);
pthread_mutex_destroy(@ctx.lock);
{$ENDIF}
{$IFDEF USE_WINDOWS}
DeleteCriticalSection(ctx.lock);
{$ENDIF}
end;
procedure send_request(client: tb_client_t; packet: Ptb_packet_t; ctx: Pcompletion_context_t);
begin
{$IFDEF USE_POSIX}
pthread_mutex_lock(@ctx.lock);
{$ENDIF}
{$IFDEF USE_WINDOWS}
EnterCriticalSection(ctx.lock);
{$ENDIF}
ctx.completed := False;
tb_client_submit(client, packet);
while not ctx.completed do
begin
{$IFDEF USE_POSIX}
pthread_cond_wait(@ctx.cv, @ctx.lock);
{$ENDIF}
{$IFDEF USE_WINDOWS}
SleepConditionVariableCS(@ctx.cv, @ctx.lock, INFINITE);
{$ENDIF}
end;
{$IFDEF USE_POSIX}
pthread_mutex_unlock(@ctx.lock);
{$ENDIF}
{$IFDEF USE_WINDOWS}
LeaveCriticalSection(ctx.lock);
{$ENDIF}
end;
{$IFDEF USE_POSIX}
function get_time_ms: Int64;
{$IFDEF USE_POSIX}
var
tv: timeval;
{$ENDIF}
begin
{$IFDEF USE_POSIX}
gettimeofday(@tv, nil);
Result := Int64(tv.tv_sec) * 1000 + Int64(tv.tv_usec) div 1000;
{$ENDIF}
{$IFDEF USE_WINDOWS}
Result := GetTickCount64;
{$ENDIF}
end;
{$IFDEF USE_POSIX}
procedure on_completion(context: uintptr_t; client: tb_client_t; packet: Ptb_packet_t; data: PByte; size: uint32_t); cdecl;
{$ENDIF}
{$IFDEF USE_WINDOWS}
procedure on_completion(context: uintptr_t; client: tb_client_t; packet: Ptb_packet_t; data: PByte; size: uint32_t); stdcall;
{$ENDIF}
var
ctx: Pcompletion_context_t;
begin
ctx := Pcompletion_context_t(context);
if size <= MAX_MESSAGE_SIZE then
begin
Move(data^, ctx.reply[0], size);
ctx.size := size;
end;
{$IFDEF USE_POSIX}
pthread_mutex_lock(@ctx.lock);
ctx.completed := True;
pthread_cond_signal(@ctx.cv);
pthread_mutex_unlock(@ctx.lock);
{$ENDIF}
{$IFDEF USE_WINDOWS}
EnterCriticalSection(ctx.lock);
ctx.completed := True;
LeaveCriticalSection(ctx.lock);
WakeConditionVariable(ctx.cv);
{$ENDIF}
end;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment