PostgreSQL Source Code
git master
lo.c
Go to the documentation of this file.
1
/*
2
* PostgreSQL definitions for managed Large Objects.
3
*
4
* contrib/lo/lo.c
5
*
6
*/
7
8
#include "
postgres.h
"
9
10
#include "
commands/trigger.h
"
11
#include "
executor/spi.h
"
12
#include "
utils/builtins.h
"
13
#include "
utils/rel.h
"
14
15
PG_MODULE_MAGIC
;
16
17
18
/*
19
* This is the trigger that protects us from orphaned large objects
20
*/
21
PG_FUNCTION_INFO_V1
(
lo_manage
);
22
23
Datum
24
lo_manage
(
PG_FUNCTION_ARGS
)
25
{
26
TriggerData
*trigdata = (
TriggerData
*) fcinfo->context;
27
int
attnum
;
/* attribute number to monitor */
28
char
**
args
;
/* Args containing attr name */
29
TupleDesc
tupdesc;
/* Tuple Descriptor */
30
HeapTuple
rettuple;
/* Tuple to be returned */
31
bool
isdelete;
/* are we deleting? */
32
HeapTuple
newtuple;
/* The new value for tuple */
33
HeapTuple
trigtuple;
/* The original value of tuple */
34
35
if
(!
CALLED_AS_TRIGGER
(fcinfo))
/* internal error */
36
elog
(
ERROR
,
"lo_manage: not fired by trigger manager"
);
37
38
if
(!
TRIGGER_FIRED_FOR_ROW
(trigdata->
tg_event
))
/* internal error */
39
elog
(
ERROR
,
"%s: must be fired for row"
,
40
trigdata->
tg_trigger
->
tgname
);
41
42
/*
43
* Fetch some values from trigdata
44
*/
45
newtuple = trigdata->
tg_newtuple
;
46
trigtuple = trigdata->
tg_trigtuple
;
47
tupdesc = trigdata->
tg_relation
->
rd_att
;
48
args
= trigdata->
tg_trigger
->
tgargs
;
49
50
if
(
args
== NULL)
/* internal error */
51
elog
(
ERROR
,
"%s: no column name provided in the trigger definition"
,
52
trigdata->
tg_trigger
->
tgname
);
53
54
/* tuple to return to Executor */
55
if
(
TRIGGER_FIRED_BY_UPDATE
(trigdata->
tg_event
))
56
rettuple = newtuple;
57
else
58
rettuple = trigtuple;
59
60
/* Are we deleting the row? */
61
isdelete =
TRIGGER_FIRED_BY_DELETE
(trigdata->
tg_event
);
62
63
/* Get the column we're interested in */
64
attnum
=
SPI_fnumber
(tupdesc,
args
[0]);
65
66
if
(
attnum
<= 0)
67
elog
(
ERROR
,
"%s: column \"%s\" does not exist"
,
68
trigdata->
tg_trigger
->
tgname
,
args
[0]);
69
70
/*
71
* Handle updates
72
*
73
* Here, if the value of the monitored attribute changes, then the large
74
* object associated with the original value is unlinked.
75
*/
76
if
(newtuple != NULL &&
77
bms_is_member
(
attnum
-
FirstLowInvalidHeapAttributeNumber
, trigdata->
tg_updatedcols
))
78
{
79
char
*orig =
SPI_getvalue
(trigtuple, tupdesc,
attnum
);
80
char
*newv =
SPI_getvalue
(newtuple, tupdesc,
attnum
);
81
82
if
(orig != NULL && (newv == NULL || strcmp(orig, newv) != 0))
83
DirectFunctionCall1
(
be_lo_unlink
,
84
ObjectIdGetDatum
(
atooid
(orig)));
85
86
if
(newv)
87
pfree
(newv);
88
if
(orig)
89
pfree
(orig);
90
}
91
92
/*
93
* Handle deleting of rows
94
*
95
* Here, we unlink the large object associated with the managed attribute
96
*/
97
if
(isdelete)
98
{
99
char
*orig =
SPI_getvalue
(trigtuple, tupdesc,
attnum
);
100
101
if
(orig != NULL)
102
{
103
DirectFunctionCall1
(
be_lo_unlink
,
104
ObjectIdGetDatum
(
atooid
(orig)));
105
106
pfree
(orig);
107
}
108
}
109
110
return
PointerGetDatum
(rettuple);
111
}
be_lo_unlink
Datum be_lo_unlink(PG_FUNCTION_ARGS)
Definition:
be-fsstubs.c:314
bms_is_member
bool bms_is_member(int x, const Bitmapset *a)
Definition:
bitmapset.c:510
builtins.h
ERROR
#define ERROR
Definition:
elog.h:39
elog
#define elog(elevel,...)
Definition:
elog.h:225
DirectFunctionCall1
#define DirectFunctionCall1(func, arg1)
Definition:
fmgr.h:641
PG_FUNCTION_ARGS
#define PG_FUNCTION_ARGS
Definition:
fmgr.h:193
if
if(TABLE==NULL||TABLE_index==NULL)
Definition:
isn.c:77
PG_MODULE_MAGIC
PG_MODULE_MAGIC
Definition:
lo.c:15
lo_manage
Datum lo_manage(PG_FUNCTION_ARGS)
Definition:
lo.c:24
PG_FUNCTION_INFO_V1
PG_FUNCTION_INFO_V1(lo_manage)
pfree
void pfree(void *pointer)
Definition:
mcxt.c:1521
generate_unaccent_rules.args
args
Definition:
generate_unaccent_rules.py:288
attnum
int16 attnum
Definition:
pg_attribute.h:74
postgres.h
PointerGetDatum
static Datum PointerGetDatum(const void *X)
Definition:
postgres.h:322
Datum
uintptr_t Datum
Definition:
postgres.h:64
ObjectIdGetDatum
static Datum ObjectIdGetDatum(Oid X)
Definition:
postgres.h:252
atooid
#define atooid(x)
Definition:
postgres_ext.h:42
rel.h
SPI_fnumber
int SPI_fnumber(TupleDesc tupdesc, const char *fname)
Definition:
spi.c:1172
SPI_getvalue
char * SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
Definition:
spi.c:1217
spi.h
HeapTupleData
Definition:
htup.h:63
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_updatedcols
const Bitmapset * tg_updatedcols
Definition:
trigger.h:43
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::tgname
char * tgname
Definition:
reltrigger.h:27
Trigger::tgargs
char ** tgargs
Definition:
reltrigger.h:41
TupleDescData
Definition:
tupdesc.h:80
FirstLowInvalidHeapAttributeNumber
#define FirstLowInvalidHeapAttributeNumber
Definition:
sysattr.h:27
trigger.h
TRIGGER_FIRED_BY_DELETE
#define TRIGGER_FIRED_BY_DELETE(event)
Definition:
trigger.h:113
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:122
TRIGGER_FIRED_BY_UPDATE
#define TRIGGER_FIRED_BY_UPDATE(event)
Definition:
trigger.h:116
contrib
lo
lo.c
Generated on Sun Oct 6 2024 12:13:13 for PostgreSQL Source Code by
1.9.1