]> granicus.if.org Git - postgresql/blob - src/backend/catalog/pg_largeobject.c
Hello,
[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-2000, PostgreSQL, Inc
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  *        $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.1 2000/10/08 03:18:53 momjian Exp $
12  *
13  *-------------------------------------------------------------------------
14  */
15 #include "postgres.h"
16
17 #include "access/genam.h"
18 #include "access/heapam.h"
19 #include "access/itup.h"
20 #include "catalog/catname.h"
21 #include "catalog/indexing.h"
22 #include "catalog/pg_largeobject.h"
23 #include "miscadmin.h"
24 #include "parser/parse_func.h"
25 #include "utils/builtins.h"
26 #include "utils/syscache.h"
27
28 bytea *_byteain(const char *data, int32 size);
29
30 bytea *_byteain(const char *data, int32 size) {
31         bytea   *result;
32
33         result = (bytea *)palloc(size + VARHDRSZ);
34         result->vl_len = size + VARHDRSZ;
35         if (size > 0)
36                 memcpy(result->vl_dat, data, size);
37         
38         return result;
39 }
40
41 Oid LargeobjectCreate(Oid loid) {
42         Oid             retval;
43         Relation                pg_largeobject;
44         HeapTuple       ntup = (HeapTuple) palloc(sizeof(HeapTupleData));
45         Relation                idescs[Num_pg_largeobject_indices];
46         Datum           values[Natts_pg_largeobject];
47         char            nulls[Natts_pg_largeobject];
48         int             i;
49
50         for (i=0; i<Natts_pg_largeobject; i++) {
51                 nulls[i] = ' ';
52                 values[i] = (Datum)NULL;
53         }
54
55         i = 0;
56         values[i++] = ObjectIdGetDatum(loid);
57         values[i++] = Int32GetDatum(0);
58         values[i++] = (Datum) _byteain(NULL, 0);
59         
60         pg_largeobject = heap_openr(LargeobjectRelationName, RowExclusiveLock);
61         ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);
62         retval = heap_insert(pg_largeobject, ntup);
63
64         if (!IsIgnoringSystemIndexes()) {
65                 CatalogOpenIndices(Num_pg_largeobject_indices, Name_pg_largeobject_indices, idescs);
66                 CatalogIndexInsert(idescs, Num_pg_largeobject_indices, pg_largeobject, ntup);
67                 CatalogCloseIndices(Num_pg_largeobject_indices, idescs);
68         }
69         
70         heap_close(pg_largeobject, RowExclusiveLock);
71         heap_freetuple(ntup);
72         
73         CommandCounterIncrement();
74
75         return retval;
76 }
77
78 void LargeobjectDrop(Oid loid) {
79         Relation        pg_largeobject;
80         Relation        pg_lo_id;
81         ScanKeyData     skey;
82         IndexScanDesc   sd = (IndexScanDesc) NULL;
83         RetrieveIndexResult     indexRes;
84         int     found = 0;
85
86         ScanKeyEntryInitialize(&skey,
87                                             (bits16) 0x0,
88                                             (AttrNumber) 1,
89                                             (RegProcedure) F_OIDEQ,
90                                             ObjectIdGetDatum(loid));
91
92         pg_largeobject = heap_openr(LargeobjectRelationName, RowShareLock);
93         pg_lo_id = index_openr(LargeobjectLOIdIndex);
94
95         sd = index_beginscan(pg_lo_id, false, 1, &skey);
96
97         while((indexRes = index_getnext(sd, ForwardScanDirection))) {
98                 found++;
99                 heap_delete(pg_largeobject, &indexRes->heap_iptr, NULL);
100                 pfree(indexRes);
101         }
102
103         index_endscan(sd);
104
105         index_close(pg_lo_id);
106         heap_close(pg_largeobject, RowShareLock);
107         if (found == 0)
108                 elog(ERROR, "LargeobjectDrop: large object %d not found", loid);
109 }
110
111 int LargeobjectFind(Oid loid) {
112         int     retval = 0;
113         Relation        pg_lo_id;
114         ScanKeyData     skey;
115         IndexScanDesc   sd = (IndexScanDesc) NULL;
116         RetrieveIndexResult     indexRes;
117
118         ScanKeyEntryInitialize(&skey,
119                                             (bits16) 0x0,
120                                             (AttrNumber) 1,
121                                             (RegProcedure) F_OIDEQ,
122                                             ObjectIdGetDatum(loid));
123
124         pg_lo_id = index_openr(LargeobjectLOIdIndex);
125
126         sd = index_beginscan(pg_lo_id, false, 1, &skey);
127
128         if ((indexRes = index_getnext(sd, ForwardScanDirection))) {
129                 retval = 1;
130                 pfree(indexRes);
131         }
132
133         index_endscan(sd);
134
135         index_close(pg_lo_id);
136         return retval;
137 }
138