exc.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:4k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * exc.c
  4.  *   POSTGRES exception handling code.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/utils/error/exc.c,v 1.25.2.1 1999/08/02 05:25:04 scrappy Exp $
  11.  *
  12.  * NOTE
  13.  *   XXX this code needs improvement--check for state violations and
  14.  *   XXX reset after handling an exception.
  15.  *
  16.  *-------------------------------------------------------------------------
  17.  */
  18. #include <errno.h>
  19. #include "postgres.h"
  20. #include "storage/ipc.h"
  21. #include "utils/exc.h"
  22. static void ExcUnCaught(Exception *excP, ExcDetail detail, ExcData data,
  23. ExcMessage message);
  24. static void ExcPrint(Exception *excP, ExcDetail detail, ExcData data,
  25.  ExcMessage message);
  26. /*
  27.  * Global Variables
  28.  */
  29. static bool ExceptionHandlingEnabled = false;
  30. char    *ExcFileName = NULL;
  31. Index ExcLineNumber = 0;
  32. ExcFrame   *ExcCurFrameP = NULL;
  33. static ExcProc *ExcUnCaughtP = NULL;
  34. extern char *ProgramName;
  35. /*
  36.  * Exported Functions
  37.  */
  38. /*
  39.  * EnableExceptionHandling
  40.  * Enables/disables the exception handling system.
  41.  *
  42.  * Note:
  43.  * This must be called before any exceptions occur.  I.e., call this first!
  44.  * This routine will not return if an error is detected.
  45.  * This does not follow the usual Enable... protocol.
  46.  * This should be merged more closely with the error logging and tracing
  47.  * packages.
  48.  *
  49.  * Exceptions:
  50.  * none
  51.  */
  52. /*
  53.  * Excection handling should be supported by the language, thus there should
  54.  * be no need to explicitly enable exception processing.
  55.  *
  56.  * This function should probably not be called, ever.  Currently it does
  57.  * almost nothing. If there is a need for this intialization and checking.
  58.  * then this function should be converted to the new-style Enable code and
  59.  * called by all the other module Enable functions.
  60.  */
  61. void
  62. EnableExceptionHandling(bool on)
  63. {
  64. if (on == ExceptionHandlingEnabled)
  65. {
  66. /* XXX add logging of failed state */
  67. proc_exit(255);
  68. /* ExitPostgres(FatalExitStatus); */
  69. }
  70. if (on)
  71. { /* initialize */
  72. ;
  73. }
  74. else
  75. { /* cleanup */
  76. ExcFileName = NULL;
  77. ExcLineNumber = 0;
  78. ExcCurFrameP = NULL;
  79. ExcUnCaughtP = NULL;
  80. }
  81. ExceptionHandlingEnabled = on;
  82. }
  83. static void
  84. ExcPrint(Exception *excP,
  85.  ExcDetail detail,
  86.  ExcData data,
  87.  ExcMessage message)
  88. {
  89. extern int errno;
  90. extern int sys_nerr;
  91. #ifdef lint
  92. data = data;
  93. #endif
  94. fflush(stdout); /* In case stderr is buffered */
  95. #if 0
  96. if (ProgramName != NULL && *ProgramName != '')
  97. fprintf(stderr, "%s: ", ProgramName);
  98. #endif
  99. if (message != NULL)
  100. fprintf(stderr, "%s", message);
  101. else if (excP->message != NULL)
  102. fprintf(stderr, "%s", excP->message);
  103. else
  104. #ifdef lint
  105. fprintf(stderr, "UNNAMED EXCEPTION 0x%lx", excP);
  106. #else
  107. fprintf(stderr, "UNNAMED EXCEPTION 0x%lx", (long) excP);
  108. #endif
  109. fprintf(stderr, " (%ld)", detail);
  110. if (errno > 0 && errno < sys_nerr)
  111. fprintf(stderr, " [%s]", strerror(errno));
  112. else if (errno != 0)
  113. fprintf(stderr, " [Error %d]", errno);
  114. fprintf(stderr, "n");
  115. fflush(stderr);
  116. }
  117. #ifdef NOT_USED
  118. ExcProc    *
  119. ExcGetUnCaught(void)
  120. {
  121. return ExcUnCaughtP;
  122. }
  123. #endif
  124. #ifdef NOT_USED
  125. ExcProc    *
  126. ExcSetUnCaught(ExcProc *newP)
  127. {
  128. ExcProc    *oldP = ExcUnCaughtP;
  129. ExcUnCaughtP = newP;
  130. return oldP;
  131. }
  132. #endif
  133. static void
  134. ExcUnCaught(Exception *excP,
  135. ExcDetail detail,
  136. ExcData data,
  137. ExcMessage message)
  138. {
  139. ExcPrint(excP, detail, data, message);
  140. ExcAbort(excP, detail, data, message);
  141. }
  142. void
  143. ExcRaise(Exception *excP,
  144.  ExcDetail detail,
  145.  ExcData data,
  146.  ExcMessage message)
  147. {
  148. ExcFrame   *efp;
  149. efp = ExcCurFrameP;
  150. if (efp == NULL)
  151. {
  152. if (ExcUnCaughtP != NULL)
  153. (*ExcUnCaughtP) (excP, detail, data, message);
  154. ExcUnCaught(excP, detail, data, message);
  155. }
  156. else
  157. {
  158. efp->id = excP;
  159. efp->detail = detail;
  160. efp->data = data;
  161. efp->message = message;
  162. ExcCurFrameP = efp->link;
  163. #if defined (JMP_BUF)
  164. longjmp(efp->context, 1);
  165. #else
  166. siglongjmp(efp->context, 1);
  167. #endif
  168. }
  169. }