50 #include "utils/fmgroids.h"
141 Anum_pg_largeobject_metadata_oid,
145 pg_lo_meta =
table_open(LargeObjectMetadataRelationId,
149 LargeObjectMetadataOidIndexId,
true,
179 datafield = &(tuple->data);
183 datafield = (
bytea *)
191 errmsg(
"pg_largeobject entry for OID %u, page %d has invalid data field size %d",
192 tuple->loid, tuple->pageno,
len)));
193 *pdatafield = datafield;
273 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
274 errmsg(
"invalid flags for opening a large object: %d",
286 (
errcode(ERRCODE_UNDEFINED_OBJECT),
287 errmsg(
"large object %u does not exist", lobjId)));
298 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
299 errmsg(
"permission denied for large object %u",
310 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
311 errmsg(
"permission denied for large object %u",
320 retval->
flags = descflags;
358 object.
classId = LargeObjectRelationId;
359 object.objectId = lobjId;
360 object.objectSubId = 0;
392 Anum_pg_largeobject_loid,
414 elog(
ERROR,
"null field found in pg_largeobject");
449 newoffset = obj_desc->
offset + offset;
456 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
457 errmsg(
"invalid whence setting: %d", whence)));
468 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
472 obj_desc->
offset = newoffset;
507 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
508 errmsg(
"permission denied for large object %u",
517 Anum_pg_largeobject_loid,
522 Anum_pg_largeobject_pageno,
536 elog(
ERROR,
"null field found in pg_largeobject");
545 if (pageoff > obj_desc->
offset)
547 n = pageoff - obj_desc->
offset;
548 n = (n <= (nbytes - nread)) ? n : (nbytes - nread);
557 off = (int) (obj_desc->
offset - pageoff);
564 n = (n <= (nbytes - nread)) ? n : (nbytes - nread);
565 memcpy(
buf + nread,
VARDATA(datafield) + off, n);
605 char *workb =
VARDATA(&workbuf.hdr);
608 bool nulls[Natts_pg_largeobject];
609 bool replace[Natts_pg_largeobject];
618 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
619 errmsg(
"permission denied for large object %u",
628 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
629 errmsg(
"invalid large object write request size: %d",
637 Anum_pg_largeobject_loid,
642 Anum_pg_largeobject_pageno,
653 while (nwritten < nbytes)
664 elog(
ERROR,
"null field found in pg_largeobject");
666 Assert(olddata->pageno >= pageno);
668 neednextpage =
false;
675 if (olddata != NULL && olddata->pageno == pageno)
698 n = (n <= (nbytes - nwritten)) ? n : (nbytes - nwritten);
699 memcpy(workb + off,
buf + nwritten, n);
711 memset(nulls,
false,
sizeof(nulls));
712 memset(replace,
false,
sizeof(replace));
714 replace[Anum_pg_largeobject_data - 1] =
true;
743 n = (n <= (nbytes - nwritten)) ? n : (nbytes - nwritten);
744 memcpy(workb + off,
buf + nwritten, n);
755 memset(nulls,
false,
sizeof(nulls));
796 char *workb =
VARDATA(&workbuf.hdr);
799 bool nulls[Natts_pg_largeobject];
800 bool replace[Natts_pg_largeobject];
808 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
809 errmsg(
"permission denied for large object %u",
818 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
830 Anum_pg_largeobject_loid,
835 Anum_pg_largeobject_pageno,
850 elog(
ERROR,
"null field found in pg_largeobject");
852 Assert(olddata->pageno >= pageno);
860 if (olddata != NULL && olddata->pageno == pageno)
868 memcpy(workb,
VARDATA(datafield), pagelen);
877 MemSet(workb + pagelen, 0, off - pagelen);
886 memset(nulls,
false,
sizeof(nulls));
887 memset(replace,
false,
sizeof(replace));
889 replace[Anum_pg_largeobject_data - 1] =
true;
905 Assert(olddata->pageno > pageno);
925 memset(nulls,
false,
sizeof(nulls));
AclResult pg_largeobject_aclcheck_snapshot(Oid lobj_oid, Oid roleid, AclMode mode, Snapshot snapshot)
static Datum values[MAXATTR]
#define InvalidSubTransactionId
#define PointerIsValid(pointer)
#define MemSet(start, val, len)
elog(ERROR, "%s: %s", p2, msg)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
struct varlena * detoast_attr(struct varlena *attr)
int errmsg_internal(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void systable_endscan(SysScanDesc sysscan)
SysScanDesc systable_beginscan_ordered(Relation heapRelation, Relation indexRelation, Snapshot snapshot, int nkeys, ScanKey key)
HeapTuple systable_getnext(SysScanDesc sysscan)
void systable_endscan_ordered(SysScanDesc sysscan)
HeapTuple systable_getnext_ordered(SysScanDesc sysscan, ScanDirection direction)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *replValues, bool *replIsnull, bool *doReplace)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
#define HeapTupleHasNulls(tuple)
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void CatalogTupleInsertWithInfo(Relation heapRel, HeapTuple tup, CatalogIndexState indstate)
void CatalogCloseIndexes(CatalogIndexState indstate)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
void CatalogTupleUpdateWithInfo(Relation heapRel, ItemPointer otid, HeapTuple tup, CatalogIndexState indstate)
static Relation lo_index_r
void inv_truncate(LargeObjectDesc *obj_desc, int64 len)
LargeObjectDesc * inv_open(Oid lobjId, int flags, MemoryContext mcxt)
int inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
static void getdatafield(Form_pg_largeobject tuple, bytea **pdatafield, int *plen, bool *pfreeit)
Oid inv_create(Oid lobjId)
static Relation lo_heap_r
static void open_lo_relation(void)
int64 inv_seek(LargeObjectDesc *obj_desc, int64 offset, int whence)
void close_lo_relation(bool isCommit)
int inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
int64 inv_tell(LargeObjectDesc *obj_desc)
static bool myLargeObjectExists(Oid loid, Snapshot snapshot)
bool lo_compat_privileges
void inv_close(LargeObjectDesc *obj_desc)
static uint64 inv_getsize(LargeObjectDesc *obj_desc)
if(TABLE==NULL||TABLE_index==NULL)
#define MAX_LARGE_OBJECT_SIZE
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * MemoryContextAlloc(MemoryContext context, Size size)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define ERRCODE_DATA_CORRUPTED
Oid LargeObjectCreate(Oid loid)
FormData_pg_largeobject * Form_pg_largeobject
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
#define RelationGetDescr(relation)
ResourceOwner TopTransactionResourceOwner
ResourceOwner CurrentResourceOwner
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Snapshot GetActiveSnapshot(void)
#define BTEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
#define VARATT_IS_EXTENDED(PTR)
#define SET_VARSIZE(PTR, len)
void CommandCounterIncrement(void)