File Definition Language

File Definition Language (FDL) je jazyk popisující organizaci souboru a formát záznamů v operačním systému OpenVMS. Na rozdíl od OS Unix a většiny novějších operačních systémů včetně MS-DOSu a MS Windows je součástí OpenVMS vrstva Record Management Services, která umožňuje pracovat na úrovni operačního systému s různými formáty a organizacemi souborů. FDL je nástroj, který umožňuje zvolit organizaci nově vytvářeného souboru nebo vytvořit kopii existujícího souboru s jinou organizací.

Organizace souborů

RMS podporuje čtyři přístupové metody k záznamům:

  • Sekvenční přístup
  • Přístup podle relativního čísla záznamu
  • Record File Address přístup
  • Indexovaný přístup

RMS podporuje čtyři formáty záznamů:

  • záznamy s pevnou délkou
  • záznamy s proměnnou délkou
  • záznamy s proměnnou délkou a s pevnou délkou řídicích bloků
  • soubory tvořené proudem bytů (v nichž jsou záznamy oddělené ukončovacími znaky)
    • STREAM: záznamy zakončené znaky CRLF
    • STREAM_CR: záznamy zakončené znakem CR
    • STREAM_LF: záznamy zakončené znakem LF

Formáty textového souboru

Obyčejný textový soubor (členěný na řádky) může být na disku uložen různými způsoby:

  • soubor je proud bytů každý řádek je zakončen k tomu určeným znakem nebo posloupností znaků:
    • MS-Windows a MS-DOS používají dvojici znaků CR a LF
    • Unixové systémy používají znak LF
    • Počítače Apple Macintosh používají znak CR
  • řádky jsou proměnné délky, na začátku každého řádku je informace o jeho délce – toto je standardní formát textových souborů v OpenVMS
  • všechny řádky jsou doplněny mezerami nebo jinými znaky na pevnou délku, informace o délce řádků je uložena v metadatech souboru – tento formát byl obvyklý v době používání děrných štítků

OpenVMS umožňuje přímo prostředky operačního systému konvertovat soubory mezi uvedenými formáty.

Použití

Systém pro každý soubor udržuje informace o jeho organizaci a formátu záznamu. Tyto atributy se při kopírování souboru zachovávají. Problém může nastat:

  • pokud se soubor zkopíruje z počítače, který používá jiný operační systém
  • pokud jsou soubory sdíleny protokolem, který informace o atributech souboru nepodporuje (např. NFS)
  • pokud jsou soubory zabaleny do archivu, který tyto atributy nepodporuje (například ZIP bez použití parametru "-V")

OpenVMS umožňuje:

  • vytvořit soubor s určitými atributy
  • vypsat atributy souboru
  • opravit atributy souboru, pokud se liší od skutečného formátu souboru (bez změny vlastních dat)
  • vytvořit kopii souboru, která bude mít stejný obsah, ale jiné atributy

Výpis atributů

Pro výpis atributů souboru lze použít buď příkaz DIR s parametrem /FULL nebo příkaz ANALYZE:

DIR /FULL ABC.TXT

Directory USER_DISK:[USER.SMITH]

ABC.TXT;2                     File ID:  (407115,857,0)
Size:            1/64         Owner:    [MZ,SMITHJ]
Created:     8-DEC-2015 13:23:34.38
Revised:    12-APR-2019 11:31:00.37 (61)
Expires:    <None specified>
Backup:     <No backup recorded>
Effective:  <None specified>
Recording:  <None specified>
Accessed:   <None specified>
Attributes: <None specified>
Modified:   <None specified>
Linkcount:  1
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 64, Extend: 0, Global buffer count: 0, No version limit
Record format:      Stream_LF, maximum 0 bytes, longest 32767 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWD, Owner:RWED, Group:R, World:
Access Cntrl List:  None
Client attributes:  None

Total of 1 file, 1/64 blocks.
ANALYZE/RMS_FILE/FDL/OUTPUT=POPIS.FDL ABC.TXT
TYPE POPIS.FDL
IDENT   FDL_VERSION 02 "10-MAY-2019 08:01:05   OpenVMS ANALYZE/RMS_FILE Utility"

SYSTEM
        SOURCE                  OpenVMS

FILE
        ALLOCATION              64
        BEST_TRY_CONTIGUOUS     no
        CLUSTER_SIZE            64
        CONTIGUOUS              no
        EXTENSION               0
        FILE_MONITORING         no
        NAME                    "USER_DISK:[USER.SMITHJ]ABC.TXT;2"
        ORGANIZATION            sequential
        OWNER                   [MZ,SMITHJ]
        PROTECTION              (system:RWD, owner:RWED, group:R, world:)
        GLOBAL_BUFFER_COUNT     0
        GLBUFF_CNT_V83          0
        GLBUFF_FLAGS_V83        none

RECORD
        BLOCK_SPAN              yes
        CARRIAGE_CONTROL        carriage_return
        FORMAT                  stream_lf
        SIZE                    0

Oprava atributů

Pokud organizace souboru na disku nesouhlasí s organizací uvedenou v metadatech souboru, je možné informace v metadatech upravit:

SET FILE /ATTRIB=(...)
popis ve .FDL souboruVýznamSET FILE /ATTRIB=(…)
FORMAT streamřádky zakončené CR+LFRFM:STM
FORMAT stream_crřádky zakončené CRRFM:STMCR
FORMAT stream_lfřádky zakončené LFRFM:STMLF
FORMAT fixedzáznamy pevné délkyRFM:FIX
FORMAT undefinednedefinovaný formátRFM:UDF
FORMAT variablezáznamy proměnné délkyRFM:VAR
FORMAT vfcRFM:VFC
CARRIAGE_CONTROL noneRAT:NONE
SIZEdélka záznamuLRL:32256

Například pro nastavení správného formátu záznamů u .BCK souboru lze použít:

SET FILE /ATTRIB=(RFM:FIX,RAT:NONE,LRL:32256) soubor.BCK

Textový soubor přenesený z Windows, který má špatné atributy, což se projevuje tak, že v editoru se zobrazuje na konci každého řádku nesmyslný znak, lze opravit příkazem:

SET FILE /ATTRIB=(RFM:STM) ABC.TXT

Textový soubor přenesený z Unixu, který má špatné atributy, což se projevuje tak, že se vypisuje schodovitě takto:

MACH1:BOB> TYPE MY_SCRIPT.COM
$!
  $! MY_SCRIPT.COM
                     $!
                       $! Author: Bob Smith
                                             $!
                                               $! Date: 11-JUL-2013
                                                                   $!

lze opravit příkazem:

SET FILE /ATTRIB=(RFM:STMLF) MY_SCRIPT.COM

Vytvoření souboru

Vytvořit soubor s určitými atributy:

CREATE /FDL=popis.FDL soubor

Zkonvertování souboru

Pro zkonvertování textového souboru organizovaného jako soubor s proměnnou délkou záznamů na textový soubor v unixovém formátu (konce řádku jsou LF) lze použít následující FDL soubor STREAM_LF.FDL:

RECORD
 FORMAT stream_lf

Vlastní konverze se provede příkazem:

CONVERT /FDL=STREAM_LF.FDL vstup.TXT vystup.TXT

Pro vytvoření textového souboru ve formátu MS-DOS nebo MS-Windows (konce řádku jsou CR+LF) by FDL soubor vypadal takto:

RECORD
 FORMAT stream

Zkonvertování souboru mimo OpenVMS

Pokud byl textový soubor s proměnnou délkou záznamů přenesen bez konverze z OpenVMS na jiný systém je možné k jeho konverzi použít následující skript vms2unix v jazyce Perl:

#!/usr/bin/perl

$filename=$ARGV[0];
open(FILE, $filename) || die "Error opening file $filename: $!\n";
do {
  $read=read(FILE, $buf, 2);
  ($len)=unpack("v", $buf);
  $read=read(FILE, $buf, $len);
  $read=read(FILE, $skip, 1) if $len % 2;
  $buf=~s/\x01\x8D//;
  print $buf, "\n";
} while (!eof(FILE));
close(FILE);

Konverze se provede příkazem

$ vms2unix vstup.txt > vystup.txt

Historický příklad – konverze na soubor se pevnou délkou záznamu

Pro zkonvertování textového souboru záznamy s pevnou délkou 80 znaků (formát děrných štítků) lze použít soubor FIXED80.FDL obsahující:

RECORD
 FORMAT fixed
 SIZE 80

Vlastní konverze se provede příkazem:

CONVERT /FDL=FIXED80.FDL /FIXED_CONTROL /PAD=" " vstup.TXT vystup.TXT

Vytvoření FDL souboru

Soubor s popisem atributů lze získat několika způsoby:

  • z existujícího souboru příkazem ANALYZE/RMS_FILE/FDL/OUTPUT=popis.FDL soubor
  • příkazem EDIT /FDL popis.FDL
  • vytvořit textový soubor popis.FDL

Organizaci souboru lze popsat *.FDL souborem. *.FDL pro existují soubor se vyrobí příkazem

ANALYZE/RMS_FILE/FDL/OUTPUT=organizace.FDL soubor

Pro výpis popisu organizace souboru na obrazovku lze použít /OUTPUT=SYS$OUTPUT

Kompletní popis textového souboru používajícího záznamy proměnné délky ve FDL:

IDENT   FDL_VERSION 02 " 3-APR-2014 08:54:40   OpenVMS ANALYZE/RMS_FILE Utility"

SYSTEM
        SOURCE                  OpenVMS

FILE
        ALLOCATION              64
        BEST_TRY_CONTIGUOUS     no
        CLUSTER_SIZE            64
        CONTIGUOUS              no
        EXTENSION               0
        FILE_MONITORING         no
        NAME                    "USER_DISK:[USER.SMITHJ]VYPIS.TXT;1"
        ORGANIZATION            sequential
        OWNER                   [SMITHJ]
        PROTECTION              (system:RWED, owner:RWED, group:RE, world:)
        GLOBAL_BUFFER_COUNT     0
        GLBUFF_CNT_V83          0
        GLBUFF_FLAGS_V83        none

RECORD
        BLOCK_SPAN              yes
        CARRIAGE_CONTROL        carriage_return
        FORMAT                  variable
        SIZE                    0

Úvodní obrazovka příkazu EDIT /FDL soubor.FDL:

                          OpenVMS FDL Editor

         Add     to insert one line into the FDL definition
         Delete  to remove one line from the FDL definition
         Exit    to leave the FDL Editor after creating the FDL file
         Help    to obtain information about the FDL Editor
         Invoke  to initiate a script of related questions
         Modify  to change an existing line in the FDL definition
         Quit    to abort the FDL Editor with no FDL file creation
         Set     to specify FDL Editor characteristics
         View    to display the current FDL Definition

         Main Editor Function            (Keyword)[Help] :

Reference

OpenVMS Record Management Utilities Reference Manual