home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume25 / oraperl / patch03b < prev    next >
Text File  |  1991-11-11  |  18KB  |  593 lines

  1. Newsgroups: comp.sources.misc
  2. From: kstock@gouldfr.encore.fr (Kevin Stock)
  3. Subject:  v25i036:  oraperl - Extensions to Perl to access Oracle databases, Patch03b/2
  4. Message-ID: <1991Nov10.174103.19859@sparky.imd.sterling.com>
  5. X-Md4-Signature: d783a6e7c3fef65ecc5795f9f7c1f07d
  6. Date: Sun, 10 Nov 1991 17:41:03 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: kstock@gouldfr.encore.fr (Kevin Stock)
  10. Posting-number: Volume 25, Issue 36
  11. Archive-name: oraperl/patch03b
  12. Environment: Perl, Oracle
  13. Patch-To: oraperl: Volume 18, Issue 10
  14.  
  15. #!/bin/sh
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file Patch03 continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 2; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test ! -f _shar_wnt_.tmp; then
  32.     echo 'x - still skipping Patch03'
  33. else
  34. echo 'x - continuing file Patch03'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'Patch03' &&
  36. ! The return value is a statement identifier
  37. ! (an \fIORACLE cursor\fP).
  38. X  
  39. X  If the SQL statement contains substitution variables
  40. - (see later)
  41. X  \fIora_bind\fP is used to assign values to them.
  42. ! This takes a statement identifier (obtained from \fIora_open\fP)
  43. X  as its first parameter,
  44. X  followed by as many parameters as are required by the statement.
  45. X  
  46. --- 38,57 ----
  47. X  (an \fIORACLE Login Data Area\fP).
  48. X  
  49. X  To specify the \fISQL\fP statement to be executed,
  50. ! the program must call \fIora_open\fP or \fIora_do\fP.
  51. ! These functions take two parameters:
  52. X  a login identifier (obtained from \fIora_login\fP)
  53. X  and the \fISQL\fP statement to be executed.
  54. ! The return value from \fIora_open\fP is a statement identifier
  55. ! (an \fIORACLE cursor\fP) for use with \fIora_fetch\fP or \fIora_bind\fP.
  56. ! The return value from \fIora_do\fP is the constant string \fBOK\fP.
  57. ! The \fIora_do\fP function
  58. ! is only suitable for statements which do not return data
  59. ! or contain substitution variables.
  60. X  
  61. X  If the SQL statement contains substitution variables
  62. X  \fIora_bind\fP is used to assign values to them.
  63. ! This function takes a statement identifier (obtained from \fIora_open\fP)
  64. X  as its first parameter,
  65. X  followed by as many parameters as are required by the statement.
  66. X  
  67. ***************
  68. *** 54,66 ****
  69. X  the return value is an array containing the data,
  70. X  one element per field.
  71. X  In a scalar context,
  72. X  the return value is the number of fields available from the query.
  73. X  
  74. ! When all the data desired has been returned from an \fISQL\fP statement,
  75. X  the statement identifier should be released using the \fIora_close\fP function.
  76. X  Every \fIora_open\fP call should have a corresponding \fIora_close\fP,
  77. X  even if it did not return any data.
  78. - This function returns the string \fBOK\fP.
  79. X  
  80. X  When the program no longer needs to access a given database,
  81. X  the login identifier should be released using the \fIora_logoff\fP function.
  82. --- 63,76 ----
  83. X  the return value is an array containing the data,
  84. X  one element per field.
  85. X  In a scalar context,
  86. + no data is actually fetched and
  87. X  the return value is the number of fields available from the query.
  88. X  
  89. ! When all the data desired has been returned from an \fIora_open()\fP call,
  90. X  the statement identifier should be released using the \fIora_close\fP function.
  91. + This function returns the string \fBOK\fP.
  92. X  Every \fIora_open\fP call should have a corresponding \fIora_close\fP,
  93. X  even if it did not return any data.
  94. X  
  95. X  When the program no longer needs to access a given database,
  96. X  the login identifier should be released using the \fIora_logoff\fP function.
  97. ***************
  98. *** 67,73 ****
  99. X  This function returns the string \fBOK\fP.
  100. X  
  101. X  All functions return a null string to indicate failure.
  102. ! In the case of \fIora_fetch\fP, this implies the end of the data.
  103. X  .SH Variables
  104. X  Two special variables are provided,
  105. X  \fIora_errno\fP and \fIora_errstr\fP.
  106. --- 77,85 ----
  107. X  This function returns the string \fBOK\fP.
  108. X  
  109. X  All functions return a null string to indicate failure.
  110. ! In the case of \fIora_fetch\fP,
  111. ! if $ora_errno is zero,
  112. ! this indicates the end of the data.
  113. X  .SH Variables
  114. X  Two special variables are provided,
  115. X  \fIora_errno\fP and \fIora_errstr\fP.
  116. ***************
  117. *** 83,90 ****
  118. X  For example, a program which added records to a telephone list
  119. X  might use the following call to \fIora_open\fP:
  120. X  
  121. X  .ti +.5i
  122. ! \f(CW$csr = &ora_open($csr, "insert into phonelist values(:1, :2)");\fP
  123. X  
  124. X  The two names \fB:1\fP and \fB:2\fP are called substitution variables.
  125. X  The function \fIora_bind\fP is used to assign values to these variables.
  126. --- 95,104 ----
  127. X  For example, a program which added records to a telephone list
  128. X  might use the following call to \fIora_open\fP:
  129. X  
  130. + .if t .ft CW
  131. X  .ti +.5i
  132. ! $csr = &ora_open($csr, "insert into phonelist values(:1, :2)");
  133. ! .if t .ft P
  134. X  
  135. X  The two names \fB:1\fP and \fB:2\fP are called substitution variables.
  136. X  The function \fIora_bind\fP is used to assign values to these variables.
  137. ***************
  138. *** 91,99 ****
  139. X  For example, the following statements would add two new people to the list:
  140. X  
  141. X  .ti +.5i
  142. ! \f(CW&ora_bind($csr, "Annette", "472-8836");\fP
  143. X  .ti +.5i
  144. ! \f(CW&ora_bind($csr, "Brian", "937-1823");\fP
  145. X  
  146. X  Note that the substitution variables must be assigned consecutively
  147. X  beginning from \fB1\fP for each SQL statement,
  148. --- 105,115 ----
  149. X  For example, the following statements would add two new people to the list:
  150. X  
  151. X  .ti +.5i
  152. ! .if t .ft CW
  153. ! &ora_bind($csr, "Annette", "472-8836");
  154. X  .ti +.5i
  155. ! &ora_bind($csr, "Brian", "937-1823");
  156. ! .if t .ft P
  157. X  
  158. X  Note that the substitution variables must be assigned consecutively
  159. X  beginning from \fB1\fP for each SQL statement,
  160. ***************
  161. *** 101,107 ****
  162. X  Named substitution variables
  163. X  (for example, \fB:NAME\fP, \fB:TELNO\fP)
  164. X  are not permitted.
  165. ! .ne 28
  166. X  .SH EXAMPLE
  167. X  .if t .ft C
  168. X  .ta 4 8 12 16 20 24 28 32 36 40
  169. --- 117,123 ----
  170. X  Named substitution variables
  171. X  (for example, \fB:NAME\fP, \fB:TELNO\fP)
  172. X  are not permitted.
  173. ! .ne 30
  174. X  .SH EXAMPLE
  175. X  .if t .ft C
  176. X  .ta 4 8 12 16 20 24 28 32 36 40
  177. ***************
  178. *** 133,138 ****
  179. --- 149,156 ----
  180. X      write;
  181. X  }
  182. X  
  183. + die "fetch error: $ora_errstr" if $ora_errno;
  184. X  do ora_close($csr) || die "can't close cursor";
  185. X  do ora_logoff($lda) || die "can't log off Oracle";
  186. X  ^cc
  187. ***************
  188. *** 162,171 ****
  189. X  .if t .ft P
  190. X  .in -3
  191. X  
  192. ! At present, only flags \fB8\fP (program execution)
  193. X  and \fB128\fP (use of malloc and free)
  194. X  are supported.
  195. - .bp
  196. X  .SH NOTES
  197. X  In keeping with the philosophy of \fIPerl\fP,
  198. X  there is no pre-defined limit to the number of simultaneous logins
  199. --- 180,189 ----
  200. X  .if t .ft P
  201. X  .in -3
  202. X  
  203. ! At present, only flags \fB8\fP (program execution),
  204. ! \fB32\fP (string/numeric conversion)
  205. X  and \fB128\fP (use of malloc and free)
  206. X  are supported.
  207. X  .SH NOTES
  208. X  In keeping with the philosophy of \fIPerl\fP,
  209. X  there is no pre-defined limit to the number of simultaneous logins
  210. ***************
  211. *** 173,187 ****
  212. X  nor to the number of data fields which may be returned by a query.
  213. X  The only limits are those imposed by the amount of memory available,
  214. X  or by \fIOracle\fP.
  215. X  .SH SEE ALSO
  216. ! Documentation for \fIOracle\fP, \fISQL*Plus\fP and \fIPro*C\fP.
  217. ! .br
  218. ! Documentation for \fIPerl\fP.
  219. ! .SH AUTHOR
  220. X  \fIORACLE\fP by Oracle Corporation, California.
  221. X  .br
  222. X  \fIPerl\fP by Larry Wall, Netlabs
  223. ! (\f(CWlwall@netlabs.com\fP).
  224. X  .br
  225. X  \fIOraperl\fP by Kevin Stock, Encore Computer SA, France
  226. ! (\f(CWkstock@gouldfr.encore.fr\fP).
  227. --- 191,221 ----
  228. X  nor to the number of data fields which may be returned by a query.
  229. X  The only limits are those imposed by the amount of memory available,
  230. X  or by \fIOracle\fP.
  231. + Debugging option \fB32\fP only reports internal string/numeric translations,
  232. + not those performed on the data retrieved from the database.
  233. X  .SH SEE ALSO
  234. ! .nf
  235. ! Oracle Documentation:
  236. ! .in +5
  237. ! \fISQL Language Reference Manual\fP
  238. ! \fIProgrammer's Guide to the Oracle Call Interfaces\fP
  239. ! .ti -5
  240. ! \fIPerl\fP documentation:
  241. ! \fIProgramming Perl\fP by Larry Wall and Randall Schwartz
  242. ! \fIperl(1)\fP
  243. ! .in -5
  244. ! .fi
  245. ! .SH AUTHORS
  246. X  \fIORACLE\fP by Oracle Corporation, California.
  247. X  .br
  248. X  \fIPerl\fP by Larry Wall, Netlabs
  249. ! .if t .ft C
  250. ! (lwall@netlabs.com).
  251. ! .if t .ft P
  252. X  .br
  253. X  \fIOraperl\fP by Kevin Stock, Encore Computer SA, France
  254. ! .if t .ft C
  255. ! (kstock@gouldfr.encore.fr).
  256. ! .if t .ft P
  257. *** ORIG/oraperl.doc    Mon Oct 28 17:13:06 1991
  258. --- ./oraperl.doc    Mon Oct 28 11:05:49 1991
  259. ***************
  260. *** 27,33 ****
  261. X  because it requires fixed addresses to be specified for receipt of data.
  262. X  A new interface was therefore created for \fBOraperl\fP.
  263. X  
  264. ! The interface follows the idiom of the following six tasks:
  265. X  
  266. X  .in +5
  267. X  .ta .4i 4.4i
  268. --- 27,33 ----
  269. X  because it requires fixed addresses to be specified for receipt of data.
  270. X  A new interface was therefore created for \fBOraperl\fP.
  271. X  
  272. ! The interface follows the idiom of the following seven tasks:
  273. X  
  274. X  .in +5
  275. X  .ta .4i 4.4i
  276. ***************
  277. *** 39,45 ****
  278. X  \fB3\fP    modify the statement    \fIora_bind\fP
  279. X  \fB4\fP    get the data    \fIora_fetch\fP
  280. X  \fB5\fP    close the stream    \fIora_close\fP
  281. ! \fB6\fP    log off of the database    \fIora_logoff\fP
  282. X  .fi
  283. X  .in -5
  284. X  
  285. --- 39,46 ----
  286. X  \fB3\fP    modify the statement    \fIora_bind\fP
  287. X  \fB4\fP    get the data    \fIora_fetch\fP
  288. X  \fB5\fP    close the stream    \fIora_close\fP
  289. ! \fB6\fP    execute an SQL statement    \fIora_do\fP
  290. ! \fB7\fP    log off of the database    \fIora_logoff\fP
  291. X  .fi
  292. X  .in -5
  293. X  
  294. ***************
  295. *** 80,85 ****
  296. --- 81,94 ----
  297. X  with a null string being returned for an error.
  298. X  
  299. X  
  300. + \fBora_version\fP
  301. + This function has nothing to do with the data interface;
  302. + it simply prints the Oraperl version and copyright information,
  303. + similar to Perl's \fB\-v\fP flag.
  304. + It does not return a value.
  305. X  \fBora_login(database, name, password)\fP
  306. X  
  307. X  Requests a cursor
  308. ***************
  309. *** 103,108 ****
  310. --- 112,119 ----
  311. X  to determine the number and size of the fields which will be returned.
  312. X  It allocates memory for these fields within \fIcsr\fP
  313. X  and attaches them to the cursor using \fBOCI\ odefin\fP.
  314. + It also attaches a return code field to each item,
  315. + so that NULL data returns can be caught and treated sensibly.
  316. X  It returns the address of the \fIcsr\fP.
  317. X  
  318. X  
  319. ***************
  320. *** 120,125 ****
  321. --- 131,139 ----
  322. X  In an array context,
  323. X  calls \fBOCI\ ofetch\fP with the specified \fIcsr\fP
  324. X  and returns an array with one element for each field returned.
  325. + If any field in the database was NULL,
  326. + and empty string will be returned.
  327. + It is not possible to distinguish between empty and NULL fields.
  328. X  In a scalar context,
  329. X  returns the number of fields available from the query.
  330. X  
  331. ***************
  332. *** 131,136 ****
  333. --- 145,161 ----
  334. X  The string \fBOK\fP is returned.
  335. X  
  336. X  
  337. + \fBora_do(lda, stmt)\fP
  338. + This is equivalent to an \fBora_open\fP
  339. + immediately followed by an \fBora_close\fP
  340. + (in fact, that is how it is implemented)
  341. + except that the user does not have to keep track
  342. + of the \fIcsr\fP used.
  343. + It is suitable for statements which do not return any data
  344. + and which do not contain any substitution variables.
  345. X  \fBora_logoff(lda)\fP
  346. X  
  347. X  Calls \fBOCI\ ologoff\fP to log off of \fIOracle\fP
  348. ***************
  349. *** 165,172 ****
  350. X  deal with the allocation and release of cursors.
  351. X  
  352. X  The definition of a cursor is extended from the \fIOracle\fP definition
  353. ! to include an \fIhda\fP (\fIHost Data Area\fP)
  354. ! and space for the data returned from the database.
  355. X  Thus, \fIcsr\fPs and \fIlda\fPs have the same structure internally.
  356. X  All the cursors are held on a singly\-linked list.
  357. X  
  358. --- 190,198 ----
  359. X  deal with the allocation and release of cursors.
  360. X  
  361. X  The definition of a cursor is extended from the \fIOracle\fP definition
  362. ! to include an \fIhda\fP (\fIHost Data Area\fP),
  363. ! space for the data returned from the database
  364. ! and space for return codes for each data field.
  365. X  Thus, \fIcsr\fPs and \fIlda\fPs have the same structure internally.
  366. X  All the cursors are held on a singly\-linked list.
  367. X  
  368. ***************
  369. *** 244,254 ****
  370. X  .in +5
  371. X  .ta 5
  372. X  .ti -5
  373. ! \ \ 8    \c
  374. X  Reports entry and exit to \fIOraperl\fP functions,
  375. X  including internal functions not directly available to \fIOraperl\fP scripts.
  376. X  
  377. X  .ti -5
  378. X  128    \c
  379. X  Reports use of \fImalloc\fP and \fIfree\fP
  380. X  to obtain cursors, login data areas, etc.
  381. --- 270,289 ----
  382. X  .in +5
  383. X  .ta 5
  384. X  .ti -5
  385. ! \0\08    \c
  386. X  Reports entry and exit to \fIOraperl\fP functions,
  387. X  including internal functions not directly available to \fIOraperl\fP scripts.
  388. X  
  389. X  .ti -5
  390. + \032    \c
  391. + Reports conversions between strings and numerics.
  392. + In the case of Oraperl, this only concerns the translation of cursor addresses
  393. + into strings, and vice versa,
  394. + since the data translations are performed by the Oracle software.
  395. + However, it could be useful in tracing obscure bugs,
  396. + if the \fIlda\fPs or \fIcsr\fPs returned by \fIOraperl\fP are unusable.
  397. + .ti -5
  398. X  128    \c
  399. X  Reports use of \fImalloc\fP and \fIfree\fP
  400. X  to obtain cursors, login data areas, etc.
  401. ***************
  402. *** 269,273 ****
  403. --- 304,310 ----
  404. X  This variable may be tested to determine whether debugging has been enabled;
  405. X  for example:
  406. X  
  407. + .nf
  408. X  .ti +5
  409. X  \fBdefined($ora_debug)\0||\0warn("oraperl debugging not enabled\en");\fP
  410. + .fi
  411. *** ORIG/oraperl.ref    Mon Oct 28 17:13:07 1991
  412. --- ./oraperl.ref    Mon Oct 28 11:42:42 1991
  413. ***************
  414. *** 2,7 ****
  415. --- 2,8 ----
  416. X  .\"
  417. X  .nf
  418. X  .\"
  419. + .vs 10
  420. X  .ps 10
  421. X  \fBOraperl Quick Reference\fP
  422. X  .ps 8
  423. ***************
  424. *** 12,17 ****
  425. --- 13,22 ----
  426. X  .in +2m
  427. X  .sp
  428. X  .ti -2m
  429. + \fB&ora_version\fP
  430. + Displays version and copyright information for Oraperl.
  431. + .sp
  432. + .ti -2m
  433. X  \fB$lda = &ora_login($database, $name, $password)\fP
  434. X  Logs into the specified database with the name and password given.
  435. X  Returns an \fIlda\fP for use with \fIora_open()\fP.
  436. ***************
  437. *** 40,45 ****
  438. --- 45,55 ----
  439. X  Finishes the SQL statement identified by $csr.
  440. X  .sp
  441. X  .ti -2m
  442. + \fB&ora_do($lda, $stmt)\fP
  443. + Equivalent to \fI&ora_close\fP(\fI&ora_open(...))\fP
  444. + for statements which have no substitution variables and do not return data.
  445. + .sp
  446. + .ti -2m
  447. X  \fB&ora_logoff($lda)\fP
  448. X  Logs out of the database identified by $lda.
  449. X  .ti -2m
  450. ***************
  451. *** 58,66 ****
  452. X  
  453. X  .ti -2m
  454. X  \fB$ora_debug\fP  (if debugging is enabled)
  455. ! Contains the debugging flags for \fIOraperl\fP.
  456. X  May be set by a program to debug only certain parts of the script.
  457. X  The following flags are meaningful:
  458. X  .ta 5m
  459. X  \0\08    report function entry and exit
  460. X  128    report use of malloc and free
  461. --- 68,77 ----
  462. X  
  463. X  .ti -2m
  464. X  \fB$ora_debug\fP  (if debugging is enabled)
  465. ! Contains the debugging flags for \fIOraperl\fP, initialised from Perl's -D flag.
  466. X  May be set by a program to debug only certain parts of the script.
  467. X  The following flags are meaningful:
  468. X  .ta 5m
  469. X  \0\08    report function entry and exit
  470. + \032    report conversions between strings and numerics
  471. X  128    report use of malloc and free
  472. *** ORIG/usersub.c    Mon Oct 28 17:12:43 1991
  473. --- ./usersub.c    Mon Oct 28 16:39:29 1991
  474. ***************
  475. *** 18,30 ****
  476. X  {
  477. X      init_oracle();
  478. X  
  479. ! #ifdef    DEBUGGING
  480. ! #ifdef    PERL_DEBUGGING
  481. X      ora_debug = debug;        /* pick up the -D flag */
  482. ! #else
  483. X      ora_debug = 0;
  484. ! #endif    /* PERL_DEBUGGING */
  485. ! #endif    /* DEBUGGING */
  486. X  
  487. X      ora_errno = 0;
  488. X  }
  489. --- 18,30 ----
  490. X  {
  491. X      init_oracle();
  492. X  
  493. ! #ifdef DEBUGGING
  494. ! #   ifdef PERL_DEBUGGING
  495. X      ora_debug = debug;        /* pick up the -D flag */
  496. ! #   else
  497. X      ora_debug = 0;
  498. ! #   endif
  499. ! #endif
  500. X  
  501. X      ora_errno = 0;
  502. X  }
  503. SHAR_EOF
  504. echo 'File Patch03 is complete' &&
  505. chmod 0644 Patch03 ||
  506. echo 'restore of Patch03 failed'
  507. Wc_c="`wc -c < 'Patch03'`"
  508. test 67801 -eq "$Wc_c" ||
  509.     echo 'Patch03: original size 67801, current size' "$Wc_c"
  510. rm -f _shar_wnt_.tmp
  511. fi
  512. # ============= oraperl.ph ==============
  513. if test -f 'oraperl.ph' -a X"$1" != X"-c"; then
  514.     echo 'x - skipping oraperl.ph (File already exists)'
  515.     rm -f _shar_wnt_.tmp
  516. else
  517. > _shar_wnt_.tmp
  518. echo 'x - extracting oraperl.ph (Text)'
  519. sed 's/^X//' << 'SHAR_EOF' > 'oraperl.ph' &&
  520. # oraperl.ph
  521. #
  522. # Various defines which may be useful in oraperl programs
  523. #
  524. # Author:    Kevin Stock
  525. # Date:        28th October 1991
  526. X
  527. X
  528. # Oraperl error codes, set in $ora_errno
  529. X
  530. $ORAP_NOMEM    = 100001;    # out of memory
  531. $ORAP_INVCSR    = 100002;    # invalid cursor supplied
  532. $ORAP_INVLDA    = 100003;    # invalid lda supplied
  533. $ORAP_NOSID    = 100004;    # couldn't set ORACLE_SID
  534. $ORAP_BADVAR    = 100005;    # bad colon variable sequence
  535. $ORAP_NUMVARS    = 100006;    # wrong number of colon variables
  536. $ORAP_NODATA    = 100007;    # statement does not return data
  537. X
  538. X
  539. # Oraperl debugging codes for $ora_debug
  540. X
  541. $ODBG_EXEC    =   8;        # program execution
  542. $ODBG_STRNUM    =  32;        # string/numeric conversions
  543. $ODBG_MALLOC    = 128;        # memory allocation/release
  544. X
  545. X
  546. 1;
  547. SHAR_EOF
  548. chmod 0644 oraperl.ph ||
  549. echo 'restore of oraperl.ph failed'
  550. Wc_c="`wc -c < 'oraperl.ph'`"
  551. test 703 -eq "$Wc_c" ||
  552.     echo 'oraperl.ph: original size 703, current size' "$Wc_c"
  553. rm -f _shar_wnt_.tmp
  554. fi
  555. # ============= patchlevel.h ==============
  556. if test -f 'patchlevel.h' -a X"$1" != X"-c"; then
  557.     echo 'x - skipping patchlevel.h (File already exists)'
  558.     rm -f _shar_wnt_.tmp
  559. else
  560. > _shar_wnt_.tmp
  561. echo 'x - extracting patchlevel.h (Text)'
  562. sed 's/^X//' << 'SHAR_EOF' > 'patchlevel.h' &&
  563. /* patchlevel.h */
  564. X
  565. #define    PATCHLEVEL    3
  566. SHAR_EOF
  567. chmod 0644 patchlevel.h ||
  568. echo 'restore of patchlevel.h failed'
  569. Wc_c="`wc -c < 'patchlevel.h'`"
  570. test 41 -eq "$Wc_c" ||
  571.     echo 'patchlevel.h: original size 41, current size' "$Wc_c"
  572. rm -f _shar_wnt_.tmp
  573. fi
  574. rm -f _shar_seq_.tmp
  575. echo You have unpacked the last part
  576. exit 0
  577. exit 0 # Just in case...
  578. -- 
  579. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  580. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  581. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  582. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  583.