/* * lo_truncate - * truncate a large object to a specified length */ Datum lo_truncate(PG_FUNCTION_ARGS) { int32 fd = PG_GETARG_INT32(0); int32 len = PG_GETARG_INT32(1); if (fd < 0 || fd >= cookies_size || cookies[fd] == NULL) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("invalid large-object descriptor: %d", fd))); /* Permission checks */ if (!lo_compat_privileges && pg_largeobject_aclcheck_snapshot(cookies[fd]->id, GetUserId(), ACL_UPDATE, cookies[fd]->snapshot) != ACLCHECK_OK) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied for large object %u", cookies[fd]->id))); inv_truncate(cookies[fd], len); PG_RETURN_INT32(0); }
/* * lo_truncate - * truncate a large object to a specified length */ static void lo_truncate_internal(int32 fd, int64 len) { LargeObjectDesc *lobj; if (fd < 0 || fd >= cookies_size || cookies[fd] == NULL) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("invalid large-object descriptor: %d", fd))); lobj = cookies[fd]; if ((lobj->flags & IFS_WRLOCK) == 0) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("large object descriptor %d was not opened for writing", fd))); /* Permission checks --- first time through only */ if ((lobj->flags & IFS_WR_PERM_OK) == 0) { if (!lo_compat_privileges && pg_largeobject_aclcheck_snapshot(lobj->id, GetUserId(), ACL_UPDATE, lobj->snapshot) != ACLCHECK_OK) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied for large object %u", lobj->id))); lobj->flags |= IFS_WR_PERM_OK; } inv_truncate(lobj, len); }
/* * lo_truncate - * truncate a large object to a specified length */ static void lo_truncate_internal(int32 fd, int64 len) { LargeObjectDesc *lobj; #ifdef PGXC #ifdef XCP ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Postgres-XL does not yet support large objects"), errdetail("The feature is not currently supported"))); #else ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Postgres-XC does not support large object yet"), errdetail("The feature is not currently supported"))); #endif #endif if (fd < 0 || fd >= cookies_size || cookies[fd] == NULL) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("invalid large-object descriptor: %d", fd))); lobj = cookies[fd]; if ((lobj->flags & IFS_WRLOCK) == 0) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("large object descriptor %d was not opened for writing", fd))); /* Permission checks --- first time through only */ if ((lobj->flags & IFS_WR_PERM_OK) == 0) { if (!lo_compat_privileges && pg_largeobject_aclcheck_snapshot(lobj->id, GetUserId(), ACL_UPDATE, lobj->snapshot) != ACLCHECK_OK) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied for large object %u", lobj->id))); lobj->flags |= IFS_WR_PERM_OK; } inv_truncate(lobj, len); }
/* * lo_truncate - * truncate a large object to a specified length */ static void lo_truncate_internal(int32 fd, int64 len) { LargeObjectDesc *lobj; if (fd < 0 || fd >= cookies_size || cookies[fd] == NULL) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("invalid large-object descriptor: %d", fd))); lobj = cookies[fd]; /* see comment in lo_read() */ if ((lobj->flags & IFS_WRLOCK) == 0) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("large object descriptor %d was not opened for writing", fd))); inv_truncate(lobj, len); }