pub struct FFI_TableProvider {
pub statistics: unsafe extern "C" fn(provider: &Self) -> FFI_Option<Vec<u8>>,
pub logical_codec: FFI_LogicalExtensionCodec,
pub version: unsafe extern "C" fn() -> u64,
pub library_marker_id: extern "C" fn() -> usize,
/* private fields */
}Expand description
A stable struct for sharing TableProvider across FFI boundaries.
§Struct Layout
The following description applies to all structs provided in this crate.
Each of the exposed structs in this crate is provided with a variant prefixed
with Foreign. This variant is designed to be used by the consumer of the
foreign code. The Foreign structs should never access the private_data
fields. Instead they should only access the data returned through the function
calls defined on the FFI_ structs. The second purpose of the Foreign
structs is to contain additional data that may be needed by the traits that
are implemented on them. Some of these traits require borrowing data which
can be far more convenient to be locally stored.
For example, we have a struct FFI_TableProvider to give access to the
TableProvider functions like table_type() and scan(). If we write a
library that wishes to expose it’s TableProvider, then we can access the
private data that contains the Arc reference to the TableProvider via
FFI_TableProvider. This data is local to the library.
If we have a program that accesses a TableProvider via FFI, then it
will use ForeignTableProvider. When using ForeignTableProvider we must
not attempt to access the private_data field in FFI_TableProvider. If a
user is testing locally, you may be able to successfully access this field, but
it will only work if you are building against the exact same version of
DataFusion for both libraries and the same compiler. It will not work
in general.
It is worth noting that which library is the local and which is foreign
depends on which interface we are considering. For example, suppose we have a
Python library called my_provider that exposes a TableProvider called
MyProvider via FFI_TableProvider. Within the library my_provider we can
access the private_data via FFI_TableProvider. We connect this to
datafusion-python, where we access it as a ForeignTableProvider. Now when
we call scan() on this interface, we have to pass it a FFI_SessionConfig.
The SessionConfig is local to datafusion-python and not my_provider.
It is important to be careful when expanding these functions to be certain which
side of the interface each object refers to.
Fields§
§statistics: unsafe extern "C" fn(provider: &Self) -> FFI_Option<Vec<u8>>Snapshot the provider’s table-level statistics. FFI_Option::None
corresponds to TableProvider::statistics returning None;
Some(bytes) is a prost-encoded datafusion_proto_common::Statistics.
logical_codec: FFI_LogicalExtensionCodec§version: unsafe extern "C" fn() -> u64Return the major DataFusion version number of this provider.
library_marker_id: extern "C" fn() -> usizeUtility to identify when FFI objects are accessed locally through
the foreign interface. See crate::get_library_marker_id and
the crate’s README.md for more information.
Implementations§
Source§impl FFI_TableProvider
impl FFI_TableProvider
Sourcepub fn new(
provider: Arc<dyn TableProvider>,
can_support_pushdown_filters: bool,
runtime: Option<Handle>,
task_ctx_provider: impl Into<FFI_TaskContextProvider>,
logical_codec: Option<Arc<dyn LogicalExtensionCodec>>,
) -> Self
pub fn new( provider: Arc<dyn TableProvider>, can_support_pushdown_filters: bool, runtime: Option<Handle>, task_ctx_provider: impl Into<FFI_TaskContextProvider>, logical_codec: Option<Arc<dyn LogicalExtensionCodec>>, ) -> Self
Creates a new FFI_TableProvider.
pub fn new_with_ffi_codec( provider: Arc<dyn TableProvider>, can_support_pushdown_filters: bool, runtime: Option<Handle>, logical_codec: FFI_LogicalExtensionCodec, ) -> Self
Trait Implementations§
Source§impl Clone for FFI_TableProvider
impl Clone for FFI_TableProvider
Source§impl Debug for FFI_TableProvider
impl Debug for FFI_TableProvider
Source§impl Drop for FFI_TableProvider
impl Drop for FFI_TableProvider
Source§impl From<&FFI_TableProvider> for Arc<dyn TableProvider>
impl From<&FFI_TableProvider> for Arc<dyn TableProvider>
Source§fn from(provider: &FFI_TableProvider) -> Self
fn from(provider: &FFI_TableProvider) -> Self
impl Send for FFI_TableProvider
impl Sync for FFI_TableProvider
Auto Trait Implementations§
impl Freeze for FFI_TableProvider
impl RefUnwindSafe for FFI_TableProvider
impl Unpin for FFI_TableProvider
impl UnsafeUnpin for FFI_TableProvider
impl UnwindSafe for FFI_TableProvider
Blanket Implementations§
Source§impl<Source> AccessAs for Source
impl<Source> AccessAs for Source
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more