Wrappers

Wrappers is a development framework for Postgres Foreign Data Wrappers (FDW), written in Rust. Its goal is to make Postgres FDW development easier while keeping Rust language's modern capabilities, such as high performance, strong types, and safety.

Features

Installation

Wrappers is a pgx extension, so you can follow the installation steps as mentioned by pgx.

Developing a FDW

To develop a FDW using Wrappers, you only need to implement the ForeignDataWrapper trait.

```rust pub trait ForeignDataWrapper { // function for query planning fn getrelsize(...) -> (i64, i32)

// functions for data scan, e.g. select
fn begin_scan(...);
fn iter_scan(...) -> Option<Row>;
fn re_scan(...);
fn end_scan(...);

// functions for data modify, e.g. insert, update and delete
fn begin_modify(...);
fn insert(...);
fn update(...);
fn delete(...);
fn end_modify(...);

} ```

In a minimum FDW, which supports data scan only, begin_scan(), iter_scan() and end_scan() are required, all the other functions are optional.

Below are some FDWs developed using this framework, check them out:

Basic usage

These steps outline how to use the a demo FDW HelloWorldFdw:

  1. Clone this repo

bash git clone https://github.com/supabase/wrappers.git

  1. Run it using pgx with feature:

bash cd wrappers/wrappers cargo pgx run --features helloworld_fdw

  1. Create the extension, foreign data wrapper and related objects:

```sql -- create extension drop extension if exists wrappers cascade; create extension wrappers;

-- create foreign data wrapper and enable 'HelloWorldFdw' drop foreign data wrapper if exists wrappershelloworld cascade; create foreign data wrapper wrappershelloworld handler wrappershandler validator wrappersvalidator options ( wrapper 'HelloWorldFdw' );

-- create server and specify custom options drop server if exists myhelloworldserver cascade; create server myhelloworldserver foreign data wrapper wrappers_helloworld options ( foo 'bar' );

-- create an example foreign table drop foreign table if exists balance; create foreign table hello ( id bigint, col text ) server myhelloworldserver options ( foo 'bar' ); ```

  1. Run a query to check if it is working:

sql wrappers=# select * from hello; id | col ----+------------- 0 | Hello world (1 row)

Limitations

Contribution

All contributions, feature requests, bug report or ideas are welcomed.

License

Apache License Version 2.0