50 #include "utils/fmgroids.h" 79 if (lo_heap_r && lo_index_r)
87 if (lo_heap_r == NULL)
89 if (lo_index_r == NULL)
101 if (lo_heap_r || lo_index_r)
141 Anum_pg_largeobject_metadata_oid,
145 pg_lo_meta =
table_open(LargeObjectMetadataRelationId,
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;
271 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
272 errmsg(
"invalid flags for opening a large object: %d",
284 (
errcode(ERRCODE_UNDEFINED_OBJECT),
285 errmsg(
"large object %u does not exist", lobjId)));
296 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
297 errmsg(
"permission denied for large object %u",
300 if ((descflags & IFS_WRLOCK) != 0)
308 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
309 errmsg(
"permission denied for large object %u",
319 retval->
flags = descflags;
363 object.
classId = LargeObjectRelationId;
364 object.objectId = lobjId;
365 object.objectSubId = 0;
397 Anum_pg_largeobject_loid,
419 elog(
ERROR,
"null field found in pg_largeobject");
422 lastbyte = (uint64) data->pageno *
LOBLKSIZE + len;
454 newoffset = obj_desc->
offset + offset;
461 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
462 errmsg(
"invalid whence setting: %d", whence)));
473 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
477 obj_desc->
offset = newoffset;
512 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
513 errmsg(
"permission denied for large object %u",
522 Anum_pg_largeobject_loid,
527 Anum_pg_largeobject_pageno,
541 elog(
ERROR,
"null field found in pg_largeobject");
549 pageoff = ((uint64) data->pageno) *
LOBLKSIZE;
550 if (pageoff > obj_desc->
offset)
552 n = pageoff - obj_desc->
offset;
553 n = (n <= (nbytes - nread)) ? n : (nbytes - nread);
554 MemSet(buf + nread, 0, n);
562 off = (int) (obj_desc->
offset - pageoff);
569 n = (n <= (nbytes - nread)) ? n : (nbytes - nread);
570 memcpy(buf + nread,
VARDATA(datafield) + off, n);
610 char *workb =
VARDATA(&workbuf.hdr);
613 bool nulls[Natts_pg_largeobject];
614 bool replace[Natts_pg_largeobject];
623 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
624 errmsg(
"permission denied for large object %u",
633 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
634 errmsg(
"invalid large object write request size: %d",
642 Anum_pg_largeobject_loid,
647 Anum_pg_largeobject_pageno,
658 while (nwritten < nbytes)
669 elog(
ERROR,
"null field found in pg_largeobject");
671 Assert(olddata->pageno >= pageno);
673 neednextpage =
false;
680 if (olddata != NULL && olddata->pageno == pageno)
688 memcpy(workb,
VARDATA(datafield), len);
697 MemSet(workb + len, 0, off - len);
703 n = (n <= (nbytes - nwritten)) ? n : (nbytes - nwritten);
704 memcpy(workb + off, buf + nwritten, n);
709 len = (len >= off) ? len : off;
715 memset(values, 0,
sizeof(values));
716 memset(nulls,
false,
sizeof(nulls));
717 memset(replace,
false,
sizeof(replace));
719 replace[Anum_pg_largeobject_data - 1] =
true;
721 values, nulls, replace);
748 n = (n <= (nbytes - nwritten)) ? n : (nbytes - nwritten);
749 memcpy(workb + off, buf + nwritten, n);
759 memset(values, 0,
sizeof(values));
760 memset(nulls,
false,
sizeof(nulls));
762 values[Anum_pg_largeobject_pageno - 1] =
Int32GetDatum(pageno);
801 char *workb =
VARDATA(&workbuf.hdr);
804 bool nulls[Natts_pg_largeobject];
805 bool replace[Natts_pg_largeobject];
813 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
814 errmsg(
"permission denied for large object %u",
823 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
835 Anum_pg_largeobject_loid,
840 Anum_pg_largeobject_pageno,
855 elog(
ERROR,
"null field found in pg_largeobject");
857 Assert(olddata->pageno >= pageno);
865 if (olddata != NULL && olddata->pageno == pageno)
873 memcpy(workb,
VARDATA(datafield), pagelen);
882 MemSet(workb + pagelen, 0, off - pagelen);
890 memset(values, 0,
sizeof(values));
891 memset(nulls,
false,
sizeof(nulls));
892 memset(replace,
false,
sizeof(replace));
894 replace[Anum_pg_largeobject_data - 1] =
true;
896 values, nulls, replace);
910 Assert(olddata->pageno > pageno);
929 memset(values, 0,
sizeof(values));
930 memset(nulls,
false,
sizeof(nulls));
932 values[Anum_pg_largeobject_pageno - 1] =
Int32GetDatum(pageno);
static bool myLargeObjectExists(Oid loid, Snapshot snapshot)
#define MAX_LARGE_OBJECT_SIZE
static void open_lo_relation(void)
int64 inv_seek(LargeObjectDesc *obj_desc, int64 offset, int whence)
void table_close(Relation relation, LOCKMODE lockmode)
void inv_truncate(LargeObjectDesc *obj_desc, int64 len)
void systable_endscan(SysScanDesc sysscan)
bool lo_compat_privileges
#define InvokeObjectPostCreateHook(classId, objectId, subId)
Oid inv_create(Oid lobjId)
#define RelationGetDescr(relation)
ResourceOwner TopTransactionResourceOwner
#define PointerGetDatum(X)
ResourceOwner CurrentResourceOwner
void inv_close(LargeObjectDesc *obj_desc)
Snapshot GetActiveSnapshot(void)
int errcode(int sqlerrcode)
#define MemSet(start, val, len)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
Oid LargeObjectCreate(Oid loid)
HeapTuple systable_getnext_ordered(SysScanDesc sysscan, ScanDirection direction)
void heap_freetuple(HeapTuple htup)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
static Relation lo_heap_r
int64 inv_tell(LargeObjectDesc *obj_desc)
static Relation lo_index_r
struct varlena * detoast_attr(struct varlena *attr)
HeapTuple systable_getnext(SysScanDesc sysscan)
void pfree(void *pointer)
#define ObjectIdGetDatum(X)
#define HeapTupleHasNulls(tuple)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
#define ERRCODE_DATA_CORRUPTED
void CatalogTupleUpdateWithInfo(Relation heapRel, ItemPointer otid, HeapTuple tup, CatalogIndexState indstate)
static uint64 inv_getsize(LargeObjectDesc *obj_desc)
void close_lo_relation(bool isCommit)
void CommandCounterIncrement(void)
void CatalogTupleInsertWithInfo(Relation heapRel, HeapTuple tup, CatalogIndexState indstate)
void systable_endscan_ordered(SysScanDesc sysscan)
#define ereport(elevel,...)
Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner)
int errmsg_internal(const char *fmt,...)
#define HeapTupleIsValid(tuple)
#define Assert(condition)
static void getdatafield(Form_pg_largeobject tuple, bytea **pdatafield, int *plen, bool *pfreeit)
SubTransactionId GetCurrentSubTransactionId(void)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner)
#define VARATT_IS_EXTENDED(PTR)
void index_close(Relation relation, LOCKMODE lockmode)
static Datum values[MAXATTR]
LargeObjectDesc * inv_open(Oid lobjId, int flags, MemoryContext mcxt)
int errmsg(const char *fmt,...)
SysScanDesc systable_beginscan_ordered(Relation heapRelation, Relation indexRelation, Snapshot snapshot, int nkeys, ScanKey key)
void * MemoryContextAlloc(MemoryContext context, Size size)
#define LargeObjectLOidPNIndexId
AclResult pg_largeobject_aclcheck_snapshot(Oid lobj_oid, Oid roleid, AclMode mode, Snapshot snapshot)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void CatalogCloseIndexes(CatalogIndexState indstate)
#define SET_VARSIZE(PTR, len)
FormData_pg_largeobject * Form_pg_largeobject
Relation table_open(Oid relationId, LOCKMODE lockmode)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *replValues, bool *replIsnull, bool *doReplace)
int inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
#define PointerIsValid(pointer)
Relation index_open(Oid relationId, LOCKMODE lockmode)
#define BTEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
int inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)