<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=OPEN.FILE</id>
	<title>OPEN.FILE - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=OPEN.FILE"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=OPEN.FILE&amp;action=history"/>
	<updated>2026-04-28T23:40:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=OPEN.FILE&amp;diff=2069&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=OPEN.FILE&amp;diff=2069&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:55Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
                  function OPEN.FILE( FILENAME, FLAGS, FILEVAR, ERR.MSG )&lt;br /&gt;
* Return File handle: open file and keep file variable in Named Common or just return it.&lt;br /&gt;
* =======================================================================================&lt;br /&gt;
* 19.Jan.2012 james: Check if FLAGS is assigned to avoid errors going to the log.&lt;br /&gt;
* 31.Jan.2009 james: Major restructuring: Let&amp;#039;s USE this thing !?&lt;br /&gt;
* 08.Feb.2008 james: Finally doing this the right way !? (From U2 Users maillist, etc).&lt;br /&gt;
* =======================================================================================&lt;br /&gt;
*&lt;br /&gt;
*   This is a hybrid of version from U2 Users group list and APP.PROGRS OPEN.FILE.B&lt;br /&gt;
*   (we don&amp;#039;t want to use the UV version anyway in case we switch to Cache?)&lt;br /&gt;
*&lt;br /&gt;
*  Usage:&lt;br /&gt;
*&lt;br /&gt;
*    if not( OPEN.FILE(&amp;quot;MYFILE&amp;quot;, FLAGS, MYFILEVAR, ERR.MSG) ) then &amp;lt;error handling using ERR.MSG&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
* ---------------------------------------------------------------------------------------&lt;br /&gt;
*&lt;br /&gt;
*  In :&lt;br /&gt;
*       FILENAME&lt;br /&gt;
*       FLAGS    : &amp;#039;RESET&amp;#039; to reset COMMON.OPEN.FILE; not normally used.&lt;br /&gt;
*&lt;br /&gt;
*  Out:&lt;br /&gt;
*       FILEVAR  : Return the regular UV &amp;#039;File Variable&amp;#039; used to READ[[/WRITE/etc]].&lt;br /&gt;
*       ERR.MSG  : If returned non-blank THERE&amp;#039;S A PROBLEM&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
*  @TODO :&lt;br /&gt;
*&lt;br /&gt;
*    - Replace all &amp;#039;OPEN&amp;#039; statements with call to this program !!!!&lt;br /&gt;
*&lt;br /&gt;
*    - Enable commented code in REP.WRITE &amp;#039;[[OpenLocalFile]]&amp;#039; to use this instead.&lt;br /&gt;
*&lt;br /&gt;
*    - Comment out (make &amp;#039;ununsed&amp;#039; ?) R$[[LOCAL_FILE_NAME_S]], etc, in REPLICATION.COMMON&lt;br /&gt;
*&lt;br /&gt;
*    - Once this is being called everywhere, we can REMOVE the &amp;#039;Common&amp;#039; opens in STD.SETUP.&lt;br /&gt;
*&lt;br /&gt;
* =======================================================================================&lt;br /&gt;
&lt;br /&gt;
  $include RMS.BP  RMS.COMMON        ;*  DEBUG.FLAG to check for &amp;#039;OPEN.FILE&amp;#039; flag.&lt;br /&gt;
  $include UTIL.BP COMMON.OPEN.FILE&lt;br /&gt;
&lt;br /&gt;
  ERR.MSG = &amp;quot;&amp;quot;&lt;br /&gt;
  OK      = @TRUE  ;*  Assume we get the file opened until proven otherwise.&lt;br /&gt;
  if not( assigned( FLAGS ) ) then FLAGS = &amp;#039;&amp;#039;  ;*  Avoid errors: not normally used anyway.&lt;br /&gt;
  &lt;br /&gt;
  locate &amp;#039;OPEN.FILE.LOG&amp;#039; in FLAGS&amp;lt;1&amp;gt; setting dum then [[OpenFileLog]] = @TRUE else [[OpenFileLog]] = @FALSE&lt;br /&gt;
  &lt;br /&gt;
  gosub [[CheckResetCommon]]  ;*  Set &amp;#039;[[ResetCommon]]&amp;#039; but do it later (so we can log it if necessary):&lt;br /&gt;
&lt;br /&gt;
  *  --- Setup logging flag :&lt;br /&gt;
  &lt;br /&gt;
  locate &amp;quot;OPEN.FILE.LOG&amp;quot; in DEBUG.FLAG&amp;lt;1&amp;gt; setting dummy then&lt;br /&gt;
    [[OpenFileLog]] = @TRUE&lt;br /&gt;
    [[OpenFileLogName]] = &amp;quot;/var/log/uv_OPENFILE.log&amp;quot;&lt;br /&gt;
  end else [[OpenFileLog]] = @FALSE&lt;br /&gt;
  &lt;br /&gt;
  * --- Reset the first time this is called _OR_ if we&amp;#039;ve switched UV Accounts:&lt;br /&gt;
  &lt;br /&gt;
  if [[ResetCommon]] then gosub [[ResetOpenFileCommon]]&lt;br /&gt;
  &lt;br /&gt;
  if FILENAME # &amp;#039;&amp;#039; then  ;*  Send &amp;#039;&amp;#039; for dummy options (e.g. &amp;#039;RESET&amp;#039;)&lt;br /&gt;
  &lt;br /&gt;
    * --- Finally: If we have the File open already, then return the cached FILEVAR:&lt;br /&gt;
    *     (use FM locate since it may be optimized ? TEST IT ?)&lt;br /&gt;
    &lt;br /&gt;
    if not( OF$USE.CACHE ) then  ;*  The hard way for testing:&lt;br /&gt;
      OF$FILE.POS = 1 ; gosub [[OpenNewFile]]&lt;br /&gt;
    end else&lt;br /&gt;
    &lt;br /&gt;
      locate(FILENAME, OF$FILENAME.S; OF$FILE.POS) then  ;*  Already open ?:&lt;br /&gt;
        [[LogMsg]] = &amp;quot;File &amp;quot;:FILENAME:&amp;quot; is already open in position &amp;quot;:OF$FILE.POS ; gosub [[WriteLog]]&lt;br /&gt;
        FILEVAR = OF$FILEVAR.S( OF$FILE.POS )&lt;br /&gt;
      end else&lt;br /&gt;
        gosub [[OpenNewFile]]&lt;br /&gt;
      end&lt;br /&gt;
    &lt;br /&gt;
    end&lt;br /&gt;
    OF$LAST.OPENED     = FILENAME&lt;br /&gt;
    OF$LAST.OPENED.POS = OF$FILE.POS&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
return( OK )&lt;br /&gt;
&lt;br /&gt;
*  --- Check if we need to Reset the commons: if this is the first time this is run; or&lt;br /&gt;
*      if the RESET flag is sent in.&lt;br /&gt;
&lt;br /&gt;
[[CheckResetCommon]]:&lt;br /&gt;
  [[ResetCommon]] = @FALSE  ;*  This may still get set below too&lt;br /&gt;
  locate &amp;quot;RESET&amp;quot; in FLAGS&amp;lt;1&amp;gt; setting dummy then  ;*  Special flag to clear Global Common&lt;br /&gt;
    [[ResetCommon]] = @TRUE&lt;br /&gt;
  end else&lt;br /&gt;
&lt;br /&gt;
    if not( assigned( OF$USE.CACHE ) ) then&lt;br /&gt;
      [[ResetCommon]] = @TRUE&lt;br /&gt;
    end else                ;*  And also reset if we change Accounts (LOGTO) :&lt;br /&gt;
      if OF$CURRENT.ACCOUNT # @WHO then [[ResetCommon]] = @TRUE&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
return (&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
[[ResetOpenFileCommon]]:&lt;br /&gt;
  [[LogMsg]] = &amp;quot;Clearing Global Common OPEN.FILE&amp;quot; ; gosub [[WriteLog]]&lt;br /&gt;
  OF$FILENAME.S      = &amp;#039;&amp;#039;    ;*  Reset the dynamic array of File Names&lt;br /&gt;
  mat OF$FILEVAR.S   = &amp;#039;&amp;#039;    ;*  This is not strictly necessary but may help hiding bugs&lt;br /&gt;
  OF$CURRENT.ACCOUNT = @WHO  ;*  Keep track of the current UV Account&lt;br /&gt;
  mat OF$ITEM.ID.S   = &amp;#039;&amp;#039;&lt;br /&gt;
  mat OF$ITEM.S      = &amp;#039;&amp;#039;&lt;br /&gt;
  OF$LAST.OPENED     = &amp;#039;&amp;#039;&lt;br /&gt;
  OF$LAST.OPENED.POS = 0&lt;br /&gt;
  open &amp;quot;CONTROL&amp;quot;   to CONTROL.FILE  else stopm &amp;quot;Unable to open CONTROL file&amp;quot;&lt;br /&gt;
  read OF$USE.CACHE from CONTROL.FILE, &amp;quot;USE.OPEN.FILE.CACHE&amp;quot;  else OF$USE.CACHE = @TRUE&lt;br /&gt;
return (&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
*  Open it first; so we let it open normally even if it can&amp;#039;t be cached : (?)&lt;br /&gt;
&lt;br /&gt;
[[OpenNewFile]]:&lt;br /&gt;
  open FILENAME to FILEVAR else&lt;br /&gt;
    ERR.MSG = &amp;#039;Unable to open &amp;#039;:FILENAME ; [[LogMsg]] = ERR.MSG ; gosub [[WriteLog]]&lt;br /&gt;
    OK = @FALSE ; return(&amp;#039;&amp;#039;)&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if OF$FILE.POS &amp;gt; MAX.OPEN.FILES then&lt;br /&gt;
    ERR.MSG = &amp;#039;TOO MANY FILES OPEN !?&amp;#039; ; OK = @FALSE&lt;br /&gt;
    if [[OpenFileLog]] then [[LogMsg]] = ERR.MSG ; gosub [[WriteLog]]&lt;br /&gt;
  end else&lt;br /&gt;
    [[LogMsg]] = &amp;quot;Opening &amp;quot;:FILENAME:&amp;quot; in position &amp;quot;:OF$FILE.POS ; gosub [[WriteLog]]&lt;br /&gt;
&lt;br /&gt;
    OF$FILENAME.S&amp;lt; OF$FILE.POS &amp;gt; = FILENAME  ;*  VM&amp;#039;s to use standard Locate&lt;br /&gt;
    OF$FILEVAR.S( OF$FILE.POS )  = FILEVAR&lt;br /&gt;
    OF$ITEM.ID.S( OF$FILE.POS )  = &amp;#039;&amp;#039;        ;*  The LAST Id ONLY for READ.FILE&lt;br /&gt;
    OF$ITEM.S   ( OF$FILE.POS )  = &amp;#039;&amp;#039;        ;*  The LAST item ONLY for READ.FILE&lt;br /&gt;
  end&lt;br /&gt;
return (&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
*  This writes a Log file if &amp;#039;[[OpenFileLog]]&amp;#039; is set; also displays if &amp;#039;[[DebugIt]]&amp;#039; is set:&lt;br /&gt;
&lt;br /&gt;
[[WriteLog]]:&lt;br /&gt;
  *if [[DebugIt]] then crt [[LogMsg]] ;* input j ; if j = &amp;#039;D&amp;#039; then debug&lt;br /&gt;
  &lt;br /&gt;
  if [[OpenFileLog]] then&lt;br /&gt;
    *  We don&amp;#039;t have &amp;#039;CALLER&amp;#039; here like REP.WRITE; would it be useful ? We can get the PID though:&lt;br /&gt;
    [[LogMsg]] := &amp;#039; (&amp;#039;:USER.ID:&amp;#039;; pid:&amp;#039;:RMS$PID:&amp;#039;)&amp;#039;   ;*  PID now set in STD.SETUP&lt;br /&gt;
    &lt;br /&gt;
    call APPEND.UNIX.LOG( [[LogMsg]], [[OpenFileLogName]], [[AppendErr]])&lt;br /&gt;
    &lt;br /&gt;
    if [[AppendErr]] # &amp;#039;&amp;#039; then&lt;br /&gt;
      ERR = &amp;quot;Unable to Append to Log file &amp;quot;:[[OpenFileLogName]]:&amp;quot; !&amp;quot; &lt;br /&gt;
      crt char(7):ERR&lt;br /&gt;
      ERR.MSG := ERR    ;*  Add to existing ERR.MSG if there ?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
return (&amp;#039;&amp;#039;)&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>