Skip to main content

laminar_db/ffi/
mod.rs

1//! C FFI layer for LaminarDB.
2//!
3//! This module provides `extern "C"` functions for calling LaminarDB from C
4//! and any language with C FFI support (Python, Java, Node.js, .NET, etc.).
5//!
6//! # Design
7//!
8//! - **Opaque handles**: C sees pointers, not struct layouts
9//! - **Explicit memory management**: Caller frees with `*_free()` functions
10//! - **Error codes**: All functions return `i32` (0 = success, negative = error)
11//! - **Out-parameters**: Results returned via pointer arguments
12//! - **Thread-local errors**: `laminar_last_error()` returns the last error message
13//!
14//! # Example (C)
15//!
16//! ```c
17//! #include "laminar.h"
18//!
19//! int main() {
20//!     LaminarConnection* conn = NULL;
21//!     int32_t rc = laminar_open(&conn);
22//!     if (rc != LAMINAR_OK) {
23//!         printf("Error: %s\n", laminar_last_error());
24//!         return 1;
25//!     }
26//!
27//!     rc = laminar_execute(conn, "CREATE SOURCE test (id BIGINT)", NULL);
28//!     laminar_close(conn);
29//!     return 0;
30//! }
31//! ```
32
33mod arrow_ffi;
34mod callback;
35mod connection;
36mod error;
37mod memory;
38mod query;
39mod schema;
40mod writer;
41
42// Re-export all FFI functions
43pub use arrow_ffi::{
44    laminar_batch_create, laminar_batch_export, laminar_batch_export_column, laminar_batch_import,
45    laminar_schema_export,
46};
47pub use callback::{
48    laminar_subscribe_callback, laminar_subscription_cancel, laminar_subscription_free,
49    laminar_subscription_is_active, laminar_subscription_user_data, LaminarErrorCallback,
50    LaminarSubscriptionCallback, LaminarSubscriptionHandle, LAMINAR_EVENT_DELETE,
51    LAMINAR_EVENT_INSERT, LAMINAR_EVENT_SNAPSHOT, LAMINAR_EVENT_UPDATE, LAMINAR_EVENT_WATERMARK,
52};
53pub use connection::{
54    laminar_close, laminar_execute, laminar_is_closed, laminar_open, laminar_query,
55    laminar_query_stream, laminar_start, LaminarConnection,
56};
57pub use error::{
58    laminar_clear_error, laminar_last_error, laminar_last_error_code, LAMINAR_ERR_CONNECTION,
59    LAMINAR_ERR_INGESTION, LAMINAR_ERR_INTERNAL, LAMINAR_ERR_INVALID_UTF8,
60    LAMINAR_ERR_NULL_POINTER, LAMINAR_ERR_QUERY, LAMINAR_ERR_SCHEMA_MISMATCH, LAMINAR_ERR_SHUTDOWN,
61    LAMINAR_ERR_SUBSCRIPTION, LAMINAR_ERR_TABLE_EXISTS, LAMINAR_ERR_TABLE_NOT_FOUND, LAMINAR_OK,
62};
63pub use memory::{laminar_string_free, laminar_version};
64pub use query::{
65    laminar_batch_free, laminar_batch_num_columns, laminar_batch_num_rows, laminar_result_free,
66    laminar_result_get_batch, laminar_result_num_batches, laminar_result_num_rows,
67    laminar_result_schema, laminar_stream_cancel, laminar_stream_free, laminar_stream_is_active,
68    laminar_stream_next, laminar_stream_schema, laminar_stream_try_next, LaminarQueryResult,
69    LaminarQueryStream, LaminarRecordBatch,
70};
71pub use schema::{
72    laminar_get_schema, laminar_list_sources, laminar_schema_field_name, laminar_schema_field_type,
73    laminar_schema_free, laminar_schema_num_fields, LaminarSchema,
74};
75pub use writer::{
76    laminar_writer_close, laminar_writer_create, laminar_writer_flush, laminar_writer_free,
77    laminar_writer_write, LaminarWriter,
78};