/* * inv_create -- create a new large object * * Arguments: * lobjId - OID to use for new large object, or InvalidOid to pick one * * Returns: * OID of new object * * If lobjId is not InvalidOid, then an error occurs if the OID is already * in use. */ Oid inv_create(Oid lobjId) { Oid lobjId_new; /* * Create a new largeobject with empty data pages */ lobjId_new = LargeObjectCreate(lobjId); /* * dependency on the owner of largeobject * * The reason why we use LargeObjectRelationId instead of * LargeObjectMetadataRelationId here is to provide backward compatibility * to the applications which utilize a knowledge about internal layout of * system catalogs. OID of pg_largeobject_metadata and loid of * pg_largeobject are same value, so there are no actual differences here. */ recordDependencyOnOwner(LargeObjectRelationId, lobjId_new, GetUserId()); /* Post creation hook for new large object */ InvokeObjectAccessHook(OAT_POST_CREATE, LargeObjectRelationId, lobjId_new, 0); /* * Advance command counter to make new tuple visible to later operations. */ CommandCounterIncrement(); return lobjId_new; }
/* * inv_create -- create a new large object * * Arguments: * lobjId - OID to use for new large object, or InvalidOid to pick one * * Returns: * OID of new object * * If lobjId is not InvalidOid, then an error occurs if the OID is already * in use. */ Oid inv_create(Oid lobjId) { /* * Allocate an OID to be the LO's identifier, unless we were told what to * use. We can use the index on pg_largeobject for checking OID * uniqueness, even though it has additional columns besides OID. */ if (!OidIsValid(lobjId)) { open_lo_relation(); lobjId = GetNewOidWithIndex(lo_heap_r, lo_index_r); } /* * Create the LO by writing an empty first page for it in pg_largeobject * (will fail if duplicate) */ LargeObjectCreate(lobjId); /* * Advance command counter to make new tuple visible to later operations. */ CommandCounterIncrement(); return lobjId; }
/* * inv_create -- create a new large object. * * Arguments: * flags * * Returns: * large object descriptor, appropriately filled in. */ LargeObjectDesc * inv_create(int flags) { Oid file_oid; LargeObjectDesc *retval; /* * Allocate an OID to be the LO's identifier. */ file_oid = newoid(); /* Check for duplicate (shouldn't happen) */ if (LargeObjectExists(file_oid)) elog(ERROR, "large object %u already exists", file_oid); /* * Create the LO by writing an empty first page for it in * pg_largeobject */ LargeObjectCreate(file_oid); /* * Advance command counter so that new tuple will be seen by later * large-object operations in this transaction. */ CommandCounterIncrement(); /* * Prepare LargeObjectDesc data structure for accessing LO */ retval = (LargeObjectDesc *) palloc(sizeof(LargeObjectDesc)); retval->id = file_oid; retval->subid = GetCurrentSubTransactionId(); retval->offset = 0; if (flags & INV_WRITE) retval->flags = IFS_WRLOCK | IFS_RDLOCK; else if (flags & INV_READ) retval->flags = IFS_RDLOCK; else elog(ERROR, "invalid flags: %d", flags); return retval; }