C API
libturbolynx.so exposes a C-compatible interface for embedding TurboLynx directly into native applications. Include turbolynx.h and link against libturbolynx.so.
Connection
turbolynx_connect
Open a database in read-write mode and return a connection ID (>= 0). Returns -1 on failure. Acquires an exclusive writer lock — only one writer may be open at a time.
turbolynx_connect_readonly
Open an existing database in read-only mode. Multiple readers may coexist. Fails if a writer holds the exclusive lock.
turbolynx_disconnect
Close the connection and release all associated resources and locks.
turbolynx_reopen
Check whether the catalog has changed since this connection was opened. Returns 1 if the catalog version changed (reconnect recommended), 0 if up-to-date, -1 on error.
turbolynx_is_connected
Returns TURBOLYNX_CONNECTED or TURBOLYNX_NOT_CONNECTED.
turbolynx_get_last_error
Retrieve the error code and message from the most recent failed call.
turbolynx_get_version
Return a version string, e.g. "1.0.0".
Metadata
turbolynx_get_metadata_from_catalog
turbolynx_num_metadata turbolynx_get_metadata_from_catalog(
int64_t conn_id,
turbolynx_label_name label,
bool like_flag,
bool filter_flag,
turbolynx_metadata **metadata
);
List vertex labels and edge types registered in the catalog. Pass NULL for label to retrieve all entries. Returns the count; populate *metadata as a linked list.
turbolynx_close_metadata
Free the metadata linked list returned by turbolynx_get_metadata_from_catalog.
turbolynx_get_property_from_catalog
turbolynx_num_properties turbolynx_get_property_from_catalog(
int64_t conn_id,
turbolynx_label_name label,
turbolynx_metadata_type type,
turbolynx_property **property
);
Retrieve the property schema (names and types) for a given label. type is TURBOLYNX_NODE or TURBOLYNX_EDGE.
turbolynx_close_property
Free the property linked list.
Query Execution
turbolynx_prepare
Parse and plan a Cypher query string. Returns a prepared statement, or NULL on parse error.
turbolynx_close_prepared_statement
Free a prepared statement.
turbolynx_execute
turbolynx_num_rows turbolynx_execute(
int64_t conn_id,
turbolynx_prepared_statement *stmt,
turbolynx_resultset_wrapper **result
);
Execute the prepared statement. Returns the total number of result rows; populates *result.
turbolynx_close_resultset
Free the result set.
Result Iteration
turbolynx_fetch_next
Advance the cursor to the next row. Returns:
| Value | Meaning |
|---|---|
TURBOLYNX_MORE_RESULT (1) |
Row available — call getters |
TURBOLYNX_END_OF_RESULT (0) |
No more rows |
TURBOLYNX_ERROR_RESULT (-1) |
Error |
Getters
After a successful turbolynx_fetch_next, read column values by zero-based col_idx:
| Function | Return type |
|---|---|
turbolynx_get_bool(result, col_idx) |
bool |
turbolynx_get_int8(result, col_idx) |
int8_t |
turbolynx_get_int16(result, col_idx) |
int16_t |
turbolynx_get_int32(result, col_idx) |
int32_t |
turbolynx_get_int64(result, col_idx) |
int64_t |
turbolynx_get_uint8(result, col_idx) |
uint8_t |
turbolynx_get_uint16(result, col_idx) |
uint16_t |
turbolynx_get_uint32(result, col_idx) |
uint32_t |
turbolynx_get_uint64(result, col_idx) |
uint64_t |
turbolynx_get_float(result, col_idx) |
float |
turbolynx_get_double(result, col_idx) |
double |
turbolynx_get_date(result, col_idx) |
turbolynx_date |
turbolynx_get_time(result, col_idx) |
turbolynx_time |
turbolynx_get_timestamp(result, col_idx) |
turbolynx_timestamp |
turbolynx_get_varchar(result, col_idx) |
turbolynx_string |
turbolynx_get_decimal(result, col_idx) |
turbolynx_decimal |
turbolynx_get_id(result, col_idx) |
uint64_t |
Parameter Binding
Bind typed values to ? placeholders in a prepared statement before calling turbolynx_execute. Parameters are 1-indexed.
turbolynx_state turbolynx_bind_boolean(stmt, idx_t param_idx, bool val);
turbolynx_state turbolynx_bind_int8 (stmt, idx_t param_idx, int8_t val);
turbolynx_state turbolynx_bind_int16 (stmt, idx_t param_idx, int16_t val);
turbolynx_state turbolynx_bind_int32 (stmt, idx_t param_idx, int32_t val);
turbolynx_state turbolynx_bind_int64 (stmt, idx_t param_idx, int64_t val);
turbolynx_state turbolynx_bind_float (stmt, idx_t param_idx, float val);
turbolynx_state turbolynx_bind_double (stmt, idx_t param_idx, double val);
turbolynx_state turbolynx_bind_varchar(stmt, idx_t param_idx, const char *val);
turbolynx_state turbolynx_bind_date (stmt, idx_t param_idx, turbolynx_date val);
turbolynx_state turbolynx_bind_time (stmt, idx_t param_idx, turbolynx_time val);
turbolynx_state turbolynx_bind_timestamp(stmt, idx_t param_idx, turbolynx_timestamp val);
turbolynx_state turbolynx_bind_null (stmt, idx_t param_idx);
Date binding example — days since 1970-01-01:
turbolynx_date d = {14}; // 1970-01-15
turbolynx_bind_date(stmt, 1, d);
// or use the string form:
turbolynx_bind_date_string(stmt, 1, "1970-01-15");
Decimal binding example:
turbolynx_hugeint hi = {100010, 0};
turbolynx_decimal dec = {6, 2, hi}; // represents 1000.10
turbolynx_bind_decimal(stmt, 1, dec);
Types
Date / Time / Timestamp
typedef struct { int32_t days; } turbolynx_date; // days since 1970-01-01
typedef struct { int64_t micros; } turbolynx_time; // microseconds since 00:00:00
typedef struct { int64_t micros; } turbolynx_timestamp; // microseconds since 1970-01-01
String
The data pointer is valid until turbolynx_close_resultset is called.
Decimal
Use turbolynx_decimal_to_string(val) to convert to a human-readable string.
Error Codes
| Constant | Value | Meaning |
|---|---|---|
TURBOLYNX_NO_ERROR |
0 | Success |
TURBOLYNX_ERROR_CONNECTION_FAILED |
-1 | Could not open database |
TURBOLYNX_ERROR_INVALID_STATEMENT |
-2 | Parse or plan error |
TURBOLYNX_ERROR_INVALID_PARAMETER_INDEX |
-3 | Bind index out of range |
TURBOLYNX_ERROR_UNSUPPORTED_OPERATION |
-4 | Operation not supported |
TURBOLYNX_ERROR_INVALID_METADATA |
-5 | Bad metadata handle |
TURBOLYNX_ERROR_INVALID_LABEL |
-6 | Label not found in catalog |
TURBOLYNX_ERROR_INVALID_PROPERTY |
-7 | Property not found |
TURBOLYNX_ERROR_INVALID_RESULT_SET |
-12 | Bad result set handle |
TURBOLYNX_ERROR_INVALID_COLUMN_INDEX |
-13 | Column index out of range |
TURBOLYNX_ERROR_INVALID_COLUMN_TYPE |
-14 | Type mismatch on getter |
TURBOLYNX_ERROR_INVALID_CURSOR |
-15 | fetch_next not called |
Example
#include "main/capi/turbolynx.h"
#include <stdio.h>
int main(void) {
// Open database
int64_t conn = turbolynx_connect("/path/to/db");
if (conn < 0) { fprintf(stderr, "connect failed\n"); return 1; }
// Prepare query
turbolynx_prepared_statement *stmt =
turbolynx_prepare(conn, "MATCH (n:Person) RETURN n.firstName, n.age LIMIT 5;");
// Execute
turbolynx_resultset_wrapper *result = NULL;
turbolynx_num_rows nrows = turbolynx_execute(conn, stmt, &result);
printf("%zu rows\n", nrows);
// Iterate
while (turbolynx_fetch_next(result) == TURBOLYNX_MORE_RESULT) {
turbolynx_string name = turbolynx_get_varchar(result, 0);
int32_t age = turbolynx_get_int32(result, 1);
printf("%.*s — %d\n", (int)name.size, name.data, age);
}
// Clean up
turbolynx_close_resultset(result);
turbolynx_close_prepared_statement(stmt);
turbolynx_disconnect(conn);
return 0;
}
Compile: