summaryrefslogtreecommitdiff
path: root/src/backend/utils/error/elog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/error/elog.c')
-rw-r--r--src/backend/utils/error/elog.c89
1 files changed, 84 insertions, 5 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 0660aaab9a9..4d646b9b926 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -37,7 +37,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.112 2003/06/30 16:47:01 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.113 2003/07/18 23:20:32 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -288,7 +288,13 @@ errstart(int elevel, const char *filename, int lineno,
edata->filename = filename;
edata->lineno = lineno;
edata->funcname = funcname;
- edata->sqlerrcode = ERRCODE_INTERNAL_ERROR; /* default errcode */
+ /* Select default errcode based on elevel */
+ if (elevel >= ERROR)
+ edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
+ else if (elevel == WARNING)
+ edata->sqlerrcode = ERRCODE_WARNING;
+ else
+ edata->sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;
/* errno is saved here so that error parameter eval can't change it */
edata->saved_errno = errno;
@@ -498,6 +504,76 @@ errcode(int sqlerrcode)
/*
+ * errcode_for_file_access --- add SQLSTATE error code to the current error
+ *
+ * The SQLSTATE code is chosen based on the saved errno value. We assume
+ * that the failing operation was some type of disk file access.
+ *
+ * NOTE: the primary error message string should generally include %m
+ * when this is used.
+ */
+int
+errcode_for_file_access(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ switch (edata->saved_errno)
+ {
+ /* Permission-denied failures */
+ case EPERM: /* Not super-user */
+ case EACCES: /* Permission denied */
+#ifdef EROFS
+ case EROFS: /* Read only file system */
+#endif
+ edata->sqlerrcode = ERRCODE_INSUFFICIENT_PRIVILEGE;
+ break;
+
+ /* Object not found */
+ case ENOENT: /* No such file or directory */
+ edata->sqlerrcode = ERRCODE_UNDEFINED_OBJECT;
+ break;
+
+ /* Duplicate object */
+ case EEXIST: /* File exists */
+ edata->sqlerrcode = ERRCODE_DUPLICATE_OBJECT;
+ break;
+
+ /* Wrong object type or state */
+ case ENOTDIR: /* Not a directory */
+ case EISDIR: /* Is a directory */
+ case ENOTEMPTY: /* Directory not empty */
+ edata->sqlerrcode = ERRCODE_WRONG_OBJECT_TYPE;
+ break;
+
+ /* Insufficient resources */
+ case ENOSPC: /* No space left on device */
+ edata->sqlerrcode = ERRCODE_DISK_FULL;
+ break;
+
+ case ENFILE: /* File table overflow */
+ case EMFILE: /* Too many open files */
+ edata->sqlerrcode = ERRCODE_INSUFFICIENT_RESOURCES;
+ break;
+
+ /* Hardware failure */
+ case EIO: /* I/O error */
+ edata->sqlerrcode = ERRCODE_IO_ERROR;
+ break;
+
+ /* All else is classified as internal errors */
+ default:
+ edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
+ break;
+ }
+
+ return 0; /* return value does not matter */
+}
+
+
+/*
* This macro handles expansion of a format string and associated parameters;
* it's common code for errmsg(), errdetail(), etc. Must be called inside
* a routine that is declared like "const char *fmt, ..." and has an edata
@@ -759,7 +835,8 @@ DebugFileOpen(void)
if ((fd = open(OutputFileName, O_CREAT | O_APPEND | O_WRONLY,
0666)) < 0)
ereport(FATAL,
- (errmsg("failed to open %s: %m", OutputFileName)));
+ (errcode_for_file_access(),
+ errmsg("failed to open \"%s\": %m", OutputFileName)));
istty = isatty(fd);
close(fd);
@@ -768,7 +845,8 @@ DebugFileOpen(void)
*/
if (!freopen(OutputFileName, "a", stderr))
ereport(FATAL,
- (errmsg("failed to reopen %s as stderr: %m",
+ (errcode_for_file_access(),
+ errmsg("failed to reopen \"%s\" as stderr: %m",
OutputFileName)));
/*
@@ -780,7 +858,8 @@ DebugFileOpen(void)
if (istty && IsUnderPostmaster)
if (!freopen(OutputFileName, "a", stdout))
ereport(FATAL,
- (errmsg("failed to reopen %s as stdout: %m",
+ (errcode_for_file_access(),
+ errmsg("failed to reopen \"%s\" as stdout: %m",
OutputFileName)));
}
}