PostgreSQL Source Code git master
Functions
multixactfuncs.c File Reference
#include "postgres.h"
#include "access/multixact.h"
#include "funcapi.h"
#include "utils/builtins.h"
Include dependency graph for multixactfuncs.c:

Go to the source code of this file.

Functions

 

Function Documentation

pg_get_multixact_members()

Datum pg_get_multixact_members ( PG_FUNCTION_ARGS  )

Definition at line 28 of file multixactfuncs.c.

29{
30 typedef struct
31 {
32 MultiXactMember *members;
33 int nmembers;
34 int iter;
35 } mxact;
37 mxact *multi;
38 FuncCallContext *funccxt;
39
40 if (mxid < FirstMultiXactId)
42 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
43 errmsg("invalid MultiXactId: %u", mxid)));
44
45 if (SRF_IS_FIRSTCALL())
46 {
47 MemoryContext oldcxt;
48 TupleDesc tupdesc;
49
50 funccxt = SRF_FIRSTCALL_INIT();
52
53 multi = palloc(sizeof(mxact));
54 /* no need to allow for old values here */
55 multi->nmembers = GetMultiXactIdMembers(mxid, &multi->members, false,
56 false);
57 multi->iter = 0;
58
59 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
60 elog(ERROR, "return type must be a row type");
61 funccxt->tuple_desc = tupdesc;
62 funccxt->attinmeta = TupleDescGetAttInMetadata(tupdesc);
63 funccxt->user_fctx = multi;
64
66 }
67
68 funccxt = SRF_PERCALL_SETUP();
69 multi = (mxact *) funccxt->user_fctx;
70
71 while (multi->iter < multi->nmembers)
72 {
73 HeapTuple tuple;
74 char *values[2];
75
76 values[0] = psprintf("%u", multi->members[multi->iter].xid);
77 values[1] = mxstatus_to_string(multi->members[multi->iter].status);
78
79 tuple = BuildTupleFromCStrings(funccxt->attinmeta, values);
80
81 multi->iter++;
82 pfree(values[0]);
83 SRF_RETURN_NEXT(funccxt, HeapTupleGetDatum(tuple));
84 }
85
86 SRF_RETURN_DONE(funccxt);
87}
static Datum values[MAXATTR]
Definition: bootstrap.c:153
TransactionId MultiXactId
Definition: c.h:667
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
#define ereport(elevel,...)
Definition: elog.h:150
HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
Definition: execTuples.c:2324
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
Definition: execTuples.c:2275
#define PG_GETARG_TRANSACTIONID(n)
Definition: fmgr.h:279
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Definition: funcapi.c:276
#define SRF_IS_FIRSTCALL()
Definition: funcapi.h:304
#define SRF_PERCALL_SETUP()
Definition: funcapi.h:308
@ TYPEFUNC_COMPOSITE
Definition: funcapi.h:149
#define SRF_RETURN_NEXT(_funcctx, _result)
Definition: funcapi.h:310
#define SRF_FIRSTCALL_INIT()
Definition: funcapi.h:306
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
Definition: funcapi.h:230
#define SRF_RETURN_DONE(_funcctx)
Definition: funcapi.h:328
void pfree(void *pointer)
Definition: mcxt.c:1594
void * palloc(Size size)
Definition: mcxt.c:1365
char * mxstatus_to_string(MultiXactStatus status)
Definition: multixact.c:1745
int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, bool from_pgupgrade, bool isLockOnly)
Definition: multixact.c:1290
#define FirstMultiXactId
Definition: multixact.h:26
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
while(p+4<=pend)
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
void * user_fctx
Definition: funcapi.h:82
AttInMetadata * attinmeta
Definition: funcapi.h:91
MemoryContext multi_call_memory_ctx
Definition: funcapi.h:101
TupleDesc tuple_desc
Definition: funcapi.h:112

References FuncCallContext::attinmeta, BuildTupleFromCStrings(), elog, ereport, errcode(), errmsg(), ERROR, FirstMultiXactId, get_call_result_type(), GetMultiXactIdMembers(), HeapTupleGetDatum(), MemoryContextSwitchTo(), FuncCallContext::multi_call_memory_ctx, mxstatus_to_string(), palloc(), pfree(), PG_GETARG_TRANSACTIONID, psprintf(), SRF_FIRSTCALL_INIT, SRF_IS_FIRSTCALL, SRF_PERCALL_SETUP, SRF_RETURN_DONE, SRF_RETURN_NEXT, FuncCallContext::tuple_desc, TupleDescGetAttInMetadata(), TYPEFUNC_COMPOSITE, FuncCallContext::user_fctx, values, and while().

AltStyle によって変換されたページ (->オリジナル) /