home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / vmsnet / sources / 479 < prev    next >
Encoding:
Internet Message Format  |  1993-01-05  |  43.1 KB

  1. Path: sparky!uunet!usc!news.service.uci.edu!unogate!mvb.saic.com!vmsnet-sources
  2. Newsgroups: vmsnet.sources
  3. From: Dan Wing <DWING@UH01.Colorado.EDU>
  4. Subject: DSNlink_NEW.COM version V2.20, part 01/01
  5. Date: Mon, 04 Jan 1993 21:27:57 GMT
  6. Message-ID: <9909637@MVB.SAIC.COM>
  7. Lines: 1119
  8. Approved: Mark.Berryman@Mvb.Saic.Com
  9.  
  10. Submitted-by: Dan Wing <DWING@UH01.Colorado.EDU>
  11. Posting-number: Volume 4, Issue 33
  12. Archive-name: dsnlink_new/part01
  13. Supersedes: dsnlink_new: Volume 3, Issue 90,190,210,242,251
  14.  
  15. DSNlink_NEW.COM is a program that runs daily to get new DSN ITS articles and 
  16. mail them to you.
  17.  
  18. Version 2.20 includes these enhancements over the 2.00 version:
  19.  
  20.   o Removed restriction of 255-character maximum for DSNlink database names.
  21.   o List of databases can be in a datafile, or in a logical name.
  22.   o Prevent output from exceeding 80 columns (for better formatting).
  23.   o Logical names changed from DSNLINKNEW_xx to DSNLINK_NEW_xx.
  24.   o Removed all checking to determine if DSNlink is running on the DCN.
  25.   o Use 'new' form of DSN ITS /SINCE processing (TODAY-2-00:00) as default.
  26.  
  27. -Dan Wing, dwing@uh01.colorado.edu or wing_d@ucolmcc.bitnet (DGW11)
  28.  Systems Administrator, University Hospital, Denver
  29.  
  30. $! ------------------ CUT HERE -----------------------
  31. $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))'
  32. $!
  33. $! This archive created by VMS_SHARE Version 8.1
  34. $!   On 21-DEC-1992 09:38:10.58   By user DWING (DWING@UH01.Colorado.EDU)
  35. $!
  36. $! The VMS_SHARE software that created this archive
  37. $!    was written by  Andy Harper, Kings College London UK
  38. $!    -- September 1992
  39. $!
  40. $! Credit is due to these people for their original ideas:
  41. $!    James Gray, Michael Bednarek 
  42. $!
  43. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  44. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  45. $!
  46. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  47. $!       1. DSNLINK_NEW.COM;275
  48. $!
  49. $set="set"
  50. $set symbol/scope=(nolocal,noglobal)
  51. $f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID"))
  52. $e="write sys$error  ""%UNPACK"", "
  53. $w="write sys$output ""%UNPACK"", "
  54. $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!"
  55. $ ve=f$getsyi("version")
  56. $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start
  57. $ e "-E-OLDVER, Must run at least VMS 4.4"
  58. $ v=f$verify(v)
  59. $ exit 44
  60. $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes
  61. $ if f$search(P1) .eqs. "" then $ goto file_absent
  62. $ e "-W-EXISTS, File ''P1' exists. Skipped."
  63. $ delete 'f'*
  64. $ exit
  65. $file_absent:
  66. $ if f$parse(P1) .nes. "" then $ goto dirok
  67. $ dn=f$parse(P1,,,"DIRECTORY")
  68. $ w "-I-CREDIR, Creating directory ''dn'"
  69. $ create/dir 'dn'
  70. $ if $status then $ goto dirok
  71. $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped."
  72. $ delete 'f'*
  73. $ exit
  74. $dirok:
  75. $ w "-I-UNPACK, Unpacking file ''P1'"
  76. $ n=P1
  77. $ if P3 .nes. "" then $ n=f
  78. $ if .not. f$verify() then $ define/user sys$output nl:
  79. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='n'
  80. PROCEDURE GetHex LOCAL x1,x2;x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,
  81. ERASE_CHARACTER(1))-1;RETURN 16*x1+x2;ENDPROCEDURE;
  82. PROCEDURE SkipPartsep LOOP EXITIF INDEX(ERASE_LINE,"-+-+-+-+-+-+-+-+")=1;
  83. ENDLOOP;ENDPROCEDURE;
  84. PROCEDURE ExpandChar CASE CURRENT_CHARACTER FROM ' ' TO 'z' ["&"]
  85. :ERASE_CHARACTER(1);x:=GetHex;COPY_TEXT(ASCII(GetHex)*x);["`"]:ERASE_CHARACTER(
  86. 1);COPY_TEXT(ASCII(GetHex));[" "]:ERASE_CHARACTER(1);[OUTRANGE,INRANGE]
  87. :MOVE_HORIZONTAL(1);ENDCASE;ENDPROCEDURE;PROCEDURE ProcessLine s:=
  88. ERASE_CHARACTER(1);LOOP EXITIF CURRENT_OFFSET>=LENGTH(CURRENT_LINE);ExpandChar;
  89. ENDLOOP;IF s="V" THEN APPEND_LINE;ENDIF;ENDPROCEDURE;
  90. PROCEDURE AdvanceLine MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);
  91. ENDPROCEDURE;PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=
  92. END_OF(b);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;
  93. ELSE ProcessLine;AdvanceLine;ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,
  94. "UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=
  95. GET_INFO(COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,
  96. GET_INFO(COMMAND_LINE,"output_file"));QUIT;
  97. $ if p3 .eqs. "" then $ goto dl
  98. $ open/write fdl &f
  99. $ write fdl "RECORD"
  100. $ write fdl P3
  101. $ close fdl
  102. $ w "-I-CONVRFM, Converting record format to ", P3
  103. $ convert/fdl=&f &f-1 &P1
  104. $dl: delete 'f'*
  105. $ if P2 .eqs. "" then $ goto ckskip
  106. $ checksum 'P1'
  107. $ if checksum$checksum .nes. P2 then $ -
  108.   e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  109. $ exit
  110. $ckskip: e "-W-CHKSUMSKIP, checksum validation unavailable for ''P1'"
  111. $ endsubroutine
  112. $start:
  113. $!
  114. $ create 'f'
  115. X$!&0220DSNlink_NEW.COM
  116. X$`20VERIFY`20=`20'F$VERIFY(F$TRNLNM("DSNlink_NEW_VERIFY"))'
  117. X$`20IF`20P1`20.EQS.`20"?"`20THEN`20SET`20VERIFY
  118. X$!
  119. X$!&0220FUNCTION:
  120. X$!&0420Get`20list`20of`20new`20DSNlink`20articles,`20and`20mail`20them`20to
  121. V`20a`20user`20or`20group`20of
  122. X$!&0420users.&0220When`20multiple`20databases`20are`20searched,`20the`20databa
  123. Vse`20is`20shown
  124. X$!&0420with`20the`20articles`20found`20in`20that`20database.&0220This`20progra
  125. Vm`20eliminates`20the`20
  126. X$!&0420need`20to`20check`20DSNlink`20manually`20every`20day.
  127. X$!
  128. X$!&0420DSNlink`20is`20a`20service`20offered`20by`20DEC`20for`20software`20supp
  129. Vort.
  130. X$!
  131. X$!&0220PARAMETERS:
  132. X$!&0520P1`20-`20`5Bopt`5D&0220maximum`20retry`20count.&0220DEFAULT`20=`205
  133. X$!&0520P2`20-`20`5Bopt`5D&0220username`20to`20send`20mail`20to.&0220DEFAULT
  134. V`20=`20current`20user
  135. X$!&0520P3`20-`20`5Bopt`5D&0220Since`20criteria.&0220DEFAULT`20=`20TODAY-2-00:0
  136. V0
  137. X$!&0520P4`20-`20`5Bopt`5D&0220databases`20to`20search.&0220DEFAULT`20=`20list
  138. V`20of`20default`20databases
  139. X$!&1120are`20used`20(see`20comments`20below)
  140. X$!&0520P5`20-`20`5Bopt`5D&0220Suppress`20mail`20if`20no`20new`20articles.
  141. V&0220If`20TRUE`20and`20no`20new`20
  142. X$!&1120articles,`20don't`20send`20Email.&0220DEFAULT`20=`20FALSE`20(send`20Ema
  143. Vil
  144. X$!&1120even`20if`20there`20are`20no`20new`20articles).
  145. X$!&0520P6`20-`20`5Bopt`5D&0220Specifies`20when`20DSNlink_NEW`20should`20be`20r
  146. Ve-submitted.
  147. X$!&1120Should`20be`20a`20delta`20time.&0220
  148. X$!
  149. X$!&0520If`20invoked`20interactively,`20DSNlink_NEW.COM`20will`20prompt`20the
  150. V`20user`20for
  151. X$!&0520all`20the`20non-specified`20parameters.
  152. X$!
  153. X$!&0220PRIVILEGES`20REQUIRED:
  154. X$!&0520NONE,`20except`20if`20the`20System`20Manager`20has`20established`20ACLs
  155. V`20on`20the
  156. X$!&0520"DSN`20ITS"`20function,`20or`20on`20the`20DSN$BATCH`20queue`20if`20you
  157. V`20submit`20to`20batch.
  158. X$!
  159. X$!&0220ENVIRONMENT:
  160. X$!&0520VMS`20version`205.0`20or`20greater
  161. X$!&0520DSNlink`20for`20VMS,`20version`201.1`20or`201.1-1
  162. X$!&0720(some`20testing`20done`20on`20field`20test`20of`20version`201.2)
  163. X$!
  164. X$!&4C2A
  165. X$!*&4A20*
  166. X$!*&0220SITE-DEPENDENT`20LOGICAL`20NAME`20SETTINGS:&2320*
  167. X$!*&4A20*
  168. X$!*&0220These`20logical`20names`20can`20be`20in`20any`20logical`20name`20table
  169. V.&0220If`20you`20start&0520*
  170. X$!*&0220DSNlink_NEW`20interactively,`20it`20will`20prompt`20you`20for`20these
  171. V`20settings,`20and&0320*
  172. X$!*&0220your`20logicals`20will`20control`20the`20default`20values`20(indicated
  173. V`20in`20brackets).&0220*
  174. X$!*&4A20*
  175. X$!*&0220The`20following`20precedence`20is`20observed`20by`20DSNlink_NEW:&1420*
  176. V
  177. X$!*&0520first`20:`20parameters`20(on`20command`20line,`20or`20via`20/PARAMETER
  178. VS`20if`20batch)&0420*
  179. X$!*&0620.&0420:`20user-supplied`20responses`20to`20prompts`20(only`20interacti
  180. Vve)&0820*
  181. X$!*&0620.&0420:`20logical`20names&3020*
  182. X$!*&0520last&0220:`20hard-coded`20defaults&2A20*
  183. X$!*&4A20*
  184. X$!**`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*
  185. V`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*
  186. X$!*&4A20*
  187. X$!*&0320Logical`20name&0A20Description&2620*
  188. X$!*&0320&0C2D&0A20&0B2D&2620*
  189. X$!*`20Following`20can`20be`20specified`20when`20DSNlink_NEW`20is`20invoked,
  190. V`20or`20as`20logicals:&0220*
  191. X$!*&0320DSNLINK_NEW_RETRY&0520Retry`20limit.&0220This`20can`20be`20over-ridden
  192. V`20by&0920*
  193. X$!*&1920specifying`20the`20retry-limit`20(if`20Interactive),`20or&0220*
  194. X$!*&1920submitting`20to`20batch`20with`20parameter`20P1.&0B20*
  195. X$!*&0320DSNLINK_NEW_MAIL_USER`20The`20usernames`20to`20receive`20list`20of`20n
  196. Vew`20DSNlink&0520*
  197. X$!*&1920articles.&0220This`20can`20be`20over-ridden`20by`20specifying`20*
  198. X$!*&1920the`20usernames`20(if`20Interactive),`20or`20submitting`20to`20*
  199. X$!*&1920batch`20with`20parameter`20P2.&0220Default`20is`20the`20current`20*
  200. X$!*&1920username.&2820*
  201. X$!*&0320DSNLINK_NEW_SINCE&0520Since`20value.&0220Can`20specify`20delta`20time
  202. V`20(such`20as&0420*
  203. X$!*&1920TODAY-7-00:00:00`20for`20a`20week`20ago).&0220This`20can`20be&0320*
  204. X$!*&1920over-ridden`20by`20specifying`20the`20since`20value`20(if&0420*
  205. X$!*&1920Interactive),`20or`20submitting`20to`20batch`20with&0820*
  206. X$!*&1920parameter`20P3.&0220Default`20is`20TODAY-2-00:00.&0920*
  207. X$!*&0320DSNLINK_NEW_DATABASES`20The`20DSNlink`20databases`20that`20you`20have
  208. V`20access`20to,&0320*
  209. X$!*&1920or`20are`20interested`20in.&0220This`20can`20be`20over-ridden&0320*
  210. X$!*&1920by`20specifying`20another`20list`20(if`20Interactive),`20or&0220*
  211. X$!*&1920submitting`20to`20batch`20with`20parameter`20P4.&0220Default&0220*
  212. X$!*&1920databases`20are`20VMS,`20VMS-RN-NF-DOC`20(to`20which`20every`20*
  213. X$!*&1920site`20running`20`60DSNlink`20for`20VMS'`20has`20access).&0620*
  214. X$!*&1920If`20the`20first`20character`20is`20"@",`20then`20the`20named&0420*
  215. X$!*&1920file`20will`20be`20read.&0220The`20file`20can`20have`20one&0820*
  216. X$!*&1920database`20on`20each`20line.&1B20*
  217. X$!*&0320DSNLINK_NEW_SUPPRESS&0220If`20TRUE,`20suppress`20Email`20if`20there
  218. V`20are`20no`20new&0620*
  219. X$!*&1920articles.&0220This`20can`20be`20over-ridden`20by`20specifying`20*
  220. X$!*&1920the`20desired`20option`20(if`20Interactive),`20or&0A20*
  221. X$!*&1920submitting`20to`20batch`20with`20parameter`20P5.&0220Default&0220*
  222. X$!*&1920is`20FALSE`20if`20Interactive,`20TRUE`20if`20Batch.&0A20*
  223. X$!*&0320DSNLINK_NEW_AFTER&0520Specify`20default`20time`20to`20re-submit`20to
  224. V`20batch.&0620*
  225. X$!*&1920Default`20is`20TOMRROW+01:00:00`20(1:00am`20tomorrow&0520*
  226. X$!*&1920morning).&2820*
  227. X$!*&4A20*
  228. X$!*`20Following`20can`20be`20specified`20*ONLY*`20as`20logical`20names:&1620*
  229. X$!*&0320DSNLINK_NEW_PROMPT&0420If`20TRUE,`20prompt`20user`20for`20values.
  230. V&0220If`20FALSE,`20use&0220*
  231. X$!*&1920the`20default`20values.&0220Only`20used`20if`20Interacative.&0220*
  232. X$!*&1920Default`20is`20TRUE.&2120*
  233. X$!*&0320DSNLINK_NEW_WAIT_TIME`20Delta`20time`20to`20wait`20between`20retries.
  234. V&0220This`20can&0420*
  235. X$!*&1920only`20be`20specified`20with`20a`20logial`20name.&0220You`20may&0320*
  236. X$!*&1920need`20to`20increase`20this`20value`20at`20your`20site.&0220The&0320*
  237. X$!*&1920default`20value`20is`2030`20seconds,`20which`20usually`20gives`20*
  238. X$!*&1920enough`20time`20for`20the`20DSNlink`20software`20and`20modem&0320*
  239. X$!*&1920to`20settle`20between`20retries.&1720*
  240. X$!*&0320DSNLINK_NEW_VERIFY&0420If`20TRUE,`20then`20DCL`20verification`20is`20t
  241. Vurned`20on.&0520*
  242. X$!*&1920Default`20is`20FALSE.&2020*
  243. X$!*&0320DSNLINK_NEW_DEBUG&0520If`20TRUE,`20then`20display`20information`20usef
  244. Vul`20for&0520*
  245. X$!*&1920debugging`20DSNlink_NEW.COM&1820*
  246. X$!*&4A20*
  247. X$!&4C2A
  248. X$!
  249. X$!&0220EXAMPLES:
  250. X$!
  251. X$!&0420The`20following`20code`20fragment,`20in`20you`20nightly`20system-manage
  252. Vment`20batch`20job,
  253. X$!&0420will`20Email`20you`20when`20there`20are`20new`20articles`20any`20of`20t
  254. Vhe`20databases
  255. X$!&0420VMS,`20VMS-RN-NF-DOC,`20or`20DSNLINK-DOC.
  256. X$!&0620$`20DEFINE`20DSNLINK_NEW_DATABASES&0220"VMS,VMS-RN-NF-DOC,DSNLINK-DOC"
  257. X$!&0620$`20DEFINE`20DSNLINK_NEW_MAIL_USER&0220SYSTEM
  258. X$!&0620$`20DEFINE`20DSNLINK_NEW_SINCE&0620"TODAY-2-00:00"
  259. X$!&0620$`20DEFINE`20DSNLINK_NEW_SUPPRESS&0320TRUE
  260. X$!&0620$`20@DSNLINK_NEW`20
  261. X$!
  262. X$!&0420If`20you`20only`20want`20to`20see`20new`20articles`20once`20a`20week,
  263. V`20put`20the`20following
  264. X$!&0420code`20into`20your`20nightly`20system-management`20batch`20job:
  265. X$!&0620$`20IF`20F$CVTIME(,,"WEEKDAY")`20.EQS.`20"Sunday"
  266. X$!&0620$`20THEN
  267. X$!&0620$&0320DEFINE`20DSNLINK_NEW_SINCE&0620"TODAY-7-00:00:00"
  268. X$!&0620$&0320DEFINE`20DSNLINK_NEW_SUPPRESS&0320TRUE
  269. X$!&0620$&0320DEFINE`20DSNLINK_NEW_DATABASES&0220"VMS,VMS-RN-NF-DOC,DSNLINK-DOC
  270. V"
  271. X$!&0620$&0320@DSNLINK_NEW
  272. X$!&0620$`20ENDIF
  273. X$!
  274. X$!&0420To`20have`20DSNlink_NEW`20get`20the`20list`20of`20databases`20from`20th
  275. Ve`20file
  276. X$!&0420SYS$MANAGER:DSNLINK_NEW_DB.DAT:
  277. X$!&0620$`20DEFINE`20DSNLINK_NEW_DATABASES`20"@SYS$MANAGER:DSNLINK_NEW_DB.DAT"
  278. X$!&0620$`20@DSNLINK_NEW
  279. X$!&0420(you`20could`20also`20specify`20@SYS$MANAGER:DSNLINK_NEW_DB.DAT`20when
  280. V`20asked`20for
  281. X$!&0420the`20list`20of`20databases.&0220The`20file`20can`20have`20only`20one
  282. V`20database`20per`20line,
  283. X$!&0420and`20an`20exclamation`20point`20is`20the`20comment`20character.)
  284. X$!
  285. X$!&0420The`20following`20command,`20entered`20from`20the`20DCL`20prompt,`20wil
  286. Vl`20run`20the`20
  287. X$!&0420program.&0220It`20will`20prompt`20you`20for`20all`20necessary`20informa
  288. Vtion.&0220If`20you`20
  289. X$!&0420tell`20it`20to`20run`20in`20Batch,`20you`20wont`20have`20to`20wait`20fo
  290. Vr`20DSNlink_NEW`20to
  291. X$!&0420retreive`20the`20articles.
  292. X$!&0620$`20@DSNLINK_NEW
  293. X$!&0420You`20can`20have`20it`20automatically`20re-submit`20itself`20to`20run
  294. V`20every`20day.
  295. X$!
  296. X$!!!!!
  297. X$!
  298. X$!&0220Idea`20for`20this`20code`20taken`20from`20DSNlink`20article`20"`5BDSNli
  299. Vnk`5D`20V1.n`20How`20To`20Get`20
  300. X$!&0220Daily`20List`20of`20New`20Database`20Articles"`20in`20the`20DSNLINK`20d
  301. Vatabase.
  302. X$!
  303. X$!&0220Copyright`20`A9`201991,`201992`20by`20Dan`20Wing.&0220This`20code`20may
  304. V`20be`20freely`20distributed`20
  305. X$!&0220and`20modified`20for`20no`20commercial`20gain`20as`20long`20as`20this
  306. V`20copyright`20notice`20is`20
  307. X$!&0220retained.&0220This`20program`20is`20supplied`20'as-is',`20and`20with
  308. V`20no`20warranty.
  309. X$!
  310. X$!&0220Written`20by`20Dan`20Wing,`20Systems`20Administrator,`20University`20Ho
  311. Vspital,`20Denver.
  312. X$!&0220Internet:&0220dwing@uh01.colorado.edu
  313. X$!&0220DECUServe:`20WING`20(EISNER::WING)
  314. X$!
  315. X$`20NO_MORE_HELP`20=`20'F$VERIFY(F$TRNLNM("DSNLINK_NEW_VERIFY"))'&0420!`20for
  316. V`20"?"`20help
  317. X$`20IF`20P1`20.EQS.`20"?"`20THEN`20GOTO`20_EXIT_NOCLEANUP
  318. X$!
  319. X$!!!!!
  320. X$!
  321. X$!&0220REVERSE`20CHRONOLOGICAL`20MODIFICATION`20HISTORY
  322. X$!
  323. X$!&0220EDIT`20DATE&0220VERS&0220BY&0320DESCRIPTION
  324. X$!&0220&092D&0220----&0220---&0220&272D
  325. X$!&022025-NOV-92&0220220&0320DGW&0220Store`20database`20names`20in`20separate
  326. V`20symbols`20(to`20avoid
  327. X$!&1820problems`20when`20list`20of`20databases`20exceeds`20255`20
  328. X$!&1820characters).&0220Allow`20list`20of`20databases`20to`20be`20in`20a`20
  329. X$!&1820file,`20and`20removed`20ability`20to`20add`20to`20a`20list`20of`20data-
  330. V
  331. X$!&1820bases.&0220Don't`20allow`20output`20of`20DSNlink`20DIR`20command`20to
  332. V`20
  333. X$!&1820exceed`2080`20characters`20(to`20avoid`20wrapping`20in`20Mail).
  334. X$!&1820Changed`20logicals`20to`20the`20form`20DSNLINK_NEW_xxx`20instead
  335. X$!&1820of`20DSNlinkNEW_xxx.
  336. X$!&022024-NOV-92&0220210&0320DGW&0220Remove`20all`20checking`20to`20see`20if
  337. V`20DSNlink`20is`20running
  338. X$!&1820on`20the`20DCN`20-`20too`20much`20code,`20and`20too`20many`20scenerios.
  339. V
  340. X$!&022023-NOV-92&0220202a&0220DGW&0220Include`20converted`20time`20in`20mail
  341. V`20message`20for`20SINCE.
  342. X$!&022023-NOV-92&0220202&0320DGW&0220Default`20to`20/SINCE=TODAY-2.&0220See
  343. V`20DSNlink`20article
  344. X$!&1820"`5BDSNlink/VMS`5D`20ITS`20/SINCE`20Now`20Produces`20Shorter`20
  345. X$!&1820Article`20Title`20Lists"`20in`20the`20DSNLINK`20database.
  346. X$!&1820Use`20TRUE`20and`20FALSE`20for`20clarity.
  347. X$!&022018-NOV-92&0220201&0320DGW&0220Use`20F$SEARCH(file,number)`20when`20usin
  348. Vg`20wildcards,
  349. X$!&1820and`20delete`20all`20of`20the`20little`20extracted`20directory
  350. X$!&1820files`20as`20part`20of`20cleanup.
  351. X$!&022017-NOV-92&0220200b&0220DGW&0220Handle`20auto-resubmit`20time`20<>`20def
  352. Vault.&0220Quote`20list
  353. X$!&1820of`20usernames`20which`20allows`20"@"`20in`20distribution`20lists.
  354. X$!&022017-NOV-92&0220200a&0220DGW&0220Cosmetic`20changes.
  355. X$!&022013-NOV-92&0220200&0320DGW&0220List`20articles`20broken`20out`20by`20dat
  356. Vabase`20name.&0220Support`20
  357. X$!&1820for`20DSNlink`20V1.1-2`20(EDSNlink)`20which`20uses`20the`20logical
  358. X$!&1820DSN$EADDR_DIGITAL`20to`20indicate`20the`20connection`20type`20
  359. X$!&1820(M=modem,`20D=DECnet,`20X=X.25).&0220Add`20DEBUG`20logical`20and`20
  360. X$!&1820some`20debugging`20output.
  361. X$!&022013-NOV-92&0220136a&0220DGW&0220Look`20for`20DSN$SCRATCH`20logical`20ins
  362. Vtead`20of`20
  363. X$!&1820DSN$COPY_DIRECTORY`20(only`20DCN`20has`20the`20second`20logical)
  364. X$!&1820Also`20fix`20syntax`20error`20on`20error-message`20creation.
  365. X$!&03206-NOV-92&0220136&0320DGW&0220Provide`20more`20information`20when`20runn
  366. Ving`20as`20to`20
  367. X$!&1820success/failure.
  368. X$!&03204-NOV-92&0220135&0320DGW&0220Correct`20automatic-resubmit`20code`20to
  369. V`20resubmit`20after
  370. X$!&1820the`20first`20time.
  371. X$!&03203-NOV-92&0220134&0320DGW&0220Send`20Email`20if`20DSNlink`20isn't`20avai
  372. Vlable`20when`20the`20batch
  373. X$!&1820job`20runs.
  374. X$!&022031-OCT-92&0220133&0320DGW&0220Allow`20DETACHED`20execution`20(for`20DEC
  375. Vscheduler)
  376. X$!&03206-OCT-92&0220132&0320DGW&0220Only`20prompt`20user`20if`20necessary.
  377. X$!&03205-OCT-92&0220131&0320DGW&0220Allow`20auto-submit`20if`20logical`20DSNli
  378. VnkNEW_AFTER`20is
  379. X$!&1820defined,`20or`20if`20user`20specifies`20a`20time`20when`20prompted.
  380. X$!&03201-OCT-92&02201302b`20DGW&0220Invalid`20syntax`20on`20SUBMIT`20corrected
  381. V.&0220Handle`20case`20
  382. X$!&1820where`20DAN`20isn't`20clustered`20with`20the`20DCN.
  383. X$!&022026-SEP-92&0220130&0320DGW&0220Fixed`20to`20operate`20correctly`20if`20w
  384. Ve're`20running`20on`20a`20DAN
  385. X$!&1820instead`20of`20the`20DCN,`20and`20still`20sense`20if`20DSNlink`20is`20
  386. X$!&1820operating`20on`20the`20DCN.&0220Handle`20DSNlink`20error`20'unknown
  387. X$!&1820database'`20as`20a`20special`20case.&0220Logical`20names`20added.
  388. X$!&1820Don't`20Email`20if`20there's`20no`20new`20articles.&0220(From`20Andy
  389. X$!&1820Harper,`20<udaa055@elm.cc.kcl.ac.uk>).&0220Also`20cosmetic`20
  390. X$!&1820changes,`20error`20handling,`20parameter`20validation,`20and
  391. X$!&1820documentation.
  392. X$!&022014-SEP-92&0220120&0320DGW&0220Break`20list`20of`20databases`20at`2080
  393. V`20columns`20(symbol`20WIDTH)
  394. X$!&1820Some`20cosmetic`20changes.
  395. X$!&03206-JUL-92&0220111&0320DGW&0220Only`20need`20edit`20110`20if`20INTERACTIV
  396. VE.
  397. X$!&022030-JUN-92&0220110&0320DGW&0220Added`20SET`20SCREEN/noPAGE,`20as`20DIR
  398. V`20would`20loop`20forever
  399. X$!&1820if`20more`20than`20a`20screenful`20of`20subjects`20was`20displayed
  400. X$!&1820(from`20Rand`20Hall,`20<rand@merrimack.edu>)
  401. X$!&03202-FEB-92&0220006&0320DGW&0220Use`20RESTART_VALUE`20to`20indicate`20how
  402. V`20many`20
  403. X$!&1820retries`20have`20been`20done.
  404. X$!&022027-JAN-92&0220005&0320DGW&0220If`20interactive,`20prompt`20for`20all
  405. V`20parameters,`20and`20
  406. X$!&1820allow`20user`20to`20submit`20to`20batch.
  407. X$!&022017-JAN-92&0220004&0320DGW&0220Retry`20limit`20=`205
  408. X$!&03205-JAN-92&0220003&0320DGW&0220The`20"NO"`20after`20the`20"DSN`20ITS"`20m
  409. Vust`20be`20there`20in`20case`20
  410. X$!&1820DSNlink`20enters`20its`20question-mode.&0220DSNlink`20was`20
  411. X$!&1820returning`20"Your`20response`20is`20ambiguous.`20Please`20
  412. X$!&1820re-enter"`20if`20the`20"NO"`20was`20in`20the`20DSN$ITS_INIT`20file.
  413. X$!&03204-JAN-92&0220002&0320DGW&0220Add`20check`20for`20"%DSN-E-"`20errors`20a
  414. Vs`20well`20as`20"%DSN-F-"`20
  415. X$!&1820errors`20to`20decide`20to`20retry.
  416. X$!&022031-DEC-91&0220001&0320DGW&0220Created.
  417. X$!&0220
  418. X$!
  419. X$&4A21
  420. X$
  421. X$&0220SET`20SYMBOL/SCOPE=(noGLOBAL)
  422. X$
  423. X$&0220ON`20WARNING`20THEN`20GOTO`20_ERROR
  424. X$&0220ON`20CONTROL_Y`20THEN`20GOTO`20_ABORT
  425. X$
  426. X$&0220TRUE&0220=`201
  427. X$&0220FALSE`20=`200
  428. X$
  429. X$&0220FINISHED_OK`20=`20FALSE
  430. X$
  431. X$&0220DSNlink_NEW$VERSION`20=`20"V2.20"
  432. X$&0220WRITE`20SYS$OUTPUT`20F$FAO("!/DSNlink_NEW&0220version`20!AS!/",`20DSNlin
  433. Vk_NEW$VERSION)
  434. X$
  435. X$!
  436. X$!!!`20Get`20default`20values
  437. X$!
  438. X$
  439. X$&0220DEBUG`20=`20FALSE
  440. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_DEBUG")`20
  441. X$&0220THEN
  442. X$&0420DEBUG`20=`20TRUE
  443. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20DSNlink_NEW`20debugging
  444. V`20enabled."
  445. X$&0220ENDIF
  446. X$
  447. X$&0220DSN_RETRY_DEFAULT`20=`205
  448. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_RETRY")`20.NES.`20""`20THEN`20-
  449. X&0520DSN_RETRY_DEFAULT`20=`20F$TRNLNM("DSNLINK_NEW_RETRY")
  450. X$
  451. X$&0220MAIL_USER_DEFAULT`20=`20F$EDIT(F$GETJPI(0,"USERNAME"),"TRIM")
  452. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_MAIL_USER")`20.NES.`20""`20THEN`20-
  453. X&0520MAIL_USER_DEFAULT`20=`20F$TRNLNM("DSNLINK_NEW_MAIL_USER")
  454. X$
  455. X$&0220DSN_SINCE_DEFAULT`20=`20"TODAY-2-00:00"
  456. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_SINCE")`20.NES.`20""`20THEN`20-
  457. X&0520DSN_SINCE_DEFAULT`20=`20F$TRNLNM("DSNLINK_NEW_SINCE")
  458. X$
  459. X$&0220DSN_DATABASES_DEFAULT`20=`20"vms,vms-rn-nf-doc"
  460. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_DATABASES")`20.NES.`20""`20THEN`20-
  461. X&0520DSN_DATABASES_DEFAULT`20=`20F$TRNLNM("DSNLINK_NEW_DATABASES")
  462. X$
  463. X$&0220DSN_SUPPRESS_DEFAULT`20=`20F$MODE()`20.EQS.`20"BATCH"
  464. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_SUPPRESS")`20.NES.`20""`20THEN`20-
  465. X&0520DSN_SUPPRESS_DEFAULT`20=`20F$TRNLNM("DSNLINK_NEW_SUPPRESS")
  466. X$
  467. X$&0220DSN_AFTER_DEFAULT`20=`20"TOMORROW+01:00:00"
  468. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_AFTER")`20.NES.`20""`20THEN`20-
  469. X&0520DSN_AFTER_DEFAULT`20=`20F$TRNLNM("DSNLINK_NEW_AFTER")
  470. X$
  471. X$&0220DSN_RETRY_WAIT_TIME`20=`20"00:00:30"&0220!`2030`20seconds
  472. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_WAIT_TIME")`20.NES.`20""`20THEN`20-
  473. X&0520DSN_RETRY_WAIT_TIME`20=`20F$TRNLNM("DSNLINK_NEW_WAIT_TIME")
  474. X$
  475. X$&0220DSN_PROMPT`20=`20TRUE
  476. X$&0220IF`20F$TRNLNM("DSNLINK_NEW_PROMPT")`20.NES.`20""`20THEN`20-
  477. X&0520DSN_PROMPT`20=`20F$TRNLNM("DSNLINK_NEW_PROMPT")
  478. X$
  479. X$!!!
  480. X$
  481. X$&0220QUOTE`5B0,8`5D`20=`2034
  482. X$&0220WIDTH`20=`2080
  483. X$&0220EXCEEDED_RETRY_LIMIT`20=`20FALSE
  484. X$
  485. X$&0220ERROR_MESSAGE`20=`20"%DSNlink_NEW-?-UNK,`20Unknown/unexpected`20error.
  486. V&0220Please`20investigate"
  487. X$
  488. X$&0220TMP_DIRFILE&0320=`20"SYS$SCRATCH:DSNLINK_NEW_1_"`20+`20F$GETJPI(0,"PID")
  489. V`20+`20".TMP"
  490. X$&0220TMP_ERRORFILE`20=`20"SYS$SCRATCH:DSNLINK_NEW_2_"`20+`20F$GETJPI(0,"PID")
  491. V`20+`20".TMP"
  492. X$&0220TMP_DSNFILE&0320=`20"SYS$SCRATCH:DSNLINK_NEW_3_"`20+`20F$GETJPI(0,"PID")
  493. V`20+`20".TMP"
  494. X$&0220TMP_CHECKFILE`20=`20"SYS$SCRATCH:DSNLINK_NEW_4_"`20+`20F$GETJPI(0,"PID")
  495. V`20+`20".TMP"
  496. X$&0220TMP_OUTFILE&0320=`20"SYS$SCRATCH:DSNLINK_NEW_5_"`20+`20F$GETJPI(0,"PID")
  497. V`20+`20".TMP"
  498. X$
  499. X$&0220INTERACTIVE`20=`20F$MODE()`20.EQS.`20"INTERACTIVE"
  500. X$&0220BATCH`20=`20F$MODE()`20.EQS.`20"BATCH"
  501. X$&0220ASK`20:=`20READ`20SYS$COMMAND/END_OF_FILE=_ABORT/PROMPT=
  502. X$
  503. X$&0220PROMPT_USER`20=`20INTERACTIVE`20.AND.`20DSN_PROMPT
  504. X$
  505. X$&0220SS$_NORMAL`20=`20%X&07301
  506. X$&0220SS$_ABORT&0220=`20%X&06302C
  507. X$
  508. X$!!!
  509. X$
  510. X$&0220IF`20F$SEARCH("SYS$SYSTEM:DSN$MAIN.EXE")`20.EQS.`20""`20THEN`20GOTO`20_N
  511. VO_DSNLINK
  512. X$
  513. X$&0220IF`20P1`20.EQS.`20""`20
  514. X$&0220THEN`20
  515. X$&0220_PROMPT_RETRY:
  516. X$&0420IF`20PROMPT_USER`20THEN`20ASK`20"`20*`20How`20many`20retries?`20`5B''DSN
  517. V_RETRY_DEFAULT'`5D`20"`20P1
  518. X$&0420IF`20P1`20.EQS.`20""`20THEN`20P1`20=`20DSN_RETRY_DEFAULT
  519. X$&0420IF`20(F$INTEGER(P1)`20.LT.`200)`20.OR.`20(F$INTEGER(P1)`20.NE.`20P1)
  520. X$&0420THEN
  521. X$&0620WRITE`20SYS$OUTPUT`20F$FAO("Retry`20value`20must`20be`20an`20integer`20>
  522. V=`200!/")
  523. X$&0620IF`20PROMPT_USER`20THEN`20GOTO`20_PROMPT_RETRY
  524. X$&0620ERROR_MESSAGE`20=`20"%DSNlink_NEW-E-INTEGER,`20RETRY`20value`20must`20be
  525. V`20an`20integer`20>=`200"
  526. X$&0620GOTO`20_EXIT_ERROR
  527. X$&0420ENDIF
  528. X$&0420P1`20=`20F$INTEGER(P1)
  529. X$&0220ENDIF
  530. X$&0220DSN_RETRY_MAX`20=`20F$INTEGER(P1)
  531. X$
  532. X$&0220IF`20P2`20.EQS.`20""`20
  533. X$&0220THEN
  534. X$&0420IF`20PROMPT_USER`20THEN`20ASK`20"`20*`20Send`20mail`20to?`20`5B''MAIL_US
  535. VER_DEFAULT'`5D`20"`20P2
  536. X$&0420P2`20=`20F$EDIT(P2,"UPCASE,COLLAPSE")
  537. X$&0420IF`20P2`20.EQS.`20""`20THEN`20P2`20=`20MAIL_USER_DEFAULT
  538. X$&0220ENDIF
  539. X$&0220MAIL_USER`20=`20P2
  540. X$&0420
  541. X$&0220IF`20P3`20.EQS.`20""`20
  542. X$&0220THEN
  543. X$&0220_PROMPT_SINCE:
  544. X$&0420IF`20PROMPT_USER`20THEN`20ASK`20"`20*`20/SINCE=value?`20`5B''DSN_SINCE_D
  545. VEFAULT'`5D`20"`20P3
  546. X$&0420P3`20=`20F$EDIT(P3,"UPCASE,COLLAPSE")
  547. X$&0420IF`20P3`20.EQS.`20""`20THEN`20P3`20=`20DSN_SINCE_DEFAULT
  548. X$&0420SET`20noON
  549. X$&0420TEST`20=`20F$CVTIME(P3)
  550. X$&0420STATUS`20=`20$STATUS
  551. X$&0420SET`20ON
  552. X$&0420IF`20.NOT.`20STATUS`20
  553. X$&0420THEN`20
  554. X$&0620IF`20PROMPT_USER`20THEN`20GOTO`20_PROMPT_SINCE
  555. X$&0620ERROR_MESSAGE`20=`20"%DSNlink_NEW-E-IVTIME,`20SINCE`20value`20must`20be
  556. V`20a`20valid`20time`20format"
  557. X$&0620GOTO`20_EXIT_ERROR
  558. X$&0420ENDIF
  559. X$&0420IF`20F$CVTIME(P3)`20.GTS.`20F$CVTIME()
  560. X$&0420THEN
  561. X$&0620WRITE`20SYS$OUTPUT`20F$FAO("Must`20specify`20a`20time`20before`20current
  562. V`20time!/")
  563. X$&0620IF`20PROMPT_USER`20THEN`20GOTO`20_PROMPT_SINCE
  564. X$&0420ENDIF
  565. X$&0220ENDIF
  566. X$&0220DSN_SINCE`20=`20P3
  567. X$
  568. X$&0220IF`20P4`20.EQS.`20""
  569. X$&0220THEN
  570. X$&0420IF`20PROMPT_USER
  571. X$&0420THEN
  572. X$&0620WRITE`20SYS$OUTPUT`20""
  573. X$&0620DSN_DATABASES`20=`20DSN_DATABASES_DEFAULT
  574. X$&0620GOSUB`20_GENERATE_DB_NAMES
  575. X$&0620CALL`20_DISPLAY_DATABASES`20SYS$OUTPUT`20
  576. X$&0620ASK`20"`20*`20Enter`20list`20of`20databases,`20or`20RETURN`20for`20above
  577. V`20list:`20"`20P4
  578. X$&0620P4`20=`20F$EDIT(P4,"UPCASE,COLLAPSE")
  579. X$&0420ENDIF
  580. X$&0420IF`20P4`20.EQS.`20""`20THEN`20P4`20=`20DSN_DATABASES_DEFAULT
  581. X$&0220ENDIF
  582. X$&0220DSN_DATABASES`20=`20P4
  583. X$&0220GOSUB`20_GENERATE_DB_NAMES
  584. X$
  585. X$&0220IF`20P5`20.EQS.`20""
  586. X$&0220THEN
  587. X$&0420IF`20PROMPT_USER`20THEN`20-
  588. X&0A20ASK`20"`20*`20Suppress`20Email`20message`20if`20no`20articles`20found?
  589. V`20`5BN`5D`20"`20P5
  590. X$&0420IF`20P5`20.EQS.`20""`20THEN`20P5`20=`20"0"
  591. X$&0420P5`20=`20F$EDIT(P5,"UPCASE,COLLAPSE")
  592. X$&0220ENDIF
  593. X$&0220DSN_MAIL_SUPPRESS`20=`20P5
  594. X$
  595. X$_PROMPT_RUN_HOW:
  596. X$&0220IF`20PROMPT_USER
  597. X$&0220THEN
  598. X$&0420ASK`20"`20*`20Run`20Interactive,`20submit`20to`20Batch,`20or`20Abort`20(
  599. VI,B,A)?`20`5BB`5D`20"`20RUN_MODE
  600. X$&0420RUN_MODE`20=`20F$EXTRACT(0,1,F$EDIT(RUN_MODE,"UPCASE,TRIM"))
  601. X$&0420IF`20RUN_MODE`20.EQS.`20""`20THEN`20RUN_MODE`20=`20"B"
  602. X$&0420IF`20F$LOCATE(RUN_MODE,"IBA")`20.EQ.`203
  603. X$&0420THEN
  604. X$&0620WRITE`20SYS$OUTPUT`20"Must`20be`20one`20of`20I,`20B,`20or`20A"
  605. X$&0620GOTO`20_PROMPT_RUN_HOW
  606. X$&0420ENDIF
  607. X$&0220ELSE
  608. X$&0420IF`20F$MODE()`20.EQS.`20"INTERACTIVE"
  609. X$&0420THEN
  610. X$&0620RUN_MODE`20=`20"B"
  611. X$&0420ELSE
  612. X$&0620RUN_MODE`20=`20"-"
  613. X$&0420ENDIF
  614. X$&0220ENDIF
  615. X$
  616. X$&0220IF`20P6`20.EQS.`20""`20.AND.`20RUN_MODE`20.EQS.`20"B"
  617. X$&0220THEN
  618. X$&0220_GET_AFTER:
  619. X$&0420IF`20PROMPT_USER`20
  620. X$&0420THEN`20
  621. X$&0620ASK`20"`20*`20Automatic`20resubmit,`20or`20ONE`20for`20one`20run`20only?
  622. V`20`5B''DSN_AFTER_DEFAULT'`5D`20"`20P6
  623. X$&0420ENDIF
  624. X$&0420IF`20P6`20.EQS.`20""`20.AND.`20INTERACTIVE`20THEN`20P6`20=`20DSN_AFTER_D
  625. VEFAULT
  626. X$&0420IF`20P6`20.EQS.`20""`20.AND.`20BATCH`20THEN`20P6`20=`20"ONE"&0220
  627. X$&0420P6`20=`20F$EDIT(P6,"UPCASE")
  628. X$&0420IF`20P6`20.NES.`20"ONE"
  629. X$&0420THEN
  630. X$&0620SET`20noON
  631. X$&0620DUMMY`20=`20F$CVTIME(P6)
  632. X$&0620STATUS`20=`20$STATUS
  633. X$&0620SET`20ON
  634. X$&0620IF`20(.NOT.`20STATUS)`20.AND.`20INTERACTIVE`20THEN`20GOTO`20_GET_AFTER
  635. X$&0620IF`20.NOT.`20STATUS`20THEN`20GOTO`20_ERROR
  636. X$&0620IF`20(F$CVTIME(P6)`20.LTS.`20F$CVTIME())
  637. X$&0620THEN
  638. X$&0820WRITE`20SYS$OUTPUT`20F$FAO("!/Time`20must`20be`20in`20the`20future`20(an
  639. Vd`20should`20be`20a`20delta`20value)")
  640. X$&0820GOTO`20_GET_AFTER
  641. X$&0620ENDIF
  642. X$&0420ENDIF
  643. X$&0220ELSE
  644. X$&0420IF`20P6`20.EQS.`20""`20THEN`20P6`20=`20"ONE"
  645. X$&0220ENDIF
  646. X$&0220DSN_AFTER`20=`20P6
  647. X$
  648. X$!
  649. X$!!!
  650. X$!
  651. X$
  652. X$&0220WRITE`20SYS$OUTPUT`20-
  653. X&0520F$FAO("!/!/Ready`20to`20mail`20all`20articles`20since`20!AS`20in`20databa
  654. Vse!0SL!%S:",`20-
  655. X&0520DSN_SINCE,`20DB_NAME_COUNT`20+`201)
  656. X$&0220CALL`20_DISPLAY_DATABASES`20SYS$OUTPUT`202`20
  657. X$&0220WRITE`20SYS$OUTPUT`20-
  658. X&0520F$FAO("to`20user!0SL!%S`20!AS`20with`20!UL`20DSNlink`20connection`20attem
  659. Vpt!%S.",`20-
  660. X&0520(F$LENGTH(MAIL_USER)`20-`20F$LOCATE(",",MAIL_USER)`20+`201),`20-
  661. X&0520MAIL_USER,`20DSN_RETRY_MAX)
  662. X$&0220IF`20RUN_MODE`20.EQS.`20"B"`20THEN`20-
  663. X&0520WRITE`20SYS$OUTPUT`20"Will`20submit`20the`20DSNlink_NEW`20job`20to`20batc
  664. Vh."
  665. X$&0220IF`20DSN_AFTER`20.NES.`20"ONE"`20THEN`20-
  666. X&0520WRITE`20SYS$OUTPUT`20"Will`20auto-submit`20to`20run`20next`20at`20",`20F$
  667. VCVTIME(DSN_AFTER,"ABSOLUTE"),`20"`20(",`20DSN_AFTER,`20")"
  668. X$&0220IF`20RUN_MODE`20.EQS.`20"I"`20THEN`20-
  669. X&0520WRITE`20SYS$OUTPUT`20"Will`20run`20the`20DSNlink_NEW`20job`20interactivel
  670. Vy."
  671. X$&0220WRITE`20SYS$OUTPUT`20""
  672. X$&0220IF`20BATCH`20THEN`20SET`20OUTPUT_RATE
  673. X$
  674. X$&0220IF`20PROMPT_USER`20
  675. X$&0220THEN
  676. X$&0420ASK`20"`20*`20Is`20this`20correct?`20`5BY`5D`20"`20OK_TO_CONTINUE
  677. X$&0420IF`20(.NOT.`20OK_TO_CONTINUE)`20.AND.`20(OK_TO_CONTINUE`20.NES.`20"")
  678. V`20THEN`20GOTO`20_ABORT
  679. X$&0220ENDIF
  680. X$
  681. X$!
  682. X$
  683. X$&0220IF`20DEBUG`20THEN`20SHOW`20SYMBOL`20*
  684. X$
  685. X$&0220IF`20RUN_MODE`20.EQS.`20"A"`20THEN`20GOTO`20_ABORT
  686. X$&0220IF`20(RUN_MODE`20.EQS.`20"B")`20.OR.`20(DSN_AFTER`20.NES.`20"ONE")
  687. X$&0220THEN
  688. X$&0420THIS_PROCEDURE`20=`20F$PARSE(";",F$ENVIRONMENT("PROCEDURE"))
  689. X$&0220_SUBMIT_TO_BATCH:
  690. X$&0420IF`20DSN_AFTER`20.EQS.`20"ONE"
  691. X$&0420THEN
  692. X$&0620AFTER_QUAL`20=`20""&0820!`20right`20now
  693. X$&0420ELSE
  694. X$&0620AFTER_QUAL`20=`20"/AFTER="`20+`20QUOTE`20+`20F$CVTIME(DSN_AFTER,"ABSOLUT
  695. VE")`20+`20QUOTE
  696. X$&0420ENDIF
  697. X$&0420SUBMIT`20-
  698. X&0520/NOTIFY`20-
  699. X&0520/QUEUE=DSN$BATCH`20-
  700. X&0520/noPRINTER`20-
  701. X&0520/KEEP`20-
  702. X&0520'AFTER_QUAL'`20-
  703. X&0520/PARAMETERS=("''DSN_RETRY_MAX'",`20-&0620!`20P1
  704. X&1220"''MAIL_USER'",`20-&0A20!`20P2
  705. X&1220"''DSN_SINCE'",`20-&0A20!`20P3
  706. X&1220"''DSN_DATABASES'",`20-&0620!`20P4
  707. X&1220"''DSN_MAIL_SUPPRESS'",`20-&0220!`20P5
  708. X&1220"''DSN_AFTER'")`20-&0A20!`20P6
  709. X&0520/NAME="DSNlink_NEW"`20-
  710. X&0520/LOG=SYS$LOGIN:DSNLINK_NEW.LOG`20-
  711. X&0520'THIS_PROCEDURE'
  712. X$&0420
  713. X$&0420FINISHED_OK`20=`20TRUE
  714. X$&0420IF`20DSN_AFTER`20.EQS.`20"ONE"`20THEN`20GOTO`20_EXIT
  715. X$&0420IF`20INTERACTIVE
  716. X$&0420THEN
  717. X$&0620DSN_AFTER`20=`20"ONE"&0820!`20submit`20to`20batch`20(and`20run`20now)
  718. X$&0620GOTO`20_SUBMIT_TO_BATCH
  719. X$&0420ENDIF
  720. X$&0220ENDIF
  721. X$
  722. X$!!!
  723. X$!!!!!&0220Connect`20to`20DSNlink`20and`20get`20the`20articles
  724. X$!!!
  725. X$
  726. X$&0220GOSUB`20_CLEAN_TMP_FILES
  727. X$&0220
  728. X$&0220OPEN/WRITE`20OUTFILE`20'TMP_DSNFILE'
  729. X$&0220IF`20INTERACTIVE`20THEN`20WRITE`20OUTFILE`20"set`20screen/NOpage"
  730. X$
  731. X$&0220COUNT`20=`200
  732. X$&0220DB_NAME`20=`20""
  733. X$_FILE_LOOP_1:
  734. X$&0220IF`20DB_NAME`20.NES.`20""`20THEN`20WRITE`20OUTFILE`20"close`20",`20DB_NA
  735. VME
  736. X$&0220DB_NAME`20=`20DB_NAME_'COUNT'
  737. X$&0220DB_DIRFILE`20=`20TMP_DIRFILE`20+`20"_"`20+`20DB_NAME
  738. X$&0220WRITE`20OUTFILE`20"open`20",`20DB_NAME
  739. X$&0220WRITE`20OUTFILE`20"dir/all/since=",`20DSN_SINCE
  740. X$&0220WRITE`20OUTFILE`20"extract/dir`20",`20DB_DIRFILE
  741. X$&0220COUNT`20=`20COUNT`20+`201
  742. X$&0220IF`20COUNT`20.LE.`20DB_NAME_COUNT`20THEN`20GOTO`20_FILE_LOOP_1
  743. X$
  744. X$&0220WRITE`20OUTFILE`20"exit"
  745. X$&0220CLOSE`20OUTFILE
  746. X$
  747. X$&0220IF`20DEBUG
  748. X$&0220THEN
  749. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20DSN`20ITS`20command`20file
  750. V:"
  751. X$&0420TYPE`20'TMP_DSNFILE'
  752. X$&0220ENDIF&0320!`20DEBUG
  753. X$
  754. X$&0220DSN_RETRY_COUNT`20=`200
  755. X$
  756. X$_DSN_RETRY:
  757. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-ATTCONN,`20Attempting`20connection
  758. V`20at`20",`20F$TIME()
  759. X$&0220IF`20F$SEARCH(TMP_ERRORFILE)`20.NES.`20""`20THEN`20DELETE`20'TMP_ERRORFI
  760. VLE';*
  761. X$
  762. X$&0220DEFINE/USER_MODE`20DSN$ITS_INIT`20'TMP_DSNFILE'
  763. X$&0220DEFINE/USER_MODE`20SYS$ERROR`20'TMP_ERRORFILE'
  764. X$&0220DEFINE/USER_MODE`20SYS$OUTPUT`20'TMP_OUTFILE'
  765. X$
  766. X$!`20The`20"NO"`20is`20in`20case`20DSNlink`20enters`20its`20question-mode.
  767. V&0220See`20edit`20003.
  768. X$
  769. X$&0220SET`20noON
  770. X$&0220DSN`20ITS
  771. XNO
  772. X$&0220SET`20ON
  773. X$
  774. X$&0220IF`20DEBUG
  775. X$&0220THEN
  776. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20DSNlink`20connection`20att
  777. Vempt`20finished`20(''F$TIME()')"
  778. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20Error`20file`20(SYS$ERROR)
  779. V:"
  780. X$&0420TYPE`20'TMP_ERRORFILE'
  781. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20Output`20file`20(SYS$OUTPU
  782. VT):"
  783. X$&0420TYPE`20'TMP_OUTFILE'
  784. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20Output`20of`20directory
  785. V`20extract`20files:"
  786. X$&0420IF`20F$SEARCH("''TMP_DIRFILE'*",1)`20.NES.`20""
  787. X$&0420THEN
  788. X$&0620TYPE`20'TMP_DIRFILE'*
  789. X$&0420ELSE
  790. X$&0620WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-DEBUG,`20<no`20directory`20output
  791. V`20files`20were`20created>"
  792. X$&0420ENDIF
  793. X$&0220ENDIF&0320!`20DEBUG
  794. X$
  795. X$&0220IF`20F$SEARCH("''TMP_DIRFILE'*",2)`20.NES.`20""`20THEN`20-
  796. X&0520GOTO`20_FOUND_DSNLINK_ARTICLES
  797. X$
  798. X$!`20no`20articles`20were`20found
  799. X$&0220RETRY_OPERATION`20=`20FALSE
  800. X$
  801. X$!`20see`20if`20we`20encountered`20any`20errors
  802. X$&0220IF`20.NOT.`20DEBUG`20THEN`20DEFINE/USER_MODE`20SYS$OUTPUT`20NLA0:
  803. X$&0220IF`20.NOT.`20DEBUG`20THEN`20DEFINE/USER_MODE`20SYS$ERROR`20NLA0:
  804. X$&0220SEARCH`20'TMP_ERRORFILE'/EXACT`20"%DSN-F-","%DSN-E-","-DSN-E-","-DSN-F-"
  805. V
  806. X$&0220IF`20$STATUS`20.EQ.`20SS$_NORMAL`20THEN`20RETRY_OPERATION`20=`20TRUE
  807. V&0320!`20found`20error
  808. X$
  809. X$!`20if`20error`20was`20UNKDBNAM`20(unknown`20database),`20don't`20die`20on
  810. V`20error.
  811. X$&0220IF`20RETRY_OPERATION
  812. X$&0220THEN&0220!`20we`20found`20an`20error`20message
  813. X$&0420IF`20.NOT.`20DEBUG`20THEN`20DEFINE/USER_MODE`20SYS$OUTPUT`20NLA0:
  814. X$&0420IF`20.NOT.`20DEBUG`20THEN`20DEFINE/USER_MODE`20SYS$ERROR`20NLA0:
  815. X$&0420SEARCH`20'TMP_ERRORFILE'`20"%DSN-E-UNKDBNAM"`20/EXACT
  816. X$&0420IF`20$STATUS`20.EQ.`20SS$_NORMAL`20THEN`20RETRY_OPERATION`20=`20FALSE
  817. V`20!`20error`20was`20UNKDBNAM
  818. X$&0220ENDIF&0220!`20retry_operation
  819. X$
  820. X$&0220IF`20RETRY_OPERATION&0320!`20if`20it`20is`20something`20other`20than`20U
  821. VNKDBNAM
  822. X$&0220THEN&0720!`20some`20sort`20of`20DSNlink`20failure
  823. X$&0420SEARCH`20'TMP_ERRORFILE'/EXACT/noHIGHLIGHT`20-
  824. X&0A20"-F-","-E-"&0420!`20show`20the`20error`20(both`20%DSN`20and`20%SYSTEM`20e
  825. Vrrors)
  826. X$&0420WRITE`20SYS$OUTPUT`20""
  827. X$&0420IF`20(DSN_RETRY_COUNT`20+`201)`20.LE.`20DSN_RETRY_MAX`20
  828. X$&0420THEN`20
  829. X$&0620DSN_RETRY_COUNT`20=`20DSN_RETRY_COUNT`20+`201
  830. X$&0620IF`20BATCH`20THEN`20SET`20RESTART_VALUE`20=`20"Retry`20count`20=`20''DSN
  831. V_RETRY_COUNT'"
  832. X$&0620WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-W-RETRY,`20Retrying`20connection`20in
  833. V`20",`20DSN_RETRY_WAIT_TIME
  834. X$&0620WRITE`20SYS$OUTPUT`20"-DSNlink_NEW-I-RETRY,`20Retry`20number`20",`20DSN_
  835. VRETRY_COUNT
  836. X$&0620WAIT`20'DSN_RETRY_WAIT_TIME'
  837. X$&0620GOTO`20_DSN_RETRY
  838. X$&0420ELSE
  839. X$&0620EXCEEDED_RETRY_LIMIT`20=`20TRUE
  840. X$&0420ENDIF&0420!`20retry`20limit`20exceeded?
  841. X$&0220ENDIF`20!`20retry_operation
  842. X$
  843. X$&0220!`20no`20errors,`20but`20no`20new`20articles`20were`20found;`20check`20f
  844. Vor`20bad`20connection
  845. X$&0220IF`20.NOT.`20DEBUG`20THEN`20DEFINE/USER_MODE`20SYS$OUTPUT`20NLA0:
  846. X$&0220IF`20.NOT.`20DEBUG`20THEN`20DEFINE/USER_MODE`20SYS$ERROR`20NLA0:
  847. X$&0220SEARCH/EXACT`20'TMP_ERRORFILE'`20"Connection`20established"
  848. X$&0220IF`20$STATUS`20.EQ.`20SS$_NORMAL
  849. X$&0220THEN&0320!`20good`20connection,`20just`20no`20articles...
  850. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-CONN,`20Connection`20established
  851. V`20at`20",`20F$FILE(TMP_ERRORFILE,"CDT")
  852. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-I-NONEW,`20No`20new`20DSNlink`20artic
  853. Vles`20were`20found."
  854. X$&0420IF`20.NOT.`20DSN_MAIL_SUPPRESS`20THEN`20-
  855. X&0A20CALL`20_GENERATE_MAIL_MESSAGE`20'TMP_OUTFILE'`20"NO`20new`20DSNlink`20art
  856. Vicles"
  857. X$&0420FINISHED_OK`20=`20TRUE
  858. X$&0220ELSE&0320!`20never`20established`20a`20connection
  859. X$&0420WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-E-ERROR,`20Error`20getting`20articles
  860. V`20(",`20F$TIME(),`20")"
  861. X$&0420CALL`20_GENERATE_MAIL_MESSAGE`20'TMP_ERRORFILE'`20"Error`20getting`20DSN
  862. Vlink`20articles"
  863. X$&0220ENDIF
  864. X$
  865. X$_EXIT:
  866. X$&0220IF`20FINISHED_OK
  867. X$&0220THEN`20
  868. X$&0420WRITE`20SYS$OUTPUT`20F$FAO("!/%DSNlink_NEW-S-OK,`20DSNlink_NEW`20complet
  869. Ved`20successfully.")
  870. X$&0220ELSE
  871. X$&0420WRITE`20SYS$OUTPUT`20F$FAO("!/%DSNlink_NEW-E-NOTOK,`20DSNlink_NEW`20enco
  872. Vuntered`20errors.")
  873. X$&0420WRITE`20SYS$OUTPUT`20"-DSNlink_NEW-E-NOTOK,`20No`20new`20DSNlink`20artic
  874. Vles`20were`20retrieved."
  875. X$&0220ENDIF
  876. X$&0220GOSUB`20_CLEAN_TMP_FILES
  877. X$_EXIT_NOCLEANUP:
  878. X$&0220VERIFY`20=`20F$VERIFY(VERIFY)
  879. X$&0220EXIT&0220!`20Leaving`20DSNlink_NEW.COM`20...
  880. X$
  881. X$_EXIT_ERROR:
  882. X$&0220ERROR_STATUS`20=`20$STATUS
  883. X$&0220IF`20ERROR_MESSAGE`20.EQS.`20""`20THEN`20-
  884. X&0520ERROR_MESSAGE`20=`20"Unexpected`20condition;`20exact`20error`20unknown."
  885. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-E-ERROR,`20error`20occurred;`20error
  886. V`20was:"
  887. X$&0220WRITE`20SYS$OUTPUT`20"&0220",`20ERROR_MESSAGE
  888. X$&0220WRITE`20SYS$OUTPUT`20"-DSNlink_NEW-E-ERROR,`20DCL`20error`20code`20was:
  889. V`20",`20ERROR_STATUS
  890. X$&0220WRITE`20SYS$OUTPUT`20"`20=",`20F$MESSAGE(ERROR_STATUS)
  891. X$&0220WRITE`20SYS$OUTPUT`20""
  892. X$
  893. X$&0220IF`20(.NOT.`20INTERACTIVE)`20.AND.`20("''MAIL_USER'"`20.NES.`20"")
  894. X$&0220THEN
  895. X$&0420WRITE`20SYS$OUTPUT`20"Informing`20''MAIL_USER'`20of`20error"
  896. X$&0420SET`20noON&0720!`20in`20case`20error-handler`20dies
  897. X$&0420CLOSE/noLOG`20OUTFILE
  898. X$&0420OPEN/WRITE`20OUTFILE`20'TMP_ERRORFILE'
  899. X$&0420WRITE`20OUTFILE`20"***`20An`20unhandled`20error`20caused`20DSNlink_NEW.C
  900. VOM`20to`20fail`20***"
  901. X$&0420WRITE`20OUTFILE`20""
  902. X$&0420WRITE`20OUTFILE`20"The`20error`20detected`20by`20DSNlink_NEW.COM`20was:"
  903. V
  904. X$&0420WRITE`20OUTFILE`20"&0220",`20ERROR_MESSAGE
  905. X$&0420WRITE`20OUTFILE`20""
  906. X$&0420WRITE`20OUTFILE`20"The`20value`20of`20$STATUS`20was:`20",`20ERROR_STATUS
  907. V
  908. X$&0420WRITE`20OUTFILE`20"&0220",`20F$MESSAGE(ERROR_STATUS)
  909. X$&0420WRITE`20OUTFILE`20""
  910. X$&0420CLOSE`20OUTFILE
  911. X$&0420CALL`20_GENERATE_MAIL_MESSAGE`20'TMP_ERRORFILE'`20"Error`20in`20DSNlink_
  912. VNEW.COM"
  913. X$&0220ENDIF
  914. X$&0220GOSUB`20_CLEAN_TMP_FILES
  915. X$&0220VERIFY`20=`20F$VERIFY(VERIFY)
  916. X$&0220EXIT`20SS$_ABORT&0620!`20Leaving`20DSNlink_NEW.COM`20(on`20error`20statu
  917. Vs)`20...
  918. X$
  919. X$_CLEAN_TMP_FILES:
  920. X$&0220IF`20F$TRNLNM("OUTFILE")`20.NES.`20""`20THEN`20CLOSE`20OUTFILE
  921. X$&0220IF`20F$TRNLNM("INFILE")`20.NES.`20""`20THEN`20CLOSE`20INFILE
  922. X$&0220IF`20F$SEARCH("''TMP_DIRFILE'*",3)`20.NES.`20""`20THEN`20DELETE`20'TMP_D
  923. VIRFILE'*;*
  924. X$&0220IF`20F$SEARCH(TMP_ERRORFILE)`20.NES.`20""`20THEN`20DELETE`20'TMP_ERRORFI
  925. VLE';*
  926. X$&0220IF`20F$SEARCH(TMP_DSNFILE)`20.NES.`20""`20THEN`20DELETE`20'TMP_DSNFILE';
  927. V*
  928. X$&0220IF`20F$SEARCH(TMP_CHECKFILE)`20.NES.`20""`20THEN`20DELETE`20'TMP_CHECKFI
  929. VLE';*
  930. X$&0220IF`20F$SEARCH(TMP_OUTFILE)`20.NES.`20""`20THEN`20DELETE`20'TMP_OUTFILE';
  931. V*
  932. X$&0220IF`20(F$SEARCH("SYS$LOGIN:DSNLINK_NEW.LOG;-4")`20.NES.`20"")`20.AND.`20(
  933. VBATCH)`20THEN`20-
  934. X&0520PURGE/KEEP=5`20SYS$LOGIN:DSNLINK_NEW.LOG
  935. X$&0220RETURN
  936. X$
  937. X$_ERROR:
  938. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-E-ERROR,`20Unexpected`20error`20occur
  939. Vred`20in`20DSNlink_NEW.COM"
  940. X$&0220GOTO`20_EXIT_ERROR
  941. X$
  942. X$_ABORT:
  943. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-E-ABORT,`20User`20aborted`20DSNlink_N
  944. VEW.COM"
  945. X$&0220FINISHED_OK`20=`20TRUE
  946. X$&0220GOTO`20_EXIT
  947. X$
  948. X$_NO_DSNLINK:
  949. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-E-NOTPRESENT,`20You`20do`20not`20have
  950. V`20DSNlink`20software`20on`20this`20node"
  951. X$&0220WRITE`20SYS$OUTPUT`20"-DSNlink_NEW-E-NOTPRESENT,`20Contact`20your`20loca
  952. Vl`20DEC`20office`20to`20obtain`20DSNlink"
  953. X$&0220FINISHED_OK`20=`20TRUE
  954. X$&0220GOTO`20_EXIT
  955. X$
  956. X$_NO_DB_FILE:
  957. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-E-NODBFILE,`20No`20such`20file`20\",
  958. V`20DB_NAMES_FILENAME,`20"\"
  959. X$&0220GOTO`20_EXIT
  960. X$
  961. X$_FOUND_DSNLINK_ARTICLES:
  962. X$&0220WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-S-NEWART,`20Found`20new`20DSNlink`20a
  963. Vrticles"
  964. X$!`20put`20separate`20articles`20together:
  965. X$&0220COUNT`20=`200
  966. X$&0220CREATE`20'TMP_DIRFILE'/FDL=SYS$INPUT:
  967. XRECORD
  968. XSIZE`2080
  969. X$&0220_FILE_LOOP_2:
  970. X$&0220DB_NAME`20=`20F$EDIT(DB_NAME_'COUNT',"UPCASE")
  971. X$&0220DB_DIRFILE`20=`20TMP_DIRFILE`20+`20"_"`20+`20DB_NAME
  972. X$&0220IF`20F$SEARCH(DB_DIRFILE)`20.NES.`20""
  973. X$&0220THEN
  974. X$&0420IF`20(DEBUG`20.OR.`20BATCH)`20THEN`20WRITE`20SYS$OUTPUT`20"%DSNlink_NEW-
  975. VI-FOUNDNEW,`20Found`20new`20articles`20in`20database`20",`20DB_NAME
  976. X$&0420OPEN/APPEND`20FILE`20'TMP_DIRFILE'
  977. X$&0420WRITE`20FILE`20DB_NAME,`20"`20database:"
  978. X$&0420CLOSE`20FILE
  979. X$&0420CONVERT/TRUNCATE/APPEND`20'DB_DIRFILE'`20'TMP_DIRFILE'
  980. X$&0220ENDIF
  981. X$&0220COUNT`20=`20COUNT`20+`201
  982. X$&0220IF`20COUNT`20.LE.`20DB_NAME_COUNT`20THEN`20GOTO`20_FILE_LOOP_2
  983. X$
  984. X$&0220!`20mail`20the`20one`20message:
  985. X$&0220CALL`20_GENERATE_MAIL_MESSAGE`20'TMP_DIRFILE'`20"New`20DSNlink`20article
  986. Vs"
  987. X$&0220FINISHED_OK`20=`20TRUE
  988. X$&0220GOTO`20_EXIT
  989. X$
  990. X$&4621
  991. X$_GENERATE_DB_NAMES:
  992. X$!`20symbol`20DSN_DATABASES`20should`20contain`20list`20of`20databases,`20or
  993. V`20@filename
  994. X$
  995. X$&0220DB_NAME_COUNT`20=`200
  996. X$&0220DB_NAMES_FILENAME`20=`20""
  997. X$
  998. X$&0220IF`20F$EXTRACT(0,1,DSN_DATABASES)`20.EQS.`20"@"`20
  999. X$&0220THEN&0220!`20file
  1000. X$&0420DB_NAMES_FILENAME`20=`20F$PARSE(F$ELEMENT(1,"@",DSN_DATABASES),".DAT")
  1001. X$&0420IF`20DB_NAMES_FILENAME`20.EQS.`20""`20.OR.`20F$SEARCH(DB_NAMES_FILENAME)
  1002. V`20.EQS.`20""`20THEN`20GOTO`20_NO_DB_FILE
  1003. X$&0420DSN_DATABASES`20=`20"@"`20+`20F$PARSE(";",F$SEARCH(DB_NAMES_FILENAME))
  1004. X$&0420DB_NAMES_FILENAME`20=`20F$SEARCH(DB_NAMES_FILENAME)
  1005. X$&0420OPEN/READ`20INFILE`20'DB_NAMES_FILENAME'
  1006. X$&0420COUNT`20=`200
  1007. X$&0420_GENERATE_DB_NAMES_2:
  1008. X$&0420READ/ERROR=_ERROR/END_OF_FILE=_GENERATE_DB_NAMES_3`20INFILE`20RECORD
  1009. X$&0420RECORD`20=`20F$ELEMENT(0,",",F$EDIT(RECORD,"UNCOMMENT,COLLAPSE"))
  1010. X$&0420IF`20RECORD`20.EQS.`20""`20THEN`20GOTO`20_GENERATE_DB_NAMES_2
  1011. X$&0420DB_NAME_'COUNT'`20=`20F$EDIT(RECORD,"UNCOMMENT,COLLAPSE")
  1012. X$&0420COUNT`20=`20COUNT`20+`201
  1013. X$&0420GOTO`20_GENERATE_DB_NAMES_2
  1014. X$&0420_GENERATE_DB_NAMES_3:
  1015. X$&0420CLOSE`20INFILE
  1016. X$&0420
  1017. X$&0220ELSE&0220!`20just`20a`20regular`20list`20of`20databases
  1018. X$&0420COUNT`20=`200
  1019. X$&0420_GENERATE_DB_NAMES_1:
  1020. X$&0420DB_NAME_'COUNT'`20=`20F$ELEMENT(COUNT,",",DSN_DATABASES)
  1021. X$&0420COUNT`20=`20COUNT`20+`201
  1022. X$&0420IF`20F$ELEMENT(COUNT,",",DSN_DATABASES)`20.NES.`20","`20THEN`20GOTO`20_G
  1023. VENERATE_DB_NAMES_1
  1024. X$&0220ENDIF
  1025. X$
  1026. X$&0220DB_NAME_COUNT`20=`20COUNT`20-`201
  1027. X$&0220IF`20DEBUG`20THEN`20SHOW`20SYMBOL`20DB_NAME_*
  1028. X$&0220RETURN
  1029. X$
  1030. X$&4621
  1031. X$_DISPLAY_DATABASES:`20SUBROUTINE
  1032. X$!`20P1`20=`20output`20file`20(file`20must`20be`20opened)
  1033. X$!`20P2`20=`20number`20spaces`20at`20beginning`20of`20each`20line
  1034. X$!`20P3`20=`20String`20to`20put`20at`20front`20of`20output`20text`20`5Boptiona
  1035. Vl`5D
  1036. X$!`20symbol`20WIDTH`20(from`20main`20routine)`20to`20specify`20line`20width
  1037. V`20(usually`2080)
  1038. X$
  1039. X$&0220IF`20P2`20.EQS.`20""`20THEN`20P2`20=`200
  1040. X$&0220P2`20=`20F$INTEGER(P2)
  1041. X$&0220AVAILABLE_WIDTH`20=`20WIDTH`20-`20P2
  1042. X$&0220DB_NUMBER`20=`200
  1043. X$&0220IF`20DB_NAMES_FILENAME`20.NES.`20""`20THEN`20P3`20=`20P3`20+`20"(@"`20+
  1044. V`20DB_NAMES_FILENAME`20+`20")`20"
  1045. X$&0220OUTPUT_STRING`20=`20P3
  1046. X$_DISPLAY_DB_LOOP:
  1047. X$&0220IF`20DB_NUMBER`20.GT.`20DB_NAME_COUNT`20THEN`20GOTO`20_DISPLAY_DB_EXIT
  1048. X$&0220ADDITIONAL_STRING`20=`20DB_NAME_'DB_NUMBER'
  1049. X$&0220IF`20F$LENGTH("''OUTPUT_STRING'''ADDITIONAL_STRING'")`20.GE.`20AVAILABLE
  1050. V_WIDTH
  1051. X$&0220THEN
  1052. X$&0420WRITE`20'P1'`20F$FAO("!#*`20!AS,",`20P2,`20OUTPUT_STRING)
  1053. X$&0420OUTPUT_STRING`20=`20ADDITIONAL_STRING
  1054. X$&0220ELSE
  1055. X$&0420IF`20OUTPUT_STRING`20.EQS.`20""
  1056. X$&0420THEN
  1057. X$&0620OUTPUT_STRING`20=`20ADDITIONAL_STRING
  1058. X$&0420ELSE
  1059. X$&0620IF`20OUTPUT_STRING`20.EQS.`20P3
  1060. X$&0620THEN`20
  1061. X$&0820OUTPUT_STRING`20=`20OUTPUT_STRING`20+`20ADDITIONAL_STRING
  1062. X$&0620ELSE
  1063. X$&0820OUTPUT_STRING`20=`20OUTPUT_STRING`20+`20","`20+`20ADDITIONAL_STRING
  1064. X$&0620ENDIF
  1065. X$&0420ENDIF
  1066. X$&0220ENDIF
  1067. X$&0220DB_NUMBER`20=`20DB_NUMBER`20+`201
  1068. X$&0220GOTO`20_DISPLAY_DB_LOOP
  1069. X$
  1070. X$_DISPLAY_DB_EXIT:
  1071. X$&0220WRITE`20'P1'`20F$FAO("!#*`20!AS",`20P2,`20OUTPUT_STRING)
  1072. X$&0220EXIT
  1073. X$&0220ENDSUBROUTINE&0220!`20display_databases
  1074. X$
  1075. X$
  1076. X$&4621
  1077. X$
  1078. X$_GENERATE_MAIL_MESSAGE:`20SUBROUTINE
  1079. X$!`20P1`20=`20append`20information`20to`20this`20file,`20then`20Email`20it
  1080. X$!`20P2`20=`20Subject`20to`20use`20for`20Mail`20message
  1081. X$
  1082. X$&0220OPEN/APPEND`20OUTFILE`20'P1'
  1083. X$&0220WRITE`20OUTFILE`20"_____"
  1084. X$&0220WRITE`20OUTFILE`20""
  1085. X$&0220WRITE`20OUTFILE`20"The`20above`20listing`20was`20generated`20with`20the
  1086. V`20following`20DSNlink_NEW`20parameters:"
  1087. X$&0220CALL`20_DISPLAY_DATABASES`20OUTFILE`202`20"Databases`20=`20"
  1088. X$&0220
  1089. X$&0220WRITE`20OUTFILE`20F$FAO("&0220Since&0520=`20!AS&0220(!AS-!AS-!AS)",`20-
  1090. X&0520DSN_SINCE,`20-
  1091. X&0520F$CVTIME(DSN_SINCE,"ABSOLUTE","DAY"),`20-
  1092. X&0520F$CVTIME(DSN_SINCE,"ABSOLUTE","MONTH"),`20-
  1093. X&0520F$CVTIME(DSN_SINCE,"ABSOLUTE","YEAR"))
  1094. X$&0220WRITE`20OUTFILE`20F$FAO("A`20total`20of`20!UL`20retr!1%Cy!%Eies!%F`20!1%
  1095. VCwas!%Ewere!%F`20performed`20(maximum`20!UL`20retr!-!0UL!1%Cy!%Eies!%F).",`20-
  1096. V
  1097. X&0520DSN_RETRY_COUNT,`20DSN_RETRY_MAX)
  1098. X$&0220WRITE`20OUTFILE`20""
  1099. X$
  1100. X$&0220IF`20EXCEEDED_RETRY_LIMIT`20
  1101. X$&0220THEN`20
  1102. X$&0420WRITE`20OUTFILE`20"%DSNlink_NEW-W-EXRETRY,`20Exceeded`20retry`20limit"
  1103. X$&0420WRITE`20OUTFILE`20""
  1104. X$&0220ENDIF
  1105. X$
  1106. X$&0220WRITE`20OUTFILE`20"This`20mail`20message`20sent`20by`20code`20within`20D
  1107. VSNlink_NEW.COM`20version`20",`20DSNlink_NEW$VERSION
  1108. X$&0220CLOSE`20OUTFILE
  1109. X$
  1110. X$&0220IF`20DEBUG`20THEN`20TYPE`20OUTFILE
  1111. X$
  1112. X$&0220MAIL`20-
  1113. X&0520'P1'`20-
  1114. X&0520"''MAIL_USER'"`20-
  1115. X&0520/SUBJECT="''P2'"`20-
  1116. X&0520/PERSONAL_NAME="''P2'"`20-
  1117. X&0520/noSELF`20
  1118. X$
  1119. X$&0220WRITE`20SYS$OUTPUT`20F$FAO("Message`20sent`20to`20user!0UL!%S`20!AS`20(!
  1120. V%T)",`20-
  1121. X&0520(F$LENGTH(MAIL_USER)`20-`20F$LOCATE(",",MAIL_USER)`20+`201),`20-
  1122. X&0520MAIL_USER,`200)
  1123. X$&0220
  1124. X$&0220EXIT
  1125. X$&0220ENDSUBROUTINE&0220!`20generate_mail_message
  1126. $ call unpack DSNLINK_NEW.COM;275 665630648 ""
  1127. $ v=f$verify(v)
  1128. $ exit
  1129.