home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume34 / oraperl-v2 / patch03 next >
Text File  |  1992-12-12  |  31KB  |  1,124 lines

  1. Newsgroups: comp.sources.misc
  2. From: Kevin Stock <kstock@encore.com>
  3. Subject:  v34i021:  oraperl-v2 - Extensions to Perl to access Oracle database, Patch03
  4. Message-ID: <1992Dec12.200913.29773@sparky.imd.sterling.com>
  5. X-Md4-Signature: 99b0ae8a2b00e4094c5bd93417a7d07d
  6. Date: Sat, 12 Dec 1992 20:09:13 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Kevin Stock <kstock@encore.com>
  10. Posting-number: Volume 34, Issue 21
  11. Archive-name: oraperl-v2/patch03
  12. Environment: Perl, Oracle with OCI, optionally Curses
  13. Patch-To: oraperl-v2: Volume 30, Issue 87-91
  14.  
  15. This is patch 3 to version 2 of Oraperl, a set of usersubs which
  16. allow Perl to access Oracle databases. You need Perl (v3.0.27 or
  17. better) and Oracle (including the Oracle Call Interface) to build
  18. Oraperl. If you can build Larry's Curseperl, then you can also
  19. build Coraperl, which is Oraperl with Curses.
  20.  
  21. Oraperl version 2 appeared as 5 postings in comp.sources.misc
  22. volume 30, issues 87 to 91. Patch 01 appeared shortly afterwards
  23. as issue 99, and Patch 02 as volume 32, issue 93.
  24.  
  25.   Principal changes:
  26.   ------------------
  27. * The functions &ora_bind() and &ora_do() now return a row-count
  28.   for successful statements. The return values are as follows:
  29.  
  30.     undef    for bad statements (eg, bad syntax)
  31.     'OK'    for good statements which affected no rows
  32.     count    for good statements which affected count rows
  33.  
  34.   This means that the standard idiom
  35.  
  36.     &ora_do($lda, $stmt) || die "$stmt failed - $ora_errstr\n";
  37.  
  38.   still works properly. However, if you tested the exact return
  39.   value from these functions, you will have to change your programs.
  40.  
  41. * The return type from malloc() can now be configured in Makefile.
  42.   The default is (char *).
  43.  
  44. * In &ora_do, a cursor was left dangling if oclose() failed. This is
  45.   no longer the case.
  46.  
  47.   Minor Changes:
  48.   --------------
  49. * examples/sql has been fixed:
  50.  
  51.   The new -c option allows the size of the fetch row cache to be set
  52.   The new -n option allows a string to be printed for NULL fields
  53.   The damage done by the change to &ora_titles() has been undone
  54.  
  55. * examples/japh has been added:
  56.  
  57.   This is a simple 'Just another Perl hacker' program, using a table to
  58.   store the information. A slightly modified version has been added to
  59.   testdir as well.
  60.  
  61. * examples/tabinfo has been modified
  62.  
  63.   the output format is slightly changed
  64.   it will now accept multiple table names and print the description of each
  65.  
  66.   What to do
  67.   ----------
  68. Unshar this file in your Oraperl source directory. This will create
  69. three new files:
  70.  
  71.     patch3
  72.     examples/japh
  73.     testdir/japh.pl
  74.  
  75. Apply the patch using:
  76.  
  77.     patch -p <patch3
  78.  
  79. then make, make test, optionally make coraperl, and make install.
  80.  
  81.     Kevin Stock
  82.     kstock@encore.com
  83.  
  84.  
  85. #!/bin/sh
  86. # This is a shell archive (produced by shar 3.49)
  87. # To extract the files from this archive, save it to a file, remove
  88. # everything above the "!/bin/sh" line above, and type "sh file_name".
  89. #
  90. # made 12/08/1992 15:53 UTC by kstock@mmcompta
  91. # Source directory /usr/local/src/cmd/oraperl-v2
  92. #
  93. # existing files will NOT be overwritten unless -c is specified
  94. #
  95. # This shar contains:
  96. # length  mode       name
  97. # ------ ---------- ------------------------------------------
  98. #  23409 -rw-r--r-- patch3
  99. #   1061 -rwxr-xr-x examples/japh
  100. #   1056 -rw-r--r-- testdir/japh.pl
  101. #
  102. # ============= patch3 ==============
  103. if test -f 'patch3' -a X"$1" != X"-c"; then
  104.     echo 'x - skipping patch3 (File already exists)'
  105. else
  106. echo 'x - extracting patch3 (Text)'
  107. sed 's/^X//' << 'SHAR_EOF' > 'patch3' &&
  108. X*** /user/mis/kstock/tmp/patchlevel.h    Tue Dec  8 16:45:52 1992
  109. X--- ./patchlevel.h    Tue Nov 17 10:23:44 1992
  110. X***************
  111. X*** 1,4 ****
  112. X  /* patchlevel.h */
  113. X  
  114. X  #define    VERSION        2
  115. X! #define    PATCHLEVEL    2
  116. X--- 1,4 ----
  117. X  /* patchlevel.h */
  118. X  
  119. X  #define    VERSION        2
  120. X! #define    PATCHLEVEL    3
  121. X*** /user/mis/kstock/tmp/Changes    Tue Dec  8 16:45:52 1992
  122. X--- ./Changes    Wed Dec  2 11:45:42 1992
  123. X***************
  124. X*** 4,9 ****
  125. X--- 4,17 ----
  126. X  Version 2
  127. X  =========
  128. X  
  129. X+ Patch 03
  130. X+ ========
  131. X+ Modify &ora_bind() and &ora_do() to return the row count
  132. X+ malloc() doesn't return a char * on all systems
  133. X+ A cursor was left dangling if the ora_close() within &ora_do failed
  134. X+ The change to &ora_titles() broke examples/sql
  135. X+ Added -n option to examples/sql to replace NULL fields with a string
  136. X+ 
  137. X  Patch 02
  138. X  ========
  139. X  Added a BUGS section to the manual page
  140. X*** /user/mis/kstock/tmp/Makefile    Tue Dec  8 16:42:57 1992
  141. X--- ./Makefile    Tue Nov 17 15:02:14 1992
  142. X***************
  143. X*** 53,58 ****
  144. X--- 53,62 ----
  145. X  # If your system library does not include strtoul, uncomment the next line
  146. X  STRTOUL    = strtoul.o
  147. X  #
  148. X+ # If your malloc() returns anything other than a char *, set the appropriate
  149. X+ # type here (don't include the *)
  150. X+ # MALLOC_PTR_TYPE=void
  151. X+ #
  152. X  # If you are using Perl v3 instead of v4, uncomment the next line
  153. X  # STR_2MORTAL    = -Dstr_2mortal=str_2static
  154. X  
  155. X*** /user/mis/kstock/tmp/Readme    Tue Dec  8 16:45:53 1992
  156. X--- ./Readme    Tue Nov 17 15:06:16 1992
  157. X***************
  158. X*** 25,31 ****
  159. X      DBUG_O        the debugging library, if debugging is required
  160. X      CACHE        default fetch cache size, if you want to change it
  161. X      BIND        if defined, do not pad empty bind values
  162. X!     STRTOUL        \_ system dependent - see Makefile for details
  163. X      STR_2MORTAL    /
  164. X      TESTDATA    database, username and password for testing Oraperl
  165. X  
  166. X--- 25,32 ----
  167. X      DBUG_O        the debugging library, if debugging is required
  168. X      CACHE        default fetch cache size, if you want to change it
  169. X      BIND        if defined, do not pad empty bind values
  170. X!     STRTOUL        \
  171. X!     MALLOC_PTR_TYPE     +- system dependent - see Makefile for details
  172. X      STR_2MORTAL    /
  173. X      TESTDATA    database, username and password for testing Oraperl
  174. X  
  175. X*** /user/mis/kstock/tmp/doc/oraperl.1    Tue Dec  8 16:45:53 1992
  176. X--- ./doc/oraperl.1    Wed Dec  2 11:37:46 1992
  177. X***************
  178. X*** 169,174 ****
  179. X--- 169,178 ----
  180. X  &ora_bind($csr, 70, 'marketing', undef);
  181. X  .if t .fi P
  182. X  
  183. X+ \fI&ora_bind()\fP returns an undefined value if an error occurred.
  184. X+ Otherwise, it returns the number of rows affected by the command
  185. X+ or the string \fB'OK'\fP if the command was successful but modified no rows.
  186. X+ 
  187. X  This function is equivalent to the \fIOCI obndrn\fP and \fIoexec\fP statements.
  188. X  
  189. X  The \fIOCI obndrn\fP function does not allow empty strings to be bound.
  190. X***************
  191. X*** 277,282 ****
  192. X--- 281,290 ----
  193. X  &ora_close(&ora_open($lda,\ $statement))\c
  194. X  .if t .ft P
  195. X  \&.
  196. X+ 
  197. X+ \fI&ora_do()\fP returns an undefined value if an error occurred.
  198. X+ Otherwise, it returns the number of rows affected by the command
  199. X+ or the string \fB'OK'\fP if the command was successful but modified no rows.
  200. X  .\"
  201. X  .SH "&ora_logoff($lda)"
  202. X  .\"
  203. X***************
  204. X*** 677,682 ****
  205. X--- 685,709 ----
  206. X  
  207. X  Debugging option \fB32\fP only reports internal string/numeric translations,
  208. X  not those performed on the data retrieved from the database.
  209. X+ 
  210. X+ When calling \fI&ora_open()\fP or \fI&ora_do()\fP with long SQL statements,
  211. X+ \fIPerl\fP's \fIHere Document\fP may be used to good effect for clarity.
  212. X+ 
  213. X+ For example:
  214. X+ 
  215. X+ .nf
  216. X+ .in +.5i
  217. X+ .if t .ft CW
  218. X+ $csr = &ora_open($lda, <<END_OF_QUERY, 10) || die $ora_errstr;
  219. X+ .in +.5i
  220. X+ select name, fname, telno from address_book
  221. X+ where lower(position) like '%director%'
  222. X+ order by name
  223. X+ .in -.5i
  224. X+ END_OF_QUERY
  225. X+ .in -.5i
  226. X+ .if t .ft P
  227. X+ .fi
  228. X  .SH SEE ALSO
  229. X  .nf
  230. X  \fIOracle\fP Documentation:
  231. X*** /user/mis/kstock/tmp/examples/Readme    Tue Dec  8 16:45:54 1992
  232. X--- ./examples/Readme    Wed Dec  2 10:56:23 1992
  233. X***************
  234. X*** 14,19 ****
  235. X--- 14,22 ----
  236. X          it using a format. It also illustrates how to recognise NULL
  237. X          fields.
  238. X  
  239. X+ japh        Just another Perl hacker, written in Oraperl
  240. X+         This is no one-liner, but it demonstrates a few things.
  241. X+ 
  242. X  mkdb.pl        Creates a database, puts some data into it, drops it. The nice
  243. X          thing about this is that it detects whether it is running under
  244. X          Oraperl or Coraperl, and changes its output accordingly. It
  245. X*** /user/mis/kstock/tmp/examples/bind.pl    Tue Dec  8 16:43:17 1992
  246. X--- ./examples/bind.pl    Wed Dec  2 11:48:15 1992
  247. X***************
  248. X*** 17,22 ****
  249. X--- 17,25 ----
  250. X      chop;
  251. X      &ora_bind($csr, $_)    || die $ora_errstr;
  252. X  
  253. X+     # Note that $phone is placed in brackets to give it array context
  254. X+     # Without them, &ora_fetch() returns the number of columns available
  255. X+ 
  256. X      if (($phone) = &ora_fetch($csr))
  257. X      {
  258. X          print "$phone\n";
  259. X*** /user/mis/kstock/tmp/examples/mkdb.pl    Tue Dec  8 16:45:55 1992
  260. X--- ./examples/mkdb.pl    Wed Dec  2 12:08:39 1992
  261. X***************
  262. X*** 50,56 ****
  263. X  
  264. X      sub during
  265. X      {
  266. X!         &addstr(sprintf("%2d   %-15s%3d\n", $lineno++, $name, $ext));
  267. X      }
  268. X  
  269. X      sub after
  270. X--- 50,56 ----
  271. X  
  272. X      sub during
  273. X      {
  274. X!         &addstr(sprintf("%2d   %-15s%3s\n", $lineno++, $name, $ext));
  275. X      }
  276. X  
  277. X      sub after
  278. X*** /user/mis/kstock/tmp/examples/sql    Tue Dec  8 16:43:05 1992
  279. X--- ./examples/sql    Wed Dec  2 11:21:51 1992
  280. X***************
  281. X*** 7,45 ****
  282. X  # Script to run an Oracle statement from the command line.
  283. X  # Written in response to <nirad.690285085@newdelphi> in alt.sources.wanted.
  284. X  #
  285. X! # Usage:
  286. X! #    sql [-#debug] [-bbase] [-ddelim] [-f|-h] [-lpage_len] name/pass stmt
  287. X  #
  288. X! #    -#debug            debugging control string
  289. X! #                MUST be first argument
  290. X! #    -b base            database to use (default $ENV{'ORACLE_SID'})
  291. X! #    -d delim        specifies the field delimiter (default TAB)
  292. X! #    -f            formatted output, similar to sqlplus
  293. X! #    -h            add headers, no formatting
  294. X! #    -l page_len        lines per page, only used by -f (default 60)
  295. X! #    name/pass        Oracle username and password
  296. X! #    stmt            Oracle statement to be executed
  297. X  #
  298. X  # Author:    Kevin Stock
  299. X  # Date:        18th November 1991
  300. X  #
  301. X  
  302. X  $ora_debug = shift if $ARGV[0] =~ /^-#/;
  303. X  
  304. X! $USAGE = "[-bbase] [-ddelim] [-f|-h] [-lpage_len] username/password statement";
  305. X  $, = "\t";            # default delimiter is a tab
  306. X  $\ = "\n";            # each record terminated with newline
  307. X  
  308. X  require 'getopts.pl';        # option parsing
  309. X! do Getopts('b:d:fhl:');
  310. X  die "$0: only one of -f and -h may be specified\n" if ($opt_f && $opt_h);
  311. X  
  312. X  $USER = shift;            # get the user name and password
  313. X  die "Usage: $0 $USAGE\n" unless $#ARGV >= 0;        # must have a statement
  314. X  
  315. X  $, = $opt_d if defined($opt_d);                # set column delimiter
  316. X  $= = $opt_l if defined($opt_l);                # set page length
  317. X- $ENV{'ORACLE_SID'} = $opt_b if defined($opt_b);        # set database
  318. X  
  319. X  die "ORACLE_SID not set\n" unless defined($ENV{'ORACLE_SID'});
  320. X  
  321. X--- 7,49 ----
  322. X  # Script to run an Oracle statement from the command line.
  323. X  # Written in response to <nirad.690285085@newdelphi> in alt.sources.wanted.
  324. X  #
  325. X! # Parameters (* = mandatory)
  326. X  #
  327. X! #    -#debug          debugging control string (must be first argument)
  328. X! #    -b base          database to use (default $ENV{'ORACLE_SID'})
  329. X! #    -c cache      SQL fetch cache size
  330. X! #    -d delim      specifies the field delimiter (default TAB)
  331. X! #    -f          formatted output, similar to sqlplus
  332. X! #    -h          add headers, no formatting
  333. X! #    -l page_len      lines per page, only used by -f (default 60)
  334. X! #    -n string      replace NULL fields by string
  335. X! #    name/pass    * Oracle username and password
  336. X! #    stmt        * Oracle statement to be executed
  337. X  #
  338. X  # Author:    Kevin Stock
  339. X  # Date:        18th November 1991
  340. X+ # Last change:    18th November 1992
  341. X  #
  342. X  
  343. X  $ora_debug = shift if $ARGV[0] =~ /^-#/;
  344. X  
  345. X! $USAGE = <<;
  346. X!     [-bbase] [-ccache] [-ddelim] [-f|-h] [-lpage_len] [-nstring] name/pass stmt
  347. X! 
  348. X  $, = "\t";            # default delimiter is a tab
  349. X  $\ = "\n";            # each record terminated with newline
  350. X  
  351. X  require 'getopts.pl';        # option parsing
  352. X! do Getopts('b:c:d:fhl:n:');
  353. X  die "$0: only one of -f and -h may be specified\n" if ($opt_f && $opt_h);
  354. X  
  355. X  $USER = shift;            # get the user name and password
  356. X  die "Usage: $0 $USAGE\n" unless $#ARGV >= 0;        # must have a statement
  357. X  
  358. X+ $ENV{'ORACLE_SID'} = $opt_b if defined($opt_b);        # set database
  359. X+ $ora_cache = $opt_c if defined($opt_c);            # set fetch cache
  360. X  $, = $opt_d if defined($opt_d);                # set column delimiter
  361. X  $= = $opt_l if defined($opt_l);                # set page length
  362. X  
  363. X  die "ORACLE_SID not set\n" unless defined($ENV{'ORACLE_SID'});
  364. X  
  365. X***************
  366. X*** 54,66 ****
  367. X  {
  368. X      if ($opt_f)            # formatted output
  369. X      {
  370. X!         @titles = &ora_titles($csr);
  371. X!         $format .= "format STDOUT_TOP =\n" . join($,, @titles) . "\n";
  372. X!         grep(tr//-/c, @titles);
  373. X!         $format .= join($,, @titles) . "\n.\n";
  374. X  
  375. X!         grep((s/^-/@/, tr/-/</), @titles);
  376. X!         $format .= "format STDOUT =\n" . join($,, @titles) . "\n";
  377. X          foreach $i (0 .. $nfields - 1)
  378. X          {
  379. X              $format .= "\$result[$i],";
  380. X--- 58,89 ----
  381. X  {
  382. X      if ($opt_f)            # formatted output
  383. X      {
  384. X!         # Build up format statements for the data
  385. X! 
  386. X!         # First, the header - a list of field names, formatted
  387. X!         # in columns of the appropriate width
  388. X! 
  389. X!         $fmt = '';
  390. X!         grep($fmt .= "%-${_}.${_}s|", &ora_lengths($csr));
  391. X!         chop $fmt;
  392. X!         $fmt = sprintf($fmt, &ora_titles($csr, 0));
  393. X!         $format .= "format STDOUT_TOP =\n" . $fmt . "\n";
  394. X! 
  395. X!         # Then underlines for the field names
  396. X  
  397. X!         $fmt =~ tr/|/-/c;
  398. X!         $fmt =~ tr/|/+/;
  399. X!         $format .= $fmt . "\n.\n";
  400. X! 
  401. X!         # Then for the data format, a @<<... field per column
  402. X! 
  403. X!         $fmt =~ tr/-+/<|/;
  404. X!         $fmt =~ s/(^|\|)</\1@/g;
  405. X!         $format .= "format STDOUT =\n" . $fmt . "\n";
  406. X! 
  407. X!         # Finally the variable associated with each column
  408. X!         # Why doesn't Perl let us specify an array here?
  409. X! 
  410. X          foreach $i (0 .. $nfields - 1)
  411. X          {
  412. X              $format .= "\$result[$i],";
  413. X***************
  414. X*** 72,78 ****
  415. X      }
  416. X      elsif ($opt_h)
  417. X      {
  418. X!         @titles = &ora_titles($csr);
  419. X          grep(s/  *$//, @titles);
  420. X          print @titles;
  421. X          grep(tr//-/c, @titles);
  422. X--- 95,103 ----
  423. X      }
  424. X      elsif ($opt_h)
  425. X      {
  426. X!         # Simple headers with underlines
  427. X! 
  428. X!         @titles = &ora_titles($csr, 0);
  429. X          grep(s/  *$//, @titles);
  430. X          print @titles;
  431. X          grep(tr//-/c, @titles);
  432. X***************
  433. X*** 81,86 ****
  434. X--- 106,112 ----
  435. X  
  436. X      while (@result = &ora_fetch($csr))
  437. X      {
  438. X+         grep(defined $_ || ($_ = $opt_n), @result) if $opt_n;
  439. X          ($opt_f) ? (write) : (print @result);
  440. X      }
  441. X      warn "$ora_errstr\n" if ($ora_errno != 0);
  442. X***************
  443. X*** 104,110 ****
  444. X  .nr % 0            \" start at page 1
  445. X  ';<<'.ex'; ############## From here on it's a standard manual page ############
  446. X  .ll 80
  447. X! .TH SQL L "18th November 1991"
  448. X  .ad
  449. X  .nh
  450. X  .SH NAME
  451. X--- 130,136 ----
  452. X  .nr % 0            \" start at page 1
  453. X  ';<<'.ex'; ############## From here on it's a standard manual page ############
  454. X  .ll 80
  455. X! .TH SQL L "18th November 1992"
  456. X  .ad
  457. X  .nh
  458. X  .SH NAME
  459. X***************
  460. X*** 112,120 ****
  461. X--- 138,148 ----
  462. X  .SH SYNOPSIS
  463. X  \fBsql\fP
  464. X  [\fB\-b\fP\fIbase\fP]
  465. X+ [\fB\-c\fP\fIcache\fP]
  466. X  [\fB\-d\fP\fIdelim\fP]
  467. X  [\fB\-f\fP|\fB\-h\fP]
  468. X  [\fB\-l\fP\fIpage_len\fP]
  469. X+ [\fB\-n\fP\fIstring\fP]
  470. X  \fIname\fP\fB/\fP\fIpassword\fP
  471. X  \fIstatement\fP
  472. X  .SH DESCRIPTION
  473. X***************
  474. X*** 129,134 ****
  475. X--- 157,170 ----
  476. X  If it is not given, the database specified by the environment variable
  477. X  \fBORACLE_SID\fP is used.
  478. X  
  479. X+ The \fB\-c\fP\fIcache\fP flag may be supplied to set the size of fetch cache
  480. X+ to be used. If it is not given, the system default is used.
  481. X+ 
  482. X+ If the \fB\-n\fP\fIstring\fP flag is supplied,
  483. X+ \fBNULL\fP fields (in the \fIOracle\fP sense)
  484. X+ will replaced in the output by \fIstring\fP.
  485. X+ Normally, they are left blank.
  486. X+ 
  487. X  The \fB\-f\fP and \fB\-h\fP flags may be used to modify the form of the output.
  488. X  Without either flag, no field headers are printed
  489. X  and fields are not padded.
  490. X***************
  491. X*** 136,153 ****
  492. X  field headers are added to the top of the output,
  493. X  but the format is otherwise unchanged.
  494. X  With the \fB\-f\fP flag,
  495. X! the output is formatted in a fashion similar to that used by \fIsqlplus\fP,
  496. X  except that all fields are left\-justified, regardless of their data type.
  497. X  Column headers are printed at the top of each page;
  498. X  a page is assumed to be 60 lines long,
  499. X  but this may be overridden with the \fB\-l\fP\fIpage_len\fP flag.
  500. X  
  501. X! Normally, fields are separated with tabs;
  502. X  this may be changed to any desired string (\fIdelim\fP)
  503. X  using the \fB\-d\fP flag.
  504. X  .SH ENVIRONMENT
  505. X  The environment variable \fBORACLE_SID\fP
  506. X! determines the Oracle database to be used.
  507. X  .SH DIAGNOSTICS
  508. X  .in +5
  509. X  .ti -5
  510. X--- 172,190 ----
  511. X  field headers are added to the top of the output,
  512. X  but the format is otherwise unchanged.
  513. X  With the \fB\-f\fP flag,
  514. X! the output is formatted in a tabular form similar to that used by \fIsqlplus\fP,
  515. X  except that all fields are left\-justified, regardless of their data type.
  516. X  Column headers are printed at the top of each page;
  517. X  a page is assumed to be 60 lines long,
  518. X  but this may be overridden with the \fB\-l\fP\fIpage_len\fP flag.
  519. X  
  520. X! Without the \fB\-f\fP flag, fields are separated with tabs;
  521. X  this may be changed to any desired string (\fIdelim\fP)
  522. X  using the \fB\-d\fP flag.
  523. X  .SH ENVIRONMENT
  524. X  The environment variable \fBORACLE_SID\fP
  525. X! determines the Oracle database to be used
  526. X! if the \fB\-b\fP\fIbase\fP flag is not supplied.
  527. X  .SH DIAGNOSTICS
  528. X  .in +5
  529. X  .ti -5
  530. X*** /user/mis/kstock/tmp/examples/tabinfo.pl    Tue Dec  8 16:45:59 1992
  531. X--- ./examples/tabinfo.pl    Thu Oct 15 09:57:19 1992
  532. X***************
  533. X*** 18,24 ****
  534. X  (($base = shift)    &&
  535. X   ($user = shift)    &&
  536. X   ($pass = shift)    &&
  537. X!  ($table = shift))    || die "Usage: $0 base user password table\n";
  538. X  
  539. X  # we need this for the table of datatypes
  540. X  #
  541. X--- 18,24 ----
  542. X  (($base = shift)    &&
  543. X   ($user = shift)    &&
  544. X   ($pass = shift)    &&
  545. X!  ($table = shift))    || die "Usage: $0 base user password table ...\n";
  546. X  
  547. X  # we need this for the table of datatypes
  548. X  #
  549. X***************
  550. X*** 28,53 ****
  551. X  Structure of @<<<<<<<<<<<<<<<<<<<<<<<
  552. X  $table
  553. X  
  554. X! Field name          | Length | Type | Type description
  555. X! --------------------+--------+------+-------------------------------------------
  556. X  .
  557. X  
  558. X  format STDOUT =
  559. X! @<<<<<<<<<<<<<<<<<<<| @>>>>> | @>>> | @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  560. X  $name[$i], $length[$i], $type[$i], $ora_types{$type[$i]}
  561. X  .
  562. X  
  563. X  $lda = &ora_login($base, $user, $pass) || die $ora_errstr . "\n";
  564. X- $csr = &ora_open($lda, "select * from $table") || die $ora_errstr . "\n";
  565. X  
  566. X! (@name = &ora_titles($csr, 0)) || die $ora_errstr . "\n";
  567. X! (@length = &ora_lengths($csr)) || die $ora_errstr . "\n";
  568. X! (@type = &ora_types($csr)) || die $ora_errstr . "\n";
  569. X! 
  570. X! foreach $i (0 .. $#name)
  571. X  {
  572. X!     write;
  573. X! }
  574. X  
  575. X- &ora_close($csr);
  576. X  &ora_logoff($lda);
  577. X--- 28,60 ----
  578. X  Structure of @<<<<<<<<<<<<<<<<<<<<<<<
  579. X  $table
  580. X  
  581. X! Field name                                    | Length | Type | Type description
  582. X! ----------------------------------------------+--------+------+-----------------
  583. X  .
  584. X  
  585. X  format STDOUT =
  586. X! @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | @>>>>> | @>>> | @<<<<<<<<<<<<<<<
  587. X  $name[$i], $length[$i], $type[$i], $ora_types{$type[$i]}
  588. X  .
  589. X  
  590. X  $lda = &ora_login($base, $user, $pass) || die $ora_errstr . "\n";
  591. X  
  592. X! do
  593. X  {
  594. X!     $csr = &ora_open($lda, "select * from $table") || die "$ora_errstr\n";
  595. X! 
  596. X!     (@name = &ora_titles($csr, 0)) || die $ora_errstr . "\n";
  597. X!     (@length = &ora_lengths($csr)) || die $ora_errstr . "\n";
  598. X!     (@type = &ora_types($csr)) || die $ora_errstr . "\n";
  599. X! 
  600. X!     foreach $i (0 .. $#name)
  601. X!     {
  602. X!         write;
  603. X!     }
  604. X! 
  605. X!     &ora_close($csr);
  606. X! 
  607. X!     $- = 0;
  608. X! } while ($table = shift);
  609. X  
  610. X  &ora_logoff($lda);
  611. X*** /user/mis/kstock/tmp/oracle.mus    Tue Dec  8 16:45:59 1992
  612. X--- ./oracle.mus    Tue Nov 17 11:27:43 1992
  613. X***************
  614. X*** 227,233 ****
  615. X      else {
  616. X          char *csr        = (char *) str_get(st[1]);
  617. X          char **vars        = (char **) malloc((items-1) * sizeof(char *));
  618. X!         int retval;
  619. X  
  620. X          if (vars == NULL)
  621. X          {
  622. X--- 227,233 ----
  623. X      else {
  624. X          char *csr        = (char *) str_get(st[1]);
  625. X          char **vars        = (char **) malloc((items-1) * sizeof(char *));
  626. X!         long retval;
  627. X  
  628. X          if (vars == NULL)
  629. X          {
  630. X***************
  631. X*** 252,265 ****
  632. X          free(vars);
  633. X          }
  634. X  
  635. X!         str_numset(st[0], (double) retval);
  636. X      }
  637. X      return sp;
  638. X  
  639. X! CASE    char *    ora_do
  640. X! I    char *    lda
  641. X! I    char *    stmt
  642. X! END
  643. X  
  644. X  CASE    char *    ora_close
  645. X  I    char *    csr
  646. X--- 252,284 ----
  647. X          free(vars);
  648. X          }
  649. X  
  650. X!         if (retval < 0)
  651. X!         str_set(st[0], (char *) NULL);
  652. X!         else if (retval == 0)
  653. X!         str_set(st[0], "OK");
  654. X!         else
  655. X!         str_numset(st[0], (double) retval);
  656. X      }
  657. X      return sp;
  658. X  
  659. X!     case US_ora_do:
  660. X!     if (items != 2)
  661. X!         fatal("Usage: &ora_do($lda, $stmt)");
  662. X!     else {
  663. X!         long retval;
  664. X!         char *    lda =        (char *)    str_get(st[1]);
  665. X!         char *    stmt =        (char *)    str_get(st[2]);
  666. X! 
  667. X!         retval = ora_do(lda, stmt);
  668. X! 
  669. X!         if (retval < 0L)
  670. X!         str_set(st[0], (char *) NULL);
  671. X!         else if (retval == 0L)
  672. X!         str_set(st[0], "OK");
  673. X!         else
  674. X!         str_numset(st[0], (double) retval);
  675. X!     }
  676. X!     return sp;
  677. X  
  678. X  CASE    char *    ora_close
  679. X  I    char *    csr
  680. X*** /user/mis/kstock/tmp/orafns.c    Tue Dec  8 16:46:00 1992
  681. X--- ./orafns.c    Tue Nov 17 11:39:08 1992
  682. X***************
  683. X*** 767,778 ****
  684. X   * binds actual values to the SQL statement associated with csr
  685. X   */
  686. X  
  687. X! int ora_bind(csr_s, vars, nitems)
  688. X  char *csr_s, **vars;
  689. X  int nitems;
  690. X  {
  691. X      int i;
  692. X      short null_flag = -1;
  693. X  #ifndef    NO_BIND_PADDING
  694. X      static char small_buf[2] = " ";
  695. X  #endif
  696. X--- 767,779 ----
  697. X   * binds actual values to the SQL statement associated with csr
  698. X   */
  699. X  
  700. X! long ora_bind(csr_s, vars, nitems)
  701. X  char *csr_s, **vars;
  702. X  int nitems;
  703. X  {
  704. X      int i;
  705. X      short null_flag = -1;
  706. X+     long rowcount;
  707. X  #ifndef    NO_BIND_PADDING
  708. X      static char small_buf[2] = " ";
  709. X  #endif
  710. X***************
  711. X*** 787,793 ****
  712. X      {
  713. X          ora_errno = ORAP_INVCSR;
  714. X          DBUG_PRINT("exit", ("not a csr"));
  715. X!         DBUG_RETURN(0);
  716. X      }
  717. X      else if (csr->varfields != nitems)
  718. X      {
  719. X--- 788,794 ----
  720. X      {
  721. X          ora_errno = ORAP_INVCSR;
  722. X          DBUG_PRINT("exit", ("not a csr"));
  723. X!         DBUG_RETURN(-1L);
  724. X      }
  725. X      else if (csr->varfields != nitems)
  726. X      {
  727. X***************
  728. X*** 794,800 ****
  729. X          ora_errno = ORAP_NUMVARS;
  730. X          DBUG_PRINT("exit", ("expected %d items, got %d",
  731. X              csr->varfields, nitems));
  732. X!         DBUG_RETURN(0);
  733. X      }
  734. X  
  735. X      for (i = 0 ; i < nitems ; i++)
  736. X--- 795,801 ----
  737. X          ora_errno = ORAP_NUMVARS;
  738. X          DBUG_PRINT("exit", ("expected %d items, got %d",
  739. X              csr->varfields, nitems));
  740. X!         DBUG_RETURN(-1L);
  741. X      }
  742. X  
  743. X      for (i = 0 ; i < nitems ; i++)
  744. X***************
  745. X*** 807,813 ****
  746. X              ora_errno = csr->csr->csrrc;
  747. X              DBUG_PRINT("exit", ("obndrn failed on field %d, <NULL>",
  748. X                  i + 1));
  749. X!             DBUG_RETURN(0);
  750. X          }
  751. X  
  752. X          DBUG_PRINT("info", ("obndrn %d, <NULL> OK", (i + 1), vars[i]));
  753. X--- 808,814 ----
  754. X              ora_errno = csr->csr->csrrc;
  755. X              DBUG_PRINT("exit", ("obndrn failed on field %d, <NULL>",
  756. X                  i + 1));
  757. X!             DBUG_RETURN(-1L);
  758. X          }
  759. X  
  760. X          DBUG_PRINT("info", ("obndrn %d, <NULL> OK", (i + 1), vars[i]));
  761. X***************
  762. X*** 827,833 ****
  763. X              ora_errno = csr->csr->csrrc;
  764. X              DBUG_PRINT("exit", ("obndrn failed on field %d, \"%s\"",
  765. X                  i + 1, vars[i]));
  766. X!             DBUG_RETURN(0);
  767. X          }
  768. X  
  769. X          DBUG_PRINT("info", ("obndrn %d, \"%s\" OK", (i + 1), vars[i]));
  770. X--- 828,834 ----
  771. X              ora_errno = csr->csr->csrrc;
  772. X              DBUG_PRINT("exit", ("obndrn failed on field %d, \"%s\"",
  773. X                  i + 1, vars[i]));
  774. X!             DBUG_RETURN(-1L);
  775. X          }
  776. X  
  777. X          DBUG_PRINT("info", ("obndrn %d, \"%s\" OK", (i + 1), vars[i]));
  778. X***************
  779. X*** 838,844 ****
  780. X      {
  781. X          ora_errno = csr->csr->csrrc;
  782. X          DBUG_PRINT("exit", ("oexec failed"));
  783. X!         DBUG_RETURN(0);
  784. X      }
  785. X  
  786. X      /* any cached data is now out of date, as is the end_of data flag */
  787. X--- 839,845 ----
  788. X      {
  789. X          ora_errno = csr->csr->csrrc;
  790. X          DBUG_PRINT("exit", ("oexec failed"));
  791. X!         DBUG_RETURN(-1L);
  792. X      }
  793. X  
  794. X      /* any cached data is now out of date, as is the end_of data flag */
  795. X***************
  796. X*** 845,852 ****
  797. X      csr->in_cache = 0;
  798. X      csr->end_of_data = 0;
  799. X  
  800. X!     DBUG_PRINT("exit", ("returning OK"));
  801. X!     DBUG_RETURN(1);
  802. X  }
  803. X  
  804. X  
  805. X--- 846,856 ----
  806. X      csr->in_cache = 0;
  807. X      csr->end_of_data = 0;
  808. X  
  809. X!     rowcount = csr->csr->csrrpc;
  810. X!     DBUG_PRINT("info", ("%ld rows processed", rowcount));
  811. X! 
  812. X!     DBUG_PRINT("exit", ("returning %ld", rowcount));
  813. X!     DBUG_RETURN(rowcount);
  814. X  }
  815. X  
  816. X  
  817. X***************
  818. X*** 858,868 ****
  819. X   * sets and executes the specified sql statement, without leaving a cursor open
  820. X   */
  821. X  
  822. X! char *ora_do(lda_s, stmt)
  823. X  char *lda_s;
  824. X  char *stmt;
  825. X  {
  826. X      char *csr_s;
  827. X  
  828. X      DBUG_ENTER("ora_do");
  829. X      DBUG_PRINT("entry", ("ora_do(%s, \"%s\")", lda_s, stmt));
  830. X--- 862,874 ----
  831. X   * sets and executes the specified sql statement, without leaving a cursor open
  832. X   */
  833. X  
  834. X! long ora_do(lda_s, stmt)
  835. X  char *lda_s;
  836. X  char *stmt;
  837. X  {
  838. X+     long rowcount;
  839. X      char *csr_s;
  840. X+     struct cursor *csr;
  841. X  
  842. X      DBUG_ENTER("ora_do");
  843. X      DBUG_PRINT("entry", ("ora_do(%s, \"%s\")", lda_s, stmt));
  844. X***************
  845. X*** 869,886 ****
  846. X  
  847. X      if ((csr_s = ora_open(lda_s, stmt)) == NULL)
  848. X      {
  849. X!         DBUG_PRINT("exit", ("ora_open failed"));
  850. X!         DBUG_RETURN(NULL);
  851. X      }
  852. X!     else if (ora_close(csr_s) == NULL)
  853. X      {
  854. X!         DBUG_PRINT("exit", ("ora_close failed"));
  855. X!         DBUG_RETURN(NULL);
  856. X      }
  857. X      else
  858. X      {
  859. X!         DBUG_PRINT("exit", ("command successful"));
  860. X!         DBUG_RETURN(OK);
  861. X      }
  862. X  
  863. X      /* NOTREACHED */
  864. X--- 875,901 ----
  865. X  
  866. X      if ((csr_s = ora_open(lda_s, stmt)) == NULL)
  867. X      {
  868. X!         DBUG_PRINT("exit", ("ora_open failed - returning -1"));
  869. X!         DBUG_RETURN(-1L);
  870. X      }
  871. X! 
  872. X!     csr = (struct cursor *) strtoul(csr_s, (char **) NULL, 0);
  873. X!     DBUG_PRINT("conv", ("string %s converted to address $#lx",
  874. X!         csr_s, (long) csr));
  875. X! 
  876. X!     rowcount = csr->csr->csrrpc;
  877. X!     DBUG_PRINT("info", ("%ld rows processed", rowcount));
  878. X! 
  879. X!     if (ora_close(csr_s) == NULL)
  880. X      {
  881. X!         ora_dropcursor(csr);
  882. X!         DBUG_PRINT("exit", ("ora_close failed - returning -1"));
  883. X!         DBUG_RETURN(-1L);
  884. X      }
  885. X      else
  886. X      {
  887. X!         DBUG_PRINT("exit", ("returning %ld", rowcount));
  888. X!         DBUG_RETURN(rowcount);
  889. X      }
  890. X  
  891. X      /* NOTREACHED */
  892. X*** /user/mis/kstock/tmp/orafns.h    Tue Dec  8 16:43:08 1992
  893. X--- ./orafns.h    Wed Dec  2 11:53:14 1992
  894. X***************
  895. X*** 14,33 ****
  896. X  
  897. X  void        ora_version();
  898. X  
  899. X! int        ora_bind(),
  900. X!         ora_fetch(),
  901. X          ora_titles();
  902. X  
  903. X  char        *ora_login(),
  904. X          *ora_open(),
  905. X          *ora_close(),
  906. X-         *ora_do(),
  907. X          *ora_logoff(),
  908. X          *ora_commit(),
  909. X          *ora_rollback(),
  910. X          *ora_autocommit();
  911. X  
  912. X  
  913. X  /* These functions are internal to the system, not for public consumption */
  914. X  
  915. X  int        ora_dropcursor(),
  916. X--- 14,34 ----
  917. X  
  918. X  void        ora_version();
  919. X  
  920. X! int        ora_fetch(),
  921. X          ora_titles();
  922. X  
  923. X  char        *ora_login(),
  924. X          *ora_open(),
  925. X          *ora_close(),
  926. X          *ora_logoff(),
  927. X          *ora_commit(),
  928. X          *ora_rollback(),
  929. X          *ora_autocommit();
  930. X  
  931. X+ long        ora_do(),
  932. X+         ora_bind();
  933. X  
  934. X+ 
  935. X  /* These functions are internal to the system, not for public consumption */
  936. X  
  937. X  int        ora_dropcursor(),
  938. X***************
  939. X*** 93,101 ****
  940. X  
  941. X  int        count_colons();
  942. X  unsigned long    strtoul();
  943. X! char        *getenv(), *malloc();
  944. X  void        my_setenv();
  945. X  
  946. X  
  947. X  /* variables accesible to the outside world */
  948. X  
  949. X--- 94,107 ----
  950. X  
  951. X  int        count_colons();
  952. X  unsigned long    strtoul();
  953. X! char        *getenv();
  954. X  void        my_setenv();
  955. X  
  956. X+ #ifndef    MALLOC_PTR_TYPE
  957. X+ #    define    MALLOC_PTR_TYPE    char
  958. X+ #endif
  959. X+ 
  960. X+ MALLOC_PTR_TYPE    *malloc();
  961. X  
  962. X  /* variables accesible to the outside world */
  963. X  
  964. X*** /user/mis/kstock/tmp/testdir/Standard-Results    Tue Dec  8 16:46:02 1992
  965. X--- ./testdir/Standard-Results    Wed Dec  2 11:54:55 1992
  966. X***************
  967. X*** 10,15 ****
  968. X--- 10,16 ----
  969. X  Only values up to 11 should appear.
  970. X  
  971. X  2 3 5 7 11 
  972. X+ just another Oraperl hacker, 
  973. X  2 fields, lengths 10, 40
  974. X      types 1, 2
  975. X      names NAME, EXT
  976. SHAR_EOF
  977. chmod 0644 patch3 ||
  978. echo 'restore of patch3 failed'
  979. Wc_c="`wc -c < 'patch3'`"
  980. test 23409 -eq "$Wc_c" ||
  981.     echo 'patch3: original size 23409, current size' "$Wc_c"
  982. fi
  983. # ============= examples/japh ==============
  984. if test ! -d 'examples'; then
  985.     echo 'x - creating directory examples'
  986.     mkdir 'examples'
  987. fi
  988. if test -f 'examples/japh' -a X"$1" != X"-c"; then
  989.     echo 'x - skipping examples/japh (File already exists)'
  990. else
  991. echo 'x - extracting examples/japh (Text)'
  992. sed 's/^X//' << 'SHAR_EOF' > 'examples/japh' &&
  993. X#!/usr/local/bin/oraperl
  994. X#
  995. X# This is an example of how we could code a JAPH in Oraperl.
  996. X#
  997. X# Author:    Kevin Stock
  998. X# Date:        1st December 1992
  999. X#
  1000. X
  1001. X# supply debugging output if desired
  1002. X
  1003. X$ora_debug = shift if $ARGV[0] =~ /^-#/;
  1004. X
  1005. X# login to the database and create the table
  1006. X
  1007. X$lda = &ora_login('t', 'kstock', 'kstock') || die $ora_errstr;
  1008. X&ora_do($lda, <<) || die $ora_errstr;
  1009. X    create table japh (word char(7), posn number(1))
  1010. X
  1011. X# Loop to insert data into the table
  1012. X
  1013. X$csr = &ora_open($lda, <<) || die $ora_errstr;
  1014. X    insert into japh values(:1, :2)
  1015. X
  1016. Xwhile (<DATA>)
  1017. X{
  1018. X    chop;
  1019. X    &ora_bind($csr, split(':')) || warn "$_: $ora_errstr";
  1020. X}
  1021. X&ora_close($csr) || warn $ora_errstr;
  1022. X
  1023. X# Now retrieve the data, printing it word by word
  1024. X
  1025. X$csr = &ora_open($lda, <<) || die $ora_errstr;
  1026. X    select word from japh order by posn
  1027. X
  1028. Xwhile (($word) = &ora_fetch($csr))
  1029. X{
  1030. X    print "$word ";
  1031. X}
  1032. X&ora_close($csr) || warn $ora_errstr;
  1033. X
  1034. Xprint "\n";
  1035. X
  1036. X# delete the table
  1037. X
  1038. X&ora_do($lda, 'drop table japh') || warn $ora_errstr;
  1039. X&ora_logoff($lda) || die $ora_errstr;
  1040. X
  1041. X__END__
  1042. XOraperl:3
  1043. Xanother:2
  1044. Xhacker:4
  1045. Xjust:1
  1046. SHAR_EOF
  1047. chmod 0755 examples/japh ||
  1048. echo 'restore of examples/japh failed'
  1049. Wc_c="`wc -c < 'examples/japh'`"
  1050. test 1061 -eq "$Wc_c" ||
  1051.     echo 'examples/japh: original size 1061, current size' "$Wc_c"
  1052. fi
  1053. # ============= testdir/japh.pl ==============
  1054. if test ! -d 'testdir'; then
  1055.     echo 'x - creating directory testdir'
  1056.     mkdir 'testdir'
  1057. fi
  1058. if test -f 'testdir/japh.pl' -a X"$1" != X"-c"; then
  1059.     echo 'x - skipping testdir/japh.pl (File already exists)'
  1060. else
  1061. echo 'x - extracting testdir/japh.pl (Text)'
  1062. sed 's/^X//' << 'SHAR_EOF' > 'testdir/japh.pl' &&
  1063. X# supply debugging output if desired
  1064. X
  1065. X$ora_debug = shift if $ARGV[0] =~ /^-#/;
  1066. X
  1067. X$USAGE = "Usage: $0 database username password\n";
  1068. X
  1069. X$base = shift || die $USAGE;
  1070. X$name = shift || die $USAGE;
  1071. X$pass = shift || die $USAGE;
  1072. X
  1073. X# login to the database and create the table
  1074. X
  1075. X$lda = &ora_login($base, $name, $pass) || die $ora_errstr;
  1076. X&ora_do($lda, <<) || die $ora_errstr;
  1077. X    create table japh (word char(7), posn number(1))
  1078. X
  1079. X# Loop to insert data into the table
  1080. X
  1081. X$csr = &ora_open($lda, <<) || die $ora_errstr;
  1082. X    insert into japh values(:1, :2)
  1083. X
  1084. Xwhile (<DATA>)
  1085. X{
  1086. X    chop;
  1087. X    &ora_bind($csr, split(':')) || warn "$_: $ora_errstr";
  1088. X}
  1089. X&ora_close($csr) || warn $ora_errstr;
  1090. X
  1091. X# Now retrieve the data, printing it word by word
  1092. X
  1093. X$csr = &ora_open($lda, <<) || die $ora_errstr;
  1094. X    select word from japh order by posn
  1095. X
  1096. Xwhile (($word) = &ora_fetch($csr))
  1097. X{
  1098. X    print "$word ";
  1099. X}
  1100. X&ora_close($csr) || warn $ora_errstr;
  1101. X
  1102. Xprint "\n";
  1103. X
  1104. X# delete the table
  1105. X
  1106. X&ora_do($lda, 'drop table japh') || warn $ora_errstr;
  1107. X&ora_logoff($lda) || die $ora_errstr;
  1108. X
  1109. X__END__
  1110. XOraperl:3
  1111. Xanother:2
  1112. Xhacker,:4
  1113. Xjust:1
  1114. SHAR_EOF
  1115. chmod 0644 testdir/japh.pl ||
  1116. echo 'restore of testdir/japh.pl failed'
  1117. Wc_c="`wc -c < 'testdir/japh.pl'`"
  1118. test 1056 -eq "$Wc_c" ||
  1119.     echo 'testdir/japh.pl: original size 1056, current size' "$Wc_c"
  1120. fi
  1121. exit 0
  1122.  
  1123. exit 0 # Just in case...
  1124.