Expand description
Type-safe init data management for table functions.
DuckDB table functions have two init phases:
- Global init (
init): Called once per query. UseFfiInitDatato store global scan state (e.g., a file handle, row counter shared across threads). - Local init (
local_init): Called once per thread. UseFfiLocalInitDatato store per-thread scan state (e.g., a thread-local buffer or offset).
§Example
use quack_rs::table::{FfiInitData, FfiLocalInitData};
use libduckdb_sys::{duckdb_init_info, duckdb_function_info};
struct GlobalState { rows_remaining: u64 }
struct LocalState { thread_offset: u64 }
unsafe extern "C" fn my_init(info: duckdb_init_info) {
unsafe { FfiInitData::<GlobalState>::set(info, GlobalState { rows_remaining: 1000 }); }
}
unsafe extern "C" fn my_local_init(info: duckdb_init_info) {
unsafe { FfiLocalInitData::<LocalState>::set(info, LocalState { thread_offset: 0 }); }
}
unsafe extern "C" fn my_scan(info: duckdb_function_info, _output: libduckdb_sys::duckdb_data_chunk) {
let _global = unsafe { FfiInitData::<GlobalState>::get(info) };
let _local = unsafe { FfiLocalInitData::<LocalState>::get(info) };
}Structs§
- FfiInit
Data - Type-safe global init data for
DuckDBtable functions. - FfiLocal
Init Data - Type-safe per-thread local init data for
DuckDBtable functions.