codekingpro/portable-devtools
115k
1/*-------------------------------------------------------------------------2 *3 * spi.h4 * Server Programming Interface public declarations5 *6 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group7 * Portions Copyright (c) 1994, Regents of the University of California8 *9 * src/include/executor/spi.h10 *11 *-------------------------------------------------------------------------12 */13#ifndef SPI_H14#define SPI_H15 16#include "commands/trigger.h"17#include "lib/ilist.h"18#include "parser/parser.h"19#include "utils/portal.h"20 21 22typedef struct SPITupleTable23{24 /* Public members */25 TupleDesc tupdesc; /* tuple descriptor */26 HeapTuple *vals; /* array of tuples */27 uint64 numvals; /* number of valid tuples */28 29 /* Private members, not intended for external callers */30 uint64 alloced; /* allocated length of vals array */31 MemoryContext tuptabcxt; /* memory context of result table */32 slist_node next; /* link for internal bookkeeping */33 SubTransactionId subid; /* subxact in which tuptable was created */34} SPITupleTable;35 36/* Optional arguments for SPI_prepare_extended */37typedef struct SPIPrepareOptions38{39 ParserSetupHook parserSetup;40 void *parserSetupArg;41 RawParseMode parseMode;42 int cursorOptions;43} SPIPrepareOptions;44 45/* Optional arguments for SPI_execute[_plan]_extended */46typedef struct SPIExecuteOptions47{48 ParamListInfo params;49 bool read_only;50 bool allow_nonatomic;51 bool must_return_tuples;52 uint64 tcount;53 DestReceiver *dest;54 ResourceOwner owner;55} SPIExecuteOptions;56 57/* Optional arguments for SPI_cursor_parse_open */58typedef struct SPIParseOpenOptions59{60 ParamListInfo params;61 int cursorOptions;62 bool read_only;63} SPIParseOpenOptions;64 65/* Plans are opaque structs for standard users of SPI */66typedef struct _SPI_plan *SPIPlanPtr;67 68#define SPI_ERROR_CONNECT (-1)69#define SPI_ERROR_COPY (-2)70#define SPI_ERROR_OPUNKNOWN (-3)71#define SPI_ERROR_UNCONNECTED (-4)72#define SPI_ERROR_CURSOR (-5) /* not used anymore */73#define SPI_ERROR_ARGUMENT (-6)74#define SPI_ERROR_PARAM (-7)75#define SPI_ERROR_TRANSACTION (-8)76#define SPI_ERROR_NOATTRIBUTE (-9)77#define SPI_ERROR_NOOUTFUNC (-10)78#define SPI_ERROR_TYPUNKNOWN (-11)79#define SPI_ERROR_REL_DUPLICATE (-12)80#define SPI_ERROR_REL_NOT_FOUND (-13)81 82#define SPI_OK_CONNECT 183#define SPI_OK_FINISH 284#define SPI_OK_FETCH 385#define SPI_OK_UTILITY 486#define SPI_OK_SELECT 587#define SPI_OK_SELINTO 688#define SPI_OK_INSERT 789#define SPI_OK_DELETE 890#define SPI_OK_UPDATE 991#define SPI_OK_CURSOR 1092#define SPI_OK_INSERT_RETURNING 1193#define SPI_OK_DELETE_RETURNING 1294#define SPI_OK_UPDATE_RETURNING 1395#define SPI_OK_REWRITTEN 1496#define SPI_OK_REL_REGISTER 1597#define SPI_OK_REL_UNREGISTER 1698#define SPI_OK_TD_REGISTER 1799#define SPI_OK_MERGE 18100 101#define SPI_OPT_NONATOMIC (1 << 0)102 103/* These used to be functions, now just no-ops for backwards compatibility */104#define SPI_push() ((void) 0)105#define SPI_pop() ((void) 0)106#define SPI_push_conditional() false107#define SPI_pop_conditional(pushed) ((void) 0)108#define SPI_restore_connection() ((void) 0)109 110extern PGDLLIMPORT uint64 SPI_processed;111extern PGDLLIMPORT SPITupleTable *SPI_tuptable;112extern PGDLLIMPORT int SPI_result;113 114extern int SPI_connect(void);115extern int SPI_connect_ext(int options);116extern int SPI_finish(void);117extern int SPI_execute(const char *src, bool read_only, long tcount);118extern int SPI_execute_extended(const char *src,119 const SPIExecuteOptions *options);120extern int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,121 bool read_only, long tcount);122extern int SPI_execute_plan_extended(SPIPlanPtr plan,123 const SPIExecuteOptions *options);124extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan,125 ParamListInfo params,126 bool read_only, long tcount);127extern int SPI_exec(const char *src, long tcount);128extern int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls,129 long tcount);130extern int SPI_execute_snapshot(SPIPlanPtr plan,131 Datum *Values, const char *Nulls,132 Snapshot snapshot,133 Snapshot crosscheck_snapshot,134 bool read_only, bool fire_triggers, long tcount);135extern int SPI_execute_with_args(const char *src,136 int nargs, Oid *argtypes,137 Datum *Values, const char *Nulls,138 bool read_only, long tcount);139extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);140extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,141 int cursorOptions);142extern SPIPlanPtr SPI_prepare_extended(const char *src,143 const SPIPrepareOptions *options);144extern SPIPlanPtr SPI_prepare_params(const char *src,145 ParserSetupHook parserSetup,146 void *parserSetupArg,147 int cursorOptions);148extern int SPI_keepplan(SPIPlanPtr plan);149extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan);150extern int SPI_freeplan(SPIPlanPtr plan);151 152extern Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex);153extern int SPI_getargcount(SPIPlanPtr plan);154extern bool SPI_is_cursor_plan(SPIPlanPtr plan);155extern bool SPI_plan_is_valid(SPIPlanPtr plan);156extern const char *SPI_result_code_string(int code);157 158extern List *SPI_plan_get_plan_sources(SPIPlanPtr plan);159extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan);160 161extern HeapTuple SPI_copytuple(HeapTuple tuple);162extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc);163extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,164 int *attnum, Datum *Values, const char *Nulls);165extern int SPI_fnumber(TupleDesc tupdesc, const char *fname);166extern char *SPI_fname(TupleDesc tupdesc, int fnumber);167extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);168extern Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull);169extern char *SPI_gettype(TupleDesc tupdesc, int fnumber);170extern Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber);171extern char *SPI_getrelname(Relation rel);172extern char *SPI_getnspname(Relation rel);173extern void *SPI_palloc(Size size);174extern void *SPI_repalloc(void *pointer, Size size);175extern void SPI_pfree(void *pointer);176extern Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen);177extern void SPI_freetuple(HeapTuple tuple);178extern void SPI_freetuptable(SPITupleTable *tuptable);179 180extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,181 Datum *Values, const char *Nulls, bool read_only);182extern Portal SPI_cursor_open_with_args(const char *name,183 const char *src,184 int nargs, Oid *argtypes,185 Datum *Values, const char *Nulls,186 bool read_only, int cursorOptions);187extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan,188 ParamListInfo params, bool read_only);189extern Portal SPI_cursor_parse_open(const char *name,190 const char *src,191 const SPIParseOpenOptions *options);192extern Portal SPI_cursor_find(const char *name);193extern void SPI_cursor_fetch(Portal portal, bool forward, long count);194extern void SPI_cursor_move(Portal portal, bool forward, long count);195extern void SPI_scroll_cursor_fetch(Portal, FetchDirection direction, long count);196extern void SPI_scroll_cursor_move(Portal, FetchDirection direction, long count);197extern void SPI_cursor_close(Portal portal);198 199extern int SPI_register_relation(EphemeralNamedRelation enr);200extern int SPI_unregister_relation(const char *name);201extern int SPI_register_trigger_data(TriggerData *tdata);202 203extern void SPI_start_transaction(void);204extern void SPI_commit(void);205extern void SPI_commit_and_chain(void);206extern void SPI_rollback(void);207extern void SPI_rollback_and_chain(void);208 209extern void AtEOXact_SPI(bool isCommit);210extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid);211extern bool SPI_inside_nonatomic_context(void);212 213#endif /* SPI_H */214 