PostgreSQL Source Code
git master
Loading...
Searching...
No Matches
insert_username.c
Go to the documentation of this file.
1
/*
2
* contrib/spi/insert_username.c
3
*
4
* insert user name in response to a trigger
5
* usage: insert_username (column_name)
6
*/
7
#include "
postgres.h
"
8
9
#include "
access/htup_details.h
"
10
#include "
catalog/pg_type.h
"
11
#include "
commands/trigger.h
"
12
#include "
executor/spi.h
"
13
#include "
miscadmin.h
"
14
#include "
utils/builtins.h
"
15
#include "
utils/rel.h
"
16
17
PG_MODULE_MAGIC_EXT
(
18
.
name
=
"insert_username"
,
19
.version =
PG_VERSION
20
);
21
22
PG_FUNCTION_INFO_V1
(
insert_username
);
23
24
Datum
25
insert_username
(
PG_FUNCTION_ARGS
)
26
{
27
TriggerData
*trigdata = (
TriggerData
*) fcinfo->context;
28
Trigger
*
trigger
;
/* to get trigger name */
29
int
nargs;
/* # of arguments */
30
Datum
newval
;
/* new value of column */
31
bool
newnull
;
/* null flag */
32
char
**args;
/* arguments */
33
char
*
relname
;
/* triggered relation name */
34
Relation
rel;
/* triggered relation */
35
HeapTuple
rettuple
=
NULL
;
36
TupleDesc
tupdesc;
/* tuple description */
37
int
attnum
;
38
39
/* sanity checks from autoinc.c */
40
if
(!
CALLED_AS_TRIGGER
(fcinfo))
41
/* internal error */
42
elog
(
ERROR
,
"insert_username: not fired by trigger manager"
);
43
if
(!
TRIGGER_FIRED_FOR_ROW
(trigdata->
tg_event
))
44
/* internal error */
45
elog
(
ERROR
,
"insert_username: must be fired for row"
);
46
if
(!
TRIGGER_FIRED_BEFORE
(trigdata->
tg_event
))
47
/* internal error */
48
elog
(
ERROR
,
"insert_username: must be fired before event"
);
49
50
if
(
TRIGGER_FIRED_BY_INSERT
(trigdata->
tg_event
))
51
rettuple
= trigdata->
tg_trigtuple
;
52
else
if
(
TRIGGER_FIRED_BY_UPDATE
(trigdata->
tg_event
))
53
rettuple
= trigdata->
tg_newtuple
;
54
else
55
/* internal error */
56
elog
(
ERROR
,
"insert_username: cannot process DELETE events"
);
57
58
rel = trigdata->
tg_relation
;
59
relname
=
SPI_getrelname
(rel);
60
61
trigger
= trigdata->
tg_trigger
;
62
63
nargs =
trigger
->
tgnargs
;
64
if
(nargs != 1)
65
/* internal error */
66
elog
(
ERROR
,
"insert_username (%s): one argument was expected"
,
relname
);
67
68
args =
trigger
->tgargs;
69
tupdesc = rel->
rd_att
;
70
71
attnum
=
SPI_fnumber
(tupdesc, args[0]);
72
73
if
(
attnum
<= 0)
74
ereport
(
ERROR
,
75
(
errcode
(
ERRCODE_TRIGGERED_ACTION_EXCEPTION
),
76
errmsg
(
"\"%s\" has no attribute \"%s\""
,
relname
, args[0])));
77
78
if
(
SPI_gettypeid
(tupdesc,
attnum
) !=
TEXTOID
)
79
ereport
(
ERROR
,
80
(
errcode
(
ERRCODE_TRIGGERED_ACTION_EXCEPTION
),
81
errmsg
(
"attribute \"%s\" of \"%s\" must be type TEXT"
,
82
args[0],
relname
)));
83
84
/* create fields containing name */
85
newval
=
CStringGetTextDatum
(
GetUserNameFromId
(
GetUserId
(),
false
));
86
newnull
=
false
;
87
88
/* construct new tuple */
89
rettuple
=
heap_modify_tuple_by_cols
(
rettuple
, tupdesc,
90
1, &
attnum
, &
newval
, &
newnull
);
91
92
pfree
(
relname
);
93
94
return
PointerGetDatum
(
rettuple
);
95
}
builtins.h
CStringGetTextDatum
#define CStringGetTextDatum(s)
Definition
builtins.h:97
errcode
int errcode(int sqlerrcode)
Definition
elog.c:863
errmsg
int errmsg(const char *fmt,...)
Definition
elog.c:1080
ERROR
#define ERROR
Definition
elog.h:39
elog
#define elog(elevel,...)
Definition
elog.h:226
ereport
#define ereport(elevel,...)
Definition
elog.h:150
PG_MODULE_MAGIC_EXT
#define PG_MODULE_MAGIC_EXT(...)
Definition
fmgr.h:540
PG_FUNCTION_INFO_V1
#define PG_FUNCTION_INFO_V1(funcname)
Definition
fmgr.h:417
PG_FUNCTION_ARGS
#define PG_FUNCTION_ARGS
Definition
fmgr.h:193
newval
#define newval
heap_modify_tuple_by_cols
HeapTuple heap_modify_tuple_by_cols(HeapTuple tuple, TupleDesc tupleDesc, int nCols, const int *replCols, const Datum *replValues, const bool *replIsnull)
Definition
heaptuple.c:1278
htup_details.h
insert_username
Datum insert_username(PG_FUNCTION_ARGS)
Definition
insert_username.c:25
pfree
void pfree(void *pointer)
Definition
mcxt.c:1616
miscadmin.h
GetUserId
Oid GetUserId(void)
Definition
miscinit.c:469
GetUserNameFromId
char * GetUserNameFromId(Oid roleid, bool noerr)
Definition
miscinit.c:988
attnum
int16 attnum
Definition
pg_attribute.h:74
relname
NameData relname
Definition
pg_class.h:38
pg_type.h
postgres.h
PointerGetDatum
static Datum PointerGetDatum(const void *X)
Definition
postgres.h:352
Datum
uint64_t Datum
Definition
postgres.h:70
fb
static int fb(int x)
Definition
preproc-init.c:92
rel.h
SPI_fnumber
int SPI_fnumber(TupleDesc tupdesc, const char *fname)
Definition
spi.c:1175
SPI_gettypeid
Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber)
Definition
spi.c:1308
SPI_getrelname
char * SPI_getrelname(Relation rel)
Definition
spi.c:1326
spi.h
HeapTupleData
Definition
htup.h:63
RelationData
Definition
rel.h:56
RelationData::rd_att
TupleDesc rd_att
Definition
rel.h:112
TriggerData
Definition
trigger.h:32
TriggerData::tg_relation
Relation tg_relation
Definition
trigger.h:35
TriggerData::tg_event
TriggerEvent tg_event
Definition
trigger.h:34
TriggerData::tg_newtuple
HeapTuple tg_newtuple
Definition
trigger.h:37
TriggerData::tg_trigger
Trigger * tg_trigger
Definition
trigger.h:38
TriggerData::tg_trigtuple
HeapTuple tg_trigtuple
Definition
trigger.h:36
Trigger
Definition
reltrigger.h:24
Trigger::tgnargs
int16 tgnargs
Definition
reltrigger.h:38
TupleDescData
Definition
tupdesc.h:136
trigger.h
TRIGGER_FIRED_BEFORE
#define TRIGGER_FIRED_BEFORE(event)
Definition
trigger.h:130
CALLED_AS_TRIGGER
#define CALLED_AS_TRIGGER(fcinfo)
Definition
trigger.h:26
TRIGGER_FIRED_FOR_ROW
#define TRIGGER_FIRED_FOR_ROW(event)
Definition
trigger.h:124
TRIGGER_FIRED_BY_INSERT
#define TRIGGER_FIRED_BY_INSERT(event)
Definition
trigger.h:112
TRIGGER_FIRED_BY_UPDATE
#define TRIGGER_FIRED_BY_UPDATE(event)
Definition
trigger.h:118
name
const char * name
Definition
wait_event_funcs.c:28
contrib
spi
insert_username.c
Generated on Tue Jan 27 2026 06:13:09 for PostgreSQL Source Code by
1.9.8