HP 3000 Manuals

FOPEN [ KSAM/3000 Reference Manual ] MPE/iX 5.0 Documentation


KSAM/3000 Reference Manual

FOPEN 

INTRINSIC NUMBER 1

Opens a file.

        I                 BA             LV     LV       IV      BA       BA
     filenum:=FOPEN(formaldesignator,foptions,aoptions,recsize,device,ksamparam,

         IV          IV         IV        DV       IV
     userlabels,blockfactor,numbuffers,filesize,numextents,

         IV        IV     O-V
     initialloc,filecode);

The FOPEN intrinsic makes it possible to access a KSAM file.  In the
FOPEN intrinsic call, a particular file may be referenced by its formal 
file designator.  When the FOPEN intrinsic is executed, it returns to the
user's process a file number by which the system uniquely identifies the
file.  This file number, rather than the file designator, then is used by
subsequent intrinsics in referencing the file.

FUNCTIONAL RETURN 

This intrinsic returns an integer file number used to identify the opened
file in other intrinsic calls.

PARAMETERS 

formal-          byte array (required) 
designator 
                 Contains a string of ASCII characters interpreted as a
                 formal file designator.  This string must begin with a
                 letter, contain alphanumeric characters, slashes, or
                 periods, and terminate with any nonnumeric character
                 except a slash or a period.  If the string names a
                 userpredefined file, it can begin with an asterisk (*).
                 Note:  The DEL, SAVE, or TEMP parameters should not be
                 used to predefine a KSAM file in a :FILE command; they
                 will cause deletion or duplication of the file.

foptions         logical by value (optional) 

                 The foptions parameter allows you to specify different
                 file characteristics, by setting corresponding bit
                 groupings in a 16-bit word.  If the file is new, bit 4
                 must be set to 1 to indicate that this is a KSAM file.
                 Refer to Table 4-6 for the foption bit settings.

                 Default:  All bits are set to zero. 

aoptions         logical by value (optional) 

                 The aoptions parameter permits you to specify the
                 various access options established by bit groupings in a
                 16-bit word.  These access options are defined in Table
                 4-7.

                 Default:  All bits are set to zero. 

recsize          integer by value (optional) 

                 An integer indicating the size of the logical records in
                 the data file.  If a positive number, this represents
                 words; bytes are represented by a negative number.  If
                 the file is a newly-created file, this value is recorded
                 permanently in the file label.  If the records in the
                 file are of variable length, this value indicates the
                 maximum logical record length allowed.

                 Binary files are word oriented.  A record size
                 specifying an odd byte count for a binary file is
                 rounded up by FOPEN to the next highest even number.

                 ASCII files may be created with logical records which
                 are an odd number of bytes in length.  Within each
                 block, however, records begin on word boundaries.

                 For either ASCII or binary files with fixed-length
                 records, the record size is rounded up to the nearest
                 word boundary.  For example, a recsize specified as -106
                 for an ASCII file is 106 characters (53 words) in
                 length.  A recsize of -113 for a binary file is 114
                 characters (57 words) in length.  The rounded sizes
                 should be used in computations for blockfactor or block
                 size.

                 Default:  The default value is the configured physical 
                 record width of the associated device. 

device           byte array (optional) 

                 Contains a string of ASCII characters terminated by any
                 nonalphanumeric character (except a slash or period)
                 that designates the device on which the file is to
                 reside.  It may be a device class name of up to eight
                 alphanumeric characters beginning with a letter; or a
                 logical device number consisting of a three-byte numeric
                 string; or a remote device identifier consisting of the
                 device class name or logical device number followed by a
                 pound sign (#) and a remote device class name or logical
                 device number.

                 Device class names and logical device numbers are
                 assigned to devices during system configuration.

                 For KSAM files, the device must be a random access
                 device such as the disc.  If the file is a newly-created
                 disc file specified as a device class name, then all
                 extents to the file must be members of the same class.
                 Similarly, if the device is identified by logical device
                 number, then all extents must have the same logical
                 device number.

                 Default:  Disc. 

ksamparam        byte array (optional) 

                 Contains information describing the key file of a KSAM
                 file.  It includes the key file name, size and device
                 plus an entry for the primary key and up to 15 alternate
                 keys.  If the file is new (is being created by FOPEN)
                 then this array must be included.  If the file is an old
                 file, it can be omitted.  Note that if the parameter is
                 included and the file is not a KSAM file, an error can
                 result.  Refer to Table 4-8 for a full description of
                 ksamparam.

                 Default:  key file description is omitted. 

userlabels       integer by ualue (optional) 

                 Specifies the number of user-label records to be written
                 for the data file.  If there are no user labels, this
                 parameter can be omitted.

                 Default:  The default number of user-label records is 
                 zero. 

blockfactor      integer by value (optional) 

                 Establishes the size of each block in the data file by
                 specifying the number of logical records per block.  It
                 also establishes the size of the data file buffer in
                 KSAM's extra data segment .  For fixed-length records,
                 blockfactor is the actual number of records in a block;
                 for variablelength records, blockfactor is a multiplier
                 used to compute block size from record size; ( (maximum
                 recsize +1) * blockfactor) +1 = blocksize.  The value of
                 blockfactor should be an integer that results in a block
                 size less than 4K words.  The blockfactor is from 1
                 through 255.  If you specify a negative value or zero,
                 the default value is used.  Values greater than 255 are
                 defaulted to the specified blockfactor modulo 256.

                 Default:  1 

numbuffers       integer by value (optional) 

                 An integer between 1 and 20 that specifies the number of
                 key block buffers in the extra data segment used by KSAM
                 files for buffering data and key blocks.  The number of
                 buffers is specified in bits 4-10; the rest of the word
                 must be set to zeros:

[]
This number should only be specified if the default number assigned by KSAM affects performance. Refer to appendix B, under KSAM Extra Data Segments for a discussion of how the key block buffers are used. Default: Between 1 and 20 bUffers depending on access type, number of keys, and number of levels per hey. (Refer to appendix B.) filesize double by value (optional) A double-word integer specifying the maximum data file size as the number of logical records in the file. A zero or negative value results in the default filesize setting. The maximum file capacity is over two million (221 ) sectors; a sector contains 128 words. Default: 1024 logical records numextents integer by value (optional) An integer specifying the number of extents (integral number of contiguously-located disc sectors) that can be dynamically allocated to the file as logical records are written to it. The number of extents applies equally to the data and key files on the assumption that there is a proportional expansion in each. The size of each extent is determined by the filesize parameter value divided by the numextents parameter value. If specified, numextents must be an integer from 1 to 32. A zero or negative value results in the default setting. Default: 8 extents. _______________________________________________________ NOTE Extents are allocated on any disc in the device class specified in the device parameter when the file was created. If it is necessary to insure that all extents of a file are on a particular disc, a single disc device class or a logical device number must be used in the device parameter. _______________________________________________________ initialloc integer by value (optional) An integer specifying the number of extents to be allocated to the data file when it is opened. (For a key file, this parameter is forced equal to the value of numextents.) This must be an integer from 1 to 32. If an attempt to allocate the requested disc space fails, the FOPEN intrinsic returns an error condition code to the calling program. Default: 1 extent. filecode integer by value (optional) An integer recorded in the file label and made available for general use to anyone accessing the file through the FGETINFO intrinsic. This parameter is used for new data files only. The filecode applies to data files only; the key file code is always 1080 and need not be specified. For this parameter, any user can specify a non-negative integer. Default: 0 CONDITION CODES CCE Request granted. The file is open. CCG Not returned by this intrinsic. CCL Request denied. This may be because another process already has exclusive or semi-exclusive access for this file, or an initial allocation of disc space cannot be made due to lack of disc space. The file number value returned by FOPEN if the file is not opened successfully is zero. The FCHECK intrinsic should be called for more details. USING FOPEN FOPTIONS PARAMETER. Table 4-6. FOPEN foptions Parameter Format
[]
AOPTIONS PARAMETER. Table 4-7. FOPEN aoptions Parameter Format
[]
Table 4-7. FOPEN aoptions Parameter Format (continued)
[]
KEY FILE DEFINITION. The ksamparam array defines the key file for a new KSAM file. If the file has already been created, this parameter can be set to all zeros or omitted. Otherwise, it must be assigned values to define the key file as shown in Table 4-8. When a new KSAM file is created, the MPE end-of-file for the key file is set to the file limit. The file limit is based on the key file size (see words 4-5 of ksamparam). The location of the key file end-of-file can be determined by executing the VERIFY command of KSAMUTIL and looking at the heading KEY FILE EOF. A call to FGETKEYINFO returns the key file size as the number of sectors used by the file. Table 4-8. FOPEN ksamparam Parameter Format
[]
This array defines the key file portion of a new KSAM file being created by the FOPEN call. The values are: Key File Name 8-byte file name that must be present if this is a new file. Only the name is specified; the account, group, and security are taken from the data file formal file designator. Key File Size Double-word specifying the maximum number of primary keys expected from which the key file size is derived. If zero, the data file size is used. (Note that a call to FGETKEYINFO returns the key file size as the number of sectors in the file.) Key Device 8-byte array that specifies the device on which the key file resides. Specified as a device class name of 1-8 alphanumeric characters beginning with a letter and terminated by a non-alphanumeric character such as a blank; or it is specified as a logical device number (3-byte numeric string) identifying a particular device. If the data file is assigned to a remote device the key file is automatically allocated to the same machine. Default is DISC. Language The number of the language to use in determining the key Identification- sequence. Bit 11 in the flagword must be set to 1 to Number use any language other than NATIVE-3000.If bit 11 is set to 0, NATIVE-3000 (the default) is used and the language identification number in word 10 is ignored. If the language is not configured, FOPEN returns condition code CCL. For detailed information on using Native Language Support (NLS) with KSAM files, refer to Appendix F. Flagword 1-word that specifies file characteristics as shown below: ------------------------------------------- | 0 1 2 3 4 5 6 7 8 9 10 11 12|13|14|15 | ------------------------------------------- | reserved |DL|NL| |SW|RN|JT | ------------------------------------------- JT bit 15:1 = 1 if file is job temporary file = 0 if file is a permanent file (default) RN 14:1 = 1 if record numbering starts with 1. 0 if record numbering starts with 0. (default) SW 13:1 = 1 if only sequential writing by primary key value is allowed. = 0 if random writing by primary key value is allowed. (default) 0:9 = 0 all reserved bits must be set to 0. NL bit 11:1 = 1 if a configured language is specified. = 0 if the default language (NATIVE-3000) is to be used. DL bit 10:1 = 1 Duplicate file locks from different open paths of the same PIN are not allowed. = 0 Duplicate file locks from the same PIN are always allowed. Number of Keys 1 byte providing the total number of keys for the file, specified as a numeric digit between 1 and 16, (left byte of word must be zero). Key Definitions Each key in the file requires a 4-word definition. The first definition is always of the primary key. Subsequent definitions describe any alternate keys. Up to 15 alternate keys are allowed in any one key file. The key definitions each contain the following information: bits 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------ | Key Type | Key Length | |----------------------------------------------------| | Key Location | |----------------------------------------------------| | D | Minimum (Maximum) Number of Keys per Block | |----------------------------------------------------| | (reserved) | R | (reserved) | ------------------------------------------------------ The information for each key has the form shown above starting in word 17 of ksamparam. It is defined as follows: Key Type 4 bits specifying the type of the key by the following code: bits 0:4 = 0001 (1) = Byte key (1 to 255 bytes) 0010 (2) = Integer key (2 bytes) 0011 (3) = Double Integer key (4 bytes) 0100 (4) = Real key (4 bytes) 0101 (5) = Long key (8 bytes) 0110 (6) = Numeric Display key (1 to 28 bytes) 0111 (7) = Packed Decimal key, odd number of digits (1 to 14 bytes) 1000 (8) = Packed Decimal key, even number of digits (2 to 14 bytes) Refer to Table 2-2 in section II for a full description of key type. Key Length 12 bits specifying length of the key in bytes. Length is a function of key type (see key type) but must never exceed 255 bytes. Key Location 1 word specifying the location of the first byte of the key in the record. Bytes in a record are numbered starting with 1. (Note that it is good practice to leave the first two bytes of a record empty of keys since these bytes are used by FREMOVE for the record delete code.) D(Duplicate 1 bit that determines if duplicate values are allowed Flag) for this key: = 0 if duplicate key values are not allowed (default) = 1 if duplicate key values are allowed. Minimum 15 bits that specify the minimum number of keys allowed (Maximum)- per key block. The value must be an even -numbered Number of Keys integer greater than or equal to 4. The resulting key per- Block block size must be less than 2048 words. If the resulting key block size is greater than 2048 words, the system will print the error message "INVALID KEY BLOCKING FACTOR VALUE (FSERR 190)" and will not open the file. In order to make optimum use of disc space, KSAM may increase the value specified here. If KSAM increases the number of keys per block, this new value is the maximum size of the key block. (Refer to appendix B for particulars on the calculation of block size and the adjustment of the blocking factor). The default generates a block size of 1K (1024) words. R(Random Insert 1 bit (8:1) that determines whether duplicate key is to Flag) be inserted randomly in duplicate key chain or is to be added to the end of the chain; the duplicate flag (D bit) must be set to 1 in order to use this flag. = 0 if duplicate key values are to be inserted at the end of the chain (default) = 1 if duplicate key values are to be inserted randomly. If inserted randomly, the chronological order of duplicate keys is no longer maintained, but the addition of keys is faster. OPENING A NEW FILE When FOPEN is used to open a new KSAM file, you must provide all the information needed to create the two files that make up a KSAM file: the key file and the data file. To inform the system that this is a KSAM file, the KSAM bit must be set in the foptions parameter; and the ksamparam parameter must be included to define the key file. Figure 4-5 is a short SPL program that builds a KSAM file. The file has two keys; the primary key starting in column 1 is 20 characters long, and the alternate key starting in column 21 is 8 characters long. The primary key will contain a name, the alternate a phone number. The first step is to declare all arrays and variables needed by the program followed by the intrinsic declaration for FOPEN. The shaded declarations in Figure 4-5 show these required to open the file; others are used in parts of the program not shown in this figure. The next step is to move the necessary values to ksamparam in order to define the key file. The last step is to call the FOPEN intrinsic, passing any previously defined variables or arrays by reference and passing all others by value. DECLARATIONS FOR FOPEN. The array ksamparam is defined three different ways: as a numeric array containing 25 words (KSAMPARAMA), as a byte array equivalenced to the numeric array (KSAMPARAM), and as a double array also equivalenced to the numeric array (KSAMPARAMD). These three definitions allow the array to be addressed by word, by byte, or by double word as required. The variable to which the file number is returned is declared to be an integer. The two arrays that will contain the formal designator and device parameter values are declared and assigned these values. In this case, the formal designator is assigned the value JEXAMFIL. This name identifies both the KSAM file in its entirety and the data file if referenced separately. The device class name assigned to the device parameter is DISC. Finally, the intrinsic itself is declared in an INTRINSIC statement. DEFINING KSAMPARAM. The ksamparam parameter is assigned a variety of values that, for the sake of clarity, are assigned in separate statements. The values assigned to ksamparam define the key file. The statements that move values to ksamparam (refer to Figure 4-5) tell the system everything it needs to know in order to build the key file. The first item moved to ksamparam is the key file name, up to 8 characters enclosed in quotes. In this case, the key file name is JKEYFILE. Next, the size of the key file is defined in terms of the maximum number of primary keys expected. The size is specified as a double word integer and is assigned to the third double word in the array, specified by an index of 2 counting from double word 0. The maximum number of primary keys should be the same as the maximum number of records specified in the filesize parameter of FOPEN. KSAM assigns a key file size based on this value. If there are alternate keys, the key file size is made proportionately larger. If the key file size is specified as zero, KSAM uses the value of the FOPEN filesize parameter as the key file size. The device class name is assigned in the 8 bytes starting in byte 12 that are allocated to device description. In this case, the device class name is DISC, the same as the device class name specified in the device parameter of FOPEN for the data file. ____________________________________________________________________________ | | | $CONTROL MAIN-JEXAMPL1 | | <<*********************************************************>> | | <<* *>> | | <<* EXAMPLE l *>> | | <<* BUILD A KSAM FILE *>> | | <<* *>> | | <<*********************************************************>> | | ARRAY KSAMPARAMA(0:25); | | BYTE ARRAY KSAMPARAM (*)=KSAMPARAMA; | | DOUBLE ARRAY KSAMPARAMD(*)=KSAMPARAMA; | | INTEGER FILNUM; | | INTEGER ERRORCODE; | | INTEGER LENGTH; | | BYTE ARRAY FILENAME(0:9):="JEXAMFIL "; | | BYTE ARRAY DEVICE(0:9):="DISC "; | | ARRAY MESSAGE(0:35); | | ARRAY INPUT(0:39); | | ARRAY OUTPUT(*)=INPUT; | | INTRINSIC FOPEN,FCLOSE,PWRITE,READ,PRINT,TERMINATE; | | INTRINSIC FCHECK,FERRMSG; | | <<*******************************>> | | <<* SETUP KSAMPARAM FOR FOPEN *>> | | <<*******************************>> | | MOVE KSAMPARAM;="JKEYFILE"; <<THE KEY FILE NAME>> | | KSAMPARAMD(2):=100D; <<THE MAX. # OF PRIMARY KEYS>> | | MOVE KSAMPARAM(12):="DISC"; <<THE KEY FILE DEVICE TYPE>> | | KSAMPARAMA(15):=&%(2)000000000000010; <<THE FLAG WORD>> | | KSAMPARAMA(16):=2; <<PRIMARY KEY & ONE ALTERNATE>> | | MOVE KSAMPARAMA(17):=([4/1,12/20], <<TYPE=ASCII; LENGTH=20 BYTES>> | | 1, <<KEY LOCATION START FROM COL 1>> | | [1/0,15/4], <<DUP NOT ALLOW; 4 KEY/BLOCK>> | | 0); <<RESERVED>> | | MOVE KSAMPARAMA(21):=([4/1,12/8], <<TYPE=ASCII; LENGTH=20 BYTES>> | | 21, <<KEY LOCATION START FROM COL 21>>| | [1/0,15/4], <<DUP NOT ALLOW; 4 KEY/BLOCK>> | | 0); <<RESERVED>> | | <<************************>> | | <<* OPEN THE KSAM FILE *>> | | <<************************>> | | FILNJM:=FOPEN(FILENAME, <<THE DATA FILE NAME>> | | &2)0000100000000100, <<KSAM,ASCII,NEW FILE>> | | &%(2)0000000001000001,<<KSAM ACCESS,EXCLUSIVE,WRITE>> | | -72, <<RECORD 72 BYTES LONG>> | | DEVICE, <<DEVICE=DISC>> | | KSAMPARAM, <<THIS DESCRIBES THE KEYS>> | ____________________________________________________________________________ Figure 4-5. FOPEN Example--Building a KSAM file ___________________________________________________________________________ | | | , <<NO USERLABELS>> | | 10, <<BLOCK 10 RECORDS>> | | , <<NUMBUFFERS NOT USED>> | | 100D); <<THIS FILE CAN HOLD 100 RECORD>> | | IF FILNUM=0 | | THEN BEGIN <<CANNOT OPEN KSAM FILE>> | | MOVE MESSAGE:="CANNOT OPEN KSAM FILE"; | | PRINT(MESSAGE,-21,0); | | FCHECK(FILNUM,ERRORCODE); <<GET THE ERROR NUMBER>>| | FERRMSG(ERRORCODE,MESSAGE,LENGTH); <<GET MESSAGE STRING>> | | PRINT(MESSAGE,-LENGTH,0); <<PRINT ERROR MESSAGE>> | | TERMINATE; | | END; | ___________________________________________________________________________ Figure 4-5. FOPEN Example--Building a KSAM file (continued) Word 15, the flag word, is set next, It uses bits 13,14, and 15 to define three conditions of the key file. In this example, bit 14 is the only bit set. This means that record numbers in the file start with 1 rather than 0 (bit 14=1), that the file is a permanent file saved in the system directory (bit 15=0), and that records may be written to the file in random order rather than being restricted to ascending sequence by primary key (bit 13=0).In Figure 4-5 the flag word is specified as a binary value for clarity; it could have been specified as octal 2 (2 or %2) for brevity. The right byte of the 16th word (byte 33) is set to 2 to specify that two keys are to be used: the primary key and one alternate. This completes the general description of the file. Its name, size, device type, special conditions, and number of keys are now specified. The remainder of ksamparam defines each key in 4-word entries. The first entry always describes the primary key. Subsequent entries define up to 15 alternate keys. In this case, one primary and one alternate are defined. Starting in word 17, the primary key is defined as type ASCII, 20 bytes long, its location starting in the first character of each record, and duplicate values are not allowed. It is blocked with four keys per block. Starting in word 21, the altemate key is defined as type ASCII, 8 bytes long, located starting in character 21 of the record, duplicate values not allowed, and blocked four keys per block. Refer to Table 4-8 for an illustration of the bit patterns used to define the ksamparam entries. CALLING FOPEN. When all the variables and arrays that pass values by reference have been defined, the intrinsic FOPEN can be called. In Figure 4-5, each parameter is shown on a separate line and documented for clarity, but the call could also be specified as: FILNUM:=FOPEN(FILNAME,%4004,%101,--72,DEVICE,KSAMPARAM,,10,0,100D); This call is identical to the call in Figure 4-5 except that octal values are used for foption and aoption. foptions The value of foptions is set to octal 4004, for which the bit pattern is:
[]
This specification defines the following file options: New KSAM file (bit 4=1) Allow: FILE (bit 5=0) Fixed-Length Records (bits 8,9=00) ASCII code (bit 13=1) New file (bits 14,15=00) aoptions The value of aoptions is set to octal 101, for which the bit pattern is:
[]
This specification defines the following access options: KSAM access expected (bit 3=0) Exclusive access (bits 8,9=01) Dynamic locking not allowed (bit 10=0) Access type is write only (bits 12-15=0001) OPENING AN EXISTING FILE Once the file has been created, opening it again after it has been closed is a simple process. The record size, device, blocking, buffersize, and file size are all defined for the data file. Therefore, these parameters need not be repeated. The key file has already been defined so that ksamparam need not be specified. This leaves the first three parameters to specify. Of these, only the formal-designator and the domain and KSAM options of the foptions parameter are always required. The formal-designator provides the file name in order to identify the file. The domain option specifies where to locate the file; if domain is set to zeros, the system expects a new file. Set the foptions KSAM option (bit 4:1) to 0 to indicate that the file is not new If the file is to be read only, the access mode parameter, aoptions, can be omitted. For any other type of access, aoptions should be specified. OPENING FILE FOR READ ACCESS. The example in Figure 4-6 illustrates opening a file for readonly access. ________________________________________________________________________________ | | | %CONTROL MAIN=JEXAMPL2 | | <<*********************************************************************>>| | <<* *>>| | <<* *>>| | <<*********************************************************************>>| | INTEGER FILNUM; | | INTEGER ERRORCODE,LENGTH; | | BYTE ARRAY FILNAME(0:9):="JEXAMFIL "; | | ARRAY MESSAGE(0:35); | | ARRAY INPUT(0:39); | | ARRAY OUTPUT(*)=INPUT; | | BYTE ARRAY KEYVALUE(0:7):="000-0000"; | | INTEGER KEYLENGTH:=8; | | INTEGER KEYLOCATION:=21; | | INTEGER RELOP:=2; | | INTRINSIC FOPEN,FCLOSE,FREAD,FFINDBYKEY,READ,PRINT, | | FCHECK,FERRMSG,PRINT'FILE'INFO,TERMINATE; | | <<************************>> | | <<* OPEN THE KSAM FILE *>> | | <<************************>> | | FFILNUM:=OPEN(FILNAME,3); <<OPEN THE KSAM FILE>> | | IF FILNUM=0 | | THEN BEGIN <<CANNOT OPEN KSAM FILE>> | | MOVE MESSAGE:="CANNOT OPEN KSAM FILE"; | | PRINT(MESSAGE,-21,0); | | FCHECK(FILNUM,ERRORCODE); <<GET THE ERROR NUMBER>> | | FERRMSG(ERRORCODE,MESSAGE,LENGTH); <<GET MESSAGE STRING>> | | PRINT(MESSAGE,-LENGTH,0); <<PRINT ERROR MESSAGE>> | | TERMINATE; | | END; | ________________________________________________________________________________ Figure 4-6. FOPEN Example--Opening an Existing File The file name is specified in the FILNAME array declaration as JEXAMFIL. This is the file that was created and opened for write-only access in Figure 4-5. It is opened for read-only access with the call: FILNUM:=FOPEN(FILNAME,3); The value of foptions is set to the value 3, for which the bit pattern is:
[]
This specification defines the following file options: Not a new KSAM file (bit 4=0) Old user file (bits 14-15=11) Because this is an existing (old) user file, other foptions settings defined when the file was created need not be respecified. For example, at creation the file was defined as containing ASCII code (bit 13=1). In subsequent FOPEN calls this bit can be 0 without changing the code to binary. When an old user file is opened, the job file domain is searched first and then the system file domain is searched for the file specified in the formal designator. The access parameter, aoptions, is not specified, but by default it specifies the following access mode: KSAM access expected Share access (default for read-only) Read-only access OPENING FILE FOR WRITE ACCESS. To open an existing file for write access, you use the same foptions values as you do to open the file for read-only access. The different access mode is specified in the aoptions parameter. For example, assuming FILNUM and FILNAME have been declared: FILNUM:=FOPEN(FILNAME,3,1) The foptions specification is the same as described above. The aoptions specification is:
[]
This bit pattern defines the following access options: KSAM access expected (bit 3=0) Exclusive access (default for all access modes except read-only) (bits 8-9=00) Disallow dynamic locking (bit 10=0) Write only access (bits 12-15=0001) This opens the file for write-only access in which all previous data is deleted. It is the access mode to use when writing to a file for the first time. If you want to write to the end of an existing file then bits 12-15 should equal 0010 and aoptions could be specified as 2 if other aoptions values are defaulted. To open the file for both reading and writing, bits 12-15 should be set to 0100, or the value 4. For update, these bits are set to 0101, or the value 5. OPENING KSAM FILE AS MPE FILE. You may want to open either the key file or the data file as a standard MPE file. To do this, name the file you want to open in the formaldesignator parameter, set foptions bit 4:1 to 1, and then set aoptions bit 3:1 to 1. These settings indicate that the file is a KSAM file, but is to be treated as an MPE file. The remaining parameter settings depend on what you want to do with the open file. For example, if you want to read the key file, JKEYFILE, as an MPE file, you call FOPEN as follows: INTEGER FILNUM; BYTE ARRAY FILNAME(0:9):="JKEYFILE "; : INTRINSIC FOPEN,...; : FILNUM:=FOPEN(FILNAME,%4003,%10000); The value of foptions defines the following file options: Specified as KSAM file (bit 4=1) Old user file (bits 14-15=11) The value of aoptions indicates the following: Non-KSAM access expected (bit 3=1) Share access (default for read only bits 8-9=00) Read-only access (default bits 12-15=0000) Normally, the only time you need to set bit 4 of foptions to 1 is when you are originally creating a KSAM file. However, when you are opening an existing KSAM file for non-KSAM access, you must set this bit to 1 so that the system can distinguish the KSAM data or key file from an MPE file. OPENING FILE FOR SHARED ACCESS. When a file is opened for shared access (aoptions bits 8,9=11), and you plan to modify the file in any way, you must enable dynamic locking (aoptions bit 10=1). This is necessary since you cannot call FWRITE, FUPDATE, or FREMOVE to modify a shared file without first calling FLOCK to lock the file. Even if you are not planning to modify the file, but only plan to read it sequentially, you should allow dynamic locking when you open the file. This is because FREAD (as well as FUPDATE and FREMOVE) is a pointer-dependent procedure. Any time you call a pointer-dependent procedure (refer to Table 4-2), you must precede it with a call to a pointer-independent procedure that positions the pointer. It is important to call FLOCK to lock the file before setting the pointer with the pointer-independent procedure and leave it locked until you have completed the sequential read or update. This insures that no other user changes the position of the pointer between the call that positions the pointer and the call that depends on the pointer.


MPE/iX 5.0 Documentation