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.3 2000/10/21 15:55:21 momjian Exp $
13 *-------------------------------------------------------------------------
17 #include "access/genam.h"
18 #include "access/heapam.h"
19 #include "catalog/catname.h"
20 #include "catalog/indexing.h"
21 #include "catalog/pg_largeobject.h"
22 #include "miscadmin.h"
23 #include "utils/fmgroids.h"
25 bytea *_byteain(const char *data, int32 size);
27 bytea *_byteain(const char *data, int32 size) {
30 result = (bytea *)palloc(size + VARHDRSZ);
31 result->vl_len = size + VARHDRSZ;
33 memcpy(result->vl_dat, data, size);
38 Oid LargeobjectCreate(Oid loid) {
40 Relation pg_largeobject;
41 HeapTuple ntup = (HeapTuple) palloc(sizeof(HeapTupleData));
42 Relation idescs[Num_pg_largeobject_indices];
43 Datum values[Natts_pg_largeobject];
44 char nulls[Natts_pg_largeobject];
47 for (i=0; i<Natts_pg_largeobject; i++) {
49 values[i] = (Datum)NULL;
53 values[i++] = ObjectIdGetDatum(loid);
54 values[i++] = Int32GetDatum(0);
55 values[i++] = (Datum) _byteain(NULL, 0);
57 pg_largeobject = heap_openr(LargeobjectRelationName, RowExclusiveLock);
58 ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);
59 retval = heap_insert(pg_largeobject, ntup);
61 if (!IsIgnoringSystemIndexes()) {
62 CatalogOpenIndices(Num_pg_largeobject_indices, Name_pg_largeobject_indices, idescs);
63 CatalogIndexInsert(idescs, Num_pg_largeobject_indices, pg_largeobject, ntup);
64 CatalogCloseIndices(Num_pg_largeobject_indices, idescs);
67 heap_close(pg_largeobject, RowExclusiveLock);
70 CommandCounterIncrement();
75 void LargeobjectDrop(Oid loid) {
76 Relation pg_largeobject;
79 IndexScanDesc sd = (IndexScanDesc) NULL;
80 RetrieveIndexResult indexRes;
83 ScanKeyEntryInitialize(&skey,
86 (RegProcedure) F_OIDEQ,
87 ObjectIdGetDatum(loid));
89 pg_largeobject = heap_openr(LargeobjectRelationName, RowShareLock);
90 pg_lo_id = index_openr(LargeobjectLOIdIndex);
92 sd = index_beginscan(pg_lo_id, false, 1, &skey);
94 while((indexRes = index_getnext(sd, ForwardScanDirection))) {
96 heap_delete(pg_largeobject, &indexRes->heap_iptr, NULL);
102 index_close(pg_lo_id);
103 heap_close(pg_largeobject, RowShareLock);
105 elog(ERROR, "LargeobjectDrop: large object %d not found", loid);
108 int LargeobjectFind(Oid loid) {
112 IndexScanDesc sd = (IndexScanDesc) NULL;
113 RetrieveIndexResult indexRes;
115 ScanKeyEntryInitialize(&skey,
118 (RegProcedure) F_OIDEQ,
119 ObjectIdGetDatum(loid));
121 pg_lo_id = index_openr(LargeobjectLOIdIndex);
123 sd = index_beginscan(pg_lo_id, false, 1, &skey);
125 if ((indexRes = index_getnext(sd, ForwardScanDirection))) {
132 index_close(pg_lo_id);