pg_largeobject.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 141 行

C
141
字号
/*------------------------------------------------------------------------- * * pg_largeobject.c *	  routines to support manipulation of the pg_largeobject relation * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.17 2003/09/24 18:54:01 tgl Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/genam.h"#include "access/heapam.h"#include "catalog/catname.h"#include "catalog/indexing.h"#include "catalog/pg_largeobject.h"#include "miscadmin.h"#include "utils/builtins.h"#include "utils/fmgroids.h"/* * Create a large object having the given LO identifier. * * We do this by inserting an empty first page, so that the object will * appear to exist with size 0.  Note that the unique index will reject * an attempt to create a duplicate page. */voidLargeObjectCreate(Oid loid){	Relation	pg_largeobject;	HeapTuple	ntup;	Datum		values[Natts_pg_largeobject];	char		nulls[Natts_pg_largeobject];	int			i;	pg_largeobject = heap_openr(LargeObjectRelationName, RowExclusiveLock);	/*	 * Form new tuple	 */	for (i = 0; i < Natts_pg_largeobject; i++)	{		values[i] = (Datum) NULL;		nulls[i] = ' ';	}	i = 0;	values[i++] = ObjectIdGetDatum(loid);	values[i++] = Int32GetDatum(0);	values[i++] = DirectFunctionCall1(byteain,									  CStringGetDatum(""));	ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);	/*	 * Insert it	 */	simple_heap_insert(pg_largeobject, ntup);	/* Update indexes */	CatalogUpdateIndexes(pg_largeobject, ntup);	heap_close(pg_largeobject, RowExclusiveLock);	heap_freetuple(ntup);}voidLargeObjectDrop(Oid loid){	bool		found = false;	Relation	pg_largeobject;	ScanKeyData skey[1];	SysScanDesc sd;	HeapTuple	tuple;	ScanKeyEntryInitialize(&skey[0], 0x0,						   (AttrNumber) Anum_pg_largeobject_loid,						   (RegProcedure) F_OIDEQ,						   ObjectIdGetDatum(loid));	pg_largeobject = heap_openr(LargeObjectRelationName, RowExclusiveLock);	sd = systable_beginscan(pg_largeobject, LargeObjectLOidPNIndex, true,							SnapshotNow, 1, skey);	while ((tuple = systable_getnext(sd)) != NULL)	{		simple_heap_delete(pg_largeobject, &tuple->t_self);		found = true;	}	systable_endscan(sd);	heap_close(pg_largeobject, RowExclusiveLock);	if (!found)		ereport(ERROR,				(errcode(ERRCODE_UNDEFINED_OBJECT),				 errmsg("large object %u does not exist", loid)));}boolLargeObjectExists(Oid loid){	bool		retval = false;	Relation	pg_largeobject;	ScanKeyData skey[1];	SysScanDesc sd;	HeapTuple	tuple;	/*	 * See if we can find any tuples belonging to the specified LO	 */	ScanKeyEntryInitialize(&skey[0], 0x0,						   (AttrNumber) Anum_pg_largeobject_loid,						   (RegProcedure) F_OIDEQ,						   ObjectIdGetDatum(loid));	pg_largeobject = heap_openr(LargeObjectRelationName, AccessShareLock);	sd = systable_beginscan(pg_largeobject, LargeObjectLOidPNIndex, true,							SnapshotNow, 1, skey);	if ((tuple = systable_getnext(sd)) != NULL)		retval = true;	systable_endscan(sd);	heap_close(pg_largeobject, AccessShareLock);	return retval;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?