Skip to content

Formatting Procedures

In This Chapter

This chapter explains how to customize the format in which Databridge outputs data set records and use those custom formats with DBSpan, DBSnapshot, or a user-written Databridge Accessory.

Overview.

Record formatting procedures allow you to customize the format in which Databridge outputs data set records and use those custom formats with DBSpan, DBSnapshot, or a user-written Databridge Accessory. If you want to reformat data items in a data set to different layouts, see Altered Data Sets for more information.

Sample Files

Sample ALGOL External Formatting Procedure contains the sample external formatting procedure, SYMBOL/DATABRIDGE/SAMPLE/ENCRYPT.

Using Custom Formatting Procedures

To customize how you want to output your data set records using a formatting procedure, complete the following steps:

  1. Read this entire chapter so that you get an understanding of how the code you write for your formatting procedure relates to the actual FORMAT declarations you make in the DBGenFormat file.
  2. Look at the data records you want to convert so you can get an idea of how many formatting routines you need to code.
  3. Familiarize yourself with the sample in Sample ALGOL External Formatting Procedure, which illustrate how to write a formatting procedure.
  4. Use CANDE or another editor to retrieve the DBGenFormat parameter file DATA/GENFORMAT/SAMPLE/CONTROL.

    For a general description of the DBGenFormat parameter file, refer to the Databridge Host Administrator's Guide. 5. Rename the file, as follows:

    DATA/GENFORMAT/databasename/CONTROL

    where databasename is the name of the database for which you are creating the tailored support library.

  5. Declare the formatting procedure. See Declaring Internal and External Formatting Procedures for more information.

  6. Save DATA/GENFORMAT/databasename/CONTROL.

  7. Write the formatting routine as follows:

    If you Do this
    Declared an internal formatting procedure Write the formatting procedure patch file that contains the formatting procedure. For details, see Writing an Internal Formatting Routine.
    Declared an external formatting procedure Write the formatting procedure library source file that contains the formatting routine. For details, see Writing an External Formatting Routine.

    You do not have to complete the external library file before going on to the next step. You must, however, finish writing and compiling it before you run an Accessory that uses the external format.
  8. If you wrote an external formatting procedure (SYMBOL/DATABRIDGE/formattingroutine), compile it as OBJECT/DATABRIDGE/formattingroutine or whatever you called it in the DBGenFormat parameter file.

  9. Compile the tailored support library, as follows:

    START WFL/DATABRIDGE/COMP ("SUPPORT",
    "databasename" ["logicaldatabasename"])

    Where Is
    "SUPPORT" The literal that represents the DBSupport program

    The quotation marks are required.
    "databasename" The name of the database for which you are creating the tailored support library.

    The database name can include a usercode and pack, which are used to locate the database DESCRIPTION file, as follows:

    "(usercode)databasename ON packname"

    The quotation marks are required.
    "logicaldatabasename" The name of a logical database for which you are creating the tailored support library.

    This WFL compiles layout tables for each data set in the database designated by databasename or logicaldatabasename. This results in the new tailored support library titled as follows:

    OBJECT/DATABRIDGE/SUPPORT/databasename

    — or —

    OBJECT/DATABRIDGE/SUPPORT/databasename/logicaldatabasename

    These data set-specific layout tables contain the offsets and sizes of individual data items.

    Caution

    If you have two databases with the same name under different usercodes, and you are running Databridge from a third usercode, be careful when you create a tailored support library. In this case, the second library you compile overwrites the first, because Databridge strips the usercode and pack name from the database name to create the tailored support library title.

  10. In the Accessory parameter file, enter the tailored support library name for the SUPPORT option and enter the ALGOL formatting procedure name for the FORMAT option.

For more information, refer to the Databridge Host Administrator's Guide.

What to Do Next

You can now run your Databridge Accessories as usual.

Repeat these steps for each internal or external formatting procedure you want to use.

If you encounter problems, see Troubleshooting for troubleshooting information. The Troubleshooting chapter provides specific troubleshooting tips for writing formatting procedures.


Declaring Internal and External Formatting Procedures

Formatting procedures must be declared as an internal or external format in the DBGenFormat parameter file. Declare the formatting procedure in the DBGenFormat parameter file using the syntax below in Declaring Internal Formats and Declaring External Formats.

Consider the following information before you choose whether to declare an internal or external formatting procedure:

Internal Format Description External Format Description
Internal formats are compiled as patches to your tailored support library. This requires that you recompile DBSupport via WFL/DATABRIDGE/COMP each time you update the internal formatting routine. External formats are linked at run-time to a user-written format library, so they can be recompiled any time without having to recompile DBSupport.
Internal formats do not have to specify how to link to DBEngine or DBSupport. External formats must link to DBSupport and DBEngine at the proper time.
Internal formats do not have to verify that their interface version matches DBEngine. External format libraries must ensure that their interface version matches DBEngine.

Declaring Internal Formats

To declare the formatting procedure as an internal format, use the following syntax in the DBGenFormat parameter file:

INTERNAL FORMAT formattingprocedure IN "patchfiletitle"

where formattingprocedure is the formatting procedure that you declared, and patchfiletitle is the title of the ALGOL patch file containing the internal formatting procedure that you created.

Declaring External Formats

If you want to write your own ALGOL library for a format, you can reference it in the tailored support library by using the following syntax in the DBGenFormat parameter file:

EXTERNAL FORMAT formattingprocedure IN "objectfilename"

where formattingprocedure is the name you have given to the external formatting procedure and objectfilename is the file title of your compiled ALGOL library program.


Writing Formatting Routines

Although you must code the formatting procedure in ALGOL, you can code it to call a COBOL library that actually formats the data set record.

Initializing the Formatting Routine.

You must initialize your formatting routine the first time it is called. Initializing your formatting routine allows you to obtain information, such as structure numbers and indexes. Your formatting routine uses this information to identify and format records. You can use the following entry points to obtain this information:

Writing an Internal Formatting Routine

If you declared an internal format in DBGenFormat, you must write an ALGOL patch file containing the formatting procedure. The patch file may include global declarations in addition to the formatting procedure itself. The patch file should not include the EXPORT declaration for the formatting routine. DBGenFormat automatically generates the appropriate EXPORT declaration.

Writing an External Formatting Routine

If you declared an external format in DBGenFormat, you must write your own library that contains the formatting procedure and does the following:

  • Sets the $ INCLUDE_ENGINE option (and the $INCLUDE_SUPPORT option if you call any DBSupport entry points) and includes SYMBOL/DATABRIDGE/INTERFACE using the following ALGOL $INCLUDE statements:

    $SET INCLUDE_ENGINE
    $INCLUDE "SYMBOL/DATABRIDGE/INTERFACE"

    or

    $SET INCLUDE_ENGINE INCLUDE_SUPPORT
    $INCLUDE "SYMBOL/DATABRIDGE/INTERFACE"

    Note

    Do not invoke the DBLINKENGINE define to link to DBEngine because DBSupport automatically links your library to the correct instance of DBEngine. If you invoke the DBLINKENGINE define before the library freezes, your library will link to a different instance of DBEngine than the Accessory, and it might return incorrect information and errors.

    Do not try to call any entry points before your library freezes because it gets linked to a different instance of DBEngine and/or DBSupport.

  • Calls DBINTERFACEVERSION to verify that your program was compiled against the same API file (SYMBOL/DATABRIDGE/INTERFACE) as DBEngine.

    Note

    Do not call DBINITIALIZE. DBINITIALIZE will undo the initialization that the Accessory has already done.

The following example shows how to call DBINTERFACEVERSION:

DBMTYPE DBRslt;

DBRslt := DBInterfaceVersion (DBV_VERSION, "MyFormat:");
if DBRslt NEQ DBM_OK then
        begin
        DBDisplayMsg (DBRslt);
        MYSELF.STATUS := value (TERMINATED);
        end;

See SYMBOL/DATABRIDGE/SAMPLE/ENCRYPT in Sample ALGOL External Formatting Procedure as an example of an external formatting routine.

Calling a COBOL Library

If your formatting routine calls a COBOL formatting program that is compiled with $FEDLEVEL=5, then you must do the following where the library is invoked:

In the COBOL program's entry point declaration, specify the ACTUALNAME to match the PROGRAM- ID name in the COBOL program. For example, the sample COBOL program EXTRACTADDRESS has the following:

IDENTIFICATION DIVISION.
PROGRAM-ID. EXTRACTADDRESS.

The declaration of the COBOL program's entry point in the ALGOL formatting routine would look like the following:

procedure ExtractAddress (...);
      library ExtractAddressLib (ACTUALNAME = "EXTRACTADDRESS");

See the declaration of EXTRACTADDRESS in Sample ALGOL Virtual Transform Procedure.


Sample ALGOL External Formatting Procedure

This formatting procedure (SYMBOL/DATABRIDGE/SAMPLE/ENCRYPT) illustrates how to write an external format that encrypts each update record using a translate table. The program that reads these records must reverse the translation to see the original values.

The DBGenFormat declaration for this example is as follows:

EXTERNAL FORMAT ENCRYPT IN "OBJECT/DATABRIDGE/SAMPLE/ENCRYPT"

The ALGOL source code (SYMBOL/DATABRIDGE/SAMPLE/ENCRYPT) for this example is as follows:

$ SET OMIT                                                       09000000
------------------------------------------------------------------------
09000100
                                                                 09000110
(c) Copyright 2019 Micro Focus or one of its affiliates.         09000120
                                                                 09000130
Module: SYMBOL/DATABRIDGE/SAMPLE/ENCRYPT                         09000140
                                                                 09000150
Project: Databridge                                              09000160
                                                                 09000170
Description: Databridge Encryption Format Library Program        09000180
                                                                 09000190
                                                                 09000430
------------------------------------------------------------------------
09000440
                                                                 09002000
                                                                 09002100
       Modification history                                      09002200
       --------------------                                      09002300
                                                                 09002400
Version 41.473                                                   09002500
       Initial version.                                          09002600
                                                                 09002700
        This sample Databridge library program illustrates how to write
09002800
      an external format. It uses a translate table to perform a 09002900
        simple encryption on each update record. A program reading such
09003000
      records would have to reverse the translation to see the   09003100
        original values.                                         09003200
                                                                 09003300
Version 41.485                                                   09003400
1     Added DBInterface compatibility check.                     09003500
                                                                 09003600
End History                                                      09003700
 $ POP OMIT                                                      09003800
                                                                 09003900
                                                                 09004100
 $ VERSION 06.003.0000
09999900Version
 $ SET SEQ 40000000 40000000
                                                                 40001000
begin                                                            40002000
                                                                 40003000
 $ set INCLUDE_ENGINE                                            40004000
 $ include "SYMBOL/DATABRIDGE/INTERFACE"                         40005000
                                                                 40006000
translatetable                                                   40007000
       Encryption                                                40008000
              (                                                  40009000
            48"000102030405060708090A0B0C0D0E0F"                 40010000
            48"101112131415161718191A1B1C1D1E1F"                 40011000
            48"202122232425262728292A2B2C2D2E2F"                 40012000
            48"303132333435363738393A3B3C3D3E3F"                 40013000
            48"404142434445464748494A4B4C4D4E4F"                 40014000
            48"505152535455565758595A5B5C5D5E5F"                 40015000
            48"606162636465666768696A6B6C6D6E6F"                 40016000
            48"707172737475767778797A7B7C7D7E7F"                 40017000
            48"808182838485868788898A8B8C8D8E8F"                 40018000
            48"909192939495969798999A9B9C9D9E9F"                 40019000
            48"A0A1A2A3A4A5A6A7A8A9AAABACADAEAF"                 40020000
            48"B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"                 40021000
            48"C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"                 40022000
            48"D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"                 40023000
            48"E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF"                 40024000
            48"F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"                 40025000
                                                                 40026000
              to                                                 40027000
                                                                 40028000
            48"FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0"                 40029000
            48"EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0"                 40030000
            48"DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0"                 40031000
            48"CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0"                 40032000
            48"BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0"                 40033000
            48"AFAEADACABAAA9A8A7A6A5A4A3A2A1A0"                 40034000
            48"9F9E9D9C9B9A99989796959493929190"                 40035000
            48"8F8E8D8C8B8A89888786858483828180"                 40036000
            48"7F7E7D7C7B7A79787776757473727170"                 40037000
            48"6F6E6D6C6B6A69686766656463626160"                 40038000
            48"5F5E5D5C5B5A59585756555453525150"                 40039000
            48"4F4E4D4C4B4A49484746454443424140"                 40040000
            48"3F3E3D3C3B3A39383736353433323130"                 40041000
            48"2F2E2D2C2B2A29282726252423222120"                 40042000
            48"1F1E1D1C1B1A19181716151413121110"                 40043000
            48"0F0E0D0C0B0A09080706050403020100"                 40044000
            );                                                   40045000
                                                                 40046000
        boolean FirstTime;                                       40047000
                                                                 40048000
        DBFormatHead [Encrypt];                                  40049000
        %             -------                                    40050000
              begin                                              40051000
              real Len;                                          40052000
              pointer pRec;                                      40053000
                                                                 40054000
              if FirstTime then                                  40055000
                     begin                                       40056000
                     DBMTYPE DBRslt;                             40057000
                                                                 40058000
                DBRslt := DBInterfaceVersion (DBV_VERSION, "Encrypt:"); 40059000
                   if DBRslt NEQ DBM_OK then                     40060000
                          begin                                  40061000
                          DBDisplayMsg (DBRslt);                 40062000
                          MYSELF.STATUS := value (TERMINATED);   40063000
                            end;                                 40064000
                   FirstTime := false;                           40065000
                    end;                                         40066000
                                                                 40067000
        Len := 6 * UPDATE_INFO [UI_RECSZ_WORDS];                 40068000
        pRec := pointer (UserRec);                               40069000
                                                                 40070000
        case UPDATE_INFO [UI_UPDATE_TYPE] of                     40071000
                begin                                            40072000
                DBV_CREATE:                                      40073000
                DBV_DELETE:                                      40074000
                DBV_MODIFY:                                      40075000
                    replace pRec by pRec for Len                 40076000
                           with Encryption;                      40077000
                else:                                            40078000
                end;                                             40079000
                                                                 40080000
        Encrypt := Callback (pRec, Len, UPDATE_INFO, UserRec);   40081000
          end Encrypt;                                           40082000
                                                                 40083000
export Encrypt;                                                  40084000
                                                                 40085000
FirstTime := true;                                               40086000
freeze (temporary);                                              40087000
end.                                                             40088000