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#![deny(clippy::allow_attributes)]
28
29pub mod arrow_wrappers;
30pub mod catalog_provider;
31pub mod catalog_provider_list;
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_source;
44pub mod udaf;
45pub mod udf;
46pub mod udtf;
47pub mod udwf;
48pub mod util;
49pub mod volatility;
50
51#[cfg(feature = "integration-tests")]
52pub mod tests;
53
54/// Returns the major version of the FFI implementation. If the API evolves,
55/// we use the major version to identify compatibility over the unsafe
56/// boundary. This call is intended to be used by implementers to validate
57/// they have compatible libraries.
58pub extern "C" fn version() -> u64 {
59    let version_str = env!("CARGO_PKG_VERSION");
60    let version = semver::Version::parse(version_str).expect("Invalid version string");
61    version.major
62}
63
64static LIBRARY_MARKER: u8 = 0;
65
66/// This utility is used to determine if two FFI structs are within
67/// the same library. It is possible that the interplay between
68/// foreign and local functions calls create one FFI struct that
69/// references another. It is helpful to determine if a foreign
70/// struct in the same library or called from a different one.
71/// If we are in the same library, then we can access the underlying
72/// types directly.
73///
74/// This function works by checking the address of the library
75/// marker. Each library that implements the FFI code will have
76/// a different address for the marker. By checking the marker
77/// address we can determine if a struct is truly foreign or is
78/// actually within the same originating library.
79///
80/// See the crate's `README.md` for additional information.
81pub extern "C" fn get_library_marker_id() -> usize {
82    &LIBRARY_MARKER as *const u8 as usize
83}
84
85/// For unit testing in this crate we need to trick the providers
86/// into thinking we have a foreign call. We do this by overwriting
87/// their `library_marker_id` function to return a different value.
88#[cfg(test)]
89pub(crate) extern "C" fn mock_foreign_marker_id() -> usize {
90    get_library_marker_id() + 1
91}
92
93#[cfg(doctest)]
94doc_comment::doctest!("../README.md", readme_example_test);