home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume25 / oraperl / patch03a next >
Text File  |  1991-11-11  |  59KB  |  2,242 lines

  1. Newsgroups: comp.sources.misc
  2. From: kstock@gouldfr.encore.fr (Kevin Stock)
  3. Subject:  v25i035:  oraperl - Extensions to Perl to access Oracle databases, Patch03a/2
  4. Message-ID: <csm-v25i035=oraperl.113826@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 1a78659a7a8b571d548075c05e76fd42
  6. Date: Sun, 10 Nov 1991 17:40:25 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: kstock@gouldfr.encore.fr (Kevin Stock)
  10. Posting-number: Volume 25, Issue 35
  11. Archive-name: oraperl/patch03a
  12. Environment: Perl, Oracle
  13. Patch-To: oraperl: Volume 18, Issue 10
  14.  
  15. This is Patch 03 for Oraperl, a set of usersubs which allow Perl to
  16. access Oracle databases. You need Perl (v3.0.27 or better) and Oracle
  17. (including the Oracle Call Interface) to build Oraperl.
  18.  
  19. Oraperl appeared in comp.sources.misc as follows:
  20.  
  21.     v18i010        original
  22.     v20i097        patch 01
  23.     v22i058        patch 02
  24.  
  25.             Details of Patch 03
  26.             -------------------
  27.  Changes
  28.  -------
  29. Fixed a bug in allocating the data buffers, notably affecting DATE fields
  30. Fixed a bug in not freeing the space for ora_bind parameters
  31. Fixed a bug in creating a "debug" variable when it wasn't needed
  32. Improved debugging output, added support for flag 32 (string/numeric conversion)
  33. Improved handling of $ora_errstr
  34. Added configuration flags for various things to the Makefile
  35. Added targets listing and docs to the Makefile
  36. Added the &ora_version() function, analagous to Perl's -v flag.
  37. Added the &ora_do() function, equivalent to &ora_close(&ora_open(...))
  38. Added handling of NULL values returned from the database
  39. Added an 'oraperl.ph' file
  40.  
  41.  What to do
  42.  ----------
  43. To apply this patch, unshar the shar file which follows. This will
  44. create the following files:
  45.  
  46.     Patch03
  47.     oraperl.ph
  48.     patchlevel.h
  49.  
  50. If for an earlier version of Oraperl you changed str_2mortal() to
  51. str_2static() in oracle.mus (for Perl v3), please change it back!
  52.  
  53. Run the file Patch03 through the patch program.
  54.  
  55. Fix anything you need for your system in the Makefile. Then read
  56. README and run make.
  57.  
  58. Note that the when you do a "make clean" it will demolish the old
  59. PATCHLEVEL file. This is correct.
  60.  
  61.  Acknowledgements
  62.  ----------------
  63. Thanks to Alec Muffett (of "crack" fame), Robert Chansky and others
  64. for helping me to understand the problem with DATEs and NULL fields,
  65. and for pointing out the difference between dsize and dbsize.
  66.  
  67.  A Philosophical Note
  68.  --------------------
  69. When Oraperl was first released, I received mail from two people.
  70. After the first patch, there were four more. After the second, there
  71. were about another eight. Is the value of software _really_ in
  72. exponential proportion to the number of patches :-). Maybe that's why
  73. people like Perl so much!
  74.  
  75.     Kevin
  76.     kstock@gouldfr.encore.fr, kstock@encore.com
  77. --------
  78. #!/bin/sh
  79. # This is a shell archive (produced by shar 3.49)
  80. # To extract the files from this archive, save it to a file, remove
  81. # everything above the "!/bin/sh" line above, and type "sh file_name".
  82. #
  83. # made 11/10/1991 17:31 UTC by kent@sparky.IMD.Sterling.COM
  84. # Source directory /home/kent/mod/csm/queue/Noraperl/repack
  85. #
  86. # existing files will NOT be overwritten unless -c is specified
  87. #
  88. # This is part 1 of a multipart archive                                    
  89. # do not concatenate these parts, unpack them in order with /bin/sh        
  90. #
  91. # This shar contains:
  92. # length  mode       name
  93. # ------ ---------- ------------------------------------------
  94. #  67801 -rw-r--r-- Patch03
  95. #    703 -rw-r--r-- oraperl.ph
  96. #     41 -rw-r--r-- patchlevel.h
  97. #
  98. if test -r _shar_seq_.tmp; then
  99.     echo 'Must unpack archives in sequence!'
  100.     echo Please unpack part `cat _shar_seq_.tmp` next
  101.     exit 1
  102. fi
  103. # ============= Patch03 ==============
  104. if test -f 'Patch03' -a X"$1" != X"-c"; then
  105.     echo 'x - skipping Patch03 (File already exists)'
  106.     rm -f _shar_wnt_.tmp
  107. else
  108. > _shar_wnt_.tmp
  109. echo 'x - extracting Patch03 (Text)'
  110. sed 's/^X//' << 'SHAR_EOF' > 'Patch03' &&
  111. *** ORIG/CHANGES    Mon Oct 28 17:13:00 1991
  112. --- ./CHANGES    Mon Oct 28 15:16:30 1991
  113. ***************
  114. *** 14,16 ****
  115. --- 14,30 ----
  116. X  Added support for dynamically modifiable SQL statements
  117. X  Added a Hints file
  118. X  Corrected an error in the quick-reference sheet
  119. + Patch 03
  120. + ========
  121. + Fixed a bug in allocating the data buffers, notably affecting DATE fields
  122. + Fixed a bug in not freeing the space for ora_bind parameters
  123. + Fixed a bug in creating a "debug" variable when it wasn't needed
  124. + Improved debugging output, added support for flag 32 (string/numeric conversion)
  125. + Improved handling of $ora_errstr
  126. + Added configuration flags for various things to the Makefile
  127. + Added targets listing and docs to the Makefile
  128. + Added the &ora_version() function, analagous to Perl's -v flag.
  129. + Added the &ora_do() function, equivalent to &ora_close(&ora_open(...))
  130. + Added handling of NULL values returned from the database
  131. + Added an 'oraperl.ph' file
  132. *** ORIG/Hints    Mon Oct 28 17:12:29 1991
  133. --- ./Hints    Mon Oct 28 15:22:35 1991
  134. ***************
  135. *** 1,4 ****
  136. X  This file contains hints and tips about Oraperl, dealing with problems which
  137. X  have arisen in the past.
  138. X  
  139. --- 1,3 ----
  140. ***************
  141. *** 6,31 ****
  142. X  Retrieving Dates
  143. X  ================
  144. X  
  145. ! If you want to retrieve a field which is declared as an Oracle DATE, then you
  146. ! must explicitly format it using the SQL*Plus TO_CHAR function, for example:
  147. !     $csr = &ora_open($lda, "select to_char(sysdate, 'DD/MM/YY') from dual")
  148. ! Otherwise, Oracle tells Oraperl that the field only occupies seven bytes,
  149. ! and a truncation error occurs when the field is fetched. This causes
  150. ! &ora_fetch() to return an error.
  151. X  
  152. - I hope to correct this in a future patch.
  153. X  
  154. X  Building on a Convex machine
  155. X  ============================
  156. X  
  157. ! The  strtol()  function used at the start of most of the functions in orafns.c
  158. ! and in oracle.mus must be replaced by  strtoul() to allow larger addresses to
  159. ! be converted.
  160. X  
  161. ! The  putenv()  function used in  set_sid()  must be replaced by  setenv() .
  162. X  
  163. X  
  164. X  Using Bind Variables
  165. --- 5,27 ----
  166. X  Retrieving Dates
  167. X  ================
  168. X  
  169. ! Due to a bug in earlier versions of Oraperl, it was not possible to return
  170. ! a DATE field in default format. This has been corrected in patch 3. You may
  171. ! still wish to use Oracle's to_char() function for greater control over the
  172. ! format in which the date is returned.
  173. X  
  174. X  
  175. X  Building on a Convex machine
  176. X  ============================
  177. X  
  178. ! Uncomment the definitions of STRTOL and PUTENV in the Makefile.
  179. ! Building with Perl v3
  180. ! =====================
  181. X  
  182. ! Ideally, get hold of v4. However, if you have to work with v3, uncomment
  183. ! the definition of STR_2MORTAL in the Makefile.
  184. X  
  185. X  
  186. X  Using Bind Variables
  187. *** ORIG/Makefile    Mon Oct 28 17:13:00 1991
  188. --- ./Makefile    Mon Oct 28 15:25:35 1991
  189. ***************
  190. *** 3,9 ****
  191. X  # Change these to your ORACLE installation directory and Perl source directory
  192. X  
  193. X  ORACLE_HOME    = /usr/soft/oracle
  194. ! SRC        = /usr/soft/public/perl_4.0.10
  195. X  
  196. X  # Oracle Definitions, taken from proc.mk
  197. X  
  198. --- 3,9 ----
  199. X  # Change these to your ORACLE installation directory and Perl source directory
  200. X  
  201. X  ORACLE_HOME    = /usr/soft/oracle
  202. ! SRC        = /usr/soft/public/perl
  203. X  
  204. X  # Oracle Definitions, taken from proc.mk
  205. X  
  206. ***************
  207. *** 25,38 ****
  208. X  # Set DEBUG to -DDEBUGGING, -DPERL_DEBUGGING or leave blank (see orafns.h)
  209. X  
  210. X  DEBUG        = -DPERL_DEBUGGING
  211. - CFLAGS        = $(DEBUG) -I$(SRC) $(GLOBINCS) -O
  212. X  
  213. ! SRCS        = usersub.c oracle.c orafns.c getcursor.c colons.c
  214. X  OBJS        = usersub.o oracle.o orafns.o getcursor.o colons.o
  215. ! HDRS        = orafns.h
  216. X  
  217. X  oraperl: $(SRC)/uperl.o $(OBJS)
  218. !     cc -o oraperl $(SRC)/uperl.o $(OBJS)                \
  219. X            -lm $(OCILIB) $(NETLIBS) $(ORALIBS) $(CLIBS) $(LIBS)
  220. X  
  221. X  oracle.c: $(SRC)/usub/mus oracle.mus
  222. --- 25,53 ----
  223. X  # Set DEBUG to -DDEBUGGING, -DPERL_DEBUGGING or leave blank (see orafns.h)
  224. X  
  225. X  DEBUG        = -DPERL_DEBUGGING
  226. X  
  227. ! # Some system-specific things
  228. ! #
  229. ! # If you have setenv() instead of putenv(), uncomment the next line
  230. ! # PUTENV    = -Dputenv=setenv
  231. ! #
  232. ! # If you have strtoul(), uncomment the next line
  233. ! # STRTOL    = -Dstrtol=strtoul
  234. ! #
  235. ! # If you are using Perl v3 instead of v4, uncomment the next line
  236. ! # STR_2MORTAL    = -Dstr_2mortal=str_2static
  237. ! # From here on, you shouldn't need to change anything
  238. ! SRCS        = usersub.c oracle.mus orafns.c getcursor.c colons.c
  239. X  OBJS        = usersub.o oracle.o orafns.o getcursor.o colons.o
  240. ! HDRS        = patchlevel.h orafns.h
  241. ! DEFS        = $(STRTOL) $(PUTENV) $(STR_2MORTAL)
  242. ! CFLAGS        = $(DEBUG) -I$(SRC) $(GLOBINCS) $(LOCINCS) $(DEFS) -O
  243. X  
  244. X  oraperl: $(SRC)/uperl.o $(OBJS)
  245. !     $(CC) -o oraperl $(SRC)/uperl.o $(OBJS)                \
  246. X            -lm $(OCILIB) $(NETLIBS) $(ORALIBS) $(CLIBS) $(LIBS)
  247. X  
  248. X  oracle.c: $(SRC)/usub/mus oracle.mus
  249. ***************
  250. *** 41,44 ****
  251. X  $(OBJS):    $(HDRS)
  252. X  
  253. X  clean:
  254. !     rm -f nohup.out oraperl *.o oracle.c oraperl.man Print tags out core
  255. --- 56,69 ----
  256. X  $(OBJS):    $(HDRS)
  257. X  
  258. X  clean:
  259. !     rm -f nohup.out oraperl *.o oracle.c oraperl.man oraperl.doc.pr \
  260. !           oraperl.ref.pr listing tags core PATCHLEVEL
  261. ! listing:
  262. !     pr -fn Makefile $(HDRS) $(SRCS) >listing
  263. ! docs:
  264. !     nroff -man oraperl.1 >oraperl.man
  265. !     nroff oraperl.doc >oraperl.doc.pr
  266. !     nroff oraperl.ref >oraperl.ref.pr
  267. *** ORIG/README    Mon Oct 28 17:13:01 1991
  268. --- ./README    Mon Oct 28 15:46:00 1991
  269. ***************
  270. *** 8,28 ****
  271. X  
  272. X      ORACLE_HOME    your Oracle installation directory
  273. X      SRC        your Perl source directory (with the usub directory)
  274. !     OTHERLIBS    \
  275. X      CLIBS         |
  276. X      OCILIB         +- copy these from your proc.mk file
  277. X      NETLIBS         |
  278. X      ORALIBS        /
  279. !     GLOBINCS    \
  280. X      LOCINCS         +- copy these from $SRC/usub/Makefile
  281. X      LIBS        /
  282. X      DEBUG        -DDEBUGGING, -DPERL_DEBUGGING or leave blank;
  283. X              see orafns.h for an explanation
  284. X  
  285. - If your version of Perl is earlier than v4, you will also need to make
  286. - one change to  oracle.mus . The name  str_2mortal()  on line 101 must
  287. - be changed to  str_2static()  with the same arguments.
  288. X  I've only tested this on an Encore Multimax 520 running UMAX V (Sys Vr3.2),
  289. X  using Perl 3.0.34, 4.0.00 4.0.03 and 4.0.10 with Oracle version 6, as I don't
  290. X  have access to any other system with Pro*C. I'd appreciate any comments,
  291. --- 8,27 ----
  292. X  
  293. X      ORACLE_HOME    your Oracle installation directory
  294. X      SRC        your Perl source directory (with the usub directory)
  295. !     OTHERLIBS    \ 
  296. X      CLIBS         |
  297. X      OCILIB         +- copy these from your proc.mk file
  298. X      NETLIBS         |
  299. X      ORALIBS        /
  300. !     GLOBINCS    \ 
  301. X      LOCINCS         +- copy these from $SRC/usub/Makefile
  302. X      LIBS        /
  303. X      DEBUG        -DDEBUGGING, -DPERL_DEBUGGING or leave blank;
  304. X              see orafns.h for an explanation
  305. +     PUTENV        \ 
  306. +     STRTOL         +- system dependent - see Makefile for details
  307. +     STR_2MORTAL    /
  308. X  
  309. X  I've only tested this on an Encore Multimax 520 running UMAX V (Sys Vr3.2),
  310. X  using Perl 3.0.34, 4.0.00 4.0.03 and 4.0.10 with Oracle version 6, as I don't
  311. X  have access to any other system with Pro*C. I'd appreciate any comments,
  312. ***************
  313. *** 32,37 ****
  314. --- 31,37 ----
  315. X  
  316. X  Source Code:
  317. X      Makefile    building instructions
  318. +     patchlevel.h    your Oraperl patch level
  319. X      orafns.h    common declarations
  320. X      oracle.mus    function interface description
  321. X      getcursor.c    functions to deal with the cursor pool
  322. ***************
  323. *** 43,62 ****
  324. X      debug-p        tests to see if debugging is available
  325. X      ex.pl        simple example of using the functions
  326. X      mkdb.pl        more extensive example, showing the use of ora_bind()
  327. X  
  328. X  Documentation
  329. X      oraperl.doc    explains some of the thinking behind Oraperl
  330. !     oraperl.ref    quick reference (troff format)
  331. X      oraperl.1    manual page
  332. -     Hints        notes on using oraperl
  333. -     Oracle-v5    Hints for compiling Oraperl with Oracle v5
  334. X  
  335. X  Miscellaneous
  336. X      CHANGES        Summary of changes to Oraperl
  337. !     PATCHLEVEL    current patchlevel (2)
  338. X  
  339. ! Many thanks to Larry for Perl. Now if only we could get the Camel book
  340. ! into France! Hmm. Any plans for "Le Livre Chameau"?
  341. X  
  342. X      Kevin Stock
  343. X      kstock@gouldfr.encore.fr
  344. --- 43,62 ----
  345. X      debug-p        tests to see if debugging is available
  346. X      ex.pl        simple example of using the functions
  347. X      mkdb.pl        more extensive example, showing the use of ora_bind()
  348. +             and ora_do()
  349. X  
  350. X  Documentation
  351. X      oraperl.doc    explains some of the thinking behind Oraperl
  352. !     oraperl.ref    quick reference - glue it into the perl reference guide
  353. X      oraperl.1    manual page
  354. X  
  355. X  Miscellaneous
  356. X      CHANGES        Summary of changes to Oraperl
  357. !     Hints        notes on using oraperl
  358. !     Oracle-v5    Hints for compiling Oraperl with Oracle v5
  359. !     oraperl.ph    definitions of Oraperl error and debugging codes
  360. X  
  361. ! Many thanks to Larry for Perl.
  362. X  
  363. X      Kevin Stock
  364. X      kstock@gouldfr.encore.fr
  365. *** ORIG/colons.c    Mon Oct 28 17:12:31 1991
  366. --- ./colons.c    Fri Oct 25 14:29:54 1991
  367. ***************
  368. *** 9,19 ****
  369. --- 9,26 ----
  370. X   * Perl kit.
  371. X   */
  372. X  
  373. + #include <stdio.h>
  374. + #include "EXTERN.h"
  375. + #include "orafns.h"
  376. X  int count_colons(s)
  377. X  register char *s;
  378. X  {
  379. X      register int n = 0, c;
  380. X  
  381. +     DEBUG(8, 1, (fprintf(stderr, "count_colons(\"%s\")\n", s)));
  382. X      while (*s != '\0')
  383. X      {
  384. X          if (*s == ':')
  385. ***************
  386. *** 24,29 ****
  387. --- 31,39 ----
  388. X              if (((c = atoi(++s)) <= 0) || (c > n+1))
  389. X              {
  390. X                  /* number too low or out of sequence */
  391. +                 DEBUG(8, -1, (fprintf(stderr,
  392. +                     "count_colons: got %d, expected %d\n",
  393. +                     c, n+1)));
  394. X                  return(-1);
  395. X              }
  396. X              else if (c == n + 1)
  397. ***************
  398. *** 43,47 ****
  399. --- 53,58 ----
  400. X          }
  401. X      }
  402. X  
  403. +     DEBUG(8, -1, (fprintf(stderr, "count_colons: returning %d\n", n)));
  404. X      return(n);
  405. X  }
  406. *** ORIG/getcursor.c    Mon Oct 28 17:13:02 1991
  407. --- ./getcursor.c    Fri Oct 25 16:05:03 1991
  408. ***************
  409. *** 29,39 ****
  410. X  {
  411. X      int i;
  412. X  
  413. !     DEBUG(8, (fprintf(stderr, "ora_free_data(%#lx)\n", (long) csr)));
  414. X  
  415. X      if (csr->data == NULL)
  416. X      {
  417. !         DEBUG(8, (fputs("ora_free_data: returning\n", stderr)));
  418. X          return;
  419. X      }
  420. X  
  421. --- 29,39 ----
  422. X  {
  423. X      int i;
  424. X  
  425. !     DEBUG(8, 1, (fprintf(stderr, "ora_free_data(%#lx)\n", (long) csr)));
  426. X  
  427. X      if (csr->data == NULL)
  428. X      {
  429. !         DEBUG(8, -1, (fputs("ora_free_data: nothing to do\n", stderr)));
  430. X          return;
  431. X      }
  432. X  
  433. ***************
  434. *** 41,57 ****
  435. X      {
  436. X          if (csr->data[i] != NULL)
  437. X          {
  438. !             DEBUG(128, (fprintf(stderr, "freeing (%d) == %#lx\n",
  439. !                 i, (long) csr->data[i])));
  440. X              free(csr->data[i]);
  441. X          }
  442. X      }
  443. X  
  444. !     DEBUG(128, (fprintf(stderr, "freeing %#lx\n", (long) csr->data)));
  445. X      free(csr->data);
  446. !     csr->data = NULL;
  447. X      csr->nfields = 0;
  448. !     DEBUG(8, (fputs("ora_free_data: returning\n", stderr)));
  449. X  }
  450. X  
  451. X  
  452. --- 41,65 ----
  453. X      {
  454. X          if (csr->data[i] != NULL)
  455. X          {
  456. !             DEBUG(128, 0, (fprintf(stderr,
  457. !                 "ora_free_data: freeing field %d at address %#lx\n",
  458. !                 i, (long) csr->data[i])));
  459. X              free(csr->data[i]);
  460. X          }
  461. X      }
  462. X  
  463. !     DEBUG(128, 0, (fprintf(stderr,
  464. !         "ora_free_data: freeing cursor rcode at address %#lx\n",
  465. !         (long) csr->rcode)));
  466. !     free(csr->rcode);
  467. !     csr->rcode = (short *) NULL;
  468. !     DEBUG(128, 0, (fprintf(stderr,
  469. !         "ora_free_data: freeing cursor data at address %#lx\n",
  470. !         (long) csr->data)));
  471. X      free(csr->data);
  472. !     csr->data = (char **) NULL;
  473. X      csr->nfields = 0;
  474. !     DEBUG(8, -1, (fputs("ora_free_data: returning\n", stderr)));
  475. X  }
  476. X  
  477. X  
  478. ***************
  479. *** 66,93 ****
  480. X  {
  481. X      struct cursor *tmp;
  482. X  
  483. !     DEBUG(8, (fputs("ora_getcursor()\n", stderr)));
  484. X  
  485. X      if ((tmp = (struct cursor *) malloc(sizeof(struct cursor))) == NULL)
  486. X      {
  487. !         DEBUG(128, (fputs("ora_getcursor: out of memory\n", stderr)));
  488. !         DEBUG(8, (fputs("ora_getcursor: returning NULL\n", stderr)));
  489. X          ora_errno = ORAP_NOMEM;
  490. X          return(NULL);
  491. X      }
  492. !     DEBUG(128, (fprintf(stderr,
  493. !         "ora_getcursor: got cursor at %#lx\n", (long) tmp)));
  494. X  
  495. !     if ((tmp->csr = (struct csrdef *) malloc(sizeof(struct csrdef))) == NULL)
  496. X      {
  497. X          free(tmp);
  498. !         DEBUG(128, (fputs("ora_getcursor: out of memory\n", stderr)));
  499. !         DEBUG(8, (fputs("ora_getcursor: returning NULL\n", stderr)));
  500. X          ora_errno = ORAP_NOMEM;
  501. X          return(NULL);
  502. X      }
  503. !     DEBUG(128, (fprintf(stderr,
  504. !         "ora_getcursor: got csr at %#lx\n", tmp->csr)));
  505. X  
  506. X      tmp->hda = NULL;
  507. X      tmp->data = NULL;
  508. --- 74,101 ----
  509. X  {
  510. X      struct cursor *tmp;
  511. X  
  512. !     DEBUG(8, 1, (fputs("ora_getcursor()\n", stderr)));
  513. X  
  514. X      if ((tmp = (struct cursor *) malloc(sizeof(struct cursor))) == NULL)
  515. X      {
  516. !         DEBUG((8 | 128), -1,
  517. !             (fputs("ora_getcursor: out of memory\n", stderr)));
  518. X          ora_errno = ORAP_NOMEM;
  519. X          return(NULL);
  520. X      }
  521. !     DEBUG(128, 0, (fprintf(stderr,
  522. !         "ora_getcursor: got cursor at %#lx\n", (long) tmp)));
  523. X  
  524. !     if ((tmp->csr = (struct csrdef *)malloc(sizeof(struct csrdef))) == NULL)
  525. X      {
  526. X          free(tmp);
  527. !         DEBUG((8 | 128), -1,
  528. !             (fputs("ora_getcursor: out of memory\n", stderr)));
  529. X          ora_errno = ORAP_NOMEM;
  530. X          return(NULL);
  531. X      }
  532. !     DEBUG(128, 0, (fprintf(stderr,
  533. !         "ora_getcursor: got csr at %#lx\n", tmp->csr)));
  534. X  
  535. X      tmp->hda = NULL;
  536. X      tmp->data = NULL;
  537. ***************
  538. *** 96,102 ****
  539. X      csr_list.next = tmp;
  540. X  
  541. X      ora_errno = 0;
  542. !     DEBUG(8, (fprintf(stderr,"ora_getcursor: returning %#lx\n",(long)tmp)));
  543. X      return(tmp);
  544. X  }
  545. X  
  546. --- 104,111 ----
  547. X      csr_list.next = tmp;
  548. X  
  549. X      ora_errno = 0;
  550. !     DEBUG(8, -1,
  551. !         (fprintf(stderr,"ora_getcursor: returning %#lx\n",(long)tmp)));
  552. X      return(tmp);
  553. X  }
  554. X  
  555. ***************
  556. *** 111,136 ****
  557. X  {
  558. X      struct cursor *tmp;
  559. X  
  560. !     DEBUG(8, (fputs("ora_getlda()\n", stderr)));
  561. X  
  562. X      if ((tmp = ora_getcursor()) == NULL)
  563. X      {
  564. !         DEBUG(8, (fputs("ora_getlda: returning NULL\n", stderr)));
  565. X          return(NULL);
  566. X      }
  567. X  
  568. X      if ((tmp->hda = malloc(256)) == NULL)
  569. X      {
  570. !         DEBUG(128, (fputs("ora_getlda: out of memory\n", stderr)));
  571. X          ora_dropcursor(tmp);
  572. -         DEBUG(8, (fputs("ora_getlda: returning NULL\n", stderr)));
  573. X          ora_errno = ORAP_NOMEM;
  574. X          return(NULL);
  575. X      }
  576. !     DEBUG(128, (fprintf(stderr,
  577. !         "ora_getlda: got hda at %#lx\n", tmp->hda)));
  578. X  
  579. !     DEBUG(8, (fprintf(stderr, "ora_getlda: returning %#lx\n", tmp)));
  580. X      return(tmp);
  581. X  }
  582. X  
  583. --- 120,145 ----
  584. X  {
  585. X      struct cursor *tmp;
  586. X  
  587. !     DEBUG(8, 1, (fputs("ora_getlda()\n", stderr)));
  588. X  
  589. X      if ((tmp = ora_getcursor()) == NULL)
  590. X      {
  591. !         DEBUG(8, -1, (fputs("ora_getlda: returning NULL\n", stderr)));
  592. X          return(NULL);
  593. X      }
  594. X  
  595. X      if ((tmp->hda = malloc(256)) == NULL)
  596. X      {
  597. !         DEBUG((8 | 128), -1,
  598. !             (fputs("ora_getlda: out of memory\n", stderr)));
  599. X          ora_dropcursor(tmp);
  600. X          ora_errno = ORAP_NOMEM;
  601. X          return(NULL);
  602. X      }
  603. !     DEBUG(128, 0,
  604. !         (fprintf(stderr, "ora_getlda: got hda at %#lx\n", tmp->hda)));
  605. X  
  606. !     DEBUG(8, -1, (fprintf(stderr, "ora_getlda: returning %#lx\n", tmp)));
  607. X      return(tmp);
  608. X  }
  609. X  
  610. ***************
  611. *** 147,153 ****
  612. X  
  613. X      tmp = &csr_list;
  614. X  
  615. !     DEBUG(8, (fprintf(stderr, "ora_dropcursor(%#lx)\n", (long) csr)));
  616. X  
  617. X      while ((tmp->next != NULL) && (tmp->next != csr))
  618. X      {
  619. --- 156,162 ----
  620. X  
  621. X      tmp = &csr_list;
  622. X  
  623. !     DEBUG(8, 1, (fprintf(stderr, "ora_dropcursor(%#lx)\n", (long) csr)));
  624. X  
  625. X      while ((tmp->next != NULL) && (tmp->next != csr))
  626. X      {
  627. ***************
  628. *** 156,162 ****
  629. X  
  630. X      if (tmp->next == NULL)
  631. X      {
  632. !         DEBUG(8, (fputs("ora_dropcursor: invalid\n", stderr)));
  633. X          ora_errno = ORAP_INVCSR;
  634. X          return(0);
  635. X      }
  636. --- 165,172 ----
  637. X  
  638. X      if (tmp->next == NULL)
  639. X      {
  640. !         DEBUG(8, -1,
  641. !             (fprintf(stderr, "ora_dropcursor: not a cursor\n")));
  642. X          ora_errno = ORAP_INVCSR;
  643. X          return(0);
  644. X      }
  645. ***************
  646. *** 165,191 ****
  647. X  
  648. X      if (t->hda != NULL)
  649. X      {
  650. !         DEBUG(128, (fprintf(stderr,
  651. !             "ora_dropcursor: freeing hda at %#lx\n", (long) t->hda)));
  652. X          free(t->hda);
  653. X      }
  654. X      if (t->data != NULL)
  655. X      {
  656. !         DEBUG(128, (fputs("ora_dropcursor: freeing data\n", stderr)));
  657. X          ora_free_data(t);
  658. X      }
  659. X  
  660. !     DEBUG(128, (fprintf(stderr,
  661. !         "ora_dropcursor: freeing csr at %#lx\n", (long) t->csr)));
  662. X      free(t->csr);
  663. X  
  664. X      t = t->next;
  665. !     DEBUG(128, (fprintf(stderr,
  666. !         "ora_dropcursor: freeing cursor at %#lx\n", (long) tmp->next)));
  667. X      free(tmp->next);
  668. X      tmp->next = t;
  669. X  
  670. !     DEBUG(8, (fputs("ora_dropcursor: returning\n", stderr)));
  671. X      return(1);
  672. X  }
  673. X  
  674. --- 175,205 ----
  675. X  
  676. X      if (t->hda != NULL)
  677. X      {
  678. !         DEBUG(128, 0,
  679. !             (fprintf(stderr, "ora_dropcursor: freeing hda at %#lx\n",
  680. !             (long) t->hda)));
  681. X          free(t->hda);
  682. X      }
  683. X      if (t->data != NULL)
  684. X      {
  685. !         DEBUG(128, 0,
  686. !             (fputs("ora_dropcursor: freeing data\n", stderr)));
  687. X          ora_free_data(t);
  688. X      }
  689. X  
  690. !     DEBUG(128, 0,
  691. !         (fprintf(stderr, "ora_dropcursor: freeing csr at %#lx\n",
  692. !         (long) t->csr)));
  693. X      free(t->csr);
  694. X  
  695. X      t = t->next;
  696. !     DEBUG(128, 0,
  697. !         (fprintf(stderr, "ora_dropcursor: freeing cursor at %#lx\n",
  698. !         (long) tmp->next)));
  699. X      free(tmp->next);
  700. X      tmp->next = t;
  701. X  
  702. !     DEBUG(8, -1, (fputs("ora_dropcursor: returning\n", stderr)));
  703. X      return(1);
  704. X  }
  705. X  
  706. ***************
  707. *** 194,207 ****
  708. X   *
  709. X   * This is just here for completeness' sake.
  710. X   * (I suppose we could check the value of hda in dropcursor and droplda
  711. !  * but I don't think it's worth it
  712. X   */
  713. X  
  714. X  int ora_droplda(lda)
  715. X  struct cursor *lda;
  716. X  {
  717. !     DEBUG(8, (fprintf(stderr,
  718. !         "ora_droplda(%#lx): calling ora_dropcursor\n", lda)));
  719. X      return(ora_dropcursor(lda));
  720. X  }
  721. X  
  722. --- 208,222 ----
  723. X   *
  724. X   * This is just here for completeness' sake.
  725. X   * (I suppose we could check the value of hda in dropcursor and droplda
  726. !  * but I don't think it's worth it)
  727. X   */
  728. X  
  729. X  int ora_droplda(lda)
  730. X  struct cursor *lda;
  731. X  {
  732. !     DEBUG(8, 0,
  733. !         (fprintf(stderr, "ora_droplda(%#lx): calling ora_dropcursor\n",
  734. !         lda)));
  735. X      return(ora_dropcursor(lda));
  736. X  }
  737. X  
  738. ***************
  739. *** 218,224 ****
  740. X  
  741. X      tmp = &csr_list;
  742. X  
  743. !     DEBUG(8, (fprintf(stderr, "ora_findcursor(%#lx)\n", (long) csr)));
  744. X  
  745. X      while ((tmp->next != NULL) && (tmp->next != csr))
  746. X      {
  747. --- 233,239 ----
  748. X  
  749. X      tmp = &csr_list;
  750. X  
  751. !     DEBUG(8, 1, (fprintf(stderr, "ora_findcursor(%#lx)\n", (long) csr)));
  752. X  
  753. X      while ((tmp->next != NULL) && (tmp->next != csr))
  754. X      {
  755. ***************
  756. *** 227,237 ****
  757. X  
  758. X      if (tmp->next == NULL)
  759. X      {
  760. !         DEBUG(8, (fputs("ora_findcursor: not valid\n", stderr)));
  761. X          return(0);
  762. X      }
  763. X  
  764. !     DEBUG(8, (fputs("ora_findcursor: valid\n", stderr)));
  765. X      return(1);
  766. X  }
  767. X  
  768. --- 242,252 ----
  769. X  
  770. X      if (tmp->next == NULL)
  771. X      {
  772. !         DEBUG(8, -1, (fputs("ora_findcursor: not a cursor\n", stderr)));
  773. X          return(0);
  774. X      }
  775. X  
  776. !     DEBUG(8, -1, (fputs("ora_findcursor: is a cursor\n", stderr)));
  777. X      return(1);
  778. X  }
  779. X  
  780. ***************
  781. *** 244,259 ****
  782. X   int check_lda(lda)
  783. X   struct cursor *lda;
  784. X   {
  785. !     DEBUG(8, (fprintf(stderr, "check_lda(%#lx)\n", (long) lda)));
  786. X  
  787. X      if (ora_findcursor(lda) && (lda->hda != NULL) && (lda->data == NULL))
  788. X      {
  789. !         DEBUG(8, (fputs("check_lda: valid\n", stderr)));
  790. X          return (1);
  791. X      }
  792. X      else
  793. X      {
  794. !         DEBUG(8, (fputs("check_lda: invalid\n", stderr)));
  795. X          return (0);
  796. X      }
  797. X  };
  798. --- 259,274 ----
  799. X   int check_lda(lda)
  800. X   struct cursor *lda;
  801. X   {
  802. !     DEBUG(8, 1, (fprintf(stderr, "check_lda(%#lx)\n", (long) lda)));
  803. X  
  804. X      if (ora_findcursor(lda) && (lda->hda != NULL) && (lda->data == NULL))
  805. X      {
  806. !         DEBUG(8, -1, (fputs("check_lda: is an lda\n", stderr)));
  807. X          return (1);
  808. X      }
  809. X      else
  810. X      {
  811. !         DEBUG(8, -1, (fputs("check_lda: not an lda\n", stderr)));
  812. X          return (0);
  813. X      }
  814. X  };
  815. ***************
  816. *** 267,282 ****
  817. X   int check_csr(csr)
  818. X   struct cursor *csr;
  819. X   {
  820. !     DEBUG(8, (fprintf(stderr, "check_csr(%#lx)\n", (long) csr)));
  821. X  
  822. X      if (ora_findcursor(csr) && (csr->hda == NULL))
  823. X      {
  824. !         DEBUG(8, (fputs("check_csr: valid\n", stderr)));
  825. X          return (1);
  826. X      }
  827. X      else
  828. X      {
  829. !         DEBUG(8, (fputs("check_csr: invalid\n", stderr)));
  830. X          return (0);
  831. X      }
  832. X  };
  833. --- 282,297 ----
  834. X   int check_csr(csr)
  835. X   struct cursor *csr;
  836. X   {
  837. !     DEBUG(8, 1, (fprintf(stderr, "check_csr(%#lx)\n", (long) csr)));
  838. X  
  839. X      if (ora_findcursor(csr) && (csr->hda == NULL))
  840. X      {
  841. !         DEBUG(8, -1, (fputs("check_csr: is a csr\n", stderr)));
  842. X          return (1);
  843. X      }
  844. X      else
  845. X      {
  846. !         DEBUG(8, -1, (fputs("check_csr: not a csr\n", stderr)));
  847. X          return (0);
  848. X      }
  849. X  };
  850. *** ORIG/mkdb.pl    Mon Oct 28 17:12:32 1991
  851. --- ./mkdb.pl    Mon Oct 28 16:47:31 1991
  852. ***************
  853. *** 8,20 ****
  854. X  # Date:        5th August 1991
  855. X  #
  856. X  
  857. ! # let's see what oraperl is doing when it executes this
  858. X  
  859. ! $ora_debug = 136;
  860. X  
  861. X  $CREATE = "create table tryit (name char(10), ext number(3))";
  862. X  $INSERT = "insert into tryit values (:1, :2)";
  863. X  $LIST    = "select * from tryit order by name";
  864. X  $DROP    = "drop table tryit";
  865. X  
  866. X  format top =
  867. --- 8,27 ----
  868. X  # Date:        5th August 1991
  869. X  #
  870. X  
  871. ! # make sure that we really are running oraperl
  872. ! die ("You should use oraperl, not perl\n") unless defined &ora_login;
  873. ! # get debugging & error codes
  874. ! require('oraperl.ph');
  875. X  
  876. ! # let's see what oraperl is doing when it executes this
  877. ! $ora_debug = $ODBG_EXEC | $ODBG_STRNUM | $ODBG_MALLOC;
  878. X  
  879. + # set these as strings to make the code more readable
  880. X  $CREATE = "create table tryit (name char(10), ext number(3))";
  881. X  $INSERT = "insert into tryit values (:1, :2)";
  882. X  $LIST    = "select * from tryit order by name";
  883. + $DELETE    = "delete from tryit where name = :1";
  884. X  $DROP    = "drop table tryit";
  885. X  
  886. X  format top =
  887. ***************
  888. *** 27,39 ****
  889. X         $name,       $ext
  890. X  .
  891. X  
  892. ! die ("You should use oraperl, not perl\n") unless defined &ora_login;
  893. X  
  894. X  # create the database
  895. X  
  896. X  $lda = &ora_login("t", "kstock", "kstock")    || die $ora_errstr;
  897. ! $csr = &ora_open($lda, $CREATE)            || die $ora_errstr;
  898. ! do ora_close($csr)                || die $ora_errstr;
  899. X  
  900. X  # put some data into it
  901. X  
  902. --- 34,60 ----
  903. X         $name,       $ext
  904. X  .
  905. X  
  906. ! # function to list the database
  907. ! sub list
  908. ! {
  909. !     local($csr, $name, $ext);
  910. !     $- = 0;
  911. !     $csr = &ora_open($lda, $LIST)            || die $ora_errstr;
  912. !     while (($name, $ext) = &ora_fetch($csr))
  913. !     {
  914. !         write;
  915. !     }
  916. !     die $ora_errstr if ($ora_errno != 0);
  917. !     do ora_close($csr)                || die $ora_errstr;
  918. ! }
  919. X  
  920. X  # create the database
  921. X  
  922. X  $lda = &ora_login("t", "kstock", "kstock")    || die $ora_errstr;
  923. ! &ora_do($lda, $CREATE)                || die $ora_errstr;
  924. X  
  925. X  # put some data into it
  926. X  
  927. ***************
  928. *** 45,73 ****
  929. X  }
  930. X  do ora_close($csr)                || die $ora_errstr;
  931. X  
  932. ! # list the result
  933. X  
  934. ! $csr = &ora_open($lda, $LIST)            || die $ora_errstr;
  935. ! while (($name, $ext) = &ora_fetch($csr))
  936. X  {
  937. !     write;
  938. X  }
  939. ! do ora_close($csr)                || die $ora_errstr;
  940. X  
  941. ! # remove the database
  942. X  
  943. ! $csr = &ora_open($lda, $DROP)            || die $ora_errstr;
  944. ! do ora_close($csr)                || die $ora_errstr;
  945. X  do ora_logoff($lda)                || die $ora_errstr;
  946. X  __END__
  947. - david:225
  948. - angela:208
  949. - bruno:302
  950. - albert:294
  951. X  julia:292
  952. ! alison:206
  953. ! arnold:305
  954. X  larry:424
  955. X  catherine:201
  956. X  randall:306
  957. ! susan:307
  958. --- 66,95 ----
  959. X  }
  960. X  do ora_close($csr)                || die $ora_errstr;
  961. X  
  962. ! # check the result
  963. ! do list();
  964. ! # remove a few lines
  965. X  
  966. ! $csr = &ora_open($lda, $DELETE)            || die $ora_errstr;
  967. ! foreach $name ('catherine', 'angela', 'arnold', 'julia')
  968. X  {
  969. !     &ora_bind($csr, $name)            || die $ora_errstr;
  970. X  }
  971. ! &ora_close($csr)                || die $ora_errstr;
  972. X  
  973. ! # check the result
  974. ! do list();
  975. X  
  976. ! # remove the database and log out
  977. ! $csr = &ora_do($lda, $DROP)            || die $ora_errstr;
  978. X  do ora_logoff($lda)                || die $ora_errstr;
  979. + # This is the data which will go into the database
  980. X  __END__
  981. X  julia:292
  982. ! angela:208
  983. X  larry:424
  984. X  catherine:201
  985. X  randall:306
  986. ! arnold:305
  987. *** ORIG/oracle.mus    Mon Oct 28 17:13:02 1991
  988. --- ./oracle.mus    Mon Oct 28 16:40:49 1991
  989. ***************
  990. *** 1,6 ****
  991. --- 1,9 ----
  992. X  /* oracle.mus
  993. X   *
  994. X   * User subroutine interface to Oracle functions
  995. +  *
  996. +  * NOTE: Do not modify oracle.c as it is created automagically from oracle.mus.
  997. +  *     Modify oracle.mus instead, or your changes will be lost.
  998. X   */
  999. X  /* Copyright 1991 Kevin Stock.
  1000. X   *
  1001. ***************
  1002. *** 23,33 ****
  1003. --- 26,38 ----
  1004. X  };
  1005. X  
  1006. X  static enum usersubs {
  1007. +     US_ora_version,
  1008. X      US_ora_login,
  1009. X      US_ora_open,
  1010. X      US_ora_bind,
  1011. X      US_ora_fetch,
  1012. X      US_ora_close,
  1013. +     US_ora_do,
  1014. X      US_ora_logoff,
  1015. X  };
  1016. X  
  1017. ***************
  1018. *** 52,62 ****
  1019. --- 57,69 ----
  1020. X      MAGICVAR("ora_errno",    UV_ora_errno);
  1021. X      MAGICVAR("ora_errstr",    UV_ora_errstr);
  1022. X  
  1023. +     make_usub("ora_version",    US_ora_version,    usersub, filename);
  1024. X      make_usub("ora_login",    US_ora_login,    usersub, filename);
  1025. X      make_usub("ora_open",    US_ora_open,    usersub, filename);
  1026. X      make_usub("ora_bind",    US_ora_bind,    usersub, filename);
  1027. X      make_usub("ora_fetch",    US_ora_fetch,    usersub, filename);
  1028. X      make_usub("ora_close",    US_ora_close,    usersub, filename);
  1029. +     make_usub("ora_do",        US_ora_do,    usersub, filename);
  1030. X      make_usub("ora_logoff",    US_ora_logoff,    usersub, filename);
  1031. X  };
  1032. X  
  1033. ***************
  1034. *** 74,79 ****
  1035. --- 81,89 ----
  1036. X  
  1037. X      switch (ix) {
  1038. X  
  1039. + CASE    void    ora_version
  1040. + END
  1041. X  CASE    char *    ora_login
  1042. X  I    char *    database
  1043. X  I    char *    name
  1044. ***************
  1045. *** 86,94 ****
  1046. X  END
  1047. X  
  1048. X      case US_ora_fetch:
  1049. !     if (items != 1)
  1050. !         fatal("Usage: @array = &ora_fetch($csr)");
  1051. !     else {
  1052. X          char *csr        = (char *) str_get(st[1]);
  1053. X  
  1054. X          if (curcsv->wantarray) {    /* in array context, return the data */
  1055. --- 96,107 ----
  1056. X  END
  1057. X  
  1058. X      case US_ora_fetch:
  1059. !     if (items != 1) {
  1060. !         if (curcsv->wantarray)
  1061. !             fatal("Usage: @array = &ora_fetch($csr)");
  1062. !         else
  1063. !             fatal("Usage: $nfields = &ora_fetch($csr)");
  1064. !     } else {
  1065. X          char *csr        = (char *) str_get(st[1]);
  1066. X  
  1067. X          if (curcsv->wantarray) {    /* in array context, return the data */
  1068. ***************
  1069. *** 137,142 ****
  1070. --- 150,156 ----
  1071. X              vars[i] = (char *) str_get(st[i+2]);
  1072. X          }
  1073. X          retval = ora_bind(csr, vars, items - 1);
  1074. +         free(vars);
  1075. X          }
  1076. X  
  1077. X          str_numset(st[0], (double) retval);
  1078. ***************
  1079. *** 143,148 ****
  1080. --- 157,167 ----
  1081. X      }
  1082. X      return sp;
  1083. X  
  1084. + CASE    char *    ora_do
  1085. + I    char *    lda
  1086. + I    char *    stmt
  1087. + END
  1088. X  CASE    char *    ora_close
  1089. X  I    char *    csr
  1090. X  END
  1091. ***************
  1092. *** 182,187 ****
  1093. --- 201,223 ----
  1094. X  }
  1095. X  
  1096. X  
  1097. + /* ora_errlist[] contains error messages corresponding to Oraperl's own
  1098. +  * error codes. These do not include Oracle errors.
  1099. +  */
  1100. + char *ora_errlist[] =
  1101. + {
  1102. +     "",    /* not used */
  1103. +     "insufficient memory",
  1104. +     "invalid cursor",
  1105. +     "invalid login data area",
  1106. +     "couldn't set ORACLE_SID",
  1107. +     "bad colon variable sequence",
  1108. +     "wrong number of variables",
  1109. +     "statement does not return data",
  1110. + };
  1111. X  static int
  1112. X  userval(ix, str)
  1113. X  int ix;
  1114. ***************
  1115. *** 212,254 ****
  1116. X              }
  1117. X              str_set(str, ertxt);
  1118. X          }
  1119. X          else
  1120. X          {
  1121. !             switch (ora_errno)
  1122. !             {
  1123. !             case ORAP_NOMEM:
  1124. !                 str_set(str, "insufficient memory");
  1125. !                 break;
  1126. !             case ORAP_INVCSR:
  1127. !                 str_set(str, "invalid cursor");
  1128. !                 break;
  1129. !             case ORAP_INVLDA:
  1130. !                 str_set(str, "invalid login data area");
  1131. !                 break;
  1132. !             case ORAP_NOSID:
  1133. !                 str_set(str, "couldn't set ORACLE_SID");
  1134. !                 break;
  1135. !             case ORAP_BADVAR:
  1136. !                 str_set(str, "bad colon variable sequence");
  1137. !                 break;
  1138. !             case ORAP_NUMVARS:
  1139. !                 str_set(str, "wrong number of variables");
  1140. !                 break;
  1141. !             default:
  1142. !                 {
  1143. !                 char tmp[30];
  1144. !                 sprintf(tmp, "unknown oraperl error %d",
  1145. !                     ora_errno);
  1146. !                 str_set(str, tmp);
  1147. !                 }
  1148. !             }
  1149. X          }
  1150. X      }
  1151. X      break;
  1152. --- 248,261 ----
  1153. X              }
  1154. X              str_set(str, ertxt);
  1155. X          }
  1156. +         else if((ora_errno == ORAP_ERRMIN) || (ora_errno > ORAP_ERRMAX))
  1157. +         {
  1158. +             sprintf(ertxt, "unknown error %d", ora_errno);
  1159. +             str_set(str, ertxt);
  1160. +         }
  1161. X          else
  1162. X          {
  1163. !             str_set(str, ora_errlist[ora_errno - ORAP_ERRMIN]);
  1164. X          }
  1165. X      }
  1166. X      break;
  1167. *** ORIG/orafns.c    Mon Oct 28 17:13:02 1991
  1168. --- ./orafns.c    Mon Oct 28 16:46:10 1991
  1169. ***************
  1170. *** 13,20 ****
  1171. --- 13,35 ----
  1172. X  #include    <stdio.h>
  1173. X  #include    <ctype.h>
  1174. X  #include    "orafns.h"
  1175. + #include    "patchlevel.h"
  1176. X  
  1177. X  
  1178. + /* void    ora_version()
  1179. +  *
  1180. +  * Print out information about Oraperl
  1181. +  */
  1182. + void    ora_version()
  1183. + {
  1184. +     printf("\nThis is Oraperl, version 1, patch level %d\n\n", PATCHLEVEL);
  1185. +     puts("Perl is copyright by Larry Wall; type oraperl -v for details.");
  1186. +     puts("Modifications for Oraperl: Copyright 1991, Kevin Stock.\n");
  1187. +     puts("Oraperl may be distributed under the same conditions as Perl.");
  1188. + }
  1189. X  /* address[] is used to return cursor addresses to the perl program
  1190. X   * it is used so that we can get the addresses exactly right, without
  1191. X   * worrying about rounding errors or playing with oracle.mus
  1192. ***************
  1193. *** 42,49 ****
  1194. X      static    char    *oldsid = NULL,
  1195. X              *newsid = NULL;
  1196. X  
  1197. !     DEBUG(8, (fprintf(stderr, "set_sid(%s)\n",
  1198. !         (database == NULL) ? "<NULL>" : database)));
  1199. X  
  1200. X      if (database != NULL)
  1201. X      {
  1202. --- 57,65 ----
  1203. X      static    char    *oldsid = NULL,
  1204. X              *newsid = NULL;
  1205. X  
  1206. !     DEBUG(8, 1, (fprintf(stderr,
  1207. !         "set_sid(\"%s\")\n",
  1208. !         (database == NULL) ? "<NULL>" : database)));
  1209. X  
  1210. X      if (database != NULL)
  1211. X      {
  1212. ***************
  1213. *** 53,127 ****
  1214. X          {
  1215. X              if  (oldsid != NULL)
  1216. X              {
  1217. !                 DEBUG(128, (fprintf(stderr,
  1218. !                     "set_sid: freeing oldsid (%#lx)\n",
  1219. !                     (long) oldsid)));
  1220. X                  free(oldsid);
  1221. X              }
  1222. X              if ((oldsid = malloc(strlen(sid) + 1)) == NULL)
  1223. X              {
  1224. !                 DEBUG(128, (fputs("set_sid: out of memory\n",
  1225. !                     stderr)));
  1226. !                 DEBUG(8, (fputs("set_sid: returning NOSID\n",
  1227. !                     stderr)));
  1228. X                  ora_errno = ORAP_NOMEM;
  1229. X                  return(NOSID);
  1230. X              }
  1231. !             DEBUG(128, (fprintf(stderr,
  1232. !                 "set_sid: got oldsid at %#lx\n", (long) oldsid)));
  1233. X              strcpy(oldsid, sid);
  1234. X          }
  1235. X  
  1236. X          if (newsid != NULL)
  1237. X          {
  1238. !             DEBUG(128, (fprintf(stderr,
  1239. !                 "set_sid: freeing newsid (%#lx)\n",
  1240. !                 (long) newsid)));
  1241. X              free(newsid);
  1242. X          }
  1243. X          if ((newsid = malloc(strlen(database) + 12)) == NULL)
  1244. X          {
  1245. !             DEBUG(128, (fputs("set_sid: out of memory\n", stderr)));
  1246. !             DEBUG(8, (fputs("set_sid: returning NOSID\n", stderr)));
  1247. X              ora_errno = ORAP_NOMEM;
  1248. X              return(NOSID);
  1249. X          }
  1250. !         DEBUG(128, (fprintf(stderr,
  1251. !             "set_sid: got newsid at %#lx\n", (long) newsid)));
  1252. X          strcpy(newsid, "ORACLE_SID=");
  1253. X          strcat(newsid, database);
  1254. X  
  1255. !         DEBUG(8, (fprintf(stderr, "set_sid: setting %s\n", newsid)));
  1256. !         return (putenv(newsid)) ? oldsid : NULL;
  1257. X      }
  1258. X      else
  1259. X      {
  1260. X          if (oldsid == NULL)
  1261. X          {
  1262. !             DEBUG(8, (fputs("set_sid: oldsid not set\n", stderr)));
  1263. X              return(NULL);
  1264. X          }
  1265. X  
  1266. X          if (newsid != NULL)
  1267. X          {
  1268. !             DEBUG(128, (fprintf(stderr,
  1269. !                 "set_sid: freeing newsid (%#lx)\n", (long)newsid)));
  1270. X              free(newsid);
  1271. X          }
  1272. X          if ((newsid = malloc(strlen(oldsid) + 12)) == NULL)
  1273. X          {
  1274. !             DEBUG(128, (fputs("set_sid: out of memory\n", stderr)));
  1275. !             DEBUG(8, (fputs("set_sid: returning NOSID\n", stderr)));
  1276. X              ora_errno = ORAP_NOMEM;
  1277. X              return(NOSID);
  1278. X          }
  1279. !         DEBUG(128, (fprintf(stderr,
  1280. !             "set_sid: got newsid at %#lx\n", (long) newsid)));
  1281. X          strcpy(newsid, "ORACLE_SID=");
  1282. X          strcat(newsid, oldsid);
  1283. X  
  1284. !         DEBUG(8, (fprintf(stderr, "set_sid: setting %s\n", newsid)));
  1285. !         return (putenv(newsid)) ? oldsid : NULL;
  1286. X      }
  1287. X  
  1288. X      /* NOTREACHED */
  1289. --- 69,170 ----
  1290. X          {
  1291. X              if  (oldsid != NULL)
  1292. X              {
  1293. !                 DEBUG(128, 0, (fprintf(stderr,
  1294. !                     "set_sid: freeing oldsid (%#lx)\n",
  1295. !                     (long) oldsid)));
  1296. X                  free(oldsid);
  1297. X              }
  1298. X              if ((oldsid = malloc(strlen(sid) + 1)) == NULL)
  1299. X              {
  1300. !                 DEBUG((8 | 128), -1, (fputs(
  1301. !                     "set_sid: out of memory\n", stderr)));
  1302. X                  ora_errno = ORAP_NOMEM;
  1303. X                  return(NOSID);
  1304. X              }
  1305. !             DEBUG(128, 0, (fprintf(stderr,
  1306. !                 "set_sid: got oldsid %d bytes at %#lx\n",
  1307. !                 strlen(sid) + 1, (long) oldsid)));
  1308. X              strcpy(oldsid, sid);
  1309. X          }
  1310. X  
  1311. X          if (newsid != NULL)
  1312. X          {
  1313. !             DEBUG(128, 0, (fprintf(stderr,
  1314. !                 "set_sid: freeing newsid (%#lx)\n",
  1315. !                 (long) newsid)));
  1316. X              free(newsid);
  1317. X          }
  1318. X          if ((newsid = malloc(strlen(database) + 12)) == NULL)
  1319. X          {
  1320. !             DEBUG((8 | 128), -1, (fputs(
  1321. !                 "set_sid: out of memory\n", stderr)));
  1322. X              ora_errno = ORAP_NOMEM;
  1323. X              return(NOSID);
  1324. X          }
  1325. !         DEBUG(128, 0, (fprintf(stderr,
  1326. !             "set_sid: got newsid %d bytes at %#lx\n",
  1327. !             strlen(database) + 12, (long) newsid)));
  1328. X          strcpy(newsid, "ORACLE_SID=");
  1329. X          strcat(newsid, database);
  1330. X  
  1331. !         DEBUG(8, 0, (fprintf(stderr, "set_sid: setting %s\n",newsid)));
  1332. !         if (putenv(newsid) != 0)
  1333. !         {
  1334. !             DEBUG(8, -1, (fputs(
  1335. !                 "set_sid: putenv() failed\n", stderr)));
  1336. !             ora_errno = ORAP_NOMEM;
  1337. !             return(NOSID);
  1338. !         }
  1339. !         else
  1340. !         {
  1341. !             DEBUG(8, -1, (fprintf(stderr,
  1342. !                 "set_sid: returning \"%s\"\n", oldsid)));
  1343. !             return(oldsid);
  1344. !         }
  1345. X      }
  1346. X      else
  1347. X      {
  1348. X          if (oldsid == NULL)
  1349. X          {
  1350. !             DEBUG(8, -1, (fputs(
  1351. !                 "set_sid: oldsid not set\n", stderr)));
  1352. X              return(NULL);
  1353. X          }
  1354. X  
  1355. X          if (newsid != NULL)
  1356. X          {
  1357. !             DEBUG(128, 0, (fprintf(stderr,
  1358. !                 "set_sid: freeing newsid (%#lx)\n",
  1359. !                 (long)newsid)));
  1360. X              free(newsid);
  1361. X          }
  1362. X          if ((newsid = malloc(strlen(oldsid) + 12)) == NULL)
  1363. X          {
  1364. !             DEBUG((8 | 128), -1, (fputs(
  1365. !                 "set_sid: out of memory\n", stderr)));
  1366. X              ora_errno = ORAP_NOMEM;
  1367. X              return(NOSID);
  1368. X          }
  1369. !         DEBUG(128, 0, (fprintf(stderr,
  1370. !             "set_sid: got newsid %d bytes at %#lx\n",
  1371. !             strlen(oldsid) + 12, (long) newsid)));
  1372. X          strcpy(newsid, "ORACLE_SID=");
  1373. X          strcat(newsid, oldsid);
  1374. X  
  1375. !         DEBUG(8, 0, (fprintf(stderr, "set_sid: setting %s\n",newsid)));
  1376. !         if (putenv(newsid) != 0)
  1377. !         {
  1378. !             DEBUG(8, -1, (fputs(
  1379. !                 "set_sid: putenv() failed\n", stderr)));
  1380. !             ora_errno = ORAP_NOMEM;
  1381. !             return(NOSID);
  1382. !         }
  1383. !         else
  1384. !         {
  1385. !             DEBUG(8, -1, (fprintf(stderr,
  1386. !                 "set_sid: returning \"%s\"\n", oldsid)));
  1387. !             return(oldsid);
  1388. !         }
  1389. X      }
  1390. X  
  1391. X      /* NOTREACHED */
  1392. ***************
  1393. *** 140,164 ****
  1394. X      char *tmp;
  1395. X      struct cursor *lda;
  1396. X  
  1397. !     DEBUG(8, (fprintf(stderr,
  1398. !         "ora_login(%s, %s, %s)\n", database, name, password)));
  1399. X  
  1400. X      if ((lda = ora_getlda()) == NULL)
  1401. X      {
  1402. !         DEBUG(8, (fputs("ora_login: couldn't get an lda\n", stderr)));
  1403. X          return(NULL);
  1404. X      }
  1405. X  
  1406. X      if (set_sid(database) == NOSID)
  1407. X      {
  1408. !         DEBUG(8, (fputs("ora_login: couldn't set database\n", stderr)));
  1409. X          ora_dropcursor(lda);
  1410. X          return(NULL);
  1411. X      }
  1412. X      else if (strcmp(database, getenv("ORACLE_SID")) != 0)
  1413. X      {
  1414. !         DEBUG(8, (fprintf(stderr,"ora_login: ORACLE_SID misset to %s\n",
  1415. !             (tmp = getenv("ORACLE_SID")) ? tmp : NULL)));
  1416. X          ora_dropcursor(lda);
  1417. X          ora_errno = ORAP_NOSID;
  1418. X          return(NULL);
  1419. --- 183,210 ----
  1420. X      char *tmp;
  1421. X      struct cursor *lda;
  1422. X  
  1423. !     DEBUG(8, 1, (fprintf(stderr,
  1424. !         "ora_login(\"%s\", \"%s\", \"%s\")\n", database, name, password)));
  1425. X  
  1426. X      if ((lda = ora_getlda()) == NULL)
  1427. X      {
  1428. !         DEBUG(8, -1, (fputs(
  1429. !             "ora_login: couldn't get an lda\n", stderr)));
  1430. X          return(NULL);
  1431. X      }
  1432. X  
  1433. X      if (set_sid(database) == NOSID)
  1434. X      {
  1435. !         DEBUG(8, -1, (fputs(
  1436. !             "ora_login: couldn't select database\n", stderr)));
  1437. X          ora_dropcursor(lda);
  1438. X          return(NULL);
  1439. X      }
  1440. X      else if (strcmp(database, getenv("ORACLE_SID")) != 0)
  1441. X      {
  1442. !         DEBUG(8, -1, (fprintf(stderr,
  1443. !             "ora_login: ORACLE_SID misset to %s\n",
  1444. !             (tmp = getenv("ORACLE_SID")) ? tmp : "<NULL>")));
  1445. X          ora_dropcursor(lda);
  1446. X          ora_errno = ORAP_NOSID;
  1447. X          return(NULL);
  1448. ***************
  1449. *** 170,177 ****
  1450. X      if (logged == 0)
  1451. X      {
  1452. X          sprintf(address, "%#lx", (long) lda);
  1453. !         DEBUG(8, (fprintf(stderr,
  1454. !             "ora_login: returning lda %s\n", address)));
  1455. X          ora_errno = 0;
  1456. X          return(address);
  1457. X      }
  1458. --- 216,226 ----
  1459. X      if (logged == 0)
  1460. X      {
  1461. X          sprintf(address, "%#lx", (long) lda);
  1462. !         DEBUG(32, 0, (fprintf(stderr,
  1463. !             "ora_login: lda %#lx converted to string \"%s\"\n",
  1464. !             lda, address)));
  1465. !         DEBUG(8, -1, (fprintf(stderr,
  1466. !             "ora_login: returning lda %s\n", address)));
  1467. X          ora_errno = 0;
  1468. X          return(address);
  1469. X      }
  1470. ***************
  1471. *** 179,186 ****
  1472. X      {
  1473. X          ora_errno = lda->csr->csrrc;
  1474. X          ora_droplda(lda);
  1475. !         DEBUG(8, (fprintf(stderr,
  1476. !             "ora_login: failed (error %d)\n", ora_errno)));
  1477. X          return((char *) NULL);
  1478. X      }
  1479. X  }
  1480. --- 228,235 ----
  1481. X      {
  1482. X          ora_errno = lda->csr->csrrc;
  1483. X          ora_droplda(lda);
  1484. !         DEBUG(8, -1, (fprintf(stderr,
  1485. !             "ora_login: failed (error %d)\n", ora_errno)));
  1486. X          return((char *) NULL);
  1487. X      }
  1488. X  }
  1489. ***************
  1490. *** 198,210 ****
  1491. X      int i;
  1492. X      struct cursor *csr;
  1493. X      struct cursor *lda = (struct cursor *) strtol(lda_s, (char **) NULL, 0);
  1494. !     short dbsize;
  1495. X  
  1496. !     DEBUG(8, (fprintf(stderr, "ora_open(%#lx, %s)\n", (long) lda, stmt)));
  1497. X  
  1498. X      if (check_lda(lda) == 0)
  1499. X      {
  1500. !         DEBUG(8, (fputs("ora_open: returning NULL\n", stderr)));
  1501. X          ora_errno = ORAP_INVLDA;
  1502. X          return((char *) NULL);
  1503. X      }
  1504. --- 247,263 ----
  1505. X      int i;
  1506. X      struct cursor *csr;
  1507. X      struct cursor *lda = (struct cursor *) strtol(lda_s, (char **) NULL, 0);
  1508. !     short dsize;
  1509. X  
  1510. !     DEBUG(8, 1, (fprintf(stderr,
  1511. !         "ora_open(%s, \"%s\")\n", lda_s, stmt)));
  1512. !     DEBUG(32, 0, (fprintf(stderr,
  1513. !         "ora_open: string \"%s\" converted to lda %#lx\n",
  1514. !         lda_s, lda)));
  1515. X  
  1516. X      if (check_lda(lda) == 0)
  1517. X      {
  1518. !         DEBUG(8, -1, (fputs("ora_open: invalid lda\n", stderr)));
  1519. X          ora_errno = ORAP_INVLDA;
  1520. X          return((char *) NULL);
  1521. X      }
  1522. ***************
  1523. *** 211,218 ****
  1524. X  
  1525. X      if ((csr = ora_getcursor()) == NULL)
  1526. X      {
  1527. !         /* ora_errno is set by ora_getcursor */
  1528. !         DEBUG(8, (fprintf(stderr, "ora_open: can't get a cursor\n")));
  1529. X          return((char *) NULL);
  1530. X      }
  1531. X  
  1532. --- 264,271 ----
  1533. X  
  1534. X      if ((csr = ora_getcursor()) == NULL)
  1535. X      {
  1536. !         DEBUG(8, -1, (fprintf(stderr,
  1537. !             "ora_open: can't get a cursor\n")));
  1538. X          return((char *) NULL);
  1539. X      }
  1540. X  
  1541. ***************
  1542. *** 221,234 ****
  1543. X       */
  1544. X      if ((csr->varfields = count_colons(stmt)) < 0)
  1545. X      {
  1546. !         DEBUG(8, (fputs("ora_open: invalid variable sequence\n",
  1547. !             stderr)));
  1548. X          ora_errno = ORAP_BADVAR;
  1549. X          return((char *) NULL);
  1550. X      }
  1551. X  
  1552. !     DEBUG(8, (fprintf(stderr,
  1553. !         "ora_open: statement contains %d colons\n", csr->varfields)));
  1554. X  
  1555. X      if ((oopen(csr->csr, lda->csr, (char *)-1, -1, -1, (char *)-1, -1) != 0)
  1556. X          || (osql3(csr->csr, stmt, -1) != 0)
  1557. --- 274,287 ----
  1558. X       */
  1559. X      if ((csr->varfields = count_colons(stmt)) < 0)
  1560. X      {
  1561. !         DEBUG(8, -1, (fputs(
  1562. !             "ora_open: invalid variable sequence\n", stderr)));
  1563. X          ora_errno = ORAP_BADVAR;
  1564. X          return((char *) NULL);
  1565. X      }
  1566. X  
  1567. !     DEBUG(8, 0, (fprintf(stderr,
  1568. !         "ora_open: statement contains %d colons\n", csr->varfields)));
  1569. X  
  1570. X      if ((oopen(csr->csr, lda->csr, (char *)-1, -1, -1, (char *)-1, -1) != 0)
  1571. X          || (osql3(csr->csr, stmt, -1) != 0)
  1572. ***************
  1573. *** 236,243 ****
  1574. X      {
  1575. X          ora_errno = csr->csr->csrrc;
  1576. X          ora_dropcursor(csr);
  1577. !         DEBUG(8, (fprintf(stderr,
  1578. !             "couldn't run SQL statement (error %d)\n", ora_errno)));
  1579. X          return((char *) NULL);
  1580. X      }
  1581. X  
  1582. --- 289,297 ----
  1583. X      {
  1584. X          ora_errno = csr->csr->csrrc;
  1585. X          ora_dropcursor(csr);
  1586. !         DEBUG(8, -1, (fprintf(stderr,
  1587. !             "ora_open: couldn't run SQL statement (error %d)\n",
  1588. !             ora_errno)));
  1589. X          return((char *) NULL);
  1590. X      }
  1591. X  
  1592. ***************
  1593. *** 257,304 ****
  1594. X      {
  1595. X          if ((csr->data = (char **) malloc(i * sizeof(char *))) == NULL)
  1596. X          {
  1597. !             DEBUG(128, (fputs("ora_open: out of memory\n",stderr)));
  1598. !             DEBUG(8, (fputs("ora_open: returning NOMEM\n",stderr)));
  1599. X              ora_errno = ORAP_NOMEM;
  1600. X              ora_dropcursor(csr);
  1601. !             return(0);
  1602. X          }
  1603. !         DEBUG(128, (fprintf(stderr,
  1604. !             "ora_open: got data at %#lx\n",csr->data)));
  1605. X          csr->nfields = i;
  1606. X  
  1607. X          for (i = 0 ; i < csr->nfields ; i++)
  1608. X          {
  1609. !             odsc(csr->csr, i + 1, &dbsize, (short *) 0, (short *) 0,
  1610. !                 (short *) 0, (char *) 0, (short *) 0, (short *) 0);
  1611. X  
  1612. !             if ((csr->data[i] = (char *) malloc(dbsize+1)) == NULL)
  1613. X              {
  1614. X                  csr->nfields = i;
  1615. X                  ora_dropcursor(csr);
  1616. !                 DEBUG(128, (fputs("ora_open: out of memory\n",
  1617. !                     stderr)));
  1618. !                 DEBUG(8, (fputs("ora_open: returning NOMEM\n",
  1619. !                     stderr)));
  1620. X                  ora_errno = ORAP_NOMEM;
  1621. X                  return((char *) NULL);
  1622. X              }
  1623. !             DEBUG(128, (fprintf(stderr,
  1624. !                 "ora_open: got field %d at %#lx\n",
  1625. !                 i, csr->data[i])));
  1626. !             odefin(csr->csr, i + 1, csr->data[i], dbsize + 1, 5, 0,
  1627. X                  (short *) 0, (char *) 0, 0, 0, (short *) 0,
  1628. !                 (char *) 0);
  1629. X          }
  1630. X      }
  1631. X      else
  1632. X      {
  1633. !         DEBUG(128, (fputs("ora_open: no data to return\n", stderr)));
  1634. X          csr->data = NULL;
  1635. X      }
  1636. X  
  1637. X      sprintf(address, "%#lx", (long) csr);
  1638. !     DEBUG(8, (fprintf(stderr, "ora_open: returning csr %s\n", address)));
  1639. X      return(address);
  1640. X  }
  1641. X  
  1642. --- 311,377 ----
  1643. X      {
  1644. X          if ((csr->data = (char **) malloc(i * sizeof(char *))) == NULL)
  1645. X          {
  1646. !             ora_dropcursor(csr);
  1647. !             DEBUG((8 | 128), -1, (fputs(
  1648. !                 "ora_open: out of memory\n", stderr)));
  1649. X              ora_errno = ORAP_NOMEM;
  1650. +             return((char *) NULL);
  1651. +         }
  1652. +         DEBUG(128, 0, (fprintf(stderr,
  1653. +             "ora_open: got data array %d items %d bytes at %#lx\n",
  1654. +             i, i * sizeof(char *), (long) csr->data)));
  1655. +         if ((csr->rcode = (short *) malloc(i * sizeof(short))) == NULL)
  1656. +         {
  1657. X              ora_dropcursor(csr);
  1658. !             DEBUG((8 | 128), -1, (fputs(
  1659. !                 "ora_open: out of memory\n", stderr)));
  1660. !             ora_errno = ORAP_NOMEM;
  1661. !             return((char *) NULL);
  1662. X          }
  1663. !         DEBUG(128, 0, (fprintf(stderr,
  1664. !             "ora_open: got rcode array %d items %d bytes at %#lx\n",
  1665. !             i, i * sizeof(short), (long) csr->rcode)));
  1666. X          csr->nfields = i;
  1667. X  
  1668. X          for (i = 0 ; i < csr->nfields ; i++)
  1669. X          {
  1670. !             odsc(csr->csr, i + 1, (short *) 0, (short *) 0,
  1671. !                 (short *) 0, (short *) 0, (char *) 0, (short *) 0,
  1672. !                 &dsize);
  1673. X  
  1674. !             if ((csr->data[i] = (char *) malloc(dsize+1)) == NULL)
  1675. X              {
  1676. X                  csr->nfields = i;
  1677. X                  ora_dropcursor(csr);
  1678. !                 DEBUG((8 | 128), -1, (fputs(
  1679. !                     "ora_open: out of memory\n", stderr)));
  1680. X                  ora_errno = ORAP_NOMEM;
  1681. X                  return((char *) NULL);
  1682. X              }
  1683. !             DEBUG(128, 0, (fprintf(stderr,
  1684. !                 "ora_open: got field %d, %d bytes at %#lx\n",
  1685. !                 i, dsize + 1, csr->data[i])));
  1686. !             odefin(csr->csr, i + 1, csr->data[i], dsize + 1, 5, 0,
  1687. X                  (short *) 0, (char *) 0, 0, 0, (short *) 0,
  1688. !                 &(csr->rcode[i]));
  1689. X          }
  1690. X      }
  1691. X      else
  1692. X      {
  1693. !         DEBUG(8, 0, (fputs(
  1694. !             "ora_open: statement returns no data\n", stderr)));
  1695. X          csr->data = NULL;
  1696. X      }
  1697. X  
  1698. X      sprintf(address, "%#lx", (long) csr);
  1699. !     DEBUG(32, 0, (fprintf(stderr,
  1700. !         "ora_open: csr %#lx converted to string \"%s\"\n",
  1701. !         csr, address)));
  1702. !     DEBUG(8, -1, (fprintf(stderr,
  1703. !         "ora_open: returning csr \"%s\"\n", address)));
  1704. X      return(address);
  1705. X  }
  1706. X  
  1707. ***************
  1708. *** 311,339 ****
  1709. X  int ora_fetch(csr_s)
  1710. X  char *csr_s;
  1711. X  {
  1712. X      struct cursor *csr = (struct cursor *) strtol(csr_s, (char **) NULL, 0);
  1713. X  
  1714. !     DEBUG(8, (fprintf(stderr, "ora_fetch(%#lx)\n", (long) csr)));
  1715. X  
  1716. X      if (check_csr(csr) == 0)
  1717. X      {
  1718. !         DEBUG(8, (fputs("ora_fetch: returning NULL\n", stderr)));
  1719. X          ora_errno = ORAP_INVCSR;
  1720. !         return(NULL);
  1721. X      }
  1722. X  
  1723. !     if ((csr->nfields == 0) || (ofetch(csr->csr) != 0))
  1724. X      {
  1725. !         DEBUG(8, (fputs("ora_fetch: ofetch failed, returing 0\n",
  1726. !             stderr)));
  1727. !         ora_result = NULL;
  1728. !         ora_errno = csr->csr->csrrc;
  1729. X          return(0);
  1730. X      }
  1731. X  
  1732. X      ora_result = csr->data;
  1733. X      ora_errno = 0;
  1734. -     DEBUG(8, (fprintf(stderr,"ora_fetch: returning <%d>\n", csr->nfields)));
  1735. X      return(csr->nfields);
  1736. X  }
  1737. X  
  1738. --- 384,472 ----
  1739. X  int ora_fetch(csr_s)
  1740. X  char *csr_s;
  1741. X  {
  1742. +     int i;
  1743. X      struct cursor *csr = (struct cursor *) strtol(csr_s, (char **) NULL, 0);
  1744. X  
  1745. !     DEBUG(8, 1, (fprintf(stderr,
  1746. !         "ora_fetch(%s)\n", csr_s)));
  1747. !     DEBUG(32, 0, (fprintf(stderr,
  1748. !         "ora_fetch: string \"%s\" converted to csr %#lx\n",
  1749. !         csr_s, csr)));
  1750. X  
  1751. X      if (check_csr(csr) == 0)
  1752. X      {
  1753. !         DEBUG(8, -1, (fputs("ora_fetch: not a csr\n", stderr)));
  1754. X          ora_errno = ORAP_INVCSR;
  1755. !         return(0);
  1756. X      }
  1757. +     else if (csr->nfields == 0)
  1758. +     {
  1759. +         DEBUG(8, -1, (fputs("ora_fetch: no data to return\n", stderr)));
  1760. +         ora_errno = ORAP_NODATA;
  1761. +         return(0);
  1762. +     }
  1763. X  
  1764. !     if ((i = ofetch(csr->csr)) == 4)
  1765. X      {
  1766. !         DEBUG(8, -1, (fputs("ora_fetch: end of data\n", stderr)));
  1767. !         ora_errno = 0;
  1768. X          return(0);
  1769. X      }
  1770. +     else if (i != 0)
  1771. +     {
  1772. +         for (i = 0 ; i < csr->nfields ; i++)
  1773. +         {
  1774. +             switch (csr->rcode[i])
  1775. +             {
  1776. +             case 0:        /* no problem */
  1777. +                 break;
  1778. +             case 1405:
  1779. +                 DEBUG(8, 0, (fprintf(stderr,
  1780. +                     "ora_fetch: field %d was NULL\n", i)));
  1781. +                 *csr->data[i] = '\0';
  1782. +                 break;
  1783. +             case 1406:
  1784. +                 DEBUG(8, -1, (fprintf(stderr,
  1785. +                     "ora_fetch: field %d was truncated\n", i)));
  1786. +                 ora_errno = csr->csr->csrrc;
  1787. +                 return(0);
  1788. +             default:    /* others should not happen */
  1789. +                 DEBUG(8, -1, (fprintf(stderr,
  1790. +                     "ora_fetch: ofetch error %d on field %d\n",
  1791. +                     csr->rcode[i], i)));
  1792. +                 ora_errno = csr->csr->csrrc;
  1793. +                 return(0);
  1794. +             }
  1795. +         }
  1796. +         /* if we fall out here, all errors were corrected */
  1797. +     }
  1798. X  
  1799. + #ifdef    DEBUGGING
  1800. +     /* NOTE: use the DEBUG macro for printing even here in case
  1801. +      *     the debug output format is changed later
  1802. +      */
  1803. +     if (ora_debug & 8)
  1804. +     {
  1805. +         int i;
  1806. +         DEBUG(8, 0, (fputs("ora_fetch: returning data:\n", stderr)));
  1807. +         for (i = 0 ; i < csr->nfields ; i++)
  1808. +         {
  1809. +             DEBUG(8, 0, (fprintf(stderr,
  1810. +                 "ora_fetch: field %4d data \"%s\"\n",
  1811. +                 i, csr->data[i])));
  1812. +         }
  1813. +     }
  1814. + #endif
  1815. +     DEBUG(8, -1, (fprintf(stderr,
  1816. +         "ora_fetch: returning %d items\n", csr->nfields)));
  1817. X      ora_result = csr->data;
  1818. X      ora_errno = 0;
  1819. X      return(csr->nfields);
  1820. X  }
  1821. X  
  1822. ***************
  1823. *** 350,369 ****
  1824. X      int i, ret;
  1825. X      struct cursor *csr = (struct cursor *) strtol(csr_s, (char **) NULL, 0);
  1826. X  
  1827. !     DEBUG(8, (fprintf(stderr, "ora_bind(%#lx, %#lx, %d)\n",
  1828. !         (long) csr, (long) vars, nitems)));
  1829. X  
  1830. X      if (check_csr(csr) == 0)
  1831. X      {
  1832. !         DEBUG(8, (fputs("ora_bind: returning 0\n", stderr)));
  1833. X          ora_errno = ORAP_INVCSR;
  1834. X          return(0);
  1835. X      }
  1836. !     if (csr->varfields != nitems)
  1837. X      {
  1838. !         DEBUG(8, (fprintf("ora_bind: expected %d items, got %d\n",
  1839. !             csr->varfields, nitems)));
  1840. X          ora_errno = ORAP_NUMVARS;
  1841. X          return(0);
  1842. X      }
  1843. --- 483,504 ----
  1844. X      int i, ret;
  1845. X      struct cursor *csr = (struct cursor *) strtol(csr_s, (char **) NULL, 0);
  1846. X  
  1847. !     DEBUG(8, 1, (fprintf(stderr,
  1848. !         "ora_bind(%s, %#lx, %d)\n", csr_s, (long) vars, nitems)));
  1849. !     DEBUG(32, 0, (fprintf(stderr,
  1850. !         "ora_bind: string \"%s\" converted to csr %#lx\n", csr_s,csr)));
  1851. X  
  1852. X      if (check_csr(csr) == 0)
  1853. X      {
  1854. !         DEBUG(8, -1, (fputs("ora_bind: not a csr\n", stderr)));
  1855. X          ora_errno = ORAP_INVCSR;
  1856. X          return(0);
  1857. X      }
  1858. !     else if (csr->varfields != nitems)
  1859. X      {
  1860. !         DEBUG(8, -1, (fprintf(
  1861. !             "ora_bind: expected %d items, got %d\n",
  1862. !             csr->varfields, nitems)));
  1863. X          ora_errno = ORAP_NUMVARS;
  1864. X          return(0);
  1865. X      }
  1866. ***************
  1867. *** 373,401 ****
  1868. X          if ((ret = obndrn(csr->csr, i+1, vars[i], strlen(vars[i])+1,
  1869. X              5, -1, (short *) -1, (char *) -1, 0, 0)) != 0)
  1870. X          {
  1871. X              ora_errno = csr->csr->csrrc;
  1872. -             DEBUG(8, (fputs("ora_bind: returning 0\n", stderr)));
  1873. X              return(0);
  1874. X          }
  1875. X  
  1876. !         DEBUG(8, (fprintf(stderr, "ora_bind: obndrv %d %s OK\n",
  1877. !             i + 1, vars[i])));
  1878. X      }
  1879. X  
  1880. X      if (oexec(csr->csr) != 0)
  1881. X      {
  1882. X          ora_errno = csr->csr->csrrc;
  1883. -         DEBUG(8, (fputs("ora_bind: returning 0\n", stderr)));
  1884. X          return(0);
  1885. X      }
  1886. X  
  1887. !     DEBUG(8, (fputs("ora_bind: oexec successful\n", stderr)));
  1888. !     DEBUG(8, (fputs("ora_bind: returning 1\n", stderr)));
  1889. X      return(1);
  1890. X  }
  1891. X  
  1892. X  
  1893. ! char    *OK    = "OK";        /* valid return from ora_close, ora_logoff */
  1894. X  
  1895. X  /* ora_close(csr)
  1896. X   *
  1897. --- 508,572 ----
  1898. X          if ((ret = obndrn(csr->csr, i+1, vars[i], strlen(vars[i])+1,
  1899. X              5, -1, (short *) -1, (char *) -1, 0, 0)) != 0)
  1900. X          {
  1901. +             DEBUG(8, -1, (fprintf(stderr,
  1902. +                 "ora_bind: obndrn failed on field %d, \"%s\"\n",
  1903. +                 i + 1, vars[i])));
  1904. X              ora_errno = csr->csr->csrrc;
  1905. X              return(0);
  1906. X          }
  1907. X  
  1908. !         DEBUG(8, 0, (fprintf(stderr,
  1909. !             "ora_bind: obndrn %d, \"%s\" OK\n", i + 1, vars[i])));
  1910. X      }
  1911. X  
  1912. X      if (oexec(csr->csr) != 0)
  1913. X      {
  1914. +         DEBUG(8, -1, (fputs("ora_bind: oexec failed\n", stderr)));
  1915. X          ora_errno = csr->csr->csrrc;
  1916. X          return(0);
  1917. X      }
  1918. X  
  1919. !     DEBUG(8, -1, (fputs("ora_bind: returning\n", stderr)));
  1920. X      return(1);
  1921. X  }
  1922. X  
  1923. X  
  1924. ! char    *OK    = "OK";        /* valid return from ora_close/do/logoff */
  1925. ! /* ora_do(lda, stmt)
  1926. !  *
  1927. !  * sets and executes the specified sql statement, without leaving a cursor open
  1928. !  */
  1929. ! char *ora_do(lda_s, stmt)
  1930. ! char *lda_s;
  1931. ! char *stmt;
  1932. ! {
  1933. !     char *csr_s;
  1934. !     DEBUG(8, 1, (fprintf(stderr,
  1935. !         "ora_do(%s, \"%s\")\n", lda_s, stmt)));
  1936. !     if ((csr_s = ora_open(lda_s, stmt)) == NULL)
  1937. !     {
  1938. !         DEBUG(8, -1, (fprintf(stderr, "ora_do: ora_open failed\n")));
  1939. !         return(NULL);
  1940. !     }
  1941. !     else if (ora_close(csr_s) == NULL)
  1942. !     {
  1943. !         DEBUG(8, -1, (fprintf(stderr, "ora_do: ora_close failed\n")));
  1944. !         return(NULL);
  1945. !     }
  1946. !     else
  1947. !     {
  1948. !         DEBUG(8, -1, (fprintf(stderr, "ora_do: successful\n")));
  1949. !         return(OK);
  1950. !     }
  1951. !     /* NOTREACHED */
  1952. ! }
  1953. X  
  1954. X  /* ora_close(csr)
  1955. X   *
  1956. ***************
  1957. *** 407,417 ****
  1958. X  {
  1959. X      struct cursor *csr = (struct cursor *) strtol(csr_s, (char **) NULL, 0);
  1960. X  
  1961. !     DEBUG(8, (fprintf(stderr, "ora_close(%#lx)\n", (long) csr)));
  1962. X  
  1963. X      if (check_csr(csr) == 0)
  1964. X      {
  1965. !         DEBUG(8, (fputs("ora_close: returning NULL\n", stderr)));
  1966. X          ora_errno = ORAP_INVCSR;
  1967. X          return(NULL);
  1968. X      }
  1969. --- 578,592 ----
  1970. X  {
  1971. X      struct cursor *csr = (struct cursor *) strtol(csr_s, (char **) NULL, 0);
  1972. X  
  1973. !     DEBUG(8, 1, (fprintf(stderr, "ora_close(%s)\n", csr_s)));
  1974. !     DEBUG(32, 0, (fprintf(stderr,
  1975. !         "ora_close: string \"%s\" converted to csr %#lx\n",
  1976. !         csr_s, csr)));
  1977. X  
  1978. X      if (check_csr(csr) == 0)
  1979. X      {
  1980. !         DEBUG(8, -1, (fputs("ora_close: not a csr\n", stderr)));
  1981. X          ora_errno = ORAP_INVCSR;
  1982. X          return(NULL);
  1983. X      }
  1984. ***************
  1985. *** 420,426 ****
  1986. X      ora_errno = csr->csr->csrrc;
  1987. X      ora_dropcursor(csr);
  1988. X  
  1989. !     DEBUG(8, (fputs("ora_close: returning OK\n", stderr)));
  1990. X      return(OK);
  1991. X  }
  1992. X  
  1993. --- 595,601 ----
  1994. X      ora_errno = csr->csr->csrrc;
  1995. X      ora_dropcursor(csr);
  1996. X  
  1997. !     DEBUG(8, -1, (fputs("ora_close: returning OK\n", stderr)));
  1998. X      return(OK);
  1999. X  }
  2000. X  
  2001. ***************
  2002. *** 435,445 ****
  2003. X  {
  2004. X      struct cursor *lda = (struct cursor *) strtol(lda_s, (char **) NULL, 0);
  2005. X  
  2006. !     DEBUG(8, (fprintf(stderr, "ora_logoff(%#lx)\n", (long) lda)));
  2007. X  
  2008. X      if (check_lda(lda) == 0)
  2009. X      {
  2010. !         DEBUG(8, (fputs("ora_logoff: returning NULL\n", stderr)));
  2011. X          ora_errno = ORAP_INVLDA;
  2012. X          return(NULL);
  2013. X      }
  2014. --- 610,623 ----
  2015. X  {
  2016. X      struct cursor *lda = (struct cursor *) strtol(lda_s, (char **) NULL, 0);
  2017. X  
  2018. !     DEBUG(8, 1, (fprintf(stderr, "ora_logoff(%s)\n", lda_s)));
  2019. !     DEBUG(32, 0, (fprintf(stderr,
  2020. !         "ora_logoff: string \"%s\" converted to lda %#lx\n",
  2021. !         lda_s, lda)));
  2022. X  
  2023. X      if (check_lda(lda) == 0)
  2024. X      {
  2025. !         DEBUG(8, -1, (fputs("ora_logoff: not an lda\n", stderr)));
  2026. X          ora_errno = ORAP_INVLDA;
  2027. X          return(NULL);
  2028. X      }
  2029. ***************
  2030. *** 448,453 ****
  2031. X      ora_errno = lda->csr->csrrc;
  2032. X      ora_droplda(lda);
  2033. X  
  2034. !     DEBUG(8, (fputs("ora_logoff: returning OK\n", stderr)));
  2035. X      return(OK);
  2036. X  }
  2037. --- 626,631 ----
  2038. X      ora_errno = lda->csr->csrrc;
  2039. X      ora_droplda(lda);
  2040. X  
  2041. !     DEBUG(8, -1, (fputs("ora_logoff: returning OK\n", stderr)));
  2042. X      return(OK);
  2043. X  }
  2044. *** ORIG/orafns.h    Mon Oct 28 17:13:03 1991
  2045. --- ./orafns.h    Mon Oct 28 16:38:53 1991
  2046. ***************
  2047. *** 15,20 ****
  2048. --- 15,21 ----
  2049. X  char        *ora_login(),
  2050. X          *ora_open(),
  2051. X          *ora_close(),
  2052. +         *ora_do(),
  2053. X          *ora_logoff();
  2054. X  
  2055. X  int        ora_bind(),
  2056. ***************
  2057. *** 67,72 ****
  2058. --- 68,74 ----
  2059. X      struct    csrdef    *csr;
  2060. X      char        *hda,        /* used if this cursor is an lda     */
  2061. X              **data;        /* used to receive database contents */
  2062. +     short        *rcode;        /* used to receive fetch error codes */
  2063. X      int        nfields,    /* number of fields to retrieve         */
  2064. X              varfields;    /* number of modifiable variables    */
  2065. X      struct    cursor    *next;        /* list pointer                 */
  2066. ***************
  2067. *** 99,105 ****
  2068. --- 101,112 ----
  2069. X   *
  2070. X   * At present, the only flags used are:
  2071. X   *       8    program execution - report function entry and exit
  2072. +  *      32    conversion between strings and numbers
  2073. +  *        (in this case, the numbers are cursor addresses)
  2074. X   *     128    use of malloc/free
  2075. +  *
  2076. +  * My apologies if you dislike the DEBUG macro, but I wanted to improve the
  2077. +  * readability of the debugging traces that came out.
  2078. X   */
  2079. X  
  2080. X  #ifdef    PERL_DEBUGGING
  2081. ***************
  2082. *** 109,122 ****
  2083. X  #endif
  2084. X  
  2085. X  #ifdef    DEBUGGING
  2086. ! #    define    DEBUG(flag, stmt)    { if (ora_debug & flag) { (stmt); } }
  2087. X  #    ifdef    PERL_DEBUGGING
  2088. !         extern    int    debug;    /* exists in uperl.o        */
  2089. ! #    else
  2090. !         EXT    int    debug;    /* need to create it ourselves    */
  2091. X  #    endif
  2092. X  #else
  2093. ! #    define    DEBUG(flag, stmt)
  2094. X  #endif
  2095. X  
  2096. X  
  2097. --- 116,141 ----
  2098. X  #endif
  2099. X  
  2100. X  #ifdef    DEBUGGING
  2101. !     EXT    int    __debug_level__        INIT(1);
  2102. ! #    define    DEBUG(flag, change, stmt)                \
  2103. !     {                                \
  2104. !         if ((ora_debug & 8) && ((change) > 0))            \
  2105. !             { __debug_level__ += 2 * (change); }        \
  2106. !         if (ora_debug & (flag))                    \
  2107. !         {                            \
  2108. !             fprintf(stderr, "OP:%*s", __debug_level__, "");    \
  2109. !             (stmt);                        \
  2110. !         }                            \
  2111. !         if ((ora_debug & 8) && ((change) < 0))            \
  2112. !             { __debug_level__ += 2 * (change); }        \
  2113. !     }
  2114. X  #    ifdef    PERL_DEBUGGING
  2115. !         extern    int    debug;    /* -D flag from uperl.o        */
  2116. X  #    endif
  2117. X  #else
  2118. ! #    define    DEBUG(flag, change, stmt)    /* nothing */
  2119. X  #endif
  2120. X  
  2121. X  
  2122. ***************
  2123. *** 134,136 ****
  2124. --- 153,158 ----
  2125. X  #define    ORAP_NOSID    100004    /* couldn't set ORACLE_SID        */
  2126. X  #define    ORAP_BADVAR    100005    /* bad colon variable sequence        */
  2127. X  #define    ORAP_NUMVARS    100006    /* wrong number of colon variables    */
  2128. + #define    ORAP_NODATA    100007    /* statement does not return data    */
  2129. + #define    ORAP_ERRMAX    ORAP_NODATA    /* highest value actually used    */
  2130. *** ORIG/oraperl.1    Mon Oct 28 17:13:03 1991
  2131. --- ./oraperl.1    Mon Oct 28 14:22:43 1991
  2132. ***************
  2133. *** 6,16 ****
  2134. --- 6,19 ----
  2135. X  oraperl \- Perl access to Oracle databases
  2136. X  .SH SYNOPSIS
  2137. X  .nf
  2138. + &ora_version
  2139. X  $lda = &ora_login($database, $name, $password)
  2140. X  $csr = &ora_open($lda, $stmt)
  2141. X  &ora_bind($csr, $var, ...)
  2142. X  &ora_fetch($csr)
  2143. X  &ora_close($csr)
  2144. + &ora_do($lda, $stmt)
  2145. X  &ora_logoff($lda)
  2146. X  
  2147. X  $ora_debug
  2148. ***************
  2149. *** 22,27 ****
  2150. --- 25,33 ----
  2151. X  which has been extended (through the \fIusersubs\fP feature)
  2152. X  to allow access to \fIOracle\fP databases.
  2153. X  .SH Functions
  2154. + The \fIora_version\fP function
  2155. + prints the version number and copyright information concerning Oraperl.
  2156. X  Any program wishing to access an \fIOracle\fP database
  2157. X  must first log in to \fIOracle\fP
  2158. X  using \fIora_login\fP.
  2159. ***************
  2160. *** 32,48 ****
  2161. X  (an \fIORACLE Login Data Area\fP).
  2162. X  
  2163. X  To specify the \fISQL\fP statement to be executed,
  2164. ! the program must call \fIora_open\fP.
  2165. ! This function takes two parameters:
  2166. X  a login identifier (obtained from \fIora_login\fP)
  2167. X  and the \fISQL\fP statement to be executed.
  2168. SHAR_EOF
  2169. true || echo 'restore of Patch03 failed'
  2170. fi
  2171. echo 'End of  part 1'
  2172. echo 'File Patch03 is continued in part 2'
  2173. echo 2 > _shar_seq_.tmp
  2174. exit 0
  2175. exit 0 # Just in case...
  2176. -- 
  2177. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2178. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2179. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2180. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2181.