datafusion_ffi/lib.rs
1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements. See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership. The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License. You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied. See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18#![doc(
19 html_logo_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg",
20 html_favicon_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg"
21)]
22#![cfg_attr(docsrs, feature(doc_cfg))]
23// Make sure fast / cheap clones on Arc are explicit:
24// https://github.com/apache/datafusion/issues/11143
25#![deny(clippy::clone_on_ref_ptr)]
26#![cfg_attr(test, allow(clippy::needless_pass_by_value))]
27
28pub mod arrow_wrappers;
29pub mod catalog_provider;
30pub mod catalog_provider_list;
31pub mod config;
32pub mod execution;
33pub mod execution_plan;
34pub mod expr;
35pub mod insert_op;
36pub mod physical_expr;
37pub mod plan_properties;
38pub mod proto;
39pub mod record_batch_stream;
40pub mod schema_provider;
41pub mod session;
42pub mod table_provider;
43pub mod table_provider_factory;
44pub mod table_source;
45pub mod udaf;
46pub mod udf;
47pub mod udtf;
48pub mod udwf;
49pub mod util;
50pub mod volatility;
51
52#[cfg(feature = "integration-tests")]
53pub mod tests;
54
55/// Returns the major version of the FFI implementation. If the API evolves,
56/// we use the major version to identify compatibility over the unsafe
57/// boundary. This call is intended to be used by implementers to validate
58/// they have compatible libraries.
59pub extern "C" fn version() -> u64 {
60 let version_str = env!("CARGO_PKG_VERSION");
61 let version = semver::Version::parse(version_str).expect("Invalid version string");
62 version.major
63}
64
65static LIBRARY_MARKER: u8 = 0;
66
67/// This utility is used to determine if two FFI structs are within
68/// the same library. It is possible that the interplay between
69/// foreign and local functions calls create one FFI struct that
70/// references another. It is helpful to determine if a foreign
71/// struct in the same library or called from a different one.
72/// If we are in the same library, then we can access the underlying
73/// types directly.
74///
75/// This function works by checking the address of the library
76/// marker. Each library that implements the FFI code will have
77/// a different address for the marker. By checking the marker
78/// address we can determine if a struct is truly foreign or is
79/// actually within the same originating library.
80///
81/// See the crate's `README.md` for additional information.
82pub extern "C" fn get_library_marker_id() -> usize {
83 &LIBRARY_MARKER as *const u8 as usize
84}
85
86/// For unit testing in this crate we need to trick the providers
87/// into thinking we have a foreign call. We do this by overwriting
88/// their `library_marker_id` function to return a different value.
89#[cfg(test)]
90pub(crate) extern "C" fn mock_foreign_marker_id() -> usize {
91 get_library_marker_id() + 1
92}
93
94#[cfg(doctest)]
95doc_comment::doctest!("../README.md", readme_example_test);