home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume18 / oraperl / part01 / oracle.mus < prev    next >
Encoding:
Text File  |  1991-04-11  |  3.8 KB  |  221 lines

  1. /* oracle.mus
  2.  *
  3.  * User subroutine interface to Oracle functions
  4.  */
  5. /* Copyright 1991 Kevin Stock.
  6.  *
  7.  * You may copy this under the terms of the GNU General Public License,
  8.  * a copy of which should have accompanied your Perl kit.
  9.  */
  10.  
  11. #include "EXTERN.h"
  12. #include "perl.h"
  13. #include "orafns.h"
  14.  
  15.  
  16. static enum uservars {
  17. #ifdef    DEBUGGING
  18.     UV_ora_debug,
  19. #endif
  20.     UV_ora_errno,
  21.     UV_ora_errstr,
  22. };
  23.  
  24. static enum usersubs {
  25.     US_ora_login,
  26.     US_ora_open,
  27.     US_ora_fetch,
  28.     US_ora_close,
  29.     US_ora_logoff,
  30. };
  31.  
  32. static int usersub();
  33. static int userset();
  34. static int userval();
  35.  
  36. int
  37. init_oracle()
  38. {
  39.     struct ufuncs uf;
  40.     char *filename = "oracle.c";
  41.  
  42.     uf.uf_set = userset;
  43.     uf.uf_val = userval;
  44.  
  45. #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
  46.  
  47. #ifdef    DEBUGGING
  48.     MAGICVAR("ora_debug",    UV_ora_debug);
  49. #endif
  50.     MAGICVAR("ora_errno",    UV_ora_errno);
  51.     MAGICVAR("ora_errstr",    UV_ora_errstr);
  52.  
  53.     make_usub("ora_login",    US_ora_login,    usersub, filename);
  54.     make_usub("ora_open",    US_ora_open,    usersub, filename);
  55.     make_usub("ora_fetch",    US_ora_fetch,    usersub, filename);
  56.     make_usub("ora_close",    US_ora_close,    usersub, filename);
  57.     make_usub("ora_logoff",    US_ora_logoff,    usersub, filename);
  58. };
  59.  
  60.  
  61. static int
  62. usersub(ix, sp, items)
  63. int ix;
  64. register int sp;
  65. register int items;
  66. {
  67.     STR **st = stack->ary_array + sp;
  68.     register int i;
  69.     register char *tmps;
  70.     register STR *Str;        /* used in str_get and str_gnum macros */
  71.  
  72.     switch (ix) {
  73.  
  74. CASE    char *    ora_login
  75. I    char *    database
  76. I    char *    name
  77. I    char *    password
  78. END
  79.  
  80. CASE    char *    ora_open
  81. I    char *    lda
  82. I    char *    stmt
  83. END
  84.  
  85.     case US_ora_fetch:
  86.     if (items != 1)
  87.         fatal("Usage: @array = &ora_fetch($csr)");
  88.     else {
  89.         char *csr        = (char *) str_get(st[1]);
  90.  
  91.         if (curcsv->wantarray) {    /* in array context, return the data */
  92.         int  retval;
  93.         char *tmps;
  94.  
  95.         retval = ora_fetch(csr);
  96.         astore(stack, sp + retval, Nullstr);
  97.         st = stack->ary_array + sp;
  98.         for (i = 0 ; i < retval ; i++) {
  99.             tmps = ora_result[i];
  100.             st[i] = str_2mortal(str_make(tmps, strlen(tmps)));
  101.         }
  102.         return sp + retval - 1;
  103.         } else {    /* in scalar context, return the number of fields */
  104.         struct cursor *csrp;
  105.         extern int check_csr();
  106.  
  107.         csrp = (struct cursor *) strtol(csr, (char *) NULL, 0);
  108.         if (check_csr(csrp))
  109.             str_numset(st[0], (double) csrp->nfields);
  110.         else
  111.             str_set(st[0], (char *) NULL);
  112.         return sp;
  113.         }
  114.     }
  115.     /* NOTREACHED */
  116.  
  117. CASE    char *    ora_close
  118. I    char *    csr
  119. END
  120.  
  121. CASE    char *    ora_logoff
  122. I    char *    lda
  123. END
  124.  
  125.     default:
  126.     fatal("Unimplemented user-defined subroutine");
  127.     }
  128.     return sp;
  129. }
  130.  
  131.  
  132. static int
  133. userset(ix, str)
  134. int ix;
  135. STR *str;
  136. {
  137.     switch (ix) {
  138. #ifdef    DEBUGGING
  139.     case UV_ora_debug:
  140.     ora_debug = (int)str_gnum(str);
  141.     break;
  142. #endif
  143.  
  144.     case UV_ora_errno:
  145.     fatal("ora_errno is read-only");
  146.     break;
  147.  
  148.     case UV_ora_errstr:
  149.     fatal("ora_errstr is read-only");
  150.     break;
  151.     }
  152.     return 0;
  153. }
  154.  
  155.  
  156. static int
  157. userval(ix, str)
  158. int ix;
  159. STR *str;
  160. {
  161.     switch (ix) {
  162. #ifdef    DEBUGGING
  163.     case UV_ora_debug:
  164.     str_numset(str, (double) ora_debug);
  165.     break;
  166. #endif
  167.  
  168.     case UV_ora_errno:
  169.     str_numset(str, (double) ora_errno);
  170.     break;
  171.  
  172.     case UV_ora_errstr:
  173.     {
  174.         int len;
  175.         char ertxt[132];
  176.  
  177.         if (ora_errno < ORAP_ERRMIN)
  178.         {
  179.             oermsg(ora_errno, ertxt);
  180.             if (ertxt[len = (strlen(ertxt) - 1)] == '\n')
  181.             {
  182.                 ertxt[len] = '\0';
  183.             }
  184.             str_set(str, ertxt);
  185.         }
  186.         else
  187.         {
  188.             switch (ora_errno)
  189.             {
  190.             case ORAP_NOMEM:
  191.                 str_set(str, "insufficient memory");
  192.                 break;
  193.  
  194.             case ORAP_INVCSR:
  195.                 str_set(str, "invalid cursor");
  196.                 break;
  197.  
  198.             case ORAP_INVLDA:
  199.                 str_set(str, "invalid login data area");
  200.                 break;
  201.  
  202.             case ORAP_NOSID:
  203.                 str_set(str, "couldn't set ORACLE_SID");
  204.                 break;
  205.  
  206.             default:
  207.                 {
  208.                 char tmp[30];
  209.  
  210.                 sprintf(tmp, "unknown oraperl error %d",
  211.                     ora_errno);
  212.                 str_set(str, tmp);
  213.                 }
  214.             }
  215.         }
  216.     }
  217.     break;
  218.     }
  219.     return 0;
  220. }
  221.