Skip to main content

FFI_TableProvider

Struct FFI_TableProvider 

Source
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() -> u64

Return the major DataFusion version number of this provider.

§library_marker_id: extern "C" fn() -> usize

Utility 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

Source

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.

Source

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

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FFI_TableProvider

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for FFI_TableProvider

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl From<&FFI_TableProvider> for Arc<dyn TableProvider>

Source§

fn from(provider: &FFI_TableProvider) -> Self

Converts to this type from the input type.
Source§

impl Send for FFI_TableProvider

Source§

impl Sync for FFI_TableProvider

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<Source> AccessAs for Source

Source§

fn ref_as<T>(&self) -> <Source as IGuardRef<T>>::Guard<'_>
where Source: IGuardRef<T>, T: ?Sized,

Provides immutable access to a type as if it were its ABI-unstable equivalent.
Source§

fn mut_as<T>(&mut self) -> <Source as IGuardMut<T>>::GuardMut<'_>
where Source: IGuardMut<T>, T: ?Sized,

Provides mutable access to a type as if it were its ABI-unstable equivalent.
Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, As> IGuardMut<As> for T
where T: Into<As>, As: Into<T>,

Source§

type GuardMut<'a> = MutAs<'a, T, As> where T: 'a

The type of the guard which will clean up the temporary after applying its changes to the original.
Source§

fn guard_mut_inner(&mut self) -> <T as IGuardMut<As>>::GuardMut<'_>

Construct the temporary and guard it through a mutable reference.
Source§

impl<T, As> IGuardRef<As> for T
where T: Into<As>, As: Into<T>,

Source§

type Guard<'a> = RefAs<'a, T, As> where T: 'a

The type of the guard which will clean up the temporary.
Source§

fn guard_ref_inner(&self) -> <T as IGuardRef<As>>::Guard<'_>

Construct the temporary and guard it through an immutable reference.
Source§

impl<T> Includes<End> for T

Source§

type Output = End

The result
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V