Raincode QIX


Version 6.0.136.0

Raincode Crossbow

Raincode Crossbow is a consistent release of the entire Raincode product line, covering compilers, emulators and ancillary tools.

In practice, Raincode Crossbow is designed with three driving forces:

  • A focus on performance across the board:

    • The internal computation engine for non-binary numeric data types (display numeric or packed decimals) has been entirely overhauled, resulting in performance improvements that can go up to a factor of 5 (depending on the level of dependence on these non-binary data types)

    • The file I/O layer has been optimized to ensure the best possible performance when dealing with indexed or sequential files

    • RadaR is a revolutionary solution to run batch steps 5 to 10 times faster, without changing the application source code or even the JCL they are called from

    • The Visual Studio plugin now runs the heaviest debugging operations asynchronously, thereby dramatically improving response time and the overall user experience, even when debugging programs with hundreds of active variables

    • The views generated to access VSAMSql and IMSql data using plain SQL DML statements have been optimized dramatically

  • Updated .NET platform support running both on Linux and on Windows, on virtual machines or in containers, on the cloud, on laptops or servers managed on premise.

  • Consolidation of the product suite, allowing all Raincode software to be built and upgraded synchronously, thereby avoiding the headaches that come from multiple products that follow different (and sometimes, incompatible) release cycles.

Version 6.0

In addition to the above description, Raincode Crossbow v6.0 (see release notes) is a technical release that includes the following:

  • Support for .NET 10.0 and SQL Server 2025 across the board.

  • The Visual Studio plugin now supports Visual Studio 2022 and 2026, with improved support for JCL debugging.

  • Support for the File-AID JCL utility.

  • Support for TLS encryption on QIX and IMS TN3270 terminal servers.

  • Removal of support for .NET Framework and .NET 6.0.

  • Removal of support for Microsoft Host Integration Server (HIS) for Db2.

  • Removal of 32-bit support.

1. Introduction

Raincode QIX is Raincode’s CICS emulator. It is designed to allow existing CICS applications running on the mainframe to be rehosted, together with Raincode’s COBOL, PL/I and assembler compiler.

Raincode QIX aims at reproducing CICS’s observable behavior, taking advantage of the capabilities of the target platform. It does not aim at reproducing all of CICS’s internal architecture and protocols, which are very much adjusted to the idiosyncrasies of the Mainframe.

Raincode® is a registered trademark. All other product and company names and marks mentioned in this document are the property of their respective owners. Note that PL/I, CICS, MVS, and z/OS are registered trademarks of IBM. SQL Server and Visual Studio are registered trademarks of Microsoft.

1.1. This document

This document is designed for developers who operate Raincode QIX, and for engineers responsible for installing and configuring it. It is not a tutorial on CICS, its operating principles, its internal protocols and data structures.

Prerequisites

Raincode QIX requires two components to be installed prior to any operation:

  • .NET 10.0 or .NET 8.0

  • SQL Server

1.2. SQL Server

Raincode QIX relies on SQL Server extensively for its own operations, in addition to any application-level use of the database. SQL Server is used to store configuration information, but also, as basic infrastructure for its various components to communicate with each other.

A QIX system will thus always require SQL Server, even if it uses file-based storage or even Oracle or Db2 for its application data.

QIX does not create the database nor the configuration tables on the fly: they must have been setup separately prior to the creation of regions and other configuration artefacts, typically by a DBA who is authorized to perform such operations. Please check the section titled Setting up the QIX configuration databases for more information about this.

1.3. Concepts and architecture

This section describes the key concepts of Raincode QIX, and how they map (or don’t map) to existing concepts in CICS.

1.3.1. Regions

Raincode QIX is based on the central concept of a region, which is a direct transposition of CICS regions. In CICS, a region is a named, isolated address space that contains a collection of resources, e.g., programs, BMS map sets, transactions, terminals, files, etc., all of which are controlled by CICS as a single unit.

A QIX region is similar, except for the fact that it does not have its own address space (which would seriously limit scalability, and which would be close to impossible to support in .NET).

In practice, a QIX region is materialized by a name, and a number of records in a configuration database. In other words, a QIX region is uniquely identified by a connection string identifying the configuration database, and a name identifying the region in this database. This allows you to have multiple regions in a single configuration database, or to have separate configuration databases, each containing a single region if that is your preference.

Upon creation of the region, a number of service broker queues are created as well. These queues define the endpoints one must connect to, to interact with the region.

By default, these queues are created in the configuration database. For performance reasons, one has the option of creating these queues on a separate database instance.

1.3.2. Terminal servers and processing servers

As explained above, a QIX region is materialized by a configuration in a configuration database together with service broker queues, but that does not make the region usable. In order to start running transactions, you must start one or more processing servers, as well as one or more terminal servers.

The figure below shows QIX’s general architecture.

QIX Architecture
Figure 1. Architecture of a QIX region
  • Terminal server: The terminal server deals with TN3270 connections. It serves as the entry point for online users accessing the system through a 3270 terminal emulator that supports the TN3270E protocol (including IBM Personal Communication). It handles all 3270 related features, including the primary mapping support component (BMS) equivalent in QIX. For instance, it converts the CICS SEND MAP command into a 3270 output datastream, and translates incoming 3270 datastreams into the equivalent data structure used by the underlying PL/I, COBOL or Assembler program. When a user connects using a standard 3270 emulator, the terminal server uses the service broker queues to communicate with a processing server where the actual programs will execute (See below). The output is then returned to the terminal server through another queue, and will then be sent back to the user through the 3270 connection.

  • Processing server: The processing server is responsible for performing the actual transactional processing. For a given region, it processes tasks stored in the task queue. This queue is filled by the terminal server, e.g. when the user presses enter in the terminal. Multiple processing servers can take from the queue, allowing parallel execution of CICS tasks.

The Terminal servers and Processing servers are not started or controlled centrally. They are started independently, connect to the region by starting to listen to its service broker queues, and then begin interacting with it.

For more information about SQL Server’s Service Broker used for the communication between the components in this architecture, please refer to documentation on Service Broker.
In addition to its name, a QIX region can also be given an APPLID if required by the underlying application. By specifying a different region name with the same APPLID, multiple instances of QIX can run with the same APPLID, which can prove helpful in a development environment.

1.3.3. Distributed Architecture

As explained in detail above, Raincode QIX is based on a distributed architecture. Its components can run on different nodes within a local area network, as required. This architecture is scalable, as there are no performance bottlenecks other than those related to network and database bandwidth.

On the other hand, this means that QIX cannot provide true shared memory services in the same way CICS does on the mainframe. It directly contradicts the distributed paradigm. QIX must instead emulate shared memory, which can only work if it is updated sparingly. Applications that depend heavily on shared memory, including updates at high frequency, may not be usable on QIX without change. More limited uses may be supported adequately. For more details on how QIX emulates shared memory and the limitations of this emulation, please refer to the documentation on the Common Work Area (CWA).

1.3.4. Extensibility

Rather than have an ever growing list of options to support even more uncommon capabilities, Raincode QIX supports a plugin mechanism that can be used to extend or override existing behaviors. Such plugins can be implemented in any .NET language, and they are loaded dynamically to enable the customization of specific components and behaviors within QIX.

An example of such a plugin is the authentication plugin used in the terminal server. For more details on implementing a plugin, please refer to the section Implementing a plugin.

1.3.5. Administration

A QIX system must be administered. One must be able to create a region, configure it, enable transactions, etc. QIX supports two means to perform these administration tasks:

  1. The Raincode Console provides a web-based interface.

  2. The QIX.Cmd tool provides similar capabilities, usable from the command line.

There is a lot of overlap between these two tools, but this is very much by design, as they serve different purposes: the Console is meant to be used by a human, provides visualization capabilities, etc. On the other hand, the QIX.Cmd allows for automation of administration tasks, for instance, to start and stop QIX regions at specific times.

1.4. Samples

Seeing a working QIX application in action is the best way to understand its operating principles.

Raincode 360 includes several such sample applications, each demonstrating a specific feature set of QIX. A good example to get started is the bank application (located in the folder Qix - Emulator - Bank Application). This example illustrates a typical use case and contains instructions on how to debug an application that runs with QIX.

1.5. Manually configuring Raincode QIX

1.5.1. Setting up the QIX configuration databases

To run an instance of QIX, the configuration and service broker database(s) must be created, where QIX will store its configuration settings and queues, respectively. These databases must be created externally, typically by a DBA, before invoking any of the QIX tools.

In practice, the following steps must be followed:

  1. In your SQL Server instance, create a database named RegionConfig (or any name of your choice) to serve as the configuration database.

  2. The Service Broker database can be the same as the configuration database or a separate one, in which case this additional database must be created as well. If a separate database is used, two distinct connection strings will have to be provided in some circumstances. See the options listed in ServiceBrokerConnectionString.

  3. Ensure that the Service Broker is enabled on the Service Broker database. If the configuration database is also your Service Broker database, enable the Service Broker when creating the database, as shown in the screenshot below. If the database has already been created, then activate the Service Broker as explained in how to activate the Service Broker in an existing database.

    servicebroker
    Figure 2. Enable Service Broker
  4. On the configuration database, execute the T-SQL script rcqix_db.sql located in the %RCDIR%\sql directory.

  5. If your programs utilize Temporary Storage queues, execute the T-SQL script rcqix_ts.sql in the configuration database, also found in the %RCDIR%\sql directory. Just as for the Service Broker queues, it is also possible to have a separate database for Temporary Storage for improved performance. To use this option, first create the database before running this rcqix_ts.sql script on it, and ensure to pass the QueueConnectionString option where needed.

  6. If the CICS programs need to access files, the file names as specified in the program need to be mapped to a data set. This mapping is done by providing a configuration file to the processing server, using the FileConfig argument. The most straightforward format of this file is given below: it first refers to the Raincode Catalog and then simply links file names to data set names using FileConfig elements. For each link, the file name is given as the LogicalName attribute, while the Path element, by starting with DSN:, states that it refers to a data set name that is contained in the catalog (the data set name being the part after DSN:).

    <FileConfigCollection>
      <CatalogConfiguration>D:\Mainframe\Raincode.Catalog.xml</CatalogConfiguration>
    <FileConfig LogicalName="MFSFAIX">
       <Path>DSN:MAIN.PROD.AIX</Path>
    </FileConfig>
    <FileConfig LogicalName="MFSFATC">
       <Path>DSN:MAIN.PROD.ATC</Path>
    </FileConfig>
    </FileConfigCollection>
  7. Create your regions, by using the Console or the QIX.Cmd tool and then adding transactions, TD queues, and other necessary components using Add commands or by importing them from a DFHCSDUP LIST ALL OBJECTS output using Setup environment.

1.5.2. Interacting with your application database

In addition to the SQL Server database(s) used by QIX to manage the regions, their configurations, the Service Broker queues and/or Temporary Storage queues, QIX application may rely on business data stored in an application database. Raincode supports Db2, SQL Server and Oracle as application databases.

To enable a QIX application to connect and interact with this database, the region must have a reference to its connection string. This connection string is added as an extra parameter when creating or adding regions to your QIX environment. This connection string must be prefixed by #, followed by the kind of SQL runtime that is used by the database (#SqlServer|#DB2|#Oracle). For instance, below is a PowerShell example, using the QIX.Cmd tool add-region command, that creates a new region called MyRegion, which specifies an Oracle database to be used by the application for its own data:

$APPCONN = '#Oracle' + '#$Env:CONNECTIONSTRING';
& "$env:RCBIN/QIX.Cmd" -CS="$QIXCONN" add-region -RegionName=MyRegion -ApplicationConnectionString="$APPCONN"

Using an application database also implies that e.g. the PL/I or COBOL programs referring and interacting with this database must be compiled with the correct flags to ensure that the SQL commands are translated to the appropriate target SQL dialect. These flags are available in the Miscellaneous code generation information section in the Raincode Stack user guide.

2. Using Raincode QIX

Raincode QIX is composed of several utilities located in the %RCBIN% directory. These include:

  • The QIX.cmd command-line configuration utility

  • The terminal server and processing server

  • The BMS compiler

You can get usage information for each tool, together with the matching supported command-line options, by running it from the command line without any parameters.

More detailed documentation is provided in the following sections for reference.

2.1. QIX command-line configuration

Earlier versions of QIX supported a separate utility named RegionCreator for managing regions. This utility has been fully replaced by the much more versatile command line tool QIX.Cmd that can be used to query, create, remove, and modify the components of a QIX region using the command line. QIX.Cmd commands can be classified into four broad categories:

  • Add to add new elements to the configuration

  • Get to query parts of the configuration

  • Edit to modify parts of the existing configuration

  • Remove

Each command provides additional flags that are used to control how the actions will be performed.

A mandatory flag for the QIX.Cmd tool is -ConnectionString, which holds the connection string to the SQL Server instance, where QIX will store the configuration for the region(s). This flag can be abbreviated with -CS.

The bare minimum elements for a region to function correctly are the name of the region, program path, map path, transaction list and an application connection string when the application uses a database. By default, all paths are set to the current working directory, i.e. the path of where the terminal or processing server is started.

2.1.1. Setup environment

Instead of starting from scratch, and defining resources one by one, QIX.Cmd can be used to create a fully initialized region based on a CSD file coming from the mainframe. This will allow the existing transactions, TD queues and files of the CICS environment to be created automatically in QIX. A CSD file can be generated on the mainframe with the DFHCSDUP utility and using the LIST ALL OBJECTS command.

To set up a region in QIX, the only thing that the setup-env command needs is the path to the CSD file and the name of the new region.

The CSD file itself contains lists, groups, and the resources (such as, transactions and TD queues) assigned to them. While parsing the CSD file, QIX.Cmd builds the structure of all the resources in the file which can be added to the QIX region. By default, setup-env imports all transactions, TD queues and files found in the CSD file.

However, if you want to include only specific parts of the CICS environment as defined in the CSD file, setup-env offers two filtering options:

  • -filterList: imports only the resources belonging to the specified list(s).

  • -filterGroup: imports only the resources belonging to the specified group(s).

Both flags can be repeated to include multiple lists and/or groups. If no filter flags are provided, all transactions, TD queues and files defined in the CSD file are imported to the QIX environment.

.\QIX.Cmd -CS="$env:CS" setup-env -FileName="path\to\csd.txt" -RegionName="NewRegionName"

2.1.2. Add commands

Add commands can be used to create new objects and add them to the QIX configuration. They start with the add- prefix and support multiple flags that are used to initialize the fields of the new object.

For instance, the following command will add a transaction named TR01, referencing program MyProgram to the region named MyRegion.

.\QIX.Cmd -CS="$env:CS" add-transaction -RegionName="MyRegion" -Name="TR01" -Program="MyProgram"

QIX.Cmd provides two separate commands to create a region:

  • add-region: creates a new empty region with the given region name and connection strings. This region will only become usable as soon as transactions (and TD queues, if applicable) are created as well.

  • clone-region: creates a new region and duplicates all the information from another existing region e.g., transactions, maps paths, …​

Creating a region with a list of transactions, TD queues, …​ requires multiple commands: add-region, add-transaction for every transaction, add-td-queue for every TD queue, …​.

2.1.3. Get commands

Get commands can be used to retrieve information from the QIX configuration, either as plain text or as JSON. These commands start with the get prefix, and can be followed by two flags to control the output:

  • -OutputFile: to redirect the output to a file instead of the console

  • -JSON: to print the data either in a JSON format or as a table

This is followed by the type of requested data and additional flags to filter and sort the data to retrieve. For instance, .\QIX.Cmd -CS="$env:CS" get -JSON transactions -RegionName="MyRegion" returns the transactions of the region named MyRegion in a JSON format.

2.1.4. Remove commands

Remove commands (recognizable by the remove- prefix) delete data from the QIX configuration, based on identifying information (such as the transaction name, for instance).

.\QIX.Cmd -CS="$env:CS" remove-transaction -RegionName="MyRegion" -Name="TR01"

2.1.5. Edit commands

Edit commands can be used to edit existing data. Similarly, to remove commands, some command-line options are mandatory for identifying the data to modify. Additional options can be used to modify the current information. For example, the following statement will overwrite the program name of the transaction TR01 in the region MyRegion.

.\QIX.Cmd -CS="$env:CS" edit-transaction -RegionName="MyRegion" -Name="TR01" -Program="NewProgramName"

2.1.6. Disabling Functions and Files

Raincode QIX also offers the functionality to enable and disable transactions and files. By default, transactions and files are enabled just as on the mainframe, but they can be disabled dynamically at runtime. If one attempts to execute a transaction marked as disabled, it will result in an abend with EIBRESP = INVREQ and RESP2 = 17. Similarly, when a program tries to access a file marked as disabled, the abend comes with EIBRESP = DISABLED and RESP2 = 50.

In Raincode QIX’s distributed architecture, each server maintains a local cache of the region configuration to avoid latency. However, this approach can result in discrepancies between the transaction or file status (enabled or disabled) stored in the region configuration database and the one stored in the local cache. To address this inconsistency, Raincode QIX automatically notifies all servers about these critical operations, i.e., the transaction or file status in the cache is kept up to date.

2.1.7. Execute Program on a QIX Region

In Raincode, programs can be executed on a QIX region without a 3270 screen by using QIX.Cmd.

Only programs that do not perform screen operations can be executed; any program that attempts to access a screen is rejected.

To run a program on a QIX region, a processing server with an active API listener is required. This can be achieved by adding the region option APIListener with a value of True to the region. Furthermore, the region should have a program path to the dll of the desired program. Finally, a processing server can be started with QIX.ProcessingServerRunner.

With the following command, the program NewProgramName will be executed on the region named MyRegion. The Data flag gives the path to a file containing the input commarea. The resulting commarea of the program is written in the file specified by Outputfile. The sizes of these commarea can be adjusted using additional options, refer to the execute command for more details.

.\QIX.Cmd -CS="$env:CS" Execute -RegionName="MyRegion" -Program="NewProgramName" -Data="input/commarea.txt" -Transaction="TR01" -OutputFile="output/commArea.txt"

2.1.8. Granting Permission to Database Users

QIX.Cmd supports a command named generate-permission-files to generate SQL files that specify the roles and permissions required for the users of the configuration and queue databases. These files are saved in the specified output directory or, if no directory is provided, in the current working directory by default.

The generated files are:

  1. QixConfigPermissionsFile.sql - This file contains the permissions required for the QixConfig database user to interact with the stored procedures and functions related to the QIX instance.

  2. QixTsQueuePermissionsFile.sql - This file contains the permissions required for the QixTsQueue database user to interact with the TS queues.

A database user must be granted specific access permissions to interact with tables, stored procedures, functions, queues, and services within the QIX instance. The four types of access that are supported are listed below.

Reader Access

Reader access allows a database user to retrieve and view data from tables within the specified QIX instance database.

Writer Access

Writer access allows a database user to insert, update or delete data from tables within the specified QIX instance database.

Execute access

Execute access grants a database user the right to execute the stored procedures and functions within the specified QIX instance.

To determine the specific stored procedures and functions that require access within the QIX instance, please refer to the following SQL files:

  • QixConfigPremissionFile.sql, has details about the stored procedures and functions associated with the QIX config database user.

  • QixTsQueuePermissionFile.sql, has details about the stored procedures and functions associated with the QIX TS queue database user.

If the database administrator (DBA) grants execute access to the QIX user on the QIX database, in that case, the QixConfigPremissionFile.sql and QixTsQueuePermissionFile.sql files become obsolete since the user will have access to all the stored procedures and functions by default.
Receive access

Receive access allows a database user to receive messages from a queue within the specified QIX region.

Multiple queues are provisioned within the service broker when a new region is created. These queues facilitate the message exchange within the Raincode QIX instance. Below is the screenshot of the Raincode console, which shows a typical representation of queues in a region.

servicebrokerqueue
Figure 3. Service Broker
Granting receive access must be repeated each time a new region is created, as each region has its own queues. This is true, even when a region is created by cloning another existing region.

2.2. QIX command line tool options

QIX.Cmd can query, create, remove, and modify the components of a QIX environment. QIX.Cmd submits the following return codes: 0: Success; 1: QixCmdError; 2: DatabaseError; 3: DoesNotExists; 4: AlreadyExists; 99: UnexpectedError;

2.2.1. Options

Configuration
Table 1. Details of command-line options for QIX.Cmd in category Configuration
Command-line option Description

ConnectionString

SQL Database connection string to connect.

This argument is mandatory.

Miscellaneous
Table 2. Details of command-line options for QIX.Cmd in category Miscellaneous
Command-line option Default value Description

DotNetConfigFile

This command-line option is an additional .net 'app.config' file.

Help

Displays the tool’s help information.

IgnoreUnkownArgs

Info

False

Displays a description of the program.

LogLevel

WARNING

Specifies the log level. Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

Version

False

Displays the version information.

Plugin
Table 3. Details of command-line options for QIX.Cmd in category Plugin
Command-line option Description

Plugin

The list of plugins to be loaded when the tool executes.

PluginPath

This command-line option specifies the path to plugins that are searched.

2.2.2. SubCommands

get: returns specific type of data based on its subcommand. Will return nothing when no subcommand is given

add-region: creates and adds a new empty region

clone-region: creates and adds a new empty region and copies all the components (transactions, maps paths, programs paths, …​) of another region into it

remove-region: removes a region with all its components

edit-region: edits a region

add-region-option: adds a region option (OptionName → OptionValue)

remove-region-option: removes a region option

edit-region-option: edits the value of a region option

add-transaction: adds a transaction

add-transactions: adds multiple transactions

remove-transaction: removes a transaction

enable-transaction: enable a transaction

disable-transaction: disable a transaction

edit-transaction: edits a transaction

add-maps-path: adds a mapsPath

remove-maps-path: removes a mapsPath

add-programs-path: adds a programsPath

remove-programs-path: removes a programsPath

add-tdqueue: adds a TD queue

remove-tdqueue: removes a TD queue

edit-tdqueue: edits a TD queue

write-tdqueue: write data to a TD queue

read-tdqueue: reads data from a TD queue

add-forward-transaction: adds a forward transaction

remove-forward-transaction: removes a forward transaction

edit-forward-transaction: edits a forward transaction

add-forward-destination: adds a forward destination

remove-forward-destination: removes a forward destination

edit-forward-destination: edits a forward destination

add-file: add a file entry with the logical name, dsn name and a status to the configuration

remove-file: remove a file entry from the configuration

enable-file: enable a file so that it can again be accessed in the current region

disable-file: disable a file so that it can no longer be accessed in the current region until it is re-enabled

edit-file: edits a file

download-file-config: creates a file config based on the files in the config database and writes it in a file

upload-file-config: given a file config, add all files in the config database

setup-env: creates a region with the transactions, TD queues and files of the given CSD file

Execute: Call a region external api to execute a program.

Admin: Set of commands to administrate the Qix configuration and database

status-region: returns the status of a region: active when it has at least one active server; otherwise inactive

stop-region: stops all the servers in a region

stop-server: stops a server

recycle-server: shuts down a server with exit code 2 to allow reloading after stopping when catching this exit code. Note, restarting the server should be done manually after catching exit code 2

generate-permission-files: generates two SQL files that specify the roles and permissions: (1) QixConfigPermissionsFile.sql contains the permissions for the QixConfig database user to interact with the stored procedures and functions related to the QIX instance; (2) QixTsQueuePermissionsFile.sql contains the permissions required for the QixTsQueue database user to interact with the TS queues. For more information, see the above section

QIX.Cmd get

returns specific type of data based on its subcommand. Will return nothing when no subcommand is given

Options
Table 4. Details of command-line options for QIX.Cmd get in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

Format

print content in a specific format. The default is CSV Valid values are:

  • Unknown

  • CSV

  • JSON

  • Table

OutputFile

Redirect the output to this file instead of the console

SubCommands

regions: returns all the regions

maps-paths: returns all the mapsPaths

programs-paths: returns all the programsPaths

region-options: returns all the region options

forward-destinations: returns all the forward destinations

forward-transactions: returns all the forward transactions

transactions: returns all the transactions

servers: returns all the servers

tdqueues: returns all the td queues

files: returns all the files

QIX.Cmd get regions

returns all the regions

Miscellaneous
Table 5. Details of command-line options for QIX.Cmd get regions in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region name

ApplicationConnectionString

Filter the output based on the application connection string

CwaSize

Filter the output based on the cwa size

Secmgrcfg

Filter the output based on secmgrcfg

CodePage

Filter the output based on the code page

QueueConnectionString

Filter the output based on the queue connection string

StringRuntimeEncoding

Filter the output based on the string runtime encoding

ParallelDestination

Filter the output based on the parallel destination

LogLevelFilter

Filter the output based on the logLevel Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

Sort

Sort the output Valid values are:

  • None

  • RegionId

  • RegionName

  • ApplicationConnectionString

  • CwaSize

  • Secmgrcfg

  • QueueConnectionString

  • CodePage

  • StringRuntimeEncoding

  • ParallelDestination

  • LogLevel

QIX.Cmd get maps-paths

returns all the mapsPaths

Miscellaneous
Table 6. Details of command-line options for QIX.Cmd get maps-paths in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region Name

MapsPathId

Filter the output based on the mapsPath id

MapsPath

Filter the output based on the mapsPath path

Sort

Sort the output Valid values are:

  • None

  • RegionId

  • MapsPathId

  • MapsPath

QIX.Cmd get programs-paths

returns all the programsPaths

Miscellaneous
Table 7. Details of command-line options for QIX.Cmd get programs-paths in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region name

ProgramsPathId

Filter the output based on the programsPath id

ProgramsPath

Filter the output based on the programsPath path

Sort

Sort the output Valid values are:

  • None

  • RegionId

  • ProgramsPathId

  • ProgramsPath

QIX.Cmd get region-options

returns all the region options

Miscellaneous
Table 8. Details of command-line options for QIX.Cmd get region-options in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region name

OptionName

Filter the output based on the option name Valid values are:

  • None

  • APPLID

  • SYSID

  • AppCleanupSessionProc

  • ServiceBrokerCS

  • SharedMemSize

  • TerminalTimeout

  • UCTRANST

  • InitialTransaction

  • MaxThreads

  • ThreadTime

  • ReactiveTransactions

  • MaxCollationChar

  • APIListener

  • AutoMapAssemblyList

  • Catalog

  • LockingBehavior

  • LogProgramOutput

OptionValue

Filter the output based on the option value

Sort

Sort the output Valid values are:

  • None

  • RegionId

  • RegionOptionName

  • RegionOptionValue

QIX.Cmd get forward-destinations

returns all the forward destinations

Miscellaneous
Table 9. Details of command-line options for QIX.Cmd get forward-destinations in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region Name

Id

Filter the output based on the forwardDestination id

HostName

Filter the output based on the forwardDestination host name

HostId

Filter the output based on the forwardDestination host id

Port

Filter the output based on the forwardDestination port

Sort

Sort the output Valid values are:

  • None

  • DestinationId

  • HostId

  • HostName

  • Port

  • RegionId

  • RegionNavigation

QIX.Cmd get forward-transactions

returns all the forward transactions

Miscellaneous
Table 10. Details of command-line options for QIX.Cmd get forward-transactions in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region Name

Id

Filter the output based on the id

TransactionId

Filter the output based on the transaction id

Destination

Filter the output based on the destination

RemoteTransaction

Filter the output based on the remote transaction

Sort

Sort the output Valid values are:

  • None

  • Id

  • RegionId

  • TransactionId

  • Transaction

  • RemoteTransaction

QIX.Cmd get transactions

returns all the transactions

Miscellaneous
Table 11. Details of command-line options for QIX.Cmd get transactions in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region name

Id

Filter the output based on the transaction id

Name

Filter the output based on the transaction name

Program

Filter the output based on the program name

TwaSize

Filter the output based on the twa size

Disabled

Filter the output for disabled transactions

Enabled

Filter the output for enabled transactions

AlwaysUseCache

Filter the output for transactions that always use the cache or follow the region option

Sort

Sort the output Valid values are:

  • None

  • Id

  • RegionId

  • Name

  • Program

  • TwaSize

  • Disabled

  • AlwaysUseCache

QIX.Cmd get servers

returns all the servers

Miscellaneous
Table 12. Details of command-line options for QIX.Cmd get servers in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region Name

ServerId

Filter the output based on the server id

Status

Filter the output based on the status of the servers Valid values are:

  • None

  • Running

  • ShutDown

  • Unresponsive

TerminalServer

Filter the output to only get terminal servers

ProcessingServer

Filter the output to get only processing servers

ServerHost

Filter the output based on the server host

Sort

Sort the output Valid values are:

  • None

  • RegionId

  • ServerId

  • ServerType

  • ServerStatus

  • ServerHost

QIX.Cmd get tdqueues

returns all the td queues

Miscellaneous
Table 13. Details of command-line options for QIX.Cmd get tdqueues in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region Name

Id

Filter the output based on the td queue id

Name

Filter the output based on the td queue name

MsmqHost

Filter the output based on the transaction msmq host

Enabled

Filter the output based on the td queue enabled/disabled

Sort

Sort the output Valid values are:

  • None

  • RegionId

  • TdQueueId

  • TdQueueName

  • TdQueueMsmqHost

  • TdQueueEnabled

QIX.Cmd get files

returns all the files

Miscellaneous
Table 14. Details of command-line options for QIX.Cmd get files in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionId

Filter the output based on the region id

RegionName

Filter the output based on the region name

FileName

Filter the output based on the file name

Dsn

Filter the output based on the dsn

Status

Filter the output based on file status Valid values are:

  • Unknown

  • Enabled

  • Disabled

  • Unenabled

QIX.Cmd add-region

creates and adds a new empty region

Miscellaneous
Table 15. Details of command-line options for QIX.Cmd add-region in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region to create

This argument is mandatory.

ApplicationConnectionString

Connection string to the business database.

LogLevel

The logLevel of the new region Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

StringRuntimeEncoding

The runtime encoding of the new region

ServiceBrokerConnectionString

Service Broker Admin Connection string to create queues and services on the Service Broker Database. If omitted, the QixConnectionString will be used

ServiceBrokerUserConnectionString

Service Broker User Connection string to send and receive messages on the Service Broker Database. If omitted, the ServiceBrokerConnectionString will be used

TSQueuesConnectionString

The connection string to the SQLServer database used for storing the temporary storage queues

DBDriver

DB Target for the applications Valid values are:

  • None

  • SQLServer

  • Db2

  • Postgres

  • Oracle

QueueConnectionString

The connection string to the queues

Cwasize

The CWA size

Secmgrcfg

Secmgrcfg

Codepage

The code page

QIX.Cmd clone-region

creates and adds a new empty region and copies all the components (transactions, maps paths, programs paths, …​) of another region into it

Miscellaneous
Table 16. Details of command-line options for QIX.Cmd clone-region in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

FromRegionName

Region name to copy from

This argument is mandatory.

ToRegionName

Region name to copy to

This argument is mandatory.

QIX.Cmd remove-region

removes a region with all its components

Miscellaneous
Table 17. Details of command-line options for QIX.Cmd remove-region in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

QIX.Cmd edit-region

edits a region

Miscellaneous
Table 18. Details of command-line options for QIX.Cmd edit-region in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

ApplicationConnectionString

The new application connection string of the region

Cwasize

The new cwa size of the region

Secmgrcfg

The new secmgrcfg of the region

QueueConnectionString

The new queue connection string of the region

Codepage

The new codepage of the region

StringRuntimeEncoding

The new string runtime encoding of the region

ParallelDestination

The new parallel destination of the region

RegionLogLevel

The new logLevel of the region Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

QIX.Cmd add-region-option

adds a region option (OptionName → OptionValue)

Miscellaneous
Table 19. Details of command-line options for QIX.Cmd add-region-option in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

OptionName

The name of the option that will be added Valid values are:

  • None

  • APPLID

  • SYSID

  • AppCleanupSessionProc

  • ServiceBrokerCS

  • SharedMemSize

  • TerminalTimeout

  • UCTRANST

  • InitialTransaction

  • MaxThreads

  • ThreadTime

  • ReactiveTransactions

  • MaxCollationChar

  • APIListener

  • AutoMapAssemblyList

  • Catalog

  • LockingBehavior

  • LogProgramOutput

This argument is mandatory.

OptionValue

The value of the option that will be added

This argument is mandatory.

QIX.Cmd remove-region-option

removes a region option

Miscellaneous
Table 20. Details of command-line options for QIX.Cmd remove-region-option in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

OptionName

The name of the option that will be deleted Valid values are:

  • None

  • APPLID

  • SYSID

  • AppCleanupSessionProc

  • ServiceBrokerCS

  • SharedMemSize

  • TerminalTimeout

  • UCTRANST

  • InitialTransaction

  • MaxThreads

  • ThreadTime

  • ReactiveTransactions

  • MaxCollationChar

  • APIListener

  • AutoMapAssemblyList

  • Catalog

  • LockingBehavior

  • LogProgramOutput

This argument is mandatory.

QIX.Cmd edit-region-option

edits the value of a region option

Miscellaneous
Table 21. Details of command-line options for QIX.Cmd edit-region-option in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

OptionName

The name of the option that will be updated Valid values are:

  • None

  • APPLID

  • SYSID

  • AppCleanupSessionProc

  • ServiceBrokerCS

  • SharedMemSize

  • TerminalTimeout

  • UCTRANST

  • InitialTransaction

  • MaxThreads

  • ThreadTime

  • ReactiveTransactions

  • MaxCollationChar

  • APIListener

  • AutoMapAssemblyList

  • Catalog

  • LockingBehavior

  • LogProgramOutput

This argument is mandatory.

OptionValue

The new value for the option

This argument is mandatory.

QIX.Cmd add-transaction

adds a transaction

Miscellaneous
Table 22. Details of command-line options for QIX.Cmd add-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the transaction that will be added

This argument is mandatory.

Program

The program name of the transaction that will be added

This argument is mandatory.

TwaSize

The twa size of the transaction that will be added

Initial

The transaction as the initial transaction

Disable

Disable the transaction that will be added

Enable

Enable the transaction that will be added

AlwaysUseCache

Always check the cached config for disabled transactions regardless of the region option

QIX.Cmd add-transactions

adds multiple transactions

Miscellaneous
Table 23. Details of command-line options for QIX.Cmd add-transactions in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Transaction

a semicolon separated list of the transaction name and program name separated by a colon. E.g., -Transaction='TR01:Pr01;TR02;Pr02'

This argument is mandatory.

QIX.Cmd remove-transaction

removes a transaction

Miscellaneous
Table 24. Details of command-line options for QIX.Cmd remove-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the transaction that will be removed

This argument is mandatory.

QIX.Cmd enable-transaction

enable a transaction

Miscellaneous
Table 25. Details of command-line options for QIX.Cmd enable-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the transaction that will be enabled

This argument is mandatory.

QIX.Cmd disable-transaction

disable a transaction

Miscellaneous
Table 26. Details of command-line options for QIX.Cmd disable-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the transaction that will be disabled

This argument is mandatory.

QIX.Cmd edit-transaction

edits a transaction

Miscellaneous
Table 27. Details of command-line options for QIX.Cmd edit-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of transaction in question

This argument is mandatory.

NewRegionName

The name of the new region to which the transaction is connected

Program

The new program name of the transaction

TwaSize

The new twa size of the transaction

AlwaysUseCache

Always check the cached config for disabled transactions regardless of the region option

QIX.Cmd add-maps-path

adds a mapsPath

Miscellaneous
Table 28. Details of command-line options for QIX.Cmd add-maps-path in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

MapsPath

The path of the mapsPath that will be added

This argument is mandatory.

QIX.Cmd remove-maps-path

removes a mapsPath

Miscellaneous
Table 29. Details of command-line options for QIX.Cmd remove-maps-path in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

MapsPath

The mapsPath that will be deleted

This argument is mandatory.

QIX.Cmd add-programs-path

adds a programsPath

Miscellaneous
Table 30. Details of command-line options for QIX.Cmd add-programs-path in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

ProgramsPath

The programsPath path that will be added

This argument is mandatory.

QIX.Cmd remove-programs-path

removes a programsPath

Miscellaneous
Table 31. Details of command-line options for QIX.Cmd remove-programs-path in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

ProgramsPath

The programsPath that will be deleted

This argument is mandatory.

QIX.Cmd add-tdqueue

adds a TD queue

Miscellaneous
Table 32. Details of command-line options for QIX.Cmd add-tdqueue in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the TD queue that will be added

This argument is mandatory.

MsmqHost

The msmq host of the TD queue that will be added

Enabled

Enables/disables the tq queue that will be added

ServiceBrokerConnectionString

Service Broker Admin Connection string to create queues and services on the Service Broker Database. If omitted, the QixConnectionString will be used

TransId

Name of the transaction that is to be automatically initiated when the trigger level is reached

TriggerLevel

The number of records to be accumlated before a task is automatically initiated to process them

Properties

Properties that can be added to the td queue

QIX.Cmd remove-tdqueue

removes a TD queue

Miscellaneous
Table 33. Details of command-line options for QIX.Cmd remove-tdqueue in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

TdQueueName

The name of the TD queue that will be deteled

This argument is mandatory.

QIX.Cmd edit-tdqueue

edits a TD queue

Miscellaneous
Table 34. Details of command-line options for QIX.Cmd edit-tdqueue in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the TD queue in question

This argument is mandatory.

MsmqHost

The new msmq host of the TD queue

Enable

Enable or disable the TD queue

TransId

Name of the transaction that is to be automatically initiated when the trigger level is reached

TriggerLevel

The number of records to be accumlated before a task is automatically initiated to process them

Properties

New properties for the td queue

ClearStatus

Clear the error status of the trigger transaction

QIX.Cmd write-tdqueue

write data to a TD queue

Miscellaneous
Table 35. Details of command-line options for QIX.Cmd write-tdqueue in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the TD queue that will be added

This argument is mandatory.

Data

Path to the file containing the bytes to send

This argument is mandatory.

QIX.Cmd read-tdqueue

reads data from a TD queue

Miscellaneous
Table 36. Details of command-line options for QIX.Cmd read-tdqueue in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

Name

The name of the TD queue that will be added

This argument is mandatory.

Data

Output file path. If not provided program will output to STDOUT

QIX.Cmd add-forward-transaction

adds a forward transaction

Miscellaneous
Table 37. Details of command-line options for QIX.Cmd add-forward-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

TransactionId

The transaction id of forward transaction that will be added

This argument is mandatory.

Destination

The destination of forward transaction that will be added

This argument is mandatory.

RemoteTransaction

The remote transaction of forward transaction that will be added

This argument is mandatory.

QIX.Cmd remove-forward-transaction

removes a forward transaction

Miscellaneous
Table 38. Details of command-line options for QIX.Cmd remove-forward-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

TransactionId

The transaction id of forward transaction that will be deleted

This argument is mandatory.

QIX.Cmd edit-forward-transaction

edits a forward transaction

Miscellaneous
Table 39. Details of command-line options for QIX.Cmd edit-forward-transaction in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

TransactionId

The transaction id of forward transaction that will be edited

This argument is mandatory.

Destination

The new destination of the forward transaction

RemoteTransaction

The new remote transaction of the forward transaction

QIX.Cmd add-forward-destination

adds a forward destination

Miscellaneous
Table 40. Details of command-line options for QIX.Cmd add-forward-destination in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

HostName

The host name of forward destination that will be added

This argument is mandatory.

HostId

The host id of forward destination that will be added

This argument is mandatory.

Port

The port of forward destination that will be added

This argument is mandatory.

QIX.Cmd remove-forward-destination

removes a forward destination

Miscellaneous
Table 41. Details of command-line options for QIX.Cmd remove-forward-destination in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

HostId

The host id of forward destination that will be deleted

This argument is mandatory.

QIX.Cmd edit-forward-destination

edits a forward destination

Miscellaneous
Table 42. Details of command-line options for QIX.Cmd edit-forward-destination in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

HostId

The host id of forward destination in question

This argument is mandatory.

HostName

The new host name of the forward destination

Port

The new port of the forward destination

QIX.Cmd add-file

add a file entry with the logical name, dsn name and a status to the configuration

Miscellaneous
Table 43. Details of command-line options for QIX.Cmd add-file in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

FileName

The name of the file in question

This argument is mandatory.

Dsn

The dsn name of the file

This argument is mandatory.

Status

The status of the file Valid values are:

  • Unknown

  • Enabled

  • Disabled

  • Unenabled

QIX.Cmd remove-file

remove a file entry from the configuration

Miscellaneous
Table 44. Details of command-line options for QIX.Cmd remove-file in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

FileName

The name of the file in question

This argument is mandatory.

QIX.Cmd enable-file

enable a file so that it can again be accessed in the current region

Miscellaneous
Table 45. Details of command-line options for QIX.Cmd enable-file in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

FileName

The name of the file that should be enabled

This argument is mandatory.

QIX.Cmd disable-file

disable a file so that it can no longer be accessed in the current region until it is re-enabled

Miscellaneous
Table 46. Details of command-line options for QIX.Cmd disable-file in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

FileName

The name of the file that should be disabled

This argument is mandatory.

QIX.Cmd edit-file

edits a file

Miscellaneous
Table 47. Details of command-line options for QIX.Cmd edit-file in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

FileName

The name of file in question

This argument is mandatory.

Dsn

The new dsn of the file

Status

The new status of the file Valid values are:

  • Unknown

  • Enabled

  • Disabled

  • Unenabled

QIX.Cmd download-file-config

creates a file config based on the files in the config database and writes it in a file

Miscellaneous
Table 48. Details of command-line options for QIX.Cmd download-file-config in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

FileConfig

The path to the file where the resulting file config should be written

This argument is mandatory.

Catalog

The name of the catalog used in the file config. When not given, the value for the region option Catalog will be used. If that is not given, the default value becomes 'Raincode.Catalog.xml'

QIX.Cmd upload-file-config

given a file config, add all files in the config database

Miscellaneous
Table 49. Details of command-line options for QIX.Cmd upload-file-config in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

FileConfig

The path to the file config

This argument is mandatory.

Conflict

Indicates what to do in case of a conflict between given fileconfig and existing config. Error will throw an error if a new value is given for an existing catalog/file. Ignore ignores the difference and keeps the value in the existing config. Update will update the existing value with the new value of the given file config Valid values are:

  • Error

  • Ignore

  • Update

QIX.Cmd setup-env

creates a region with the transactions, TD queues and files of the given CSD file

Miscellaneous
Table 50. Details of command-line options for QIX.Cmd setup-env in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

FileName

The file containing the environment of the mainframe, from which we will retrieve the transaction with their corresponding transactions and the TD queues

This argument is mandatory.

RegionName

The name of the region to create and to which the transactions and TD queues will be added

This argument is mandatory.

ApplicationConnectionString

The connection string to the business database used to create the region

StringRuntimeEncoding

The runtime encoding used to create the region

ServiceBrokerConnectionString

Service Broker Admin Connection string to create queues and services on the Service Broker Database. If omitted, the QixConnectionString will be used

ServiceBrokerUserConnectionString

Service Broker User Connection string to send and receive messages on the Service Broker Database. If omitted, the ServiceBrokerConnectionString will be used

TSQueuesConnectionString

The connection string to the SQLServer database used for storing the temporary storage queues

DBDriver

DB Target for the applications Valid values are:

  • None

  • SQLServer

  • Db2

  • Postgres

  • Oracle

filterList

Filter on list so that only their resources are added

filterGroup

Filter on groups so that only their resources are added

QIX.Cmd Execute

Call a region external api to execute a program.

Miscellaneous
Table 51. Details of command-line options for QIX.Cmd Execute in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region you are connecting to

This argument is mandatory.

Program

Name of the Program you are executing

This argument is mandatory.

CommAreaLength

Length of the CommArea. Only needs to be specified if the length of the commArea is different from the length of the data present in the file.

InboundCommAreaLength

Length of the result data. Only need to be provided if the server should return only a small portion of the commarea.

Transaction

Value EIBTRNID will return to the program.

Data

Path to the file containing the bytes to send

OutputFile

Output file path. If not provided program will output to STDOUT

QIX.Cmd Admin

Set of commands to administrate the Qix configuration and database

Options
Table 52. Details of command-line options for QIX.Cmd Admin in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

SubCommands

DropAllObjects: Drop all service broker objects.

CreateObjects: Create all service broker objects.

ClearConversations: End all the conversations in conversations queues.

QIX.Cmd Admin DropAllObjects

Drop all service broker objects.

Miscellaneous
Table 53. Details of command-line options for QIX.Cmd Admin DropAllObjects in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

QIX.Cmd Admin CreateObjects

Create all service broker objects.

Miscellaneous
Table 54. Details of command-line options for QIX.Cmd Admin CreateObjects in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

QIX.Cmd Admin ClearConversations

End all the conversations in conversations queues.

Miscellaneous
Table 55. Details of command-line options for QIX.Cmd Admin ClearConversations in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The region name in question

This argument is mandatory.

QIX.Cmd status-region

returns the status of a region: active when it has at least one active server; otherwise inactive

Miscellaneous
Table 56. Details of command-line options for QIX.Cmd status-region in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

QIX.Cmd stop-region

stops all the servers in a region

Miscellaneous
Table 57. Details of command-line options for QIX.Cmd stop-region in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

RegionName

The name of the region in question

This argument is mandatory.

QIX.Cmd stop-server

stops a server

Miscellaneous
Table 58. Details of command-line options for QIX.Cmd stop-server in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

ServerId

The server id of the server that will be stopped

This argument is mandatory.

QIX.Cmd recycle-server

shuts down a server with exit code 2 to allow reloading after stopping when catching this exit code. Note, restarting the server should be done manually after catching exit code 2

Miscellaneous
Table 59. Details of command-line options for QIX.Cmd recycle-server in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

ServerId

The server id of the server that will be stopped for reloading

This argument is mandatory.

QIX.Cmd generate-permission-files

generates two SQL files that specify the roles and permissions: (1) QixConfigPermissionsFile.sql contains the permissions for the QixConfig database user to interact with the stored procedures and functions related to the QIX instance; (2) QixTsQueuePermissionsFile.sql contains the permissions required for the QixTsQueue database user to interact with the TS queues. For more information, see the above section

Miscellaneous
Table 60. Details of command-line options for QIX.Cmd generate-permission-files in category Miscellaneous
Command-line option Description

Help

Displays the tool’s help information.

2.3. BMS compiler

The BMS compiler (rcbms.exe) is a command-line tool that can be used compile the original BMS screen definitions into a COBOL or PL/I symbolic map and an XML version of the map. These XML maps need to be placed in the maps path and are used by the terminal server to create the TN3270 data stream.

This is an area where QIX is very different from CICS on the mainframe, where BMS maps are compiled into a binary format. XML has been preferred, as it is more flexible and versatile.
Miscellaneous
Table 61. Details of command-line options for rcbms in category Miscellaneous
Command-line option Default value Description

AlignSymbolicMap

False

Align the symbolic map fields with fillers to have the fields start on even offsets.

CobolSymbolicMapFileExtension

.cpy

Symbolic map file extension for COBOL

CopybooksOutputDirectory

Directory where the copybooks will be created.

CSharpSymbolicMapFileExtension

.cs

Symbolic map file extension for C#

DotNetConfigFile

This command-line option is an additional .net 'app.config' file.

ExpandedOutputDirectory

The location where the map compiler will save the expanded version of the map. The expanded file will have the form 'filename.expanded.extension'

FetchNameFromComment

False

Check the actual name of a field in the comment on the line before.

FileExtension

bms

When specifying a directory, only the files with the specified extension will be processed. Can be specified with or without dot. Specify an empty string for extensionless files, specify * for all files.

GenBasedSymbolicMap

False

Generate the symbolic mapset copybook in a single file, with the output structure based/redefining the input structure.

GenSymbolicMap

Generate the symbolic mapset copybook. Two different files will be created: one for the input structure, and one for the output structure.

Help

Displays the tool’s help information.

IgnoreUnkownArgs

IncludeDirectory

.

Specify the directories containing the BMS include files. Several directories can be specified separated by ';'.

IncludeExtension

;.bms

Provides a semicolon separated set of extensions to use when opening include files. '.' character must be explicitly specified. Example: -IncludeExtension=.foo,.bar.

Info

False

Displays a description of the program.

InputEncoding

utf-8

The encoding of the BMSFile.

Language

Indicate the language for the symbolic map. Valid values are:

  • cobol

  • pli

  • csharp

LogLevel

INFO

Specifies the log level. Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

MapsOutputDirectory

Directory that will contain the physical XML maps.

OutputEncoding

The encoding of the generated include/copybooks.

PliSymbolicMapFileExtension

.plinc

Symbolic map file extension for PL/I

TabWidth

4

The number of spaces by which a tab character will be replaced when found in the BMS file.

Version

False

Displays the version information.

Repository
Table 62. Details of command-line options for rcbms in category Repository
Command-line option Default value Description

RepoConnectString

The repository connection string. See also the DBDriver option.

RepoDriver

Sets the connection string to use for the repository persistence system as an ODBC connection string if ODBC persistence is used or as a physical file name if SQLITE is used instead. See also the DBConnectString option. Values can be any of the following: Valid values are:

  • ODBC

  • Sqlite

ScanOnly

False

Parse and scan the DBD, but do not produce any code (.sql or .cs). This is useful for checking DBD syntax for compatibility.

2.4. Terminal Server Transport Layer Security

Introduction

Raincode QIX and IMSql both support Transport Layer Security (TLS/SSL) on their Terminal Servers, including mutual authentication through client certificate validation.

For the sake of the readability of the documentation, this section is repeated identically in the QIX and IMSql manuals.
Server authentication

To enable TLS on the Terminal Server, the -TlsServerCertificatePath option must be provided, giving a path to the server certificate chain in PEM format. The -TlsServerPrivateKeyPath option must also be provided, giving the path to the (unencrypted) server private key in PEM format.

The server must be configured with the full certificate chain, i.e. its own certificate and all necessary intermediate CA certificates required to establish a trust chain to the root CA. Without this, server authentication will not succeed.
For security reasons, users should ensure that the unencrypted server private key is properly protected, e.g. by way of restrictive file access permissions.
Example invocation enabling TLS server authentication
TerminalServer [other options] -TlsServerCertificatePath=/path/to/cert/server-chain.cert.pem -TlsServerPrivateKeyPath=/path/to/key/server.key.pem
Client authentication

The Terminal Server also supports client authentication (also known as mutual authentication). It can be configured to require clients to present a valid certificate, and it also allows the server to use a custom trust store to validate those certificates. By default, client certificates are not required.

The client authentication only makes sense if server authentication is enabled.

To enable client authentication, set the -TlsRequireClientAuthentication flag. By default, client certificates are validated using the system’s trust store (e.g. Trusted Root Certification Authorities on Windows, or the OpenSSL trust store on Linux). The trust store used for validation can be overridden by using the TlsCertificateAuthorityFilePath option, which should point to a PEM file containing all the CA certificates trusted by the Terminal Server for client authentication.

By default, the revocation status of client certificates is checked online by way of certificate revocation list (CRL) checks or the OCSP protocol. Client authentication will fail if the client certificate has been revoked by its certificate authority, or if the revocation status cannot be assessed (e.g. if the CRL cannot be accessed through the network). To disable revocation checks (i.e. trust any client certificate signed by a trusted CA, regardless of revocation status), the -TlsCheckClientCertificateRevocation=false flag can be passed to the Terminal Server.

Revocation status checks are enabled by default.
Example invocation enabling TLS client authentication
TerminalServer [other options] -TlsServerCertificatePath=/path/to/cert/server-chain.cert.pem -TlsServerPrivateKeyPath=/path/to/key/server.key.pem -TlsRequireClientAuthentication -TlsCheckClientCertificateRevocation=false -TlsCertificateAuthorityFilePath=/path/to/store/custom-ca-certificates.pem

2.5. Runners

Each Raincode QIX server component materialized by an executable supports its own set of command-line options.

2.5.1. Terminal Server command-line options

Miscellaneous
Table 63. Details of command-line options for Qix.TerminalServerRunner in category Miscellaneous
Command-line option Default value Description

ConfigConnectionString

The SQL Server connection string to the database where the region configuration will be fetched.

DisableAutoReload

False

Disables the automatic relodin of the configuration every heart beat

DotNetConfigFile

This command-line option is an additional .net 'app.config' file.

GMText

good morning message

Help

Displays the tool’s help information.

IgnoreLocalHostPing

False

Ignore connection from localhost (127.0.0.1) send by Azure monitoring

IgnoreUnkownArgs

Info

False

Displays a description of the program.

LogLevel

WARNING

Specifies the log level. Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

LogsDirectory

Dump server logs in the specified directory.

OnlineValidationConnectionString

OnlineValidationLogPath

ParallelMode

User

The mode in which the parallel mode is to be run Valid values are:

  • User

  • Developer

ParallelSyncPluginConfig

Region

The name of the region to join.

ServerName

The name of the server as it will appear in the administration interface.

TcpPort

The TCP/IP port on which the terminal server will listen for incoming TN3270 connections. Defaults to 23, or 992 if TLS is enabled.

TctuaSize

0

The size of the TCTUA in bytes.

Version

False

Displays the version information.

Plugin
Table 64. Details of command-line options for Qix.TerminalServerRunner in category Plugin
Command-line option Description

Plugin

The list of plugins to be loaded when the tool executes.

PluginPath

This command-line option specifies the path to plugins that are searched.

Transport Layer Security
Table 65. Details of command-line options for Qix.TerminalServerRunner in category Transport Layer Security
Command-line option Default value Description

TlsCertificateAuthorityFilePath

Path to the Certificate Authority file to be used for client certificate validation. If not specified, the default system trust store will be used.

TlsCheckClientCertificateRevocation

True

Check revocation status of client certificates. Defaults to true.

TlsRequireClientAuthentication

Require client certificate validation (mutual authentication) to establish TLS sessions. Defaults to false.

TlsServerCertificatePath

Path to the server certificate in PEM format to be used for TLS. Enables TLS.

TlsServerPrivateKeyPath

Path to the (unencrypted) server private key in PEM format to be used for TLS. Required if TLS is enabled.

2.5.2. Processing Server command-line options

Miscellaneous
Table 66. Details of command-line options for Qix.ProcessingServerRunner in category Miscellaneous
Command-line option Default value Description

CatalogConfiguration

The path to a batch Catalog configuration file, enabling usage of DSN in FileConfig

ConfigConnectionString

The SQL Server connection string to the database where the region configuration will be fetched.

DisableAutoReload

False

Disables the automatic relodin of the configuration every heart beat

DotNetConfigFile

This command-line option is an additional .net 'app.config' file.

FileConfig

The path to a file configuration file

Help

Displays the tool’s help information.

IgnoreUnkownArgs

Info

False

Displays a description of the program.

LogLevel

WARNING

Specifies the log level. Valid values are:

  • SILENT

  • ERROR

  • WARNING

  • PROGRAM_OUTPUT

  • PROGRAM

  • INFO

  • DEBUG

  • TRACE

  • DIAGNOSTIC

LogProgramOutput

False

Includes what would be written to the console by the program to the QIX log file. This has no effect when SYSOUT is redirected to a file.

LogsDirectory

Dump server logs in the specified directory.

MaxThreads

The maximum number of transactions the processing server can execute concurrently.

Region

The name of the region to join.

SafeMemoryMode

Enables safe mode in memory allocator. Works in conjunction with the :VerifyMemory flag on the compilers.

ServerName

The name of the server as it will appear in the administration interface.

TraceAll

Enable all QIX statements tracing.

Version

False

Displays the version information.

Plugin
Table 67. Details of command-line options for Qix.ProcessingServerRunner in category Plugin
Command-line option Description

Plugin

The list of plugins to be loaded when the tool executes.

PluginPath

This command-line option specifies the path to plugins that are searched.

3. Implementing a plugin

The Raincode runtime enables for certain selected functionalities to provide a custom implementation dynamically. Depending on the specifics of each functionality, the classes, methods, parameters and return values will vary, but they all follow a common mechanism. This section explains how to implement and register a Raincode QIX plugin, as well as the various plugin interfaces that QIX supports.

The QIX processing and terminal servers automatically load all plugins from their respective plugin directory. Within the %RCDIR%\plugins directory, both the terminal and the processing server have their own subdirectories.

Additionally, both servers support the use of the Plugin and PluginPath command-line arguments, so plugins can be placed anywhere on the file system.

3.1. Developing a plugin

To develop a plugin for QIX, a reference to a rcqixlib library, which is located in %RCDIR%/rcpackages needs to be added to the project. This library contains the classes and interfaces required to interact with QIX at the C# level. Plugins must abide to the existing type system to interact gracefully with QIX components. Every plugin hook in Raincode QIX is exposed using a static instance of the generic Raincode Plugin class (see the list of plugin hooks for QIX ).

The assembly of the plugin needs to declare itself as an assembly that will interact with the plugin hook, i.e. providing a plugin implementation.

To do this, an assembly attribute of the following form needs to be added:

[assembly:PluginProvider(typeof(NameSpace.To.Plugin.Plugin),"RegisterPlugin")]

where the first parameter (NameSpace.To.Plugin.Plugin) is the type of the class of the plugin that contains a RegisterPlugin method, as stated in the second parameter.

QIX will call the RegisterPlugin method right after loading the assembly. This method should register the entry point of the plugin with the QIX hook. To register the plugin, the method calls the static Provide method of the plugin hook. For example, in the case of creating a Qix Factory plugin this would be:

RaincodeLegacyQixInterface.QixInstances.QixFactory.ConstructorPlugin.Provide(priority, delegateMethod)

The Provide method takes two parameters:

  • Priority: determines the order in which plugins are executed

  • delegateMethod: .NET delegate type (i.e. a method signature). Each specific plugin hook will have its own kind of delegate, i.e. its own kind of method that accepts a list of parameters and return a value.

Calling the Provide method adds the method delegate to the plugin hook, with the chosen priority.

From this point on, whenever the runtime needs a plugin, e.g. for QixFactory, the hook will call each registered delegate (i.e. method implementation) in descending priority order until one returns an object. Depending on the type of plugin hook, the method will receive different types of arguments, and can use these to perform any plugin initialization, as needed.

To continue the QixFactory example, a possible delegate is the following builder method, which simply instantiates a new factory with the given QIX context:

public static QixFactory builder(IQixContext context){
    return new MyQixFactory(context);
}

Once a plugin has been initialized in this way, the methods on this object will be called according to the API for the plugin (as specified in the interface or abstract class definition of the plugin).

3.2. Minimal example: a Password Plugin

Raincode supports the use of a password plugin to allow the secure management of database credentials. The plugin is invoked just before executing the connection call to the database layer, ensuring that the actual password is retrieved at the latest possible moment of code execution. This approach securely injects connection details into the Processing and Terminal Servers at runtime, eliminating the need to hardcode credentials and ensuring that the full connection string, including the password, never appears in any log file.

This section provides a minimal example plugin that retrieves credentials from an environment variable, e.g. QIX_PROD_CONNSTRING, and uses them as the connection string to the database. This allows the actual connection string to be securely provided by the environment variable, instead of being hardcoded in source code or a file.

To include the plugin at execution of the terminal server, e.g. for the BankDemo example, the command line is as follows:

"%RCBIN%\QIX.TerminalServerRunner.exe" -Region="BankDemo" -ConfigConnectionString="QIX_PROD_CONNSTRING" -PluginPath="C:\Plugins" -Plugin="ConnectionStringRewriter.dll"

The command line specifies that the configuration connection string is QIX_PROD_CONNSTRING and that the plugin in C:\Plugins\ConnectionStringRewriter.dll, detailed below, needs to be used.

Looking at the source code below, we see:

  • The assembly attribute identifying the plugin class and registration method (Register).

  • The Register method that registers the plugin with the PasswordRewriter hook, giving a priority of 10 and the MapConnectionString method as the entry point for the plugin.

  • The MapConnectionString(string connectionString) method that will receive the value of the ConfigConnectionString argument and look up the environment variable with that name.

If environment variable lookup fails, the system will return null, which the plugin hook will interpret as a refusal of the plugin to cooperate. The hook will then attempt to execute lower-priority plugins, and if none exist or cooperate, the value of the ConfigConnectionString argument will be used as the connection string to the database.
using RainCode.Core.Plugin;
using RainCodeLegacyRuntimeUtils;

[assembly: PluginProvider(typeof(ConnectionStringRewriter.RewriteConnectionString), nameof(ConnectionStringRewriter.RewriteConnectionString.Register))]

namespace ConnectionStringRewriter
{
    public class RewriteConnectionString
    {
        public static void Register()
        {
            PasswordMapping.PasswordRewriter.Provide(10, MapConnectionString);
        }
        private static string MapConnectionString(string connectionString)
        {
            /* Get the actual connection string from the environment variable */
            return Environment.GetEnvironmentVariable(connectionString);
        }
    }

}

3.3. Sample: Terminal Server Session

As the name implies, this plugin is designed for the Terminal Server. It establishes a terminal session either with QIX or a remote mainframe through an API.

The plugin can be found in the TSPlugin subdirectory within the plugins directory. It contains one class called SessionPlugin and the plugin hook method with the type Plugin<IPluginSessionApi, string, bool> . This means that the delegate method that creates the plugin is provided with an IPluginSessionApi and string arguments, and should return a bool to acknowledge whether initialization was successful.

The first argument is an object that implements the IPluginSessionApi interface. It provides methods for initiating and terminating terminal sessions, as well as sending and receiving messages within a session.

The second argument, the configuration string is currently unused but reserved for future use, such as receiving a command-line argument of the terminal server.

The plugin connects to a remote terminal and performs a number of operations. (For further details, refer to the source code in the TSPlugin directory).

3.3.1. The IPluginSessionApi interface

This section provides a bit more detail on the IPluginSessionApi interface.

public interface IPluginSessionApi
{
    Guid ConnectLocal(ITerminalInfo terminalInfo, Encoding terminal, Encoding local);
    Guid ConnectRemote(TcpClient client);

    void Disconnect(Guid guid);
    byte[] Receive(Guid guid);
    void Send(Guid guid, byte[] dataBuffer);
}

The ConnectLocal function has the transaction’s executions performed by the local QIX processing server. It takes the following input parameters:

  • The IBM 3270 model. (The ITerminalInfo interface provides methods for retrieving the IBM3270 terminal model.)

  • The terminal encoding.[1]

  • The encoding used by the application programs

In contrast, the ConnectRemote function connects to a remote QIX server and takes a TcpClient instance to connect remotely to:

  • The target hostname

  • The target port number

Both connect functions return the Guid.[2] of the created session, which is the first parameter of the send, receive, and disconnect functions.

The Send function takes the following input parameters:

  • A session Guid

  • An array of bytes containing the input 3270 stream

The Receive function takes the following input parameter:

  • A session Guid

The Receive function returns an array of bytes. If no new data is currently available from the target, it returns null; if data is available, it returns the output 3270 stream.

This function is non-blocking. If no new data is available, it immediately returns null without waiting. It is the responsibility of the calling thread to invoke it again after an adequate sleeping time.

The Disconnect function takes the following input parameter:

  • The Guid of the session that need to be closed

3.4. Sample: Active Directory Plugin

This plugin is also for the Terminal Server and allows authentication in QIX via the SIGNON and SIGNOFF commands. An example Active Directory plugin is included and can be found inside the QIX directory in the plugins directory.

This implementation for QIX provides almost full support for the SIGNON and SIGNOFF commands, with one exception that the user groups are not supported.

The plugin has to be configured, e.g., to configure the creation of the Active Directory PrincipalContext object that acts as a gateway to the directory service. This configuration string is contained in the SecurityManagerConfig parameter of the QIX region. For more details on how to set it, refer to the section Configuring Raincode QIX.

The available input parameters are given below. For more details, see the respective Microsoft Active Directory documentation:

  1. ContextParameters: These parameters will be used to create a System.DirectoryServices.AccountManagement.PrincipalContext object. The names of these parameters map naturally to the parameters of the PrincipalContext constructor.

    • ContextType

    • ContextName

    • ContextContainer

    • ContextOptions

    • ContextUser

    • ContextPassword

      The ContextType parameter is mandatory, and depending on its value, other parameters may be required as well.
  2. Identity parameters are used to find a System.DirectoryServices.AccountManagement.UserPrincipal object associated with the userId specified in the QIX SIGNON command.

    • IdentityType: specifies the format of the identity. The default is Name.

    • IdentityFormat: .NET composite format string mapping a userId to the name used by the directory service. The default is {0}.

      For example, if QIX user ABCDE has the Security Account Manager name U_ABCDE, then the identityType=SamAccountName and identityFormat=U_{0}.

  3. User parameters are used in the PrincipalContext.ValidateCredentials method call. These parameters will have different default values, depending on the ContextType. If ContextType=Machine, the default values for UserOptions and UserLogin are Negotiate and Name. In any other case, it will be SimpleBind and DistinguishedName.

    • UserOptions: The type is System.DirectoryServices.AccountManagement.ContextOptions

    • UserLogin: The type is System.DirectoryServices.AccountManagement.IdentityType

To pass the specified parameters for the QIX region where the signon or signoff occurs, they should be separated by the ';' symbol, concatenated, and contained in the SecurityManagerConfig parameter.

Below are some example configuration strings:

  1. ContextType=Machine: this is the minimal example.

  2. ContextType=Machine;UserOptions=Negotiate|Sealing: In the case of multiple values for ContextOptions parameter type like ContextOptions or UserOptions the values should be separated by '|'.

  3. ContextType=ApplicationDirectory;ContextName=127.0.0.1:389;ContextContainer=CN=Partition1,DC=raincode,DC=com;ContextOptions=SimpleBind;ContextUser=Me;ContextPassword=myPassword;IdentityType=Name;IdentityFormat={0};UserOptions=SimpleBind;UserLogin=DistinguishedName; : this is a complete example, where all the parameters are specified.

Plugin API

The ISecurityManager interface specifies the methods called when authentication is performed either through SIGNON or SIGNOFF commands.

An authentication plugin should implement this interface.

public interface ISecurityManager
{
	IUser Default { get;}
	IUser SignOn (IUser currentUser,
				  IUser nextUser,
				  ISignOnStatement statement);
	IUser SignOff(IUser currentUser,
				  IUser nextUser,
				  ISignOffStatement statement);
}

The currentUser is the user who executes a CESN or CESF transaction for SIGNON and SIGNOFF, respectively, and the nextUser will be the user after completion of this command.

The description of helper interfaces is provided below. Note that for IUser, the result of a CICS ASSIGN USERID will be the value that is contained in Name.

public interface IUser
{
	bool IsDefault { get;}
	string Name { get;}
}
public interface ISignOnStatement
{
	string USERID { get; set; }
	string PASSWORD { get; set; }
	string NEWPASSWORD { get; set; }
	byte[] OIDCARD { get; set; }
	int ESMReason { get; set; }
	int ESMRESP { get; set; }
	string LANGINUSE { get; set; }
	string NATLANGINUSE { get; set; }
	EResp RESP { get; set; }
	int RESP2 { get; set; }
}

public interface ISignOffStatement
{
	EResp RESP { get; set; }
	int RESP2 { get; set; }
}

3.5. Sample: Setting up a login transaction in QIX

3.5.1. The DFHSNP transaction

A login transaction that can be used to authenticate users before they access other transcations in a region is readily available in Raincode QIX. The login transaction can be added to your QIX project while configuring the regions using Qix.Cmd. To do so, add the following line when setting up the region for which authentication is required.

& "$env:RCBIN/QIX.Cmd" -CS="$QIXCONN" add-transaction -RegionName=REGION_NAME -Name=SIGN -Program=DFHSNP -LoginTransaction

The transaction name is specified using the -Name flag, and can be any four-letter word. The -Program flag links this transaction name with the program that is executed when the transaction is invoked. The login program available in the QIX codebase is called DFHSNP.

The last flag -LoginTransaction might be omitted. If provided, it indicates that this transaction will be the first to be executed, even if the -Initial flag has been provided for another transaction. In that case, it means that the login transaction is executed first, and the -Initial transaction is executed right afterwards (For more details, see the Qix.Cmd command-line options section).

When the DFHSNP transaction executes, the initial login screen appears on the 3270 terminal. The user enters their login ID, group and password to connect.

loginprompt

If the login is successful, a new screen appears showing the user’s name and the current group.

loginsuccess

Pressing ENTER will launch the user to the next transaction (if an -Initial transaction was provided when configuring the region), or prompt the user to manually enter the name of the next transaction to execute.

3.5.2. Authentication method

The default security manager provided in QIX registers the credentials into the current session, but does not perform any credential check.

The Active Directory (AD) authentication Plugin provides a more advanced authentication method that relies on an Active Directory server.

Enabling the Active Directory QIX plugin

The following steps must be followed to use the Active Directory plugin to authenticate users in a QIX application.

  • Construct the configuration string to communicate with your Active Directory server: The content of this configuration string is described in the Sample: Active Directory Plugin section, along with detailed examples. This string depends on the type and configuration of the Active Directory server used in your organization. Another example configuration string with all parameters may be structured as follows: ContextType=Domain;ContextName=corp.raincode.com;ContextContainer=OU=All Users,DC=corp,DC=raincode,DC=com;ContextOptions=Negotiate; ContextUser=myADuser;ContextPassWord=myADPassword;IdentityType=UserPrincipalName;IdentityFormat={0};UserLogin=UserPrincipalName

The chosen parameters will impact the format of the username required during authentication. In the case IdentityType=UserPrincipalName;UserLogin=UserPrincipalName, a full User Principal Name (UPN) is required, for example john@corp.raincode.com.

  • Bind the configuration string to a QIX region: When creating QIX regions with Qix.Cmd, the configuration string generated in the previous step, must be provided. In the example below, the configuration string is stored in the ADCONFIG_STRING variable. When the BANKDEMO region is created, the configuration string is added to the SecurityManagerConfig parameter of the region using the -Secmgrcfg flag in the edit-region command.

$ADCONFIG_STRING="ContextType=Domain;ContextName=corp.raincode.com;ContextContainer=OU=All Users,DC=corp,DC=raincode,DC=com;ContextOptions=Negotiate;ContextUser=myADuser;ContextPassWord=myADPassword;IdentityType=UserPrincipalName;IdentityFormat={0};UserLogin=UserPrincipalName"

& "$env:RCBIN/QIX.Cmd" -CS="$QIXCONN" add-region        -RegionName=BANKDEMO -ApplicationConnectionString="$APPCONN"
& "$env:RCBIN/QIX.Cmd" -CS="$QIXCONN" edit-region       -RegionName=BANKDEMO -Secmgrcfg="$ADCONFIG_STRING"
  • Include the plugin in the execution of the Terminal Server: There are two ways to inform the Terminal server that the Active Directory plugin should be used.

It follows the same rules as the other QIX plugins (see the section Implementing a plugin).

  1. Either place the ADPlugin.dll within the %RCDIR%\plugins directory, in the QIX Terminal Server subdirectory. The Terminal server will automatically load the plugin when launched. In this case, the Terminal server can be executed with no extra flags. For instance, Start-Process -FilePath "$Env:RCBIN\QIX.TerminalServerRunner.exe" -ArgumentList "-LogLevel=TRACE -Region=BANKDEMO -TcpPort=23 -TCTUASIZE=512 -ConfigConnectionString="$QIXCONN""

  2. Or keep your plugin placed anywhere on the file system. In this case, the location and name of the plugin should be added as extra command-line arguments when running the Terminal server.

Therefore, the above example would have two additional arguments, as follows: Start-Process -FilePath "$Env:RCBIN\QIX.TerminalServerRunner.exe" -ArgumentList "-LogLevel=TRACE -Region=BANKDEMO -TcpPort=23 -TCTUASIZE=512 -PluginPath=<Current path of the plugin> -Plugin=ADPlugin.dll -ConfigConnectionString="$QIXCONN""

4. Raincode QIX Plugins

This section contains a list of the different kinds of plugins supported by QIX

4.1. ProcessingServer.LoadConfigPlugin

Class

RainCode.QIX.ProcessingServer.ProcessingServer

Field name

LoadConfigPlugin

Strategy

Execute all

Plugin API:

(RainCodeLegacyRuntime.QIX.Interface.IQixConfig arg0)

Description:

Allows to execute a custom action based on the newly loaded qix configuration. Called every time the config is loaded by the server.

4.2. ProcessingServer.ProcessingServerSetupPlugin

Class

RainCode.QIX.ProcessingServer.ProcessingServer

Field name

ProcessingServerSetupPlugin

Strategy

Execute all

Plugin API:

(RainCode.QIX.ProcessingServer.ProcessingServer arg0)

Description:

Allows additional steps to be taken at the setup stage of the Processing server based on the Config and arguments, e.g. starting new listeners

4.3. QixTerminalServer.TerminalServerSetupPlugin

Class

RainCode.QIX.TerminalServer.QixTerminalServer

Field name

TerminalServerSetupPlugin

Strategy

Execute all

Plugin API:

(RainCode.QIX.TerminalServer.QixTerminalServer arg0)

Description:

Allows additional steps to be taken at the setup stage of the Terminal server based on the config and arguments, e.g. starting new listeners

4.4. TerminalServer.SecurityManagerPlugin

Class

RainCode.QIX.TerminalServer.QixTerminalServer

Field name

SecurityManagerPlugin

Strategy

Best non null

Plugin API:

RainCode.QIX.Common.Security.ISecurityManager(string arg0)

Description:

Let you provide your implementation of ISecurityManager based on the SecurityManagerConfig

For more details refer to the authentication Plugin documentation.

4.5. QIX.TN3270Terminal

Class

RainCode.QIX.TerminalServer.QixTerminalServer

Field name

SessionPlugin

Strategy

Best

Plugin API:

bool(RainCode.QIX.TerminalServer.Sessions.Plugin.IPluginSessionApi arg0 ,string arg1)

Description:

This plugin can be plugged into the terminal server and establish a terminal session to QIX or to a remote mainframe through an API

For more details refer to the terminal Server Session API documentation.

4.6. QIXForwardSession

Class

RainCode.QIX.TerminalServer.Sessions.ForwardTN3270ClientSession

Field name

ForwardSessionPluginBuilder

Strategy

Best non null

Plugin API:

RainCode.QIX.TerminalServer.Sessions.Plugin.IPluginSessionForward(RainCode.QIX.TerminalServer.Sessions.ForwardTN3270ClientSession session)

  • session - The forwarded session

Description:

Forward TN3270 session to another server. This can be used to forward some messages to another CICS server (on a mainframe) or to an IMS server. The default implementation forward the message to another CICS server. There is also a example (QixIMSqlForwardSession) to forward the message to a IMSql server

4.7. Cics synchronization Plugin

Class

RainCode.QIX.TerminalServer.Parallel.ParallelTN3270ServerSession

Field name

CicsSynchronizationPlugin

Strategy

Best non null

Plugin API:

RainCode.QIX.TerminalServer.Parallel.Interfaces.IQixParallelSynchronization(RainCode.QIX.Common.TransactionServer.IQix3270TransactionServer arg0 ,RainCode.Tn3270.ITerminalInfo arg1 ,string arg2)

Description:

Provides the logic to assess if both of the parallel sessions are in sync with each other based on the screen output.

4.8. DataStream comparer

Class

RainCode.QIX.TerminalServer.Parallel.ParallelTN3270ServerSession

Field name

OutputComparerPlugin

Strategy

Best

Plugin API:

RainCode.QIX.TerminalServer.Parallel.IOutputComparer(RainCode.QIX.Common.Sessions.IQix3270Session arg0 ,System.Text.Encoding arg1)

Description:

Provides an action to be taken in the context of parallel sessions to compare the 2 outputs and return the list of differences.

4.9. RainCode.QIX.Common.WorkerServer

Class

RainCode.QIX.Common.Server

Field name

QixServerStatePlugin

Strategy

Best

Plugin API:

bool(RainCode.QIX.Common.IQixServer arg0)

Description:

--

5. CICS supported commands

This section covers all the supported CICS API calls in QIX.

The following information is given:

  1. Function name

  2. Option and arguments (supported syntax)

  3. Degree of runtime support

Considering the degree of runtime support, there are four distinct possibilities, as follows:

  • None: There is no runtime support for this statement. The client or the integrator code provides it.

  • Library: The runtime support for this statement is identical with or without using QIX.

  • Qix Emulator: There is runtime support for this statement only when using the QIX.

  • Library and Qix emulator: The statement is also supported without QIX, and QIX extends the level of support to include more arguments/combinations.

For all statements, the support may be incomplete. Some options or combinations of options may not be implemented. Please test and/or contact Raincode for details about your use case.

5.1. ABEND

Supported syntax:

ABEND
  ABCODE(name)? CANCEL? NODUMP?

Runtime support : library

5.2. ACQUIRE PROCESS

Supported syntax:

ACQUIRE
  [ ACTIVITYID(data-value) | ( PROCESS(data-value) PROCESSTYPE(data-value) ) ]

Runtime support : none

5.3. ADDRESS

Supported syntax:

ADDRESS
  ACEE(ptr-ref)? COMMAREA(ptr-ref)? CWA(ptr-ref)? EIB(ptr-ref)?
  TCTUA(ptr-ref)? TWA(ptr-ref)?

Runtime support : library and Qix emulator

5.4. ALLOCATE (APPC)

Supported syntax:

ALLOCATE
  [ ( SYSID(systemname) PROFILE(name)? ) | PARTNER(name) ] NOQUEUE? STATE(cvda)?

Runtime support : none

5.5. ASKTIME

Supported syntax:

ASKTIME
  ABSTIME(data-area)?

Runtime support : library

5.6. ASSIGN

Supported syntax:

ASSIGN
  ABCODE(data-area)? ABDUMP(data-area)? ABPROGRAM(data-area)?
  ACTIVITY(data-area)? ACTIVITYID(data-area)? ALTSCRNHT(data-area)?
  ALTSCRNWD(data-area)? APLKYBD(data-area)? APLTEXT(data-area)?
  APPLID(data-area)? ASRAINTRPT(data-area)? ASRAKEY(cvda)?
  ASRAPSW(data-area)? ASRAREGS(data-area)? ASRASPC(cvda)? ASRASTG(cvda)?
  BRIDGE(data-area)? BTRANS(data-area)? CHANNEL(data-area)?
  CMDSEC(data-area)? COLOR(data-area)? CWALENG(data-area)?
  DEFSCRNHT(data-area)? DEFSCRNWD(data-area)? DELIMITER(data-area)?
  DESTCOUNT(data-area)? DESTID(data-area)? DESTIDLENG(data-area)?
  DS3270(data-area)? DSSCS(data-area)? EWASUPP(data-area)? EXTDS(data-area)?
  FACILITY(data-area)? FCI(data-area)? GCHARS(data-area)? GCODES(data-area)?
  GMMI(data-area)? HILIGHT(data-area)? INITPARM(data-area)?
  INITPARMLEN(data-area)? INPARTN(data-area)? INVOKINGPROG(data-area)?
  KATAKANA(data-area)? LANGINUSE(data-area)? LDCNUM(data-area)?
  LDCMNEM(data-area)? MAPCOLUMN(data-area)? MAPHEIGHT(data-area)?
  MAPLINE(data-area)? MAPWIDTH(data-area)? MSRCONTROL(data-area)?
  NATLANGINUSE(data-area)? NETNAME(data-area)? NEXTTRANSID(data-area)?
  NUMTAB(data-area)? OPCLASS(data-area)? OPERKEYS(data-area)?
  OPID(data-area)? OPSECURITY(data-area)? ORGABCODE(data-area)?
  OUTLINE(data-area)? PAGENUM(data-area)? PARTNPAGE(data-area)?
  PARTNS(data-area)? PARTNSET(data-area)? PRINSYSID(data-area)?
  PROCESS(data-area)? PROCESSTYPE(data-area)? PROGRAM(data-area)?
  PS(data-area)? QNAME(data-area)? RESSEC(data-area)? RESTART(data-area)?
  RETURNPROG(data-area)? SCRNHT(data-area)? SCRNWD(data-area)?
  SIGDATA(data-area)? SOSI(data-area)? STARTCODE(data-area)?
  STATIONID(data-area)? SYSID(data-area)? TASKPRIORITY(data-area)?
  TCTUALENG(data-area)? TELLERID(data-area)? TERMCODE(data-area)?
  TERMPRIORITY(data-area)? TEXTKYBD(data-area)? TEXTPRINT(data-area)?
  TRANPRIORITY(data-area)? TWALENG(data-area)? UNATTEND(data-area)?
  USERID(data-area)? USERNAME(data-area)? USERPRIORITY(data-area)?
  VALIDATION(data-area)? ASSIGN?

Runtime support : library and Qix emulator

5.7. BIF DEEDIT

Supported syntax:

BIF
  DEEDIT FIELD(data-area) LENGTH(data-value)?

Runtime support : library

5.8. BIF DIGEST

Supported syntax:

BIF
  DIGEST RECORD(data-value) RECORDLEN(data-value)
  [ HEX | BINARY | BASE64 | DIGESTTYPE(cvda) ]? RESULT(data-area)

Runtime support : none

5.9. BUILD ATTACH

Supported syntax:

BUILD
  ATTACH ATTACHID(name) RPROCESS(name)? RRESOURCE(name)? DATASTR(data-value)?
  RECFM(data-value)?

Runtime support : none

5.10. CANCEL

Supported syntax:

CANCEL
  REQID(name) SYSID(systemname)? TRANSID(name)??

Runtime support : none

5.11. CANCEL (BTS)

Supported syntax:

CANCEL
  [ ACTIVITY(data-value) | ACQACTIVITY | ACQPROCESS ]

Runtime support : none

5.12. CHANGE PASSWORD

Supported syntax:

CHANGE
  PASSWORD(data-value) NEWPASSWORD(data-value) USERID(data-value)
  ESMREASON(data-area)? ESMRESP(data-area)?

Runtime support : none

5.13. CHECK ACQPROCESS

Supported syntax:

CHECK
  ACQPROCESS COMPSTATUS(cvda) ABCODE(data-area)? ABPROGRAM(data-area)?
  MODE(cvda)? SUSPSTATUS(cvda)?

Runtime support : none

5.14. CHECK ACTIVITY

Supported syntax:

CHECK
  [ ACTIVITY(data-value) | ACQACTIVITY ]? COMPSTATUS(cvda) ABCODE(data-area)?
  ABPROGRAM(data-area)? MODE(cvda)? SUSPSTATUS(cvda)?

Runtime support : none

5.15. COLLECT STATISTICS

Supported syntax:

COLLECT
  STATISTICS SET(ptr-ref)
  [ TERMINAL(data-value) | MONITOR(data-value) | DB2CONN | RECOVERY | STORAGE
  | TCPIP
  ]?

Runtime support : none

5.16. CONNECT PROCESS (APPC)

Supported syntax:

CONNECT
  PROCESS [ CONVID(name) | SESSION(name) ]
  [ ( PROCNAME(data-value) PROCLENGTH(data-value)? ) | PARTNER(name) ]?
  ( PIPLIST(data-area) PIPLENGTH(data-value)? )? SYNCLEVEL(data-value)
  STATE(cvda)?

Runtime support : none

5.17. CONVERSE

Supported syntax:

CONVERSE
  [ CONVID(name) | SESSION(name) ]? FROM(data-area)
  [ FROMLENGTH(data-value) | FROMFLENGTH(data-value) ]?
  [ INTO(data-area) | SET(ptr-ref) ]
  [ STRFIELD | ( ( ERASE [ DEFAULT | ALTERNATE ]? )? CTLCHAR(data-value)? ) ]?
  [ TOLENGTH(data-area) | TOFLENGTH(data-area) ]?
  [ MAXLENGTH(data-value) | MAXFLENGTH(data-value) ]? DEFRESP? FMH?
  NOTRUNCATE? ASIS? STATE(cvda)?

Runtime support : none

5.18. DEFINE ACTIVITY

Supported syntax:

DEFINE
  ACTIVITY(data-value) EVENT(data-value)? TRANSID(data-value)
  PROGRAM(data-value)? USERID(data-value)? ACTIVITYID(data-area)?

Runtime support : none

5.19. DEFINE COUNTER

Supported syntax:

DEFINE
  COUNTER(name) POOL(name)? ( VALUE(data-value) MINIMUM(data-value)? )?
  MAXIMUM(data-value)?

Runtime support : library

5.20. DEFINE INPUT EVENT

Supported syntax:

DEFINE
  INPUT EVENT(data-value)

Runtime support : none

5.21. DEFINE PROCESS

Supported syntax:

DEFINE
  PROCESS(data-value) PROCESSTYPE(data-value) TRANSID(data-value)
  PROGRAM(data-value)? USERID(data-value)? NOCHECK?

Runtime support : none

5.22. DEFINE TIMER

Supported syntax:

DEFINE
  TIMER(data-value) EVENT(data-value)? AFTER(data-value)
  ( DAYS(data-value)? HOURS(data-value)? MINUTES(data-value)?
    SECONDS(data-value)?
  )
DEFINE
  TIMER(data-value) EVENT(data-value)? AT
  ( HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  ( ON YEAR(data-value)
    [ ( MONTH(data-value) DAYOFMONTH(data-value) ) | DAYOFYEAR(data-value) ]
  )?

Runtime support : none

5.23. DELAY

Supported syntax:

DELAY
  [ INTERVAL(hhmmss) | TIME(hhmmss)
  | ( FOR HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)?
      MILLISECS(data-value)?
    )
  | ( UNTIL HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  ]?
  REQID(name)?

Runtime support : library and Qix emulator

5.24. DELETE

Supported syntax:

DELETE
  [ FILE(filename) | DATASET(filename) ]
  [ TOKEN(data-area)
  | ( RIDFLD(data-area)
      ( KEYLENGTH(data-value) ( GENERIC NUMREC(data-area)? )? )?
    )
  ]?
  SYSID(systemname)? NOSUSPEND? [ RRN | RBA ]?

Runtime support : none

5.25. DELETE ACTIVITY

Supported syntax:

DELETE
  ACTIVITY(data-value)

Runtime support : none

5.26. DELETE CONTAINER

Supported syntax:

DELETE
  CONTAINER(data-value) CHANNEL(data-value)?

Runtime support : none

5.27. DELETE COUNTER

Supported syntax:

DELETE
  COUNTER(name) POOL(name)?

Runtime support : library

5.28. DELETE TIMER

Supported syntax:

DELETE
  TIMER(data-value)

Runtime support : none

5.29. DELETEQ TD

Supported syntax:

DELETEQ
  TD QUEUE(name) SYSID(systemname)?

Runtime support : library

5.30. DELETEQ TS

Supported syntax:

DELETEQ
  TS? [ QUEUE(name) | QNAME(name) ] SYSID(systemname)?

Runtime support : library

5.31. DEQ

Supported syntax:

DEQ
  RESOURCE(data-area) [ UOW | LUW | MAXLIFETIME(cvda) | TASK ]?
DEQ
  RESOURCE(data-area) LENGTH(data-value)
  [ UOW | LUW | MAXLIFETIME(cvda) | TASK ]?

Runtime support : Qix emulator

5.32. DOCUMENT CREATE

Supported syntax:

DOCUMENT
  CREATE DOCTOKEN(data-area)
  [ ( [ FROM(data-area) | TEXT(data-area) | BINARY(data-area) ]
      LENGTH(data-area)
    )
  | FROMDOC(data-area) | TEMPLATE(name)
  ]?
  ( SYMBOLLIST(data-area) LISTLENGTH(data-value) DELIMITER(data-value)?
    UNESCAPED?
  )?
  DOCSIZE(data-area)? HOSTCODEPAGE(name)?

Runtime support : none

5.33. DUMP TRANSACTION

Supported syntax:

DUMP
  TRANSACTION DUMPCODE(name)
  ( FROM(data-area) [ LENGTH(data-value) | FLENGTH(data-value) ] )? COMPLETE?
  TRT?
  ( SEGMENTLIST(data-area) ( LENGTHLIST(data-area)? NUMSEGMENTS(data-area)? ) )?
  TASK? STORAGE? PROGRAM? TERMINAL? TABLES? FCT? PCT? PPT? SIT? TCT?
  DUMPID(data-area)?
DUMP
  DUMPCODE(name)
  ( FROM(data-area) [ LENGTH(data-value) | FLENGTH(data-value) ] )? COMPLETE?
  TRT? TASK? STORAGE? PROGRAM? TERMINAL? TABLES? FCT? PCT? PPT? SIT? TCT?
  DUMPID(data-area)?

Runtime support : Qix emulator

5.34. ENABLE

Supported syntax:

ENABLE
  PROGRAM(data-value) EXIT(data-value)? START? GALENGTH(data-value)?

Runtime support : none

5.35. ENDBR

Supported syntax:

ENDBR
  [ FILE(filename) | DATASET(filename) ] REQID(data-value)?
  SYSID(systemname)?

Runtime support : library

5.36. ENDBROWSE ACTIVITY

Supported syntax:

ENDBROWSE
  ACTIVITY BROWSETOKEN(data-value)

Runtime support : none

5.37. ENDBROWSE CONTAINER

Supported syntax:

ENDBROWSE
  CONTAINER BROWSETOKEN(data-value)

Runtime support : none

5.38. ENQ

Supported syntax:

ENQ
  RESOURCE(data-area) [ UOW | LUW | MAXLIFETIME(cvda) | TASK ]? NOSUSPEND?
ENQ
  RESOURCE(data-area) LENGTH(data-value)
  [ UOW | LUW | MAXLIFETIME(cvda) | TASK ]? NOSUSPEND?

Runtime support : Qix emulator

5.39. ENTER TRACENUM

Supported syntax:

ENTER
  [ TRACENUM(data-value) | TRACEID(data-value) ]
  ( FROM(data-area) LENGTH(data-value)? FROMLENGTH(data-area)? )?
  RESOURCE(name)? EXCEPTION?

Runtime support : none

5.40. EXTRACT ATTACH

Supported syntax:

EXTRACT
  ATTACH SESSION(name)? RECFM(data-area)?

Runtime support : none

5.41. EXTRACT EXIT

Supported syntax:

EXTRACT
  EXIT PROGRAM(data-value) ENTRYNAME(data-value)? GALENGTH(data-area)
  GASET(ptr-ref)

Runtime support : none

5.42. EXTRACT LOGONMSG

Supported syntax:

EXTRACT
  LOGONMSG INTO(data-area) LENGTH(data-area)

Runtime support : none

5.43. EXTRACT PROCESS (APPC)

Supported syntax:

EXTRACT
  PROCESS MAXPROCLEN(data-value)? CONVID(name)? PROCNAME(data-area)?
  PROCLENGTH(data-value)? SYNCLEVEL(data-area)? PIPLIST(ptr-ref)?
  PIPLENGTH(data-area)?

Runtime support : none

5.44. EXTRACT STATISTICS

Supported syntax:

EXTRACT
  STATISTICS RESTYPE(cvda) SET(ptr-ref)

Runtime support : none

5.45. FETCH ANY

Supported syntax:

FETCH
  ANY(data-area) CHANNEL(data-area)? COMPSTATUS(cvda)? ABCODE(data-area)?
  NOSUSPEND? TIMEOUT(data-value)?

Runtime support : none

5.46. FETCH CHILD

Supported syntax:

FETCH
  CHILD(data-value) CHANNEL(data-area)? COMPSTATUS(cvda)? ABCODE(data-area)?
  NOSUSPEND? TIMEOUT(data-value)?

Runtime support : none

5.47. FORMATTIME

Supported syntax:

FORMATTIME
  ABSTIME(data-area) DATE(data-area)? FULLDATE(data-area)?
  DATEFORM(data-area)? DATESEP(data-value)? DAYCOUNT(data-area)?
  DAYOFMONTH(data-area)? DAYOFWEEK(data-area)? DDMMYY(data-area)?
  DDMMYYYY(data-area)? MILLISECONDS(data-area)? MMDDYY(data-area)?
  MMDDYYYY(data-area)? MONTHOFYEAR(data-area)? MONTH(data-area)?
  TIME(data-area)? TIMESEP(data-value)? YEAR(data-area)? YYDDD(data-area)?
  YYDDMM(data-area)? YYMMDD(data-area)? YYYYDDD(data-area)?
  YYYYDDMM(data-area)? YYYYMMDD(data-area)? DATESTRING(data-area)?
  STRINGFORMAT(cvda)? ( DATASTRING(data-area) STRINGZONE(cvda)? )?

Runtime support : library

5.48. FREE

Supported syntax:

FREE
  [ CONVID(name) | SESSION(name) ]? STATE(cvda)?

Runtime support : none

5.49. FREEMAIN

Supported syntax:

FREEMAIN
  [ DATA(data-area) | DATAPOINTER(ptr-value) ]

Runtime support : library

5.50. GET COUNTER

Supported syntax:

GET
  COUNTER(name) POOL(name)? VALUE(data-area)
  ( INCREMENT(data-value) REDUCE? )? WRAP? COMPAREMIN(data-value)?
  COMPAREMAX(data-value)?

Runtime support : library

5.51. GET CONTAINER

Supported syntax:

GET
  CONTAINER(data-value)
  [ ( INTO(data-area)
      ( [ FLENGTH(data-area) | LENGTH(data-area) ] BYTEOFFSET(data-area)? )?
    )
  | ( SET(ptr-ref) [ FLENGTH(data-area) | LENGTH(data-area) ]
      BYTEOFFSET(data-area)?
    )
  | ( NODATA [ FLENGTH(data-area) | LENGTH(data-area) ] )
  ]
  [ [ CHANNEL(data-value)?
    | [ INTOCCSID(data-value) | INTOCODEPAGE(data-value)
      | ( CONVERTST(cvda) CCSID(data-area)? )
      ]?
    ]
  | [ ACTIVITY(data-value) | ACQACTIVITY | PROCESS | ACQPROCESS ]?
  ]?

Runtime support : library

5.52. GETMAIN

Supported syntax:

GETMAIN
  SET(ptr-ref) [ ( FLENGTH(data-value) BELOW? ) | LENGTH(data-value) ]
  INITIMG(data-value)? SHARED? NOSUSPEND? [ USERDATAKEY | CICSDATAKEY ]?

Runtime support : library

5.53. GETNEXT ACTIVITY

Supported syntax:

GETNEXT
  ACTIVITY(data-area) BROWSETOKEN(data-value) ACTIVITYID(data-area)?
  LEVEL(data-area)?

Runtime support : none

5.54. GETNEXT CONTAINER

Supported syntax:

GETNEXT
  CONTAINER(data-area) BROWSETOKEN(data-value)

Runtime support : none

5.55. HANDLE ABEND

Supported syntax:

HANDLE
  ABEND [ CANCEL | PROGRAM(name) | LABEL(label) | RESET ]?

Runtime support : library

5.56. HANDLE AID

Supported syntax:

Runtime support : library and Qix emulator

5.57. HANDLE CONDITION

Supported syntax:

Runtime support : library

5.58. IGNORE CONDITION

Supported syntax:

Runtime support : library

5.59. INQUIRE ACTIVITYID

Supported syntax:

INQUIRE
  ACTIVITYID(data-value) ABCODE(data-area)? ABPROGRAM(data-area)?
  ACTIVITY(data-area)? COMPSTATUS(cvda)? EVENT(data-area)? MODE(cvda)?
  PROCESS(data-area)? PROCESSTYPE(data-area)? PROGRAM(data-area)?
  SUSPSTATUS(cvda)? TRANSID(data-area)? USERID(data-area)?

Runtime support : none

5.60. INQUIRE ASSOCIATION

Supported syntax:

INQUIRE
  ASSOCIATION(data-value)
  ( APPLID(data-area)? FACILTYPE(cvda)? ODAPPLID(data-area)?
    ODUSERID(data-area)? ODFACILNAME(data-area)? ODNETWORKID(data-area)?
    ODFACILTYPE(cvda)?
  )

Runtime support : none

5.61. INQUIRE CONNECTION

Supported syntax:

INQUIRE
  CONNECTION(name) ACCESSMETHOD(data-value)? ACQSTATUS(data-value)?
  AIDCOUNT(data-value)? AUTOCONNECT(data-value)? CHANGEAGENT(data-value)?
  CHANGEAGREL(data-value)? CHANGETIME(data-value)? CHANGEUSRID(data-value)?
  CONNSTATUS(data-value)? CONNTYPE(data-value)? CQP(data-value)?
  DEFINESOURCE(data-value)? DEFINETIME(data-value)? EXITTRACING(data-value)?
  GRNAME(data-value)? INSTALLAGENT(data-value)? INSTALLTIME(data-value)?
  INSTALLUSRID(data-value)? LINKSYSTEM(data-value)? MEMBERNAME(data-value)?
  NETNAME(data-value)? NQNAME(data-value)? PENDSTATUS(data-value)?
  PROTOCOL(data-value)? RECEIVECOUNT(data-value)? RECOVSTATUS(data-value)?
  REMOTENAME(data-value)? REMOTESYSNET(data-value)? REMOTESYSTEM(data-value)?
  SENDCOUNT(data-value)? SERVSTATUS(data-value)? XLNSTATUS(data-value)?
  ZCPTRACING(data-value)?

Runtime support : none

5.62. INQUIRE DB2ENTRY

Supported syntax:

INQUIRE
  DB2ENTRY(data-value) PLAN(data-area)?

Runtime support : none

5.63. INQUIRE END

Supported syntax:

INQUIRE
  TSQNAME END

Runtime support : none

5.64. INQUIRE EXITPROGRAM

Supported syntax:

INQUIRE
  EXITPROGRAM(data-value) EXIT(data-value)? ENTRYNAME(data-area)?
  APIST(cvda)? CONCURRENTST(cvda)? CONNECTST(cvda)? ENTRY(ptr-ref)?
  FORMATEDFST(cvda)? GAENTRYNAME(data-area)? GALENGTH(data-area)?
  GAUSECOUNT(data-area)? INDOUBTST(cvda)? NUMEXITS(data-area)?
  PURGEABLEST(cvda)? QUALIFIER(data-area)? SHUTDOWNST(cvda)? SPIST(cvda)?
  STARTSTATUS(cvda)? TALENGTH(data-area)? TASKSTARTST(cvda)?
  USECOUNT(data-area)?

Runtime support : none

5.65. INQUIRE FILE

Supported syntax:

INQUIRE
  [ FILE(filename) | DATASET(filename) ] ACCESSMETHOD(cvda)? ADD(cvda)?
  BASEDSNAME(data-area)? BLOCKFORMAT(cvda)? BLOCKKEYLEN(data-area)?
  BLOCKSIZE(data-area)? BROWSE(cvda)? CFDTPOOL(data-area)? CHANGEAGENT(cvda)?
  CHANGEAGREL(data-area)? CHANGETIME(data-area)? CHANGEUSRID(data-area)?
  DEFINESOURCE(data-area)? DEFINETIME(data-area)? DELETE(cvda)?
  DISPOSITION(cvda)? [ DSNAME(data-area) | OBJECTNAME(data-area) ]?
  EMPTYSTATUS(cvda)? ENABLESTATUS(cvda)? EXCLUSIVE(cvda)? FWDRECSTATUS(cvda)?
  INSTALLAGENT(cvda)? INSTALLTIME(data-area)? INSTALLUSRID(data-area)?
  JOURNALNUM(data-area)? KEYLENGTH(data-area)? KEYPOSITION(data-area)?
  LOADTYPE(cvda)? LSRPOOLNUM(data-area)? MAXNUMRECS(data-area)? OBJECT(cvda)?
  OPENSTATUS(cvda)? RBATYPE(cvda)? READ(cvda)? READINTEG(cvda)?
  RECORDFORMAT(cvda)? RECORDSIZE(data-area)? RECOVSTATUS(cvda)?
  RELTYPE(cvda)? REMOTENAME(data-area)? REMOTESYSTEM(data-area)?
  REMOTETABLE(cvda)? RLSACCESS(cvda)? STRINGS(data-area)? TABLE(cvda)?
  TABLENAME(data-area)? TYPE(cvda)? UPDATE(cvda)? UPDATEMODEL(cvda)?

Runtime support : none

5.66. INQUIRE IPCONN

Supported syntax:

INQUIRE
  IPCONN(cvda) APPLID(data-area)? AUTOCONNECT(cvda)? CERTIFICATE(data-area)?
  CHANGEAGENT(data-area)? CHANGEAGREL(data-area)? CHANGETIME(data-area)?
  CHANGEUSRID(data-area)? CIPHERS(data-area)? CLIENTLOC(data-area)?
  CONNSTATUS(cvda)? DEFINESOURCE(data-area)? DEFINETIME(data-area)? HA(cvda)?
  HOST(data-area)? HOSTTYPE(cvda)? IDPROP(cvda)? IPFAMILY(cvda)?
  IPRESOLVED(data-area)? INSTALLAGENT(cvda)? INSTALLTIME(data-area)?
  INSTALLUSRID(data-area)? LINKAUTH(cvda)? MAXQTIME(data-area)?
  MIRRORLIFE(cvda)? NETWORKID(data-area)? NUMCIPHERS(data-area)?
  PARTNER(data-area)? PENDSTATUS(cvda)? PORT(data-area)?
  QUEUELIMIT(data-area)? RECEIVECOUNT(data-area)? RECOVSTATUS(cvda)?
  SECURITYNAME(data-area)? SENDCOUNT(data-area)? SERVSTATUS(cvda)?
  SSLTYPE(cvda)? TCPIPSERVICE(data-area)? USERAUTH(cvda)?

Runtime support : none

5.67. INQUIRE IPCONN END

Supported syntax:

INQUIRE
  IPCONN END

Runtime support : none

5.68. INQUIRE IPCONN NEXT

Supported syntax:

INQUIRE
  IPCONN(cvda) APPLID(data-area)? AUTOCONNECT(cvda)? CERTIFICATE(data-area)?
  CHANGEAGENT(data-area)? CHANGEAGREL(data-area)? CHANGETIME(data-area)?
  CHANGEUSRID(data-area)? CIPHERS(data-area)? CLIENTLOC(data-area)?
  CONNSTATUS(cvda)? DEFINESOURCE(data-area)? DEFINETIME(data-area)? HA(cvda)?
  HOST(data-area)? HOSTTYPE(cvda)? IDPROP(cvda)? IPFAMILY(cvda)?
  IPRESOLVED(data-area)? INSTALLAGENT(cvda)? INSTALLTIME(data-area)?
  INSTALLUSRID(data-area)? LINKAUTH(cvda)? MAXQTIME(data-area)?
  MIRRORLIFE(cvda)? NETWORKID(data-area)? NUMCIPHERS(data-area)?
  PARTNER(data-area)? PENDSTATUS(cvda)? PORT(data-area)?
  QUEUELIMIT(data-area)? RECEIVECOUNT(data-area)? RECOVSTATUS(cvda)?
  SECURITYNAME(data-area)? SENDCOUNT(data-area)? SERVSTATUS(cvda)?
  SSLTYPE(cvda)? TCPIPSERVICE(data-area)? USERAUTH(cvda)? NEXT

Runtime support : none

5.69. INQUIRE IPCONN START

Supported syntax:

INQUIRE
  IPCONN START

Runtime support : none

5.70. INQUIRE NETNAME

Supported syntax:

INQUIRE
  NETNAME(data-value) TERMINAL(data-area)? ACCESSMETHOD(cvda)?
  ACQSTATUS(cvda)? AIDCOUNT(data-area)? ALTPAGEHT(data-area)?
  ALTPAGEWD(data-area)? ALTPRINTER(data-area)? ALTPRTCOPYST(cvda)?
  ALTSCRNHT(data-area)? ALTSCRNWD(data-area)? ALTSUFFIX(data-area)?
  APLKYBDST(cvda)? APLTEXTST(cvda)? ASCII(cvda)? ATISTATUS(cvda)?
  AUDALARMST(cvda)? AUTOCONNECT(cvda)? BACKTRANSST(cvda)? COLORST(cvda)?
  CONSOLE(data-area)? COPYST(cvda)? CORRELID(data-area)? CREATESESS(cvda)?
  DATASTREAM(cvda)? DEFPAGEHT(data-area)? DEFPAGEWD(data-area)?
  DEFSCRNHT(data-area)? DEFSCRNWD(data-area)? DEVICE(cvda)? DISCREQST(cvda)?
  DUALCASEST(cvda)? EXITTRACING(cvda)? EXTENDEDDSST(cvda)? FMHPARMST(cvda)?
  FORMFEEDST(cvda)? GCHARS(data-area)? GCODES(data-area)? HFORMST(cvda)?
  HILIGHTST(cvda)? KATAKANAST(cvda)? LIGHTPENST(cvda)? LINKSYSTEM(data-area)?
  MAPNAME(data-area)? MAPSETNAME(data-area)? MODENAME(data-area)?
  MSRCONTROLST(cvda)? NATLANG(data-area)? NATURE(cvda)?
  NEXTTRANSID(data-area)? NQNAME(data-area)? OBFORMATST(cvda)?
  OBOPERIDST(cvda)? OPERID(data-area)? OUTLINEST(cvda)? PAGEHT(data-area)?
  PAGESTATUS(cvda)? PAGEWD(data-area)? PARTITIONSST(cvda)?
  PRINTADAPTST(cvda)? PRINTER(data-area)? PROGSYMBOLST(cvda)?
  PRTCOPYST(cvda)? QUERYST(cvda)? RELREQST(cvda)? REMOTENAME(data-area)?
  REMOTESYSNET(data-area)? REMOTESYSTEM(data-area)? SCRNHT(data-area)?
  SCRNWD(data-area)? SECURITY(cvda)? SERVSTATUS(cvda)? SESSIONTYPE(cvda)?
  SIGNONSTATUS(cvda)? SOSIST(cvda)? TASKID(data-area)?
  TCAMCONTROL(data-area)? TERMMODEL(data-area)? TERMPRIORITY(data-area)?
  TERMSTATUS(cvda)? TEXTKYBDST(cvda)? TEXTPRINTST(cvda)? TRACING(cvda)?
  TRANSACTION(data-area)? TTISTATUS(cvda)? UCTRANST(cvda)? USERAREA(ptr-ref)?
  USERAREALEN(data-area)? USERID(data-area)? USERNAME(data-area)?
  VALIDATIONST(cvda)? VFORMST(cvda)? ZCPTRACING(cvda)?

Runtime support : none

5.71. INQUIRE PROGRAM

Supported syntax:

INQUIRE
  PROGRAM(name) LOADPOINT(ptr-ref)? LENGTH(data-value)? APIST(data-value)?
  CEDFSTATUS(data-value)? CHANGEAGENT(data-value)? CHANGEAGREL(data-area)?
  CHANGETIME(data-area)? CHANGEUSRID(data-value)? COBOLTYPE(data-value)?
  COPY(data-value)? CONCURRENCY(data-value)? DATALOCATION(data-value)?
  DEFINESOURCE(data-area)? DEFINETIME(data-area)? DYNAMSTATUS(data-value)?
  ENTRYPOINT(ptr-ref)? EXECKEY(data-value)? EXECUTIONSET(data-value)?
  HOLDSTATUS(data-value)? INSTALLAGENT(data-value)? INSTALLTIME(data-area)?
  INSTALLUSRID(data-value)? JVMCLASS(data-value)? JVMPROFILE(data-value)?
  LANGDEDUCED(data-value)? LANGUAGE(data-value)? LIBRARY(data-value)?
  LIBRARYDSN(data-value)? LPASTATUS(data-value)? PROGTYPE(data-value)?
  REMOTENAME(data-value)? REMOTESYSTEM(data-value)? RESCOUNT(data-value)?
  RUNTIME(data-value)? SHARESTATUS(data-value)? STATUS(data-value)?
  TRANSID(data-value)? USECOUNT(data-value)?

Runtime support : library

5.72. INQUIRE START

Supported syntax:

INQUIRE
  TSQNAME START AT(data-value)?

Runtime support : none

5.73. INQUIRE STORAGE

Supported syntax:

INQUIRE
  STORAGE
  [ ( ADDRESS(ptr-value) ELEMENT(ptr-ref)? FLENGTH(data-area)? )
  | ( NUMELEMENTS(data-area) ELEMENTLIST(ptr-ref)? LENGTHLIST(ptr-ref)?
      TASK(data-value)?
    )
  ]

Runtime support : none

5.74. INQUIRE SYSTEM

Supported syntax:

INQUIRE
  SYSTEM AKP(data-area)? APPLID(data-area)? CDSASIZE(data-area)?
  CICSSTATUS(cvda)? CICSSYS(data-area)? CMDPROTECT(cvda)?
  DATEFORM(data-area)? DFLTREMSYS(data-area)? DFLTUSER(data-area)?
  DSALIMIT(data-area)? DTRPROGRAM(data-area)? DUMPING(cvda)?
  ECDSASIZE(data-area)? EDSALIMIT(data-area)? ERDSASIZE(data-area)?
  ESDSASIZE(data-area)? EUDSASIZE(data-area)?
  [ GMMTEXT(data-area) | GMMLENGTH(data-area) ]? GMMTRANID(data-area)?
  INITSTATUS(cvda)? INTROINTVL(data-area)? JOBNAME(data-area)?
  LOCALE(data-area)? MAXREGIONPOOL(data-area)? MAXSERVER(data-area)?
  MAXTASKS(data-area)? MAXTASKSHPOOL(data-area)? MINSERVER(data-area)?
  MROBATCH(data-area)? OPREL(data-area)? OPSYS(data-area)?
  PROGAUTOCTLG(cvda)? PROGAUTOEXIT(data-area)? PROGAUTOINST(cvda)?
  PRTYAGING(data-area)? RDSASIZE(data-area)? REENTPROTECT(cvda)?
  REGIONTHRESH(data-area)? RELEASE(data-area)? RUNAWAY(data-area)?
  SCANDELAY(data-area)? SDSASIZE(data-area)? SDTRAN(data-area)?
  SECURITYMGR(cvda)? SHUTSTATUS(cvda)? SOSSTATUS(cvda)? STARTUP(cvda)?
  STARTUPDATE(data-area)? STOREPROTECT(cvda)? SYSID(data-area)?
  TASKSHTHRESH(data-area)? TIME(data-area)? TRANISOLATE(cvda)?
  UDSASIZE(data-area)? XPRECVTIMEOUT(ptr-ref)? XRFSTATUS(cvda)?
  MEMLIMIT(data-area)? ETDSASIZE(data-area)? GCDSASIZE(data-area)?
  GSDSASIZE(data-area)? GUDSASIZE(data-area)? CICSTSLEVEL(data-area)?
  OSLEVEL(data-area)? RLSSTATUS(cvda)? ACTOPENTCBS(data-area)?
  AIDCOUNT(data-area)? COLDSTATUS(cvda)? DB2CONN(data-area)? DEBUGTOOL(cvda)?
  DSRTPROGRAM(data-area)? FORCEQR(cvda)? LASTCOLDTIME(data-area)?
  LASTEMERTIME(data-area)? LASTINITTIME(data-area)? LASTWARMTIME(data-area)?
  LOGDEFER(data-area)? MAXOPENTCBS(data-area)? MESSAGECASE(cvda)?
  MQCONN(data-area)? MVSSMFID(data-area)? MVSSYSNAME(data-area)?
  PLTPIUSR(data-area)? REGIONUSERID(data-area)? SOSABOVEBAR(cvda)?
  SOSABOVELINE(cvda)? SOSBELOWLINE(cvda)?

Runtime support : none

5.75. INQUIRE TASK

Supported syntax:

INQUIRE
  TASK(data-value) ACTIVITY(data-area)? ACTIVITYID(data-area)?
  ATTACHTIME(data-value)? BRFACILITY(data-area)? BRIDGE(data-value)?
  CMDSEC(data-value)? CURRENTPROG(name)? DB2PLAN(data-area)?
  DTIMEOUT(data-value)? DUMPING(data-value)? FACILITY(data-value)?
  FACILITYTYPE(data-value)? IDENTIFIER(data-value)? INDOUBT(data-value)?
  INDOUBTMINS(data-value)? INDOUBTWAIT(data-value)? IPFACILITIES(ptr-ref)?
  IPFLISTSIZE(data-value)? ISOLATEST(data-value)? PRIORITY(data-value)?
  PROCESS(data-value)? PROCESSTYPE(data-value)? PROFILE(data-value)?
  PROGRAM(data-value)? PURGEABILITY(data-value)? REMOTENAME(data-value)?
  REMOTESYSTEM(data-value)? RESSEC(data-value)? ROUTING(data-value)?
  RTIMEOUT(data-value)? RUNAWAY(data-value)? RUNSTATUS(data-value)?
  SCRNSIZE(data-value)? STARTCODE(data-value)? STORAGECLEAR(data-value)?
  SUSPENDTIME(data-value)? SUSPENDTYPE(data-value)? SUSPENDVALUE(data-value)?
  TASKDATAKEY(data-value)? TASKDATALOC(data-value)? TCB(data-value)?
  TCLASS(data-value)? TRACING(data-value)? TRANCLASS(data-value)?
  TRANPRIORITY(data-value)? TRANSACTION(data-value)? TRPROF(data-value)?
  TWASIZE(data-value)? UOW(data-area)? USERID(data-value)?
  RECUNITID(data-area)?

Runtime support : none

5.76. INQUIRE TASK LIST

Supported syntax:

INQUIRE
  TASK LIST? LISTSIZE(data-area) DISPATCHABLE? RUNNING? SUSPENDED?
  ( SET(ptr-ref) SETTRANSID(ptr-ref)? )?

Runtime support : none

5.77. INQUIRE TDQUEUE

Supported syntax:

INQUIRE
  TDQUEUE(data-value) ATITRANID(data-area)? RECORDLENGTH(data-area)?
  RECORDFORMAT(cvda)?

Runtime support : none

5.78. INQUIRE TERMINAL

Supported syntax:

INQUIRE
  TERMINAL(data-value) NETNAME(data-area)? ACCESSMETHOD(cvda)?
  ACQSTATUS(cvda)? AIDCOUNT(data-area)? ALTPAGEHT(data-area)?
  ALTPAGEWD(data-area)? ALTPRINTER(data-area)? ALTPRTCOPYST(cvda)?
  ALTSCRNHT(data-area)? ALTSCRNWD(data-area)? ALTSUFFIX(data-area)?
  APLKYBDST(cvda)? APLTEXTST(cvda)? ASCII(cvda)? ATISTATUS(cvda)?
  AUDALARMST(cvda)? AUTOCONNECT(cvda)? BACKTRANSST(cvda)? COLORST(cvda)?
  CONSOLE(data-area)? COPYST(cvda)? CORRELID(data-area)? CREATESESS(cvda)?
  DATASTREAM(cvda)? DEFPAGEHT(data-area)? DEFPAGEWD(data-area)?
  DEFSCRNHT(data-area)? DEFSCRNWD(data-area)? DEVICE(cvda)? DISCREQST(cvda)?
  DUALCASEST(cvda)? EXITTRACING(cvda)? EXTENDEDDSST(cvda)? FMHPARMST(cvda)?
  FORMFEEDST(cvda)? GCHARS(data-area)? GCODES(data-area)? HFORMST(cvda)?
  HILIGHTST(cvda)? KATAKANAST(cvda)? LIGHTPENST(cvda)? LINKSYSTEM(data-area)?
  MAPNAME(data-area)? MAPSETNAME(data-area)? MODENAME(data-area)?
  MSRCONTROLST(cvda)? NATLANG(data-area)? NATURE(cvda)?
  NEXTTRANSID(data-area)? NQNAME(data-area)? OBFORMATST(cvda)?
  OBOPERIDST(cvda)? OPERID(data-area)? OUTLINEST(cvda)? PAGEHT(data-area)?
  PAGESTATUS(cvda)? PAGEWD(data-area)? PARTITIONSST(cvda)?
  PRINTADAPTST(cvda)? PRINTER(data-area)? PROGSYMBOLST(cvda)?
  PRTCOPYST(cvda)? QUERYST(cvda)? RELREQST(cvda)? REMOTENAME(data-area)?
  REMOTESYSNET(data-area)? REMOTESYSTEM(data-area)? SCRNHT(data-area)?
  SCRNWD(data-area)? SECURITY(cvda)? SERVSTATUS(cvda)? SESSIONTYPE(cvda)?
  SIGNONSTATUS(cvda)? SOSIST(cvda)? TASKID(data-area)?
  TCAMCONTROL(data-area)? TERMMODEL(data-area)? TERMPRIORITY(data-area)?
  TERMSTATUS(cvda)? TEXTKYBDST(cvda)? TEXTPRINTST(cvda)? TRACING(cvda)?
  TRANSACTION(data-area)? TTISTATUS(cvda)? UCTRANST(cvda)? USERAREA(ptr-ref)?
  USERAREALEN(data-area)? USERID(data-area)? USERNAME(data-area)?
  VALIDATIONST(cvda)? VFORMST(cvda)? ZCPTRACING(cvda)?

Runtime support : Qix emulator

5.79. INQUIRE TRANCLASS

Supported syntax:

INQUIRE
  TRANCLASS(data-value) ACTIVE(data-area)? CHANGEAGENT(cvda)?
  CHANGEAGREL(data-area)? CHANGETIME(data-area)? CHANGEUSRID(data-area)?
  DEFINESOURCE(data-area)? DEFINETIME(data-area)? INSTALLAGENT(data-area)?
  INSTALLTIME(data-area)? INSTALLUSRID(data-area)? MAXACTIVE(data-area)?
  PURGETHRESH(data-area)? QUEUED(data-area)?

Runtime support : none

5.80. INQUIRE TRANCLASS END

Supported syntax:

INQUIRE
  TRANCLASS END

Runtime support : none

5.81. INQUIRE TRANCLASS NEXT

Supported syntax:

INQUIRE
  TRANCLASS(data-value) ACTIVE(data-area)? CHANGEAGENT(cvda)?
  CHANGEAGREL(data-area)? CHANGETIME(data-area)? CHANGEUSRID(data-area)?
  DEFINESOURCE(data-area)? DEFINETIME(data-area)? INSTALLAGENT(data-area)?
  INSTALLTIME(data-area)? INSTALLUSRID(data-area)? MAXACTIVE(data-area)?
  PURGETHRESH(data-area)? QUEUED(data-area)? NEXT

Runtime support : none

5.82. INQUIRE TRANCLASS START

Supported syntax:

INQUIRE
  TRANCLASS [ START | ( START AT(data-value) ) | AT(data-value) ]

Runtime support : none

5.83. INQUIRE TRANDUMPCODE

Supported syntax:

INQUIRE
  TRANDUMPCODE(data-value) CHANGEAGENT(cvda)? CHANGEAGREL(data-area)?
  CHANGETIME(data-area)? CHANGEUSRID(data-area)? CURRENT(data-area)?
  DEFINESOURCE(data-area)? DEFINETIME(data-area)? DUMPSCOPE(cvda)?
  INSTALLAGENT(cvda)? INSTALLTIME(data-area)? INSTALLUSRID(data-area)?
  MAXIMUM(data-area)? SHUTOPTION(cvda)? SYSDUMPING(cvda)? TRANDUMPING(cvda)?

Runtime support : none

5.84. INQUIRE TRANDUMPCODE END

Supported syntax:

INQUIRE
  TRANDUMPCODE END

Runtime support : none

5.85. INQUIRE TRANDUMPCODE NEXT

Supported syntax:

INQUIRE
  TRANDUMPCODE(data-value) CHANGEAGENT(cvda)? CHANGEAGREL(data-area)?
  CHANGETIME(data-area)? CHANGEUSRID(data-area)? CURRENT(data-area)?
  DEFINESOURCE(data-area)? DEFINETIME(data-area)? DUMPSCOPE(cvda)?
  INSTALLAGENT(cvda)? INSTALLTIME(data-area)? INSTALLUSRID(data-area)?
  MAXIMUM(data-area)? SHUTOPTION(cvda)? SYSDUMPING(cvda)? TRANDUMPING(cvda)?
  NEXT

Runtime support : none

5.86. INQUIRE TRANDUMPCODE START

Supported syntax:

INQUIRE
  TRANDUMPCODE START

Runtime support : none

5.87. INQUIRE TRANSACTION

Supported syntax:

INQUIRE
  TRANSACTION(data-value) CMDSEC(cvda)? DTIMEOUT(data-area)? DTB(cvda)?
  DUMPING(cvda)? ISOLATEST(cvda)? PRIORITY(data-area)? PROFILE(data-area)?
  PROGRAM(data-area)? PURGEABILITY(cvda)? REMOTENAME(data-area)?
  REMOTESYSTEM(data-area)? RESSEC(cvda)? ROUTING(cvda)? RTIMEOUT(data-area)?
  RUNAWAY(data-area)? RUNAWAYTYPE(cvda)? SCRNSIZE(cvda)? SHUTDOWN(cvda)?
  STATUS(cvda)? STORAGECLEAR(cvda)? TASKDATAKEY(cvda)? TASKDATALOC(cvda)?
  TCLASS(data-area)? TRANCLASS(data-area)? TRACING(cvda)? TRPROF(data-area)?
  TWASIZE(data-area)?

Runtime support : none

5.88. INQUIRE TSQUEUE

Supported syntax:

INQUIRE
  [ TSQUEUE(data-area) | TSQNAME(data-area) ] NEXT LASTUSEDINT(data-area)?
  LOCATION(data-area)? NUMITEMS(data-area)?
INQUIRE
  [ TSQUEUE(data-area) | TSQNAME(data-area) ] LASTUSEDINT(data-area)?
  LOCATION(data-area)? NUMITEMS(data-area)?

Runtime support : none

5.89. INQUIRE UOW

Supported syntax:

INQUIRE
  UOW(data-area) AGE(data-area)? LINK(data-area)? NETNAME(data-area)?
  NETUOWID(data-area)? OTSTID(data-area)? SYSID(data-area)?
  TASKID(data-area)? TERMID(data-area)? TRANSID(data-area)? UOWSTATE(cvda)?
  USERID(data-area)? WAITCAUSE(cvda)? WAITSTATE(cvda)?

Runtime support : none

5.90. INQUIRE URIMAP

Supported syntax:

INQUIRE
  URIMAP(data-value) WEBSERVICE(data-area)?

Runtime support : none

5.91. INQUIRE WEBSERVICE

Supported syntax:

INQUIRE
  WEBSERVICE(name) BINDING(data-area)?

Runtime support : none

5.92. INVOKE SERVICE

Supported syntax:

INVOKE
  [ SERVICE(data-value) | WEBSERVICE(data-value) ] CHANNEL(data-value)
  OPERATION(data-value) [ URI(data-value) | URIMAP(data-value) ]?
  ( SCOPE(data-value) SCOPELEN(data-value)? )?

Runtime support : none

5.93. ISSUE (APPC)

Supported syntax:

ISSUE
  [ PRINT | EODS ]
ISSUE
  [ ABEND | ERROR | CONFIRMATION | PREPARE ] CONVID(name)? STATE(cvda)?
ISSUE
  DISCONNECT SESSION(name)?
ISSUE
  ERASEAUP WAIT?
ISSUE
  SIGNAL [ ( CONVID(name)? STATE(cvda)? ) | SESSION(name) ]

Runtime support : none

Supported syntax:

LINK
  PROGRAM(name)
  [ ( COMMAREA(data-area) LENGTH(data-value)? DATALENGTH(data-value)? )
  | CHANNEL(name)
  ]?
  [ ( INPUTMSG(data-area) INPUTMSGLEN(data-value)? )
  | ( SYSID(systemname)? SYNCONRETURN? TRANSID(name)? )
  ]?
  ( RETCODE(data-area) APPLID(name) )?

Runtime support : library

5.95. LOAD

Supported syntax:

LOAD
  PROGRAM(name) SET(ptr-ref)? [ LENGTH(data-area) | FLENGTH(data-area) ]?
  ENTRY(ptr-ref)? HOLD?

Runtime support : none

5.96. MONITOR

Supported syntax:

MONITOR
  POINT(data-value) DATA1(data-area)? DATA2(data-area)? ENTRYNAME(data-area)?

Runtime support : library

5.97. MOVE CONTAINER

Supported syntax:

MOVE
  CONTAINER(data-value)? AS(data-value)? CHANNEL(data-value)?
  TOCHANNEL(data-value)?

Runtime support : none

5.98. POP HANDLE

Supported syntax:

POP
  HANDLE?

Runtime support : library

5.99. POST

Supported syntax:

POST
  [ TIME(data-value) | INTERVAL(data-value)
  | ( AFTER HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  | ( AT HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  ]?
  SET(ptr-ref) REQID(name)?

Runtime support : none

5.100. PURGE MESSAGE

Supported syntax:

PURGE
  MESSAGE

Runtime support : none

5.101. PUSH HANDLE

Supported syntax:

PUSH
  HANDLE?

Runtime support : library

5.102. PUT CONTAINER

Supported syntax:

PUT
  CONTAINER(data-value)
  [ CHANNEL(data-value)
  | [ ACTIVITY(data-value) | ACQACTIVITY | PROCESS | ACQPROCESS ]?
  ]?
  FROM(data-area) [ FLENGTH(data-value) | LENGTH(data-value) ]?
  [ BIT | DATATYPE(cvda) | CHAR ]?
  [ FROMCCSID(data-value) | FROMCODEPAGE(data-value) ]? [ APPEND | PREPEND ]?

Runtime support : library

5.103. QUERY COUNTER

Supported syntax:

QUERY
  COUNTER(name) POOL(name)? VALUE(data-area)? MINIMUM(data-area)?
  MAXIMUM(data-area)?

Runtime support : none

5.104. QUERY SECURITY

Supported syntax:

QUERY
  SECURITY RESTYPE(data-value) RESID(data-value) LOGMESSAGE(cvda)?
  READ(cvda)? UPDATE(cvda)? CONTROL(cvda)? ALTER(cvda)? NOLOG?
QUERY
  SECURITY RESCLASS(data-value) RESIDLENGTH(data-value) RESID(data-value)
  LOGMESSAGE(cvda)? READ(cvda)? UPDATE(cvda)? CONTROL(cvda)? ALTER(cvda)?
  NOLOG?

Runtime support : none

5.105. READ

Supported syntax:

READ
  [ FILE(filename) | DATASET(filename) ]
  [ UNCOMMITTED | CONSISTENT | REPEATABLE | ( UPDATE TOKEN(data-area)? ) ]?
  [ INTO(data-area) | SET(ptr-ref) ] RIDFLD(data-area)
  ( KEYLENGTH(data-value) GENERIC? )? SYSID(systemname)? LENGTH(data-area)?
  [ DEBKEY | DEBREC | RBA | RRN | XRBA ]? [ EQUAL | GTEQ ]? NOSUSPEND?

Runtime support : none

5.106. READNEXT

Supported syntax:

READNEXT
  [ FILE(filename) | DATASET(filename) ] [ INTO(data-area) | SET(ptr-ref) ]
  [ UNCOMMITTED | CONSISTENT | REPEATABLE | ( UPDATE TOKEN(data-area)? ) ]?
  RIDFLD(data-area)? KEYLENGTH(data-value)? REQID(data-value)?
  SYSID(systemname)? LENGTH(data-area)? [ RBA | RRN | XRBA ]? NOSUSPEND?

Runtime support : none

5.107. READPREV

Supported syntax:

READPREV
  [ FILE(filename) | DATASET(filename) ] [ INTO(data-area) | SET(ptr-ref) ]
  [ UNCOMMITTED | CONSISTENT | REPEATABLE | ( UPDATE TOKEN(data-area)? ) ]?
  RIDFLD(data-area)? KEYLENGTH(data-value)? REQID(data-value)?
  SYSID(systemname)? LENGTH(data-area)? [ RBA | RRN | XRBA ]? NOSUSPEND?

Runtime support : none

5.108. READQ TD

Supported syntax:

READQ
  TD QUEUE(name) [ INTO(data-area) | SET(ptr-ref) ] LENGTH(data-area)?
  SYSID(systemname)? NOSUSPEND?

Runtime support : library

5.109. READQ TS

Supported syntax:

READQ
  TS? [ QUEUE(name) | QNAME(name) ] [ INTO(data-area) | SET(ptr-ref) ]
  LENGTH(data-area)? NUMITEMS(data-area)? [ NEXT | ITEM(data-value) ]?
  SYSID(systemname)?

Runtime support : library

5.110. RECEIVE (APPC)

Supported syntax:

RECEIVE
  [ CONVID(name) | SESSION(name) ]? INTO(data-area)?
  [ LENGTH(data-area) | FLENGTH(data-area) ]?
  [ MAXLENGTH(data-value) | MAXFLENGTH(data-value) ]? BUFFER? ASIS?
  NOTRUNCATE? STATE(cvda)?
RECEIVE
  [ CONVID(name) | SESSION(name) ]? SET(ptr-ref)
  [ LENGTH(data-area) | FLENGTH(data-area) ]
  [ MAXLENGTH(data-value) | MAXFLENGTH(data-value) ]? BUFFER? ASIS?
  NOTRUNCATE? STATE(cvda)?

Runtime support : none

5.111. RECEIVE MAP

Supported syntax:

RECEIVE
  MAP(name) MAPSET(name)? INTO(data-area)?
  [ ( TERMINAL? ASIS? INPARTN(name)? ) | ( FROM(data-area) LENGTH(data-value)? ) ]
RECEIVE
  MAP(name) MAPSET(name)? SET(ptr-ref)
  [ ( TERMINAL? ASIS? INPARTN(name)? ) | ( FROM(data-area) LENGTH(data-value)? ) ]

Runtime support : Qix emulator

5.112. RECEIVE MAP MAPPINGDEV

Supported syntax:

RECEIVE
  MAP(name) MAPPINGDEV(data-value) FROM(data-area) LENGTH(data-area)?
  MAPSET(name)? INTO(data-area)?
RECEIVE
  MAP(name) MAPPINGDEV(data-value) FROM(data-area) LENGTH(data-area)?
  MAPSET(name)? SET(ptr-ref)

Runtime support : none

5.113. RECEIVE PARTN

Supported syntax:

RECEIVE
  PARTN(data-area) [ INTO(data-area) | SET(ptr-ref) ] LENGTH(data-area) ASIS?

Runtime support : none

5.114. RELEASE

Supported syntax:

RELEASE
  PROGRAM(name)

Runtime support : none

5.115. RESET ACQPROCESS

Supported syntax:

RESET
  ACQPROCESS

Runtime support : none

5.116. RESET ACTIVITY

Supported syntax:

RESET
  ACTIVITY(data-value)

Runtime support : none

5.117. RESETBR

Supported syntax:

RESETBR
  [ FILE(filename) | DATASET(filename) ] RIDFLD(data-area)
  ( KEYLENGTH(data-value) GENERIC? )? SYSID(systemname)? [ EQUAL | GTEQ ]?
  [ RBA | RRN | XRBA ]?

Runtime support : library

5.118. RESUME

Supported syntax:

RESUME
  [ ACTIVITY(data-value) | ACQACTIVITY | ACQPROCESS ]

Runtime support : none

5.119. RETRIEVE

Supported syntax:

RETRIEVE
  [ INTO(data-area) | SET(ptr-ref) ] LENGTH(data-area)? RTRANSID(data-area)?
  RTERMID(data-area)? QUEUE(data-area)? WAIT?

Runtime support : Qix emulator

5.120. RETRIEVE REATTACH EVENT

Supported syntax:

RETRIEVE
  REATTACH EVENT(data-area) EVENTTYPE(cvda)?

Runtime support : none

5.121. RETURN

Supported syntax:

RETURN
  ( TRANSID(name)
    [ ( COMMAREA(data-area) LENGTH(data-value)? ) | CHANNEL(name) ]?
    IMMEDIATE?
  )?
  ( INPUTMSG(data-area) INPUTMSGLEN(data-value)? )? ENDACTIVITY?

Runtime support : library and Qix emulator

5.122. REWIND COUNTER

Supported syntax:

REWIND
  COUNTER(name) POOL(name)? INCREMENT(data-value)?

Runtime support : none

5.123. REWRITE

Supported syntax:

REWRITE
  [ FILE(filename) | DATASET(filename) ] TOKEN(data-area)? FROM(data-area)
  LENGTH(data-value)? SYSID(systemname)? NOSUSPEND?

Runtime support : none

5.124. ROUTE

Supported syntax:

ROUTE
  [ INTERVAL(hhmmss) | TIME(hhmmss)
  | ( AFTER HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  | ( AT HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  ]?
  ERRTERM(name)? TITLE(data-area)? LIST(data-area)? OPCLASS(data-area)?
  REQID(name)? LDC(name)? NLEOM?

Runtime support : none

5.125. RUN

Supported syntax:

RUN
  [ ACTIVITY(data-value) | ACQACTIVITY | ACQPROCESS ]
  [ SYNCHRONOUS | ( ASYNCHRONOUS FACILITYTOKN(data-value)? ) ]
  INPUTEVENT(data-value)?

Runtime support : none

5.126. RUN TRANSID

Supported syntax:

RUN
  TRANSID(name) CHANNEL(name)? CHILD(data-area)?

Runtime support : none

5.127. SEND

Supported syntax:

SEND
  FROM(data-area)? [ CONVID(name) | SESSION(name) | DEST(name) ]?
  [ LENGTH(data-value) | FLENGTH(data-value) ]? [ CONFIRM | WAIT ]?
  [ INVITE | LAST ]? ATTACHID(name)?
  ( ( ERASE [ DEFAULT | ALTERNATE ]? )? CTLCHAR(data-value)? STRFIELD? )
  DEFRESP? FMH?

Runtime support : Qix emulator

5.128. SEND CONTROL

Supported syntax:

SEND
  CONTROL CURSOR(data-value)? FORMFEED?
  [ ( ERASE [ DEFAULT | ALTERNATE ]? ) | ERASEAUP ]? PRINT? FREEKB? ALARM?
  FRSET? MSR(data-value)? [ LDC(name) | ( OUTPARTN(name)? ACTPARTN(name)? ) ]
  ACCUM? [ SET(ptr-ref) | PAGING | ( TERMINAL WAIT? LAST? ) ]? REQID(name)?
  [ HONEOM | L40 | L64 | L80 ]?

Runtime support : Qix emulator

5.129. SEND MAP

Supported syntax:

SEND
  MAP(name) MAPSET(name)?
  [ ( FROM(data-area)? DATAONLY? LENGTH(data-value)? ) | MAPONLY ]
  CURSOR(data-value)? FORMFEED?
  [ ( ERASE? [ ALTERNATE | DEFAULT ]? ) | ERASEAUP ] PRINT? FREEKB? ALARM?
  FRSET? NLEOM? MSR(data-value)? FMHPARM(name)?
  [ [ OUTPARTN(name) | ACTPARTN(name) ]? | LDC(name) ] ACCUM? TERMINAL? WAIT?
  LAST? NOFLUSH? [ HONEOM | L40 | L64 | L80 ]? PAGING?
SEND
  MAP(name) MAPSET(name)?
  [ ( FROM(data-area)? DATAONLY? LENGTH(data-value)? ) | MAPONLY ]
  CURSOR(data-value)? FORMFEED?
  [ ( ERASE? [ ALTERNATE | DEFAULT ]? ) | ERASEAUP ] PRINT? FREEKB? ALARM?
  FRSET?
SEND
  MAP(name) MAPSET(name)?
  [ ( FROM(data-area)? DATAONLY? LENGTH(data-value)? ) | MAPONLY ]
  CURSOR(data-value)? FORMFEED?
  [ ( ERASE? [ ALTERNATE | DEFAULT ]? ) | ERASEAUP ] PRINT? FREEKB? ALARM?
  FRSET? NLEOM? MSR(data-value)? FMHPARM(name)?
  [ [ OUTPARTN(name) | ACTPARTN(name) ]? | LDC(name) ]

Runtime support : Qix emulator

5.130. SEND MAP MAPPINGDEV

Supported syntax:

SEND
  MAP(name) MAPSET(name)? MAPPINGDEV(data-value) MAPONLY? FROM(data-area)?
  DATAONLY? CURSOR(data-value)? FORMFEED? ERASE? ERASEAUP? PRINT? FREEKB?
  ALARM? FRSET? SET(ptr-ref)?

Runtime support : none

5.131. SEND PAGE

Supported syntax:

SEND
  PAGE [ ( RELEASE TRANSID(name)? ) | RETAIN ]? TRAILER(data-area)?
  SET(ptr-ref)? [ ( AUTOPAGE [ CURRENT | ALL ]? ) | NOAUTOPAGE ]? OPERPURGE?
  FMHPARM(name)? LAST?

Runtime support : Qix emulator

5.132. SEND PARTNSET

Supported syntax:

SEND
  PARTNSET(name)

Runtime support : none

5.133. SEND TEXT

Supported syntax:

SEND
  TEXT FROM(data-area) LENGTH(data-value)? CURSOR(data-value)? FORMFEED?
  ( ERASE [ DEFAULT | ALTERNATE ]? )? PRINT? FREEKB? ALARM? NLEOM?
  FMHPARM(name)? [ LDC(name) | ( OUTPARTN(name)? ACTPARTN(name)? ) ]
  MSR(data-value)? ( [ PAGING | TERMINAL ]? WAIT? LAST? ) REQID(name)?
  HEADER(data-area)? TRAILER(data-area)?
  [ JUSTIFY(data-value) | JUSFIRST | JUSLAST ]? ACCUM?
  [ HONEOM | L40 | L64 | L80 ]?

Runtime support : Qix emulator

5.134. SEND TEXT MAPPED

Supported syntax:

SEND
  TEXT MAPPED FROM(data-area)? TERMINAL? PAGING? WAIT? LAST? REQID(name)?

Runtime support : none

5.135. SEND TEXT NOEDIT

Supported syntax:

SEND
  TEXT NOEDIT ( FROM(data-area) LENGTH(data-value)? )? ERASE? DEFAULT?
  ALTERNATE? PRINT? FREEKB? ALARM? OUTPARTN(name)? TERMINAL? PAGING? WAIT?
  LAST? REQID(name)? HONEOM? L40? L64? L80?

Runtime support : none

5.136. SET CONNECTION

Supported syntax:

SET
  CONNECTION(data-value)
  [ CONNSTATUS(cvda) | ACQSTATUS(cvda) | ACQUIRED | RELEASED ]?
  [ AFFINITY(cvda) | ENDAFFINITY ]?
  [ EXITTRACING(cvda) | EXITTRACE | NOEXITTRACE ]?
  [ PENDSTATUS(cvda) | NOTPENDING ]?
  [ PURGETYPE(cvda) | CANCEL | FORCECANCEL | FORCEPURGE | KILL | PURGE ]?
  [ RECOVSTATUS(cvda) | NORECOVDATA ]?
  [ SERVSTATUS(cvda) | INSERVICE | OUTSERVICE ]?
  [ UOWACTION(cvda) | BACKOUT | COMMIT | FORCEUOW | FORCE | RESYNC ]?

Runtime support : none

5.137. SET DUMPDS

Supported syntax:

SET
  DUMPDS SWITCH?

Runtime support : none

5.138. SET FILE

Supported syntax:

SET
  [ FILE(data-value) | DATASET(data-value) ]?
  [ ADD(cvda) | ADDABLE | NOTADDABLE ]?
  [ BROWSE(cvda) | BROWSABLE | NOTBROWSABLE ]?
  [ BUSY(cvda) | WAIT | FORCE | NOWAIT ]? CFDTPOOL(data-value)?
  [ DELETE(cvda) | DELETABLE | NOTDELETABLE ]?
  [ DISPOSITION(cvda) | OLD | SHARE ]?
  [ DSNAME(data-value) | OBJECTNAME(data-value) ]?
  [ EMPTYSTATUS(cvda) | EMPTY | EMPTYREQ | NOEMPTYREQ ]?
  [ ENABLESTATUS(cvda) | DISABLED | ENABLED ]?
  [ OPENSTATUS(cvda) | CLOSED | OPEN ]?
  [ EXCLUSIVE(cvda) | EXCTL | NOEXCTL ]? KEYLENGTH(data-value)?
  [ LOADTYPE(cvda) | LOAD | NOLOAD ]? LSRPOOLNUM(data-value)?
  MAXNUMRECS(data-value)? [ READ(cvda) | NOTREADABLE | READABLE ]?
  RECORDSIZE(data-value)?
  [ READINTEG(cvda) | UNCOMMITTED | CONSISTENT | REPEATABLE ]?
  [ RLSACCESS(cvda) | RLS | NOTRLS ]? STRINGS(data-value)?
  [ TABLE(cvda) | CFTABLE | CICSTABLE | NOTTABLE | USERTABLE ]?
  TABLENAME(data-value)? [ UPDATE(cvda) | NOTUPDATABLE | UPDATABLE ]?
  [ UPDATEMODEL(cvda) | CONTENTION | LOCKING ]?

Runtime support : none

5.139. SET PROGRAM

Supported syntax:

SET
  PROGRAM(data-value) [ STATUS(cvda) | ENABLED | DISABLED ]?
  [ CEDFSTATUS(cvda) | CEDF | NOCEDF ]? [ COPY(cvda) | NEWCOPY | PHASEIN ]?
  [ EXECUTIONSET(cvda) | DPLSUBSET | FULLAPI ]?
  [ REPLICATION(cvda) | REPLICATOR | NOREPLICATOR ]?
  [ SHARESTATUS(cvda) | PRIVATE | SHARED ]? VERSION(cvda)?
  OPERATION(data-value)?

Runtime support : none

5.140. SET TASK

Supported syntax:

SET
  TASK(data-value) PRIORITY(data-value)?
  [ PURGETYPE(cvda) | PURGE | KILL | FORCEPURGE ]?

Runtime support : none

5.141. SET TDQUEUE

Supported syntax:

SET
  TDQUEUE(data-value) [ ATIFACILITY(cvda) | NOTERMINAL | TERMINAL ]?
  ATITERMID(data-value)? ATITRANID(data-value)? ATIUSERID(data-value)?
  [ ENABLESTATUS(cvda) | DISABLED | ENABLED ]?
  [ OPENSTATUS(cvda) | CLOSED | OPEN ]? TRIGGERLEVEL(data-value)?

Runtime support : none

5.142. SET TERMINAL

Supported syntax:

SET
  TERMINAL(data-value)
  [ TERMSTATUS(cvda) | ACQSTATUS(cvda) | ACQUIRED | COLDACQ | RELEASED ]?
  ALTPRINTER(data-value)? [ ALTPRTCOPYST(cvda) | ALTPRTCOPY | NOALTPRTCOPY ]?
  [ ATISTATUS(cvda) | ATI | NOATI ]?
  [ CREATESESS(cvda) | CREATE | NOCREATE ]?
  [ DISCREQST(cvda) | DISCREQ | NODISCREQ ]?
  [ EXITTRACING(cvda) | EXITTRACE | NOEXITTRACE ]? MAPNAME(data-value)?
  MAPSETNAME(data-value)? NEXTTRANSID(data-value)?
  [ OBFORMATST(cvda) | OBFORMAT | NOOBFORMAT ]? OPERID(data-value)?
  [ PAGESTATUS(cvda) | AUTOPAGEABLE | PAGEABLE ]? PRINTER(data-value)?
  [ PRTCOPYST(cvda) | PRTCOPY | NOPRTCOPY ]?
  [ PURGETYPE(cvda) | FORCEPURGE | KILL | CANCEL ]?
  [ RELREQST(cvda) | RELREQ | NORELREQ ]?
  [ SERVSTATUS(cvda) | INSERVICE | OUTSERVICE ]? TERMPRIORITY(data-value)?
  [ TRACING(cvda) | SPECTRACE | STANTRACE ]?
  [ TTISTATUS(cvda) | NOTTI | TTI ]?
  [ UCTRANST(cvda) | UCTRAN | NOUCTRAN | TRANIDONLY ]?
  [ ZCPTRACING(cvda) | NOZCPTRACE | ZCPTRACE ]?

Runtime support : Qix emulator

5.143. SET TRANDUMPCODE

Supported syntax:

SET
  TRANDUMPCODE(data-value) [ ACTION(cvda) | ADD | REMOVE | RESET ]?
  [ DUMPSCOPE(cvda) | LOCAL | RELATED ]? MAXIMUM(data-value)?
  [ SHUTOPTION(cvda) | NOSHUTDOWN | SHUTDOWN ]?
  [ SYSDUMPING(cvda) | NOSYSDUMP | SYSDUMP ]?
  [ TRANDUMPING(cvda) | NOTRANDUMP | TRANDUMP ]?

Runtime support : none

5.144. SET TRANSACTION

Supported syntax:

SET
  TRANSACTION(data-value) [ DUMPING(cvda) | TRANDUMP | NOTRANDUMP ]?
  PRIORITY(data-value)? [ PURGEABILITY(cvda) | NOTPURGEABLE | PURGEABLE ]?
  RUNAWAY(data-value)? [ RUNAWAYTYPE(cvda) | SYSTEM | USER ]?
  [ SHUTDOWN(cvda) | SHUTDISABLED | SHUTENABLED ]?
  [ STATUS(cvda) | DISABLED | ENABLED ]?
  [ TCLASS(data-value) | TRANCLASS(data-value) ]?
  [ TRACING(cvda) | SPECTRACE | SPRSTRACE | STANTRACE ]?

Runtime support : none

5.145. SIGNOFF

Supported syntax:

  SIGNOFF
null

Runtime support : Qix emulator

5.146. SIGNON

Supported syntax:

SIGNON
  USERID(data-value) ESMREASON(data-area)? ESMRESP(data-area)?
  GROUPID(data-value)? [ LANGUAGECODE(data-value) | NATLANG(data-value) ]?
  LANGINUSE(data-area)? NATLANGINUSE(data-area)?
  [ ( PASSWORD(data-value) NEWPASSWORD(data-value)? )
  | ( PHRASE(data-area) PHRASELEN(data-value)
      ( NEWPHRASE(data-area) NEWPHRASELEN(data-value) )?
    )
  ]?
  OIDCARD(data-value)?

Runtime support : Qix emulator

5.147. SOAPFAULT CREATE

Supported syntax:

SOAPFAULT
  CREATE [ FAULTCODE(cvda) | CLIENT | SERVER | SENDER | RECEIVER ]?
  FAULTCODESTR(data-value)? FAULTCODELEN(data-value)?
  ( FAULTSTRING(data-value) FAULTSTRLEN(data-value)? ) NATLANG(data-value)?
  ( ROLE(data-value) ROLELENGTH(data-value)? )?
  ( FAULTACTOR(data-value) FAULTACTLEN(data-value)? )?
  ( DETAIL(data-value) DETAILLENGTH(data-value)? )? FROMCCSID(data-value)?

Runtime support : none

5.148. SPOOLCLOSE

Supported syntax:

SPOOLCLOSE
  TOKEN(data-area) [ KEEP | DELETE ]?

Runtime support : none

5.149. SPOOLOPEN

Supported syntax:

SPOOLOPEN
  INPUT TOKEN(data-area) USERID(data-value) CLASS(data-value)?
SPOOLOPEN
  OUTPUT TOKEN(data-area) USERID(data-value) NODE(data-value)
  CLASS(data-value)? OUTDESCR(ptr-ref)? [ NOCC | ASA | MCC ]?
  [ ( PRINT RECORDLENGTH(data-value)? ) | PUNCH ]?

Runtime support : none

5.150. SPOOLREAD

Supported syntax:

SPOOLREAD
  TOKEN(data-area)? MAXLENGTH(data-value)? NOHANDLE? RESP? RESP2?
  INTO(data-area)? TOLENGTH(data-area)?

Runtime support : none

5.151. SPOOLWRITE

Supported syntax:

SPOOLWRITE
  TOKEN(data-area) FROM(data-area) FLENGTH(data-value)? [ LINE | PAGE ]?

Runtime support : none

5.152. START

Supported syntax:

START
  [ TRANSID(name) | TRANS(name) ]
  [ INTERVAL(hhmmss) | TIME(hhmmss)
  | ( AFTER HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  | ( AT HOURS(data-value)? MINUTES(data-value)? SECONDS(data-value)? )
  ]?
  REQID(name)? ( FROM(data-area) LENGTH(data-value)? FMH? )?
  [ TERMID(name) | USERID(data-value) ]? SYSID(systemname)? RTRANSID(name)?
  RTERMID(name)? QUEUE(name)? NOCHECK? PROTECT?

Runtime support : Qix emulator

5.153. START ATTACH

Supported syntax:

START
  ATTACH TRANSID(name) ( FROM(data-area) LENGTH(data-value)? )?

Runtime support : none

5.154. START CHANNEL

Supported syntax:

START
  TRANSID(name) CHANNEL(name) [ TERMID(name) | USERID(data-value) ]?
  SYSID(systemname)?

Runtime support : none

5.155. STARTBR

Supported syntax:

STARTBR
  [ FILE(filename) | DATASET(filename) ] RIDFLD(data-area)
  ( KEYLENGTH(data-value) GENERIC? )? REQID(data-value)? SYSID(systemname)?
  [ DEBKEY | DEBREC | RBA | RRN | XRBA ]? [ EQUAL | GTEQ | LTEQ ]?

Runtime support : library

5.156. STARTBROWSE ACTIVITY

Supported syntax:

STARTBROWSE
  ACTIVITY
  [ ACTIVITYID(data-value) | ( PROCESS(data-value) PROCESSTYPE(data-value) ) ]?
  BROWSETOKEN(data-area)

Runtime support : none

5.157. STARTBROWSE CONTAINER

Supported syntax:

STARTBROWSE
  CONTAINER
  [ ACTIVITY(data-value) | ( PROCESS(data-value) PROCESSTYPE(data-value) )
  | CHANNEL(data-value)
  ]?
  BROWSETOKEN(data-area)

Runtime support : none

5.158. SUSPEND

Supported syntax:

SUSPEND
  [ ACTIVITY(data-value) | ACQACTIVITY | ACQPROCESS ]?

Runtime support : none

5.159. SYNCPOINT

Supported syntax:

  SYNCPOINT
null

Runtime support : library and Qix emulator

5.160. SYNCPOINT ROLLBACK

Supported syntax:

SYNCPOINT
  ROLLBACK

Runtime support : library and Qix emulator

5.161. UNLOCK

Supported syntax:

UNLOCK
  [ FILE(filename) | DATASET(filename) ] TOKEN(data-area)? SYSID(systemname)?

Runtime support : none

5.162. UPDATE COUNTER

Supported syntax:

UPDATE
  COUNTER(name) POOL(name)? VALUE(data-value) COMPAREMIN(data-value)?
  COMPAREMAX(data-value)?

Runtime support : none

5.163. VERIFY PASSWORD

Supported syntax:

VERIFY
  PASSWORD(data-value) USERID(data-value) CHANGETIME(data-area)?
  DAYSLEFT(data-area)? ESMREASON(data-area)? ESMRESP(data-area)?
  EXPIRYTIME(data-area)? INVALIDCOUNT(data-area)? LASTUSETIME(data-area)?

Runtime support : none

5.164. WAIT EVENT

Supported syntax:

WAIT
  EVENT ECADDR(ptr-value) NAME(name)?

Runtime support : none

5.165. WAIT JOURNAL

Supported syntax:

WAIT
  JOURNAL JOURNALNAME(data-value)? REQID(data-value)? JOURNALNUM(data-value)?

Runtime support : none

5.166. WAIT TERMINAL

Supported syntax:

WAIT
  TERMINAL [ CONVID(name) | SESSION(name) ]?

Runtime support : none

5.167. WEB CLOSE

Supported syntax:

WEB
  CLOSE SESSTOKEN(data-value)

Runtime support : none

5.168. WEB CONVERSE

Supported syntax:

WEB
  CONVERSE SESSTOKEN(data-value)
  [ ( PATH(data-area) PATHLENGTH(data-value) ) | URIMAP(data-value) ]?
  [ GET | HEAD | POST | PUT | TRACE | OPTIONS | DELETE | METHOD(cvda) ]
  ( QUERYSTRING(data-area) QUERYSTRLEN(data-value) )?
  [ ( DOCTOKEN(data-value) [ NODOCDELETE | DOCDELETE | DOCSTATUS(cvda) ]? )
  | ( FROM(data-area) FROMLENGTH(data-value) )
  | ( CONTAINER(data-value) CHANNEL(data-value)? )
  ]
  MEDIATYPE(data-value)? [ CLICONVERT | NOCLICONVERT | CLIENTCONV(cvda) ]?
  CHARACTERSET(data-value)? [ EXPECT | ACTION(cvda) ]?
  [ NOCLOSE | CLOSE | CLOSESTATUS(cvda) ]?
  [ NONE | BASICAUTH | AUTHENTICATE(cvda) ]?
  ( USERNAME(data-value) USERNAMELEN(data-value)? )?
  ( PASSWORD(data-value) PASSWORDLEN(data-value)? )?
  [ CHUNKNO | CHUNKYES | CHUNKEND | CHUNKING(cvda) ]?
  ( STATUSCODE(data-value) STATUSTEXT(data-area) STATUSLEN(data-value) )?
  [ INTO(data-area) | SET(ptr-ref) ] LENGTH(data-area) MAXLENGTH(data-value)?
  NOTRUNCATE? BODYCHARSET(data-area)?

Runtime support : none

5.169. WEB EXTRACT

Supported syntax:

WEB
  EXTRACT SESSTOKEN(data-area)? SCHEME(cvda)?
  ( HOST(data-area) HOSTLENGTH(data-value) HOSTTYPE(cvda)? )?
  ( HTTPMETHOD(data-area) METHODLENGTH(data-area) )?
  ( HTTPVERSION(data-area) VERSIONLEN(data-area) )?
  ( PATH(data-area) PATHLENGTH(data-area) )? PORTNUMBER(data-area)?
  ( QUERYSTRING(data-area) QUERYSTRLEN(data-area) )? REQUESTTYPE(cvda)?
  URIMAP(data-area)? ( REALM(data-area) REALMLEN(data-area) )?

Runtime support : none

5.170. WEB OPEN

Supported syntax:

WEB
  OPEN
  [ URIMAP(data-value)
  | ( HOST(data-value) HOSTLENGTH(data-value) PORTNUMBER(data-value)
      [ SCHEME(cvda) | HTTP | HTTPS ]?
    )
  ]
  CERTIFICATE(data-value)? ( CIPHERS(data-value) NUMCIPHERS(data-value) )?
  CODEPAGE(data-value)? SESSTOKEN(data-area)
  ( HTTPVNUM(data-area) HTTPRNUM(data-area) )?

Runtime support : none

5.171. WEB READ HTTPHEADER

Supported syntax:

WEB
  READ HTTPHEADER(data-area) NAMELENGTH(data-value) SESSTOKEN(data-area)?
  VALUE(data-area) VALUELENGTH(data-area)

Runtime support : none

5.172. WEB RECEIVE (client)

Supported syntax:

WEB
  RECEIVE SESSTOKEN(data-value) MEDIATYPE(data-area)?
  ( STATUSCODE(data-value) STATUSTEXT(data-area) STATUSLEN(data-value) )?
  [ INTO(data-area) | SET(ptr-ref) ] LENGTH(data-area) MAXLENGTH(data-value)?
  NOTRUNCATE? [ CLIENTCONV(cvda) | CLICONVERT | NOCLICONVERT ]?
  BODYCHARSET(data-area)?

Runtime support : none

5.173. WEB RECEIVE (container client)

Supported syntax:

WEB
  RECEIVE SESSTOKEN(data-value) MEDIATYPE(data-area)? STATUSCODE(data-value)?
  ( STATUSTEXT(data-area) STATUSLEN(data-value) )? TOCONTAINER(data-value)
  TOCHANNEL(data-value)? BODYCHARSET(data-area)?

Runtime support : none

5.174. WEB RECEIVE (container server)

Supported syntax:

WEB
  RECEIVE TOCONTAINER(data-value) TOCHANNEL(data-value)? TYPE(cvda)?
  CHARACTERSET(data-value)? BODYCHARSET(data-area)? MEDIATYPE(data-value)?

Runtime support : none

5.175. WEB RECEIVE (server)

Supported syntax:

WEB
  RECEIVE [ INTO(data-area) | SET(ptr-ref) ] LENGTH(data-area)
  MAXLENGTH(data-value)? NOTRUNCATE? TYPE(cvda)?
  [ SERVERCONV(cvda) | SRVCONVERT | NOSRVCONVERT ]? CHARACTERSET(data-value)?
  HOSTCODEPAGE(data-value)? BODYCHARSET(data-area)? MEDIATYPE(data-value)?

Runtime support : none

5.176. WEB SEND (client)

Supported syntax:

WEB
  SEND SESSTOKEN(data-value)
  [ GET | HEAD | POST | PUT | TRACE | OPTIONS | DELETE | METHOD(cvda) ]
  [ ( PATH(data-area) PATHLENGTH(data-value) ) | URIMAP(data-value) ]?
  ( QUERYSTRING(data-area) QUERYSTRLEN(data-value) )?
  [ ( DOCTOKEN(data-value) [ NODOCDELETE | DOCDELETE | DOCSTATUS(cvda) ]? )
  | ( FROM(data-area) FROMLENGTH(data-value) )
  | ( CONTAINER(data-value) CHANNEL(data-value)? )
  ]
  MEDIATYPE(data-value)? [ CLICONVERT | NOCLICONVERT | CLIENTCONV(cvda) ]?
  CHARACTERSET(data-value)? [ EXPECT | ACTION(cvda) ]?
  [ NOCLOSE | CLOSE | CLOSESTATUS(cvda) ]?
  [ NONE | BASICAUTH | AUTHENTICATE(cvda) ]?
  ( USERNAME(data-value) USERNAMELEN(data-value)? )?
  ( PASSWORD(data-value) PASSWORDLEN(data-value)? )?
  [ CHUNKNO | CHUNKYES | CHUNKEND | CHUNKING(cvda) ]?

Runtime support : none

5.177. WEB SEND (server)

Supported syntax:

WEB
  SEND
  [ ( DOCTOKEN(data-value) [ NODOCDELETE | DOCDELETE | DOCSTATUS(cvda) ]? )
  | CHUNKEND
  | ( FROM(data-area) FROMLENGTH(data-value)
      [ CHUNKNO | CHUNKYES | CHUNKEND | CHUNKING(cvda) ]?
      HOSTCODEPAGE(data-value)?
    )
  | ( CONTAINER(data-value) CHANNEL(data-value)? )
  ]
  MEDIATYPE(data-value)? [ SRVCONVERT | NOSRVCONVERT | SERVERCONV(cvda) ]?
  CHARACTERSET(data-value)?
  ( STATUSCODE(data-value) STATUSTEXT(data-area)
    [ STATUSLEN(data-value) | LENGTH(data-value) ]
  )?
  [ IMMEDIATE | EVENTUAL | ACTION(cvda) ]?
  [ NOCLOSE | CLOSE | CLOSESTATUS(cvda) ]?

Runtime support : none

5.178. WEB WRITE HTTPHEADER

Supported syntax:

WEB
  WRITE HTTPHEADER(data-area) NAMELENGTH(data-value)? SESSTOKEN(data-value)?
  VALUE(data-area) VALUELENGTH(data-value)?

Runtime support : none

5.179. WRITE

Supported syntax:

WRITE
  [ FILE(filename) | DATASET(filename) ] MASSINSERT? FROM(data-area)
  RIDFLD(data-area) KEYLENGTH(data-value)? SYSID(systemname)?
  LENGTH(data-value)? [ RBA | RRN | XRBA ]? NOSUSPEND?

Runtime support : none

5.180. WRITE JOURNAL

Supported syntax:

WRITE
  [ JOURNALNAME(data-value) | ( JOURNALNUM(data-value) STARTIO? ) ]
  JTYPEID(data-value) FROM(data-area)
  [ LENGTH(data-value) | FLENGTH(data-value) ]? REQID(data-value)?
  ( PREFIX(data-value) PFXLENG(data-value)? )? WAIT? NOSUSPEND?

Runtime support : none

5.181. WRITE OPERATOR

Supported syntax:

WRITE
  OPERATOR TEXT(data-value) TEXTLENGTH(data-value)?
  ( ROUTECODES(data-value) NUMROUTES(data-value) )?
  [ EVENTUAL | ACTION(cvda) | CRITICAL | IMMEDIATE
  | ( REPLY(data-area) MAXLENGTH(data-value) REPLYLENGTH(data-area)?
      TIMEOUT(data-value)?
    )
  ]?

Runtime support : none

5.182. WRITEQ TD

Supported syntax:

WRITEQ
  TD QUEUE(name) FROM(data-area) LENGTH(data-value)? SYSID(systemname)?

Runtime support : library

5.183. WRITEQ TS

Supported syntax:

WRITEQ
  TS? [ QUEUE(name) | QNAME(name) ] FROM(data-area) LENGTH(data-value)?
  ITEM(data-area)? [ NUMITEMS(data-area) | REWRITE ]? SYSID(systemname)?
  [ AUXILIARY | MAIN ]? NOSUSPEND?

Runtime support : library

5.184. XCTL

Supported syntax:

XCTL
  PROGRAM(name) [ ( COMMAREA(data-area) LENGTH(data-value)? ) | CHANNEL(name) ]?
  ( INPUTMSG(data-area) INPUTMSGLEN(data-value)? )?

Runtime support : library

6. Limitations

QIX comes with a few limitations, described below.

6.1. Printing support

In practice, there is an extremely wide array of implementations of printing support, both on and off the mainframe. Moreover, requirements for how things need to be printed vary greatly from CICS installation to CICS installation. As a consequence, support for printing in QIX almost always needs to be customized for the application being migrated.

Given the need for such customization, Raincode does not provide any out-of-the-box printing support. This is because any such support would need to be customized anyway, and hence it is arguable that a complete custom solution is a cleaner approach. Typically, on the mainframe, there is an existing program, e.g., written in COBOL, that handles printing. This can serve as a reference for a C# implementation of printing logic.

For example, if printing is implemented using TD queues, the original program that reads the queue and spools the content to a printer can be replaced by a C# program that sends the content to a different printer. Alternatively, if a printer is addressed as a 3287 terminal through a SEND MAP command, then a specific handler for such an operation needs to be created. This can be done as a customization of QIX, e.g., by reusing the open-source pr3287 tool.

6.2. Common Work Area

Due to the distributed nature of QIX, allowing multiple processing servers to run simultaneously, running transactions accessing the same piece of shared memory in the QIX region is a bit tricky and is only supported in a limited way.

The Common Work Area (CWA) is more or less supported, depending on how the application uses it:

  • Without resource locking: when starting a new transaction, QIX allocates a copy of the CWA in the address space of the new task. When the task ends, QIX checks if this task’s CWA changed, and if it did, propagates it to other running processing servers. Each task has its own copy of the CWA, and it is not updated for a running task when another task writes in its own copy. Only tasks started after a task writing in the CWA will get a fresh copy. There is no guarantee as to which CWA will be used by subsequent tasks when two or more tasks update their copy of the CWA and get propagated simultaneously.

  • With resource locking: the previous paragraph still holds; with the addition, QIX can propagate the CWA even to running tasks. When issuing the ENQ command on a location inside the CWA, QIX can better keep track of changes and propagate the updated CWA to all running tasks, including tasks running on other processing servers, but only when the resource is released. When issuing the corresponding DEQ to release the lock, QIX takes care of propagating the CWA and copies it into the address space of every running task. Tasks waiting on the same lock will therefore get the most up-to-date version of the CWA.

Using a name lock (as opposed to an address lock) will not protect the CWA, as QIX only propagates on DEQ when a location inside the CWA is locked.

7. Telemetry

7.1. Introduction

This section describes Raincode’s approach to Telemetry across all relevant products.

For the sake of readability of the documentation, this section is repeated identically in the following manuals: QIX, IMSql, and JCL.

7.1.1. What is Telemetry

According to Wikipedia, Telemetry is the automatic process of measuring and transmitting data for the purpose of monitoring applications and assessing their health and performance.

This definition implies the clear separation between the production of this continuous stream of data and the collection, summarization, storage, etc., of this data. As a response to this separation, the OpenTelemetry standard has emerged, enabling a vibrant market for visualization and monitoring tools. It provides a single, open-source standard and a set of technologies to capture and export metrics, traces, and logs from cloud-native applications and infrastructure.

7.1.2. How about Raincode

Telemetry applies to the subset of Raincode’s products that include a runtime component:

  • QIX, Raincode’s CICS emulator

  • IMSql, Raincode’s IMS emulator (and in the context of Telemetry, focusing on the IMS/TM part of this product)

  • Raincode JCL.

While very different in functionality, these products share the ability to send events that can be used to monitor the health and performance of the running processes.

While the Raincode Console can be used to manage the static aspects of the configuration of these products and some more dynamic aspects (inspecting IMS/TM queues, for instance), it does not offer any telemetry capabilities. This is not an oversight: the Raincode product line is designed to connect to third-party solutions for Telemetry instead.

Further, the section below explains how the Raincode products mentioned above can be configured to external telemetry services for monitoring, visualization, alerts, and more.

7.2. In practice

The Raincode products are agnostic as per the telemetry platform (or even Telemetry standard) they will connect to.

Using user-defined plugins, one has full control over how events produced by the products (starting or stopping a JCL, QIX transactions, etc.) are handled, what to connect to, etc.

The QIX, IMSql, and Raincode JCL distributions include a plugin that connects to an OpenTelemetry endpoint, which can be easily replaced or extended for more functionality or to connect to an entirely different platform if necessary.

7.2.1. Event Structure

The events produced by all Raincode products follow a consistent naming convention. The event names are made of three parts, separated by colons, according to the following pattern:

  • Product: The name of the product, forced in lower case, e.g. qix or ims

  • Name: The type object the event is about, e.g. transaction or aplitdli

  • Verb: The action that was done on that object, e.g. start, stop, abort

For instance, valid event names include:

  • qix:transaction:start

  • ims:transaction:stop

This simple scheme allows optimal flexibility when filtering events by product, object, action or any combination thereof.

Table 68. The telemetry events
Event Arguments Description

ims:transaction:start

the transaction code

Start of an IMS transaction

ims:transaction:stop

the transaction code
the return code

End of an IMS transaction

ims:appltdli:start

the function

Start of a IMS call (EXEC DLI, CBLTDLI, PLITDLI, CEETDLI, ASMTDLI) using a DB PCB

ims:appltdli:stop

the function

End of a IMS call (EXEC DLI, CBLTDLI, PLITDLI, CEETDLI, ASMTDLI) using a DB PCB

ims:appltdli_io:start

the function

Start of a IMS call (EXEC DLI, CBLTDLI, PLITDLI, CEETDLI, ASMTDLI) using a IO PCB

ims:appltdli_io:stop

the function

End of a IMS call (EXEC DLI, CBLTDLI, PLITDLI, CEETDLI, ASMTDLI) using a IO PCB

ims:appltdli_alt:start

the function

Start of a IMS call (EXEC DLI, CBLTDLI, PLITDLI, CEETDLI, ASMTDLI) using a alternate PCB

ims:appltdli_alt:stop

the function

End of a IMS call (EXEC DLI, CBLTDLI, PLITDLI, CEETDLI, ASMTDLI) using a alternate PCB

qix:transaction:start

the transaction code

Start of on CICS transaction

qix:transaction:stop

the transaction code
the return code

End of on CICS transaction

batch:job:preexecute

the name of the job

Start of a job (JCL)

batch:job:postexecute

the name of the job
the return code

End of a job (JCL)

batch:step:preexecute

the name of the step

Start of a step

batch:step:postexecute

the name of the step
the return code

End of a step

7.2.2. The Telemetry plugin

The plugin provides a single interface for events behind which the user can customize the filtering and connection to the telemetry API of choice. This interface is made using a single method.

LogTelemetryEvent(name, args…)

To which the first parameter will always be the event name, and the following parameters will depend on the event itself.

LogTelemetryEvent("qix:transaction:start", Transaction.ID);
LogTelemetryEvent("qix:transaction:stop", Transaction.ID, transactionResult.Error);

If only a subset of the events must be reacted to, one can use an appropriate filtering regular expression, taking advantage of the naming convention described above.

        public void LogTelemetryEvent(string eventName, params string[] eventData){
            switch (eventName)
            {
                case "ims:transaction:start":
                    StartIMSqlTransactionTelemetry(eventData[0]);
                    break;
                case "ims:transaction:stop":
                    StopIMSqlTransactionTelemetry(eventData[0], eventData[1]);
                    break;
                case "ims:appltdli:start":
                    StartAppltdliTelemetry(eventData[0]);
                    break;
                case "ims:appltdli:stop":
                    StopAppltdliTelemetry(eventData[0]);
                    break;
                default:
                    break;
            }
        }
The sample telemetry plugin can be found at %RCDIR%\plugins\AppInsights.

7.2.3. Using a plugin: command line

Providing the telemetry plugin follows the same options as providing any plugin to an application.

Use -Plugin to provide a path to an assembly.

Submit.exe -Plugin=<path to assembly>

Or you can use -PluginPath to provide a path to a folder where all the assemblies will be scanned for plugins.

Submit.exe -PluginPath=<path to folder>

The screenshot below was captured by connecting Raincode JCL to .NET Aspire® and using Application Insight for visualization.

telemetry1
Figure 4. Central telemetry graph

8. Raincode dual SQL runtime- Introduction

This document describes how to use the Raincode dual SQL runtime (also known as RainCodeLegacySqlDB2OleDbSqlServer) across multiple Raincode products. The dual SQL runtime targets both SQL Server and Db2, using the Microsoft OLE DB Provider for DB2. It can leverage Microsoft Distributed Transaction Coordinator (MSDTC, or DTC) to allow distributing the transaction and guarantee transactional integrity between SQL Server and Db2.

8.1. Prerequisites

8.2. RainCodeLegacySqlDB2OleDbSqlServer

This is an SQL runtime implementation compatible with the Raincode Stack suite. It is designed to enable connections to both SQL Server and Db2, allowing a single COBOL program to work with both databases in the same execution.

It is not a generic SQL runtime that can be used to target any SQL database; it is confined to targeting SQL Server and Db2.

The rest of this section will explain how RainCodeLegacySqlDB2OleDbSqlServer works. Later sections will explain how to configure and use it in the Raincode product suite with the help of samples.

SQL Server is the main database, and when the program starts, a connection is opened using the connection string specified in the configuration file (see Configuration file). All EXEC SQL statements will be run against SQL Server until it encounters an EXEC SQL CONNECT TO statement.

When an EXEC SQL CONNECT TO statement is executed, RainCodeLegacySqlDB2OleDbSqlServer establishes a connection to Db2 using the name specified in the CONNECT TO statement (see the Configuration file for details on how to configure this). Once the connection is established, all subsequent EXEC SQL statements will be executed against Db2, until a new CONNECT TO, SET CONNECTION or CONNECT RESET command is issued.

SET CONNECTION will switch to a previously opened Db2 connection.

CONNECT RESET will set the Db2 connection aside (not closed), and all subsequent SQL queries will be run against SQL Server. Calling CONNECT RESET always causes RainCodeLegacySqlDB2OleDbSqlServer to switch back to using the SQL Server connection.

8.3. Instantiating RainCodeLegacySqlDB2OleDbSqlServer

The RainCodeLegacySqlDB2OleDbSqlServer requires two or more connection strings: one for SQL Server and one or more for Db2. To achieve this, RainCodeLegacySqlDB2OleDbSqlServer requires a configuration file providing, among other things, the necessary connection strings.

In the Raincode Stack suite, wherever a connection string can be specified, and when using RainCodeLegacySqlDB2OleDbSqlServer, the path to the configuration file should be specified instead. For instance, in Raincode JCL, RcDbConnections.csv should have a plan specifying RainCodeLegacySqlDB2OleDbSqlServer as the SQL target, and instead of a connection string, the path to a configuration file, like so:

DUALPLAN,RainCodeLegacySqlDB2OleDbSqlServer,DualRuntimeConfig.cfg

8.3.1. Configuration file

The format of this file is subject to change in the future.

The configuration is an XML file defining the following attributes:

  • SqlServerConnectionString: A mandatory connection string for SQL Server.

  • XXXX_ConnectionString: An optional connection string for Db2. Replace XXXX with the name passed to the CONNECT TO in the COBOL program. You can specify multiple such connection strings, one for each Db2 instance that the program can connect to.

  • UseDTC: An optional boolean flag specifying whether the dual runtime should use DTC (Distributed Transaction Coordinator).

    Valid values are true and false (case insensitive). The default value is false.

    In practice, this suppresses any ambient transaction by instantiating a TransactionScope with option TransactionScopeOption.Suppress. Commits and rollbacks are handled separately for each database used.

    When UseDTC="true", make sure to specify Units of Work=DUW;AutoCommit=False; in the OLE DB for Db2 connection string, otherwise the distributed transaction will fail with exception System.InvalidOperationException: The ITransactionLocal interface is not supported by the 'DB2OLEDB' provider. Local transactions are unavailable with the current provider. when enlisting the Db2 connection into the current transaction.
    When UseDTC="false", make sure to specify Units of Work=RUW;AutoCommit=False; in the OLE DB for Db2 connection string, otherwise you’ll get exception System.InvalidOperationException: The ITransactionLocal interface is not supported by the 'DB2OLEDB' provider. Local transactions are unavailable with the current provider. when querying Db2 for the first time.

8.3.2. Samples

Three sample examples are provided to illustrate how the dual runtime integrates with the different Raincode products:

  1. Raincode JCL

  2. Raincode QIX

  3. Raincode Stored Procedure Runner

These can be found in %RCDIR%\samples\Dual SQL runtime

Sample batch job: batch sample

This sample shows how to run a batch job with the dual SQL runtime. It consists of a single COBOL program that showcases the dual SQL runtime and distributed transactions.

Description of files
  • dual.jcl: A JCL script used to execute a batch job. It starts the program DUALCOB using the plan DUALPLAN.

    //SIMPLE   JOB  CLASS=A,MSGCLASS=C
    //STEP0 EXEC PGM=IKJEFT01
    //SYSTSIN  DD *
      RUN PROGRAM(DUALCOB) PLAN(DUALPLAN)
      END
    /*
  • RcDbConnections.csv: A database connections file mapping DUALPLAN to the RainCodeLegacySqlDB2OleDbSqlServer and the configuration file for said runtime.

    DUALPLAN,RainCodeLegacySqlDB2OleDbSqlServer,DualRuntimeConfig.cfg
  • DualRuntimeConfig.cfg: An XML configuration file, specific to DualRuntimeConfig.cfg. It’s contains all necessary connection strings to be used by the dual SQL runtime.

    <RainCodeLegacySqlDDB2OleDbSqlServer
      SqlServerConnectionString="..."
      DB2SRV_ConnectionString="..."
      />
  • DUALCOB.cob: A COBOL program that connects to Db2 and performs the following SQL queries (not necessarily in this order):

    1. SELECT on SQL Server

    2. SELECT on Db2

    3. INSERT on Db2

    4. CONNECT TO

    5. SET CONNECTION

    6. CONNECT RESET

  • sqlserver.ddl and db2.ddl: the DDLs for creating the tables used in DUALCOB.COB.

Running the sample
  1. Update the connection strings in DualRuntimeConfig.cfg

  2. Create the required tables in SQL Server and Db2 using the provided DDL files

  3. Compile the program by running ./compile.ps1

  4. Execute the program with ./run.ps1

    After the run completes, you should see the following in the log output:

BEGIN
SQL Server SELECT:
SQLCODE: 0000000000
WS-C2: initial sql server data
--------------
Connect to 'DB2SRV  ':
SQLCODE: 0000000000
--------------
DB2 Init data
SQLCODE: 0000000000
--------------
DB2 SELECT:
SQLCODE: 0000000000
C1: initial db2 data
--------------
DB2 INSERT:
SQLCODE: 0000000000
--------------
DB2 SELECT:
SQLCODE: 0000000000
C1: John Dough
--------------
SQLCODE: 0000000000
SQL Server SELECT:
SQLCODE: 0000000000
WS-C2: initial sql server data
--------------
SET CONNECTION:
SQLCODE: 0000000000
--------------
DB2 INSERT:
SQLCODE: 0000000000
--------------
DB2 SELECT:
SQLCODE: 0000000000
C1: John Dough
--------------
END
Sample QIX transaction: qix sample

This sample shows how to run a Raincode QIX transaction, running a COBOL program showcasing the dual SQL runtime and distributed transaction.

Description of files
  • createregion.ps1: Edits the file to add connection strings and run to create the QIX region

  • buildbms.ps1: PowerShell script to compile the screen

  • MMENU.bms: the map used by the transaction

  • compile.ps1: PowerShell script to compile the COBOL program

  • DualRuntimeConfig.cfg: configuration file for the RainCodeLegacySqlDB2OleDbSqlServer SQL runtime. It’s an XML file containing all necessary connection strings to be used by the dual SQL runtime.

    <RainCodeLegacySqlDDB2OleDbSqlServer
      SqlServerConnectionString="..."
      DB2SRV_ConnectionString="..."
      />
  • DUALCOBQIX.cob: A COBOL program that connects to Db2 and performs the following SQL queries (not necessarily in this order):

    1. SELECT on SQL Server

    2. SELECT on Db2

    3. INSERT on Db2

    4. CONNECT TO

    5. SET CONNECTION

    6. CONNECT RESET

  • sqlserver.ddl and db2.ddl: the DDLs for creating the tables used in DUALCOB.COB.

  • startqix.ps1: PowerShell script to start the Raincode QIX region

Running the sample
  1. Update the application connection strings in DualRuntimeConfig.cfg.

  2. Update the QIX connection string in createregion.ps1 and startqix.ps1.

  3. Create the required tables in SQL Server and Db2 using the provided DDL files.

  4. Compile the map with buildbms.ps1

  5. Compile the program with compile.ps1

  6. Run startqix.ps1

  7. In a 3270 terminal emulator, connect to the QIX terminal server.

    After the run completes, you should see the following on the terminal emulator:

 MYTR                           CUSTOMER CATALOG                       Raincode
 TERMID: DEMO                                                          08:46


 SQL Server SELECT: SQLCODE = 00000000, C2 = initial sql server data
 Connect to: DB2SRV  , SQLCODE = 00000000
 DB2 Init data (DELETE): SQLCODE = 00000000
 DB2 Init data (INSERT): SQLCODE = 00000000
 DB2 SELECT: SQLCODE = 00000000, C1 = initial db2 data
 DB2 INSERT: SQLCODE = 00000000
 DB2 SELECT: SQLCODE = 00000000, C1 = John Dough
 CONNECT RESET SQLCODE = 00000000
 SQL Server SELECT: SQLCODE = 00000000, C2 = initial sql server data
 SET CONNECTION: SQLCODE = 00000000







 DB2 INSERT: SQLCODE = 00000000
 F3: Exit  ENTER: Process
Sample COBOL stored procedure: sp sample

This sample shows how to run a COBOL stored procedure using the dual SQL runtime, in the context of the Raincode Stored Procedure Runner.

Description of files
  • compile.ps1: A PowerShell script to compile the COBOL program and generate the C# helper program.

  • config.xml: An XML configuration file for the Raincode Stored Procedure Runner. In the context of using the dual sql runtime, the most important lines are these:

      SqlRuntime="RainCodeLegacySqlDB2OleDbSqlServer"
      SqlRuntimeConnectionString="path_to_DualRuntimeConfig.cfg"

    The other attributes ProgramsPath, HelpersPath should be filled according to Raincode Stored Procedure Runner Configuration file

  • DualRuntimeConfig.cfg: configuration file for the RainCodeLegacySqlDB2OleDbSqlServer SQL runtime. It’s an XML file containing all necessary connection strings to be used by the dual SQL runtime. In the context of running a COBOL stored procedure, the UseDTC attribute is set to false.

    <RainCodeLegacySqlDDB2OleDbSqlServer
      SqlServerConnectionString="..."
      DB2SRV_ConnectionString="..."
      UseDTC="false"
      />
  • DUALCOBSP.cob: A COBOL program that connects to Db2 and performs the following SQL queries (not necessarily in this order):

    1. SELECT on SQL Server

    2. SELECT on Db2

    3. INSERT on Db2

    4. CONNECT TO

    5. SET CONNECTION

    6. CONNECT RESET

  • sqlserver.ddl and db2.ddl: the DDLs for creating the tables used in DUALCOB.COB

  • startqix.ps1: A PowerShell script to start the Raincode QIX region

Running the sample

Run compile.ps1 to generate the helper program and the .dll file of the COBOL program. Then, follow instructions at Deploying a COBOL stored procedure to deploy the COBOL stored procedure.

Specifically, udpate $env:RCDIR\StoredProcedureRunner\config.xml with appropriate values, using the config.xml included in this sample as reference.

The COBOL stored procedure can be tested by running the following T-SQL script in SQL Server Management Studio, for example.

DECLARE	@return_value int

EXEC	@return_value = [dbo].[DUALCOBSP]
		@P0 = 42

SELECT	'Return Value' = @return_value

GO

After the successful execution, you should see the following output in the Messages tab:

BEGIN2
P1: 000000042
SQL Server SELECT:
SQLCODE: 0000000000
WS-C2: initial sql server data
--------------
Connect to 'DB2SRV  ':
SQLCODE: 0000000000
--------------
DB2 SELECT:
SQLCODE: 0000000000
C1: John Dough
--------------
DB2 INSERT:
SQLCODE: 0000000000
---------
STDOUT message(s) from external script:
-----
DB2 SELECT:
SQLCODE: 0000000000
C1: John Dough
--------------
SQLCODE: 0000000000
SQL Server SELECT:
SQLCODE: 0000000000
WS-C2: initial sql server data
--------------
SET CONNECTION:
SQLCODE: 0000000000
--------------
DB2 INSERT:
SQLCODE: 0000000000
--------------
DB2 SELECT:
SQLCODE: 0000000000
C1: John Dough
--------------
END

8.4. Troubleshooting

8.4.1. System.InvalidOperationException: The 'DB2OLEDB' provider is not registered on the local machine.

Cause: The Microsoft OLE DB Provider for Db2 is not installed.

8.4.2. System.Transactions.TransactionManagerCommunicationException: Network access for Distributed Transaction Manager (MSDTC) has been disabled.

Cause: MSDTC network access is disabled.

Fix: Enable MSDTC network access in Component Services

8.4.3. Error: MSDTC was unable to read its configuration information. (0x8004D027)

Cause: when running a COBOL stored procedure with the dual sql runtime, the Db2 connection is enlisted in the TransactionScope, causing MSDTC to kick in. MSDTC does not work in SQL Server Language Extensions (the environment used to run a COBOL stored procedure).

Fix: Disable DTC by specifying xml attribute UseDTC="false" in the configuration file.

8.4.4. System.InvalidOperationException: The ITransactionLocal interface is not supported by the 'DB2OLEDB' provider. Local transactions are unavailable with the current provider.

Cause: There’s a mismatch in the configuration file.

Fix:

  • When DTC is used, make sure you specify Units of Work=DUW in the Db2 connection string.

  • Without DTC, make sure you specify Units of Work=RUW in the Db2 connection string.


1. http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx
2. http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx