1 /*-------------------------------------------------------------------------
4 * routines to support manipulation of the pg_largeobject relation
6 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.1 2000/10/08 03:18:53 momjian Exp $
13 *-------------------------------------------------------------------------
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"
28 bytea *_byteain(const char *data, int32 size);
30 bytea *_byteain(const char *data, int32 size) {
33 result = (bytea *)palloc(size + VARHDRSZ);
34 result->vl_len = size + VARHDRSZ;
36 memcpy(result->vl_dat, data, size);
41 Oid LargeobjectCreate(Oid loid) {
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];
50 for (i=0; i<Natts_pg_largeobject; i++) {
52 values[i] = (Datum)NULL;
56 values[i++] = ObjectIdGetDatum(loid);
57 values[i++] = Int32GetDatum(0);
58 values[i++] = (Datum) _byteain(NULL, 0);
60 pg_largeobject = heap_openr(LargeobjectRelationName, RowExclusiveLock);
61 ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);
62 retval = heap_insert(pg_largeobject, ntup);
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);
70 heap_close(pg_largeobject, RowExclusiveLock);
73 CommandCounterIncrement();
78 void LargeobjectDrop(Oid loid) {
79 Relation pg_largeobject;
82 IndexScanDesc sd = (IndexScanDesc) NULL;
83 RetrieveIndexResult indexRes;
86 ScanKeyEntryInitialize(&skey,
89 (RegProcedure) F_OIDEQ,
90 ObjectIdGetDatum(loid));
92 pg_largeobject = heap_openr(LargeobjectRelationName, RowShareLock);
93 pg_lo_id = index_openr(LargeobjectLOIdIndex);
95 sd = index_beginscan(pg_lo_id, false, 1, &skey);
97 while((indexRes = index_getnext(sd, ForwardScanDirection))) {
99 heap_delete(pg_largeobject, &indexRes->heap_iptr, NULL);
105 index_close(pg_lo_id);
106 heap_close(pg_largeobject, RowShareLock);
108 elog(ERROR, "LargeobjectDrop: large object %d not found", loid);
111 int LargeobjectFind(Oid loid) {
115 IndexScanDesc sd = (IndexScanDesc) NULL;
116 RetrieveIndexResult indexRes;
118 ScanKeyEntryInitialize(&skey,
121 (RegProcedure) F_OIDEQ,
122 ObjectIdGetDatum(loid));
124 pg_lo_id = index_openr(LargeobjectLOIdIndex);
126 sd = index_beginscan(pg_lo_id, false, 1, &skey);
128 if ((indexRes = index_getnext(sd, ForwardScanDirection))) {
135 index_close(pg_lo_id);