#![warn(missing_docs)]
extern crate no_panic;
pub mod pg_alloc;
#[cfg(feature = "pg_v10")]
pub mod pg_bool;
pub mod pg_datum;
pub mod pg_error;
pub mod pg_sys;
#[macro_export]
macro_rules! pg_magic {
(version: $vers:expr) => {
#[global_allocator]
static GLOBAL: pg_extend::pg_alloc::PgAllocator = pg_extend::pg_alloc::PgAllocator;
#[no_mangle]
#[allow(non_snake_case)]
#[allow(unused)]
#[link_name = "Pg_magic_func"]
pub extern "C" fn Pg_magic_func() -> &'static pg_extend::pg_sys::Pg_magic_struct {
use pg_extend::{pg_sys, register_panic_handler};
use std::mem::size_of;
use std::os::raw::c_int;
const my_magic: pg_extend::pg_sys::Pg_magic_struct = pg_sys::Pg_magic_struct {
len: size_of::<pg_sys::Pg_magic_struct>() as c_int,
version: $vers as std::os::raw::c_int / 100,
funcmaxargs: pg_sys::FUNC_MAX_ARGS as c_int,
indexmaxkeys: pg_sys::INDEX_MAX_KEYS as c_int,
namedatalen: pg_sys::NAMEDATALEN as c_int,
float4byval: pg_sys::USE_FLOAT4_BYVAL as c_int,
float8byval: pg_sys::USE_FLOAT8_BYVAL as c_int,
};
register_panic_handler();
&my_magic
}
};
}
pub fn get_args(
func_call_info: &pg_sys::FunctionCallInfoData,
) -> (&[pg_sys::Datum], &[bool]) {
let num_args = func_call_info.nargs as usize;
let args: &[pg_sys::Datum] = &func_call_info.arg[..num_args];
let args_null: &[bool] = &func_call_info.argnull[..num_args];
(args, args_null)
}
pub fn register_panic_handler() {
use std::panic;
use crate::pg_error;
panic::set_hook(Box::new(|info| {
let level = pg_error::Level::Fatal;
pg_error::log(level, file!(), line!(), module_path!(), format!("panic in Rust extension: {}", info));
}));
}