00001 #include "orasel.h"
00002
00003
00004 void __attribute__((noreturn)) donegood(const char *msg)
00005 {
00006 OCITerminate(OCI_DEFAULT);
00007 if (msg && !outmode.emp)
00008 printf("%s\n", msg);
00009 exit(0);
00010 }
00011
00012
00013 void __attribute__((noreturn)) errxit(const char *msg)
00014 {
00015 OCITerminate(OCI_DEFAULT);
00016 fprintf(stderr, "ERROR: %s\n", msg);
00017 exit(1);
00018 }
00019
00020
00021 void __attribute__((noreturn)) oraxit(sword status, const con_t* con)
00022 {
00023 const char *p = NULL;
00024 char buf[512];
00025 sword ecd;
00026
00027 switch (status) {
00028 case OCI_SUCCESS_WITH_INFO:
00029 case OCI_ERROR:
00030 ecd = 0;
00031 if(OCIErrorGet(con->errhp, 1, NULL, &ecd, (OraText*)buf,
00032 sizeof(buf), OCI_HTYPE_ERROR) != OCI_SUCCESS)
00033 {
00034 snprintf(buf, sizeof(buf), "unknown ORAERR %u", ecd);
00035 }
00036 break;
00037
00038 default:
00039 snprintf(buf, sizeof(buf), "unknown status %u", status);
00040 break;
00041
00042 case OCI_SUCCESS:
00043 p = "success";
00044 break;
00045
00046 case OCI_NEED_DATA:
00047 p = "need data";
00048 break;
00049
00050 case OCI_NO_DATA:
00051 p = "no data";
00052 break;
00053
00054 case OCI_INVALID_HANDLE:
00055 p = "invalid handle";
00056 break;
00057
00058 case OCI_STILL_EXECUTING:
00059 p = "executing";
00060 break;
00061
00062 case OCI_CONTINUE:
00063 p = "continue";
00064 break;
00065 }
00066 if (p) {
00067 snprintf(buf, sizeof(buf), "logic error (%s)", p);
00068 }
00069 errxit(buf);
00070 }
00071
00072
00073
00074 static void __attribute__((noreturn)) nomem(void)
00075 {
00076 errxit("no enough memory");
00077 }
00078
00079
00080 void* safe_malloc(size_t sz)
00081 {
00082 void *p = malloc(sz);
00083 if (!p) nomem();
00084 return p;
00085 }
00086
00087
00088 Str* str_alloc(const char *s, size_t len)
00089 {
00090 Str* ps = (Str*)safe_malloc(sizeof(Str) + len + 1);
00091 ps->len = len;
00092 memcpy(ps->s, s, len);
00093 ps->s[len] = '\0';
00094 return ps;
00095 }
00096
00097