utils/db_oracle/util.c

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: /* ORA-3123 */
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 //-----------------------------------------------------------------------------