/*-------------------------------------------------------------------------
*
* buffile.c
- * Management of large buffered files, primarily temporary files.
+ * Management of large buffered temporary files.
*
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* of opening/closing file descriptors.
*
* Note that BufFile structs are allocated with palloc(), and therefore
- * will go away automatically at transaction end. If the underlying
- * virtual File is made with OpenTemporaryFile, then all resources for
+ * will go away automatically at query/transaction end. Since the underlying
+ * virtual Files are made with OpenTemporaryFile, all resources for
* the file are certain to be cleaned up even if processing is aborted
* by ereport(ERROR). The data structures required are made in the
* palloc context that was current when the BufFile was created, and
/*
* We break BufFiles into gigabyte-sized segments, regardless of RELSEG_SIZE.
- * The reason is that we'd like large temporary BufFiles to be spread across
- * multiple tablespaces when available.
+ * The reason is that we'd like large BufFiles to be spread across multiple
+ * tablespaces when available.
*/
#define MAX_PHYSICAL_FILESIZE 0x40000000
#define BUFFILE_SEG_SIZE (MAX_PHYSICAL_FILESIZE / BLCKSZ)
return file;
}
-#ifdef NOT_USED
-/*
- * Create a BufFile and attach it to an already-opened virtual File.
- *
- * This is comparable to fdopen() in stdio. This is the only way at present
- * to attach a BufFile to a non-temporary file. Note that BufFiles created
- * in this way CANNOT be expanded into multiple files.
- */
-BufFile *
-BufFileCreate(File file)
-{
- return makeBufFile(file);
-}
-#endif
-
/*
* Close a BufFile
*
/* flush any unwritten data */
BufFileFlush(file);
- /* close the underlying file(s) (with delete if it's a temp file) */
+ /* close and delete the underlying file(s) */
for (i = 0; i < file->numFiles; i++)
FileClose(file->files[i]);
/* release the buffer space */
/*
* Advance to next component file if necessary and possible.
- *
- * This path can only be taken if there is more than one component, so it
- * won't interfere with reading a non-temp file that is over
- * MAX_PHYSICAL_FILESIZE.
*/
if (file->curOffset >= MAX_PHYSICAL_FILESIZE &&
file->curFile + 1 < file->numFiles)
}
/*
- * Enforce per-file size limit only for temp files, else just try to
- * write as much as asked...
+ * Determine how much we need to write into this file.
*/
bytestowrite = file->nbytes - wpos;
availbytes = MAX_PHYSICAL_FILESIZE - file->curOffset;
* BufFileSeek
*
* Like fseek(), except that target position needs two values in order to
- * work when logical filesize exceeds maximum value representable by long.
- * We do not support relative seeks across more than LONG_MAX, however.
+ * work when logical filesize exceeds maximum value representable by off_t.
+ * We do not support relative seeks across more than that, however.
*
* Result is 0 if OK, EOF if not. Logical position is not moved if an
* impossible seek is attempted.