Skip to main content

Module init_data

Module init_data 

Source
Expand description

Type-safe init data management for table functions.

DuckDB table functions have two init phases:

  • Global init (init): Called once per query. Use FfiInitData to store global scan state (e.g., a file handle, row counter shared across threads).
  • Local init (local_init): Called once per thread. Use FfiLocalInitData to 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§

FfiInitData
Type-safe global init data for DuckDB table functions.
FfiLocalInitData
Type-safe per-thread local init data for DuckDB table functions.