]> granicus.if.org Git - postgresql/blob - src/backend/catalog/pg_largeobject.c
Update CVS HEAD for 2007 copyright. Back branches are typically not
[postgresql] / src / backend / catalog / pg_largeobject.c
1 /*-------------------------------------------------------------------------
2  *
3  * pg_largeobject.c
4  *        routines to support manipulation of the pg_largeobject relation
5  *
6  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  *        $PostgreSQL: pgsql/src/backend/catalog/pg_largeobject.c,v 1.27 2007/01/05 22:19:25 momjian Exp $
12  *
13  *-------------------------------------------------------------------------
14  */
15 #include "postgres.h"
16
17 #include "access/genam.h"
18 #include "access/heapam.h"
19 #include "catalog/indexing.h"
20 #include "catalog/pg_largeobject.h"
21 #include "utils/builtins.h"
22 #include "utils/fmgroids.h"
23
24
25 /*
26  * Create a large object having the given LO identifier.
27  *
28  * We do this by inserting an empty first page, so that the object will
29  * appear to exist with size 0.  Note that the unique index will reject
30  * an attempt to create a duplicate page.
31  */
32 void
33 LargeObjectCreate(Oid loid)
34 {
35         Relation        pg_largeobject;
36         HeapTuple       ntup;
37         Datum           values[Natts_pg_largeobject];
38         char            nulls[Natts_pg_largeobject];
39         int                     i;
40
41         pg_largeobject = heap_open(LargeObjectRelationId, RowExclusiveLock);
42
43         /*
44          * Form new tuple
45          */
46         for (i = 0; i < Natts_pg_largeobject; i++)
47         {
48                 values[i] = (Datum) NULL;
49                 nulls[i] = ' ';
50         }
51
52         i = 0;
53         values[i++] = ObjectIdGetDatum(loid);
54         values[i++] = Int32GetDatum(0);
55         values[i++] = DirectFunctionCall1(byteain,
56                                                                           CStringGetDatum(""));
57
58         ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);
59
60         /*
61          * Insert it
62          */
63         simple_heap_insert(pg_largeobject, ntup);
64
65         /* Update indexes */
66         CatalogUpdateIndexes(pg_largeobject, ntup);
67
68         heap_close(pg_largeobject, RowExclusiveLock);
69
70         heap_freetuple(ntup);
71 }
72
73 void
74 LargeObjectDrop(Oid loid)
75 {
76         bool            found = false;
77         Relation        pg_largeobject;
78         ScanKeyData skey[1];
79         SysScanDesc sd;
80         HeapTuple       tuple;
81
82         ScanKeyInit(&skey[0],
83                                 Anum_pg_largeobject_loid,
84                                 BTEqualStrategyNumber, F_OIDEQ,
85                                 ObjectIdGetDatum(loid));
86
87         pg_largeobject = heap_open(LargeObjectRelationId, RowExclusiveLock);
88
89         sd = systable_beginscan(pg_largeobject, LargeObjectLOidPNIndexId, true,
90                                                         SnapshotNow, 1, skey);
91
92         while ((tuple = systable_getnext(sd)) != NULL)
93         {
94                 simple_heap_delete(pg_largeobject, &tuple->t_self);
95                 found = true;
96         }
97
98         systable_endscan(sd);
99
100         heap_close(pg_largeobject, RowExclusiveLock);
101
102         if (!found)
103                 ereport(ERROR,
104                                 (errcode(ERRCODE_UNDEFINED_OBJECT),
105                                  errmsg("large object %u does not exist", loid)));
106 }
107
108 bool
109 LargeObjectExists(Oid loid)
110 {
111         bool            retval = false;
112         Relation        pg_largeobject;
113         ScanKeyData skey[1];
114         SysScanDesc sd;
115
116         /*
117          * See if we can find any tuples belonging to the specified LO
118          */
119         ScanKeyInit(&skey[0],
120                                 Anum_pg_largeobject_loid,
121                                 BTEqualStrategyNumber, F_OIDEQ,
122                                 ObjectIdGetDatum(loid));
123
124         pg_largeobject = heap_open(LargeObjectRelationId, AccessShareLock);
125
126         sd = systable_beginscan(pg_largeobject, LargeObjectLOidPNIndexId, true,
127                                                         SnapshotNow, 1, skey);
128
129         if (systable_getnext(sd) != NULL)
130                 retval = true;
131
132         systable_endscan(sd);
133
134         heap_close(pg_largeobject, AccessShareLock);
135
136         return retval;
137 }