/* * Opens an existing file as BufFile * * If create is true, the file is created if it doesn't exist. * * Does not add the pgsql_tmp/ prefix to the file path before opening. * */ BufFile * BufFileOpenFile(const char *fileName, bool create, bool delOnClose, bool interXact) { bool closeAtEOXact = !interXact; File pfile = OpenNamedFile(fileName, create, delOnClose, closeAtEOXact); /* closeAtEOXact */ /* * If we are trying to open an existing file and it failed, * signal this to the caller. */ if (!create && pfile <= 0) { return NULL; } Assert(pfile >= 0); BufFile *file = makeBufFile(pfile); file->isTemp = delOnClose; if (!create) { /* Open existing file, initialize its size */ file->maxoffset = FileDiskSize(file->file); } return file; }
/* * Open a temporary file that will (optionally) disappear when we close it. * * If 'makenameunique' is true, this function generates a file name which * should be unique to this particular OpenTemporaryFile() request and * distinct from any others in concurrent use on the same host. As a * convenience for monitoring and debugging, the given 'fileName' string * and 'extentseqnum' are embedded in the file name. * * If 'makenameunique' is false, then 'fileName' and 'extentseqnum' identify a * new or existing temporary file which other processes also could open and * share. * * If 'create' is true, a new file is created. If successful, a valid vfd * index (>0) is returned; otherwise an error is thrown. * * If 'create' is false, an existing file is opened. If successful, a valid * vfd index (>0) is returned. If the file does not exist or cannot be * opened, an invalid vfd index (<= 0) is returned. * * If 'delOnClose' is true, then the file is removed when you call * FileClose(); or when the process exits; or (provided 'closeAtEOXact' is * true) when the transaction ends. * * If 'closeAtEOXact' is true, the vfd is closed automatically at end of * transaction unless you have called FileClose() to close it before then. * If 'closeAtEOXact' is false, the vfd state is not changed at end of * transaction. * * In most cases, you don't want temporary files to outlive the transaction * that created them, so you should specify 'true' for both 'delOnClose' and * 'closeAtEOXact'. */ File OpenTemporaryFile(const char *fileName, int extentseqnum, bool makenameunique, bool create, bool delOnClose, bool closeAtEOXact) { char tempfilepath[MAXPGPATH]; Assert(fileName); AssertImply(makenameunique, create && delOnClose); char tempfileprefix[MAXPGPATH]; int len = GetTempFilePrefix(tempfileprefix, MAXPGPATH, fileName); insist_log(len <= MAXPGPATH - 1, "could not generate temporary file name"); if (makenameunique) { /* * Generate a tempfile name that should be unique within the current * database instance. */ snprintf(tempfilepath, sizeof(tempfilepath), "%s_%d_%04d.%ld", tempfileprefix, MyProcPid, extentseqnum, tempFileCounter++); } else { snprintf(tempfilepath, sizeof(tempfilepath), "%s.%04d", tempfileprefix, extentseqnum); } return OpenNamedFile(tempfilepath, create, delOnClose, closeAtEOXact); } /* OpenTemporaryFile */