Skip to main content

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