From 8463572beae5c5e8df59e12107a8cecee3ea8680 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 16 Apr 2023 22:07:36 +0200 Subject: [PATCH] fix SPI build --- src/exchangedb/spi/Makefile | 1 + src/exchangedb/spi/README.md | 60 +++++++------- src/exchangedb/spi/own_test.c | 36 ++++----- src/exchangedb/spi/own_test.sql | 135 ++++++++++++++------------------ 4 files changed, 107 insertions(+), 125 deletions(-) diff --git a/src/exchangedb/spi/Makefile b/src/exchangedb/spi/Makefile index 9c84bf75b..d654d91e9 100644 --- a/src/exchangedb/spi/Makefile +++ b/src/exchangedb/spi/Makefile @@ -1,6 +1,7 @@ EXTENSION = own_test MODULES = own_test DATA = own_test.sql +PG_CPPFLAGS = -I /usr/include/postgresql # postgresql build stuff PG_CONFIG = pg_config diff --git a/src/exchangedb/spi/README.md b/src/exchangedb/spi/README.md index ec6a9016a..47eb37b94 100644 --- a/src/exchangedb/spi/README.md +++ b/src/exchangedb/spi/README.md @@ -1,41 +1,37 @@ - Server Programming Interface (SPI) + Server Programming Interface (SPI) -Dependencies: -============= - -These are the direct dependencies for running SPI functions : - - - -Step 1: -"postgresql-server-dev-" --- sudo apt-get install libpq-dev postgresql-server-dev-13 - -Step 2: -To solve gssapi/gssapi.h, use the following command: -apt-get install libkrb5-dev - -Step 3: -apt-cache search openssl | grep -- -dev -apt-get install libssl-dev - -Compile: +Overview ======== -gcc -shared -o .so .c -CALL FUNCTIONS: -=============== +This folder contains results from an experiment by Joseph Xu +to use the Postgres SPI. They are not currently used at all +by the GNU Taler exchange. -psql -c "SELECT ();" db_name -Structure: -========== +Dependencies +============ -usr/include/postgres/ +These are the direct dependencies for compiling the code: -usr/include/postgres/13/server/ +# apt-get install libpq-dev postgresql-server-dev-13 +# apt-get install libkrb5-dev +# apt-get install libssl-dev -make -make install -psql \ No newline at end of file + +Compilation +=========== + +$ make + +Loading functions +================= + +# make install +$ psql "$DB_NAME" < own_test.sql + + +Calling functions +================== + +$ psql -c "SELECT $FUNCTION_NAME($ARGS);" "$DB_NAME" diff --git a/src/exchangedb/spi/own_test.c b/src/exchangedb/spi/own_test.c index 7da89cbd2..ac72fad7b 100644 --- a/src/exchangedb/spi/own_test.c +++ b/src/exchangedb/spi/own_test.c @@ -2,17 +2,17 @@ #include #include -#include -#include +#include +#include #include #include #include #include #include -#include "utils/array.h" +#include #include -#include "utils/numeric.h" -#include "utils/timestamp.h" +#include +#include #include #ifdef PG_MODULE_MAGIC @@ -66,7 +66,7 @@ pg_spi_prepare_example (PG_FUNCTION_ARGS) { if (prepared_plan == NULL) { - new_plan = SPI_prepare ("SELECT 1 FROM joseph_test.X", 0, NULL); + new_plan = SPI_prepare ("SELECT 1 FROM X", 0, NULL); prepared_plan = SPI_saveplan (new_plan); if (prepared_plan == NULL) @@ -112,7 +112,7 @@ pg_spi_prepare_example_without_saveplan (PG_FUNCTION_ARGS) } { - new_plan = SPI_prepare ("SELECT 1 FROM joseph_test.X", 0, NULL); + new_plan = SPI_prepare ("SELECT 1 FROM X", 0, NULL); ret = SPI_execute_plan (new_plan, NULL, 0,false, 0); if (ret != SPI_OK_SELECT) { @@ -142,7 +142,7 @@ Datum pg_spi_select_from_x (PG_FUNCTION_ARGS) { int ret; - char *query = "SELECT 1 FROM joseph_test.X"; + char *query = "SELECT 1 FROM X"; uint64 proc; ret = SPI_connect (); @@ -172,7 +172,7 @@ pg_spi_insert_int (PG_FUNCTION_ARGS) int nargs; Oid argtypes[1]; Datum values[1]; - char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)"; + char *query = "INSERT INTO X (a) VALUES ($1)"; ret = SPI_connect (); if (ret != SPI_OK_CONNECT) @@ -204,7 +204,7 @@ pg_spi_prepare_insert (PG_FUNCTION_ARGS) int nargs; Oid argtypes[1]; Datum values[1]; - char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)"; + const char *query = "INSERT INTO X (a) VALUES ($1)"; SPIPlanPtr new_plan; ret = SPI_connect (); if (ret != SPI_OK_CONNECT) @@ -252,7 +252,7 @@ pg_spi_prepare_insert_bytea(PG_FUNCTION_ARGS) Datum values[1]; Oid argtypes2[1]; Datum val[1]; - char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)"; + char *query = "INSERT INTO X (a) VALUES ($1)"; SPIPlanPtr new_plan; ret = SPI_connect(); if (ret != SPI_OK_CONNECT) @@ -296,7 +296,7 @@ pg_spi_prepare_insert_without_saveplan (PG_FUNCTION_ARGS) int nargs; Oid argtypes[1]; Datum values[1]; - char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)"; + const char *query = "INSERT INTO X (a) VALUES ($1)"; SPIPlanPtr new_plan; ret = SPI_connect (); if (ret != SPI_OK_CONNECT) @@ -333,7 +333,7 @@ pg_spi_select_pair_from_y(PG_FUNCTION_ARGS) int ret; valuest result; bool isnull; - char *query = "SELECT 1,1 FROM joseph_test.Y"; + char *query = "SELECT 1,1 FROM Y"; result.col1 = 0; result.col2 = 0; @@ -368,7 +368,7 @@ pg_spi_select_with_cond(PG_FUNCTION_ARGS) Oid argtypes[1]; Datum values[1]; uint64 proc; - query = "SELECT col1 FROM joseph_test.Y WHERE col2 = $1"; + query = "SELECT col1 FROM Y WHERE col2 = $1"; ret = SPI_connect(); if (ret != SPI_OK_CONNECT) { @@ -401,7 +401,7 @@ Datum pg_spi_prepare_select_with_cond(PG_FUNCTION_ARGS) { uint64 proc; int nargs; Oid argtypes[1]; - char *query = "SELECT col1 FROM joseph_test.Y WHERE col1 = $1"; + char *query = "SELECT col1 FROM Y WHERE col1 = $1"; int result = 0; ret = SPI_connect(); @@ -461,7 +461,7 @@ pg_spi_prepare_select_with_cond_without_saveplan (PG_FUNCTION_ARGS) uint64 proc; int nargs; Oid argtypes[1]; - char *query = "SELECT col1 FROM joseph_test.Y WHERE col2 = $1"; + char *query = "SELECT col1 FROM Y WHERE col2 = $1"; int result = 0; ret = SPI_connect (); @@ -519,7 +519,7 @@ pg_spi_update_y (PG_FUNCTION_ARGS) int nargs; Oid argtypes[1]; Datum values[1]; - char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)"; + const char *query = "UPDATE Y SET col1 = 4 WHERE (col2 = $1)"; ret = SPI_connect (); if (ret != SPI_OK_CONNECT) @@ -552,7 +552,7 @@ pg_spi_prepare_update (PG_FUNCTION_ARGS) int nargs; Oid argtypes[1]; Datum values[1]; - char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)"; + const char *query = "UPDATE Y SET col1 = 4 WHERE (col2 = $1)"; ret = SPI_connect (); if (ret != SPI_OK_CONNECT) diff --git a/src/exchangedb/spi/own_test.sql b/src/exchangedb/spi/own_test.sql index 9fe42c0a4..12729d068 100644 --- a/src/exchangedb/spi/own_test.sql +++ b/src/exchangedb/spi/own_test.sql @@ -1,42 +1,20 @@ - -DROP TABLE joseph_test.X; -CREATE TABLE joseph_test.X ( +DROP TABLE IF EXISTS X; +CREATE TABLE X ( a integer ); -INSERT INTO joseph_test.X (a) VALUES (1), (2), (3), (4), (5), (6), (7); - -DROP TABLE joseph_test.Y; -CREATE TABLE joseph_test.Y (col1 INT, col2 INT); -INSERT INTO joseph_test.Y (col1,col2) VALUES (1,2), (2,0), (0,4), (4,0), (0,6), (6,7), (7,8); - -DROP TABLE joseph_test.Z; -CREATE TABLE joseph_test.Z(col1 BYTEA); -DROP TABLE deposits; -/*CREATE TABLE deposits( - deposit_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY - ,shard INT8 NOT NULL - ,coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32) - ,known_coin_id INT8 NOT NULL - ,amount_with_fee_val INT8 NOT NULL - ,amount_with_fee_frac INT4 NOT NULL - ,wallet_timestamp INT8 NOT NULL - ,exchange_timestamp INT8 NOT NULL - ,refund_deadline INT8 NOT NULL - ,wire_deadline INT8 NOT NULL - ,merchant_pub BYTEA NOT NULL CHECK (LENGTH(merchant_pub)=32) - ,h_contract_terms BYTEA NOT NULL CHECK (LENGTH(h_contract_terms)=64) - ,coin_sig BYTEA NOT NULL CHECK (LENGTH(coin_sig)=64) - ,wire_salt BYTEA NOT NULL CHECK (LENGTH(wire_salt)=16) - ,wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32) - ,done BOOLEAN NOT NULL DEFAULT FALSE - ,policy_blocked BOOLEAN NOT NULL DEFAULT FALSE - ,policy_details_serial_id INT8); -*/ ---INSERT INTO deposits VALUES (); +INSERT INTO X (a) + VALUES (1), (2), (3), (4), (5), (6), (7); +DROP TABLE IF EXISTS Y; +CREATE TABLE Y (col1 INT, col2 INT); +INSERT INTO Y (col1,col2) + VALUES (1,2), (2,0), (0,4), (4,0), (0,6), (6,7), (7,8); +DROP TABLE IF EXISTS Z; +CREATE TABLE Z (col1 BYTEA); +DROP TABLE IF EXISTS deposits; CREATE TABLE deposits( deposit_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY ,shard INT8 NOT NULL @@ -58,79 +36,81 @@ CREATE TABLE deposits( ,policy_details_serial_id INT8); -CREATE OR REPLACE FUNCTION pg_spi_insert_int() +DROP FUNCTION IF EXISTS pg_spi_insert_int; +CREATE FUNCTION pg_spi_insert_int() RETURNS VOID - LANGUAGE c COST 100 + LANGUAGE c VOLATILE COST 100 AS '$libdir/own_test', 'pg_spi_insert_int'; -DROP FUNCTION pg_spi_select_from_x(); -CREATE OR REPLACE FUNCTION pg_spi_select_from_x() + +DROP FUNCTION IF EXISTS pg_spi_select_from_x; +CREATE FUNCTION pg_spi_select_from_x() RETURNS INT8 LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_select_from_x'; -/*DROP FUNCTION pg_spi_select_pair_from_y(); -CREATE OR REPLACE FUNCTION pg_spi_select_pair_from_y() +/* +CREATE FUNCTION pg_spi_select_pair_from_y() RETURNS valuest LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_select_pair_from_y'; */ -/*CREATE OR REPLACE FUNCTION pg_spi_select_with_cond() +/*CREATE FUNCTION pg_spi_select_with_cond() RETURNS INT8 LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_select_with_cond'; */ -DROP FUNCTION pg_spi_update_y(); -CREATE OR REPLACE FUNCTION pg_spi_update_y() - RETURNS VOID - LANGUAGE c COST 100 -AS '$libdir/own_test', 'pg_spi_update_y'; -DROP FUNCTION pg_spi_prepare_example(); -CREATE OR REPLACE FUNCTION pg_spi_prepare_example() +DROP FUNCTION IF EXISTS pg_spi_update_y; +CREATE FUNCTION pg_spi_update_y() + RETURNS VOID + LANGUAGE c VOLATILE COST 100 +AS '$libdir/own_test', 'pg_spi_update_y'; + +DROP FUNCTION IF EXISTS pg_spi_prepare_example; +CREATE FUNCTION pg_spi_prepare_example() RETURNS INT8 LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_prepare_example'; -DROP FUNCTION pg_spi_prepare_example_without_saveplan(); -CREATE OR REPLACE FUNCTION pg_spi_prepare_example_without_saveplan() +DROP FUNCTION IF EXISTS pg_spi_prepare_example_without_saveplan; +CREATE FUNCTION pg_spi_prepare_example_without_saveplan() RETURNS INT8 LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_prepare_example_without_saveplan'; -CREATE OR REPLACE FUNCTION pg_spi_prepare_insert() +DROP FUNCTION IF EXISTS pg_spi_prepare_insert; +CREATE FUNCTION pg_spi_prepare_insert() RETURNS VOID - LANGUAGE c COST 100 + LANGUAGE c VOLATILE COST 100 AS '$libdir/own_test', 'pg_spi_prepare_insert'; -CREATE OR REPLACE FUNCTION pg_spi_prepare_insert_without_saveplan() +DROP FUNCTION IF EXISTS pg_spi_prepare_insert_without_saveplan; +CREATE FUNCTION pg_spi_prepare_insert_without_saveplan() RETURNS VOID - LANGUAGE c COST 100 + LANGUAGE c VOLATILE COST 100 AS '$libdir/own_test', 'pg_spi_prepare_insert_without_saveplan'; -/*DROP FUNCTION pg_spi_prepare_select_with_cond(); -CREATE OR REPLACE FUNCTION pg_spi_prepare_select_with_cond() +/* +CREATE FUNCTION pg_spi_prepare_select_with_cond() RETURNS INT8 LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_prepare_select_with_cond'; */ -DROP FUNCTION pg_spi_prepare_select_with_cond_without_saveplan(); -CREATE OR REPLACE FUNCTION pg_spi_prepare_select_with_cond_without_saveplan() + +DROP FUNCTION IF EXISTS pg_spi_prepare_select_with_cond_without_saveplan; +CREATE FUNCTION pg_spi_prepare_select_with_cond_without_saveplan() RETURNS INT8 LANGUAGE c COST 100 AS '$libdir/own_test', 'pg_spi_prepare_select_with_cond_without_saveplan'; -DROP FUNCTION pg_spi_prepare_update(); -CREATE OR REPLACE FUNCTION pg_spi_prepare_update() +DROP FUNCTION IF EXISTS pg_spi_prepare_update; +CREATE FUNCTION pg_spi_prepare_update() RETURNS VOID - LANGUAGE c COST 100 + LANGUAGE c VOLATILE COST 100 AS '$libdir/own_test', 'pg_spi_prepare_update'; -DROP FUNCTION pg_spi_get_dep_ref_fees( - IN in_timestamp INT8 - ,IN merchant_pub BYTEA - ,IN wire_target_h_payto BYTEA - ,IN wtid BYTEA); -CREATE OR REPLACE FUNCTION pg_spi_get_dep_ref_fees( +DROP FUNCTION IF EXISTS pg_spi_get_dep_ref_fees; +CREATE FUNCTION pg_spi_get_dep_ref_fees( IN in_timestamp INT8 ,IN merchant_pub BYTEA ,IN wire_target_h_payto BYTEA @@ -140,7 +120,8 @@ CREATE OR REPLACE FUNCTION pg_spi_get_dep_ref_fees( LANGUAGE c VOLATILE COST 100 AS '$libdir/own_test', 'pg_spi_get_dep_ref_fees'; -CREATE OR REPLACE FUNCTION update_pg_spi_get_dep_ref_fees( +DROP FUNCTION IF EXISTS update_pg_spi_get_dep_ref_fees; +CREATE FUNCTION update_pg_spi_get_dep_ref_fees( IN in_refund_deadline INT8, IN in_merchant_pub BYTEA, IN in_wire_target_h_payto BYTEA @@ -165,43 +146,47 @@ RETURN QUERY amount_with_fee_frac; END $$; -CREATE OR REPLACE FUNCTION stored_procedure_update( +DROP FUNCTION IF EXISTS stored_procedure_update; +CREATE FUNCTION stored_procedure_update( IN in_number INT8 ) RETURNS VOID LANGUAGE plpgsql AS $$ BEGIN - UPDATE joseph_test.Y + UPDATE Y SET col1 = 4 WHERE col2 = in_number; END $$; -CREATE OR REPLACE FUNCTION stored_procedure_select(OUT out_value INT8) +DROP FUNCTION IF EXISTS stored_procedure_select; +CREATE FUNCTION stored_procedure_select(OUT out_value INT8) RETURNS INT8 LANGUAGE plpgsql AS $$ BEGIN SELECT 1 INTO out_value - FROM joseph_test.X; + FROM X; RETURN; END $$; -CREATE OR REPLACE FUNCTION stored_procedure_insert( +DROP FUNCTION IF EXISTS stored_procedure_insert; +CREATE FUNCTION stored_procedure_insert( IN in_number INT8, OUT out_number INT8) RETURNS INT8 LANGUAGE plpgsql AS $$ BEGIN - INSERT INTO joseph_test.X (a) + INSERT INTO X (a) VALUES (in_number) RETURNING a INTO out_number; END $$; -CREATE OR REPLACE FUNCTION stored_procedure_select_with_cond( +DROP FUNCTION IF EXISTS stored_procedure_select_with_cond; +CREATE FUNCTION stored_procedure_select_with_cond( IN in_number INT8, OUT out_number INT8 ) @@ -210,7 +195,7 @@ LANGUAGE plpgsql AS $$ BEGIN SELECT col1 INTO out_number - FROM joseph_test.Y + FROM Y WHERE col2 = in_number; RETURN; END $$;