HP 3000 Manuals

Identifying Preprocessor Output [ ALLBASE/SQL C Application Programming Guide ] MPE/iX 5.0 Documentation


ALLBASE/SQL C Application Programming Guide

Identifying Preprocessor Output 

As Figure 2-5 points out, running the C preprocessor in full
preprocessing mode creates the following output files:

   *   Modified source file.
   *   Include files.
   *   SQL message file.
   *   Installable module file.

Also, a module is stored in the DBEnvironment specified in the
preprocessor invocation line.  Each of these is described in the
following sections.

Modified Source File 

As the C preprocessor parses the source file, it copies lines from it and
any include files into the modified source file, inserts conditional
compiler directives around the embedded SQL commands, and inserts
information around each embedded SQL command.

The default modified source file name is SQLOUT.

Figure 2-9 illustrates the modified source file generated for the source
file pictured in Figure 1-8.  The shaded lines contain information
generated by the C preprocessor.

In both preprocessing modes, the C preprocessor:

   *   Inserts conditional compiler directives around embedded SQL
       commands to conditionally ignore the SQL commands.

   *   Inserts three #INCLUDE C compiler directives within the
       Declaration part.  These directives reference the three
       preprocessor generated include files.  These files are included at
       the beginning of the modified source file created by the
       preprocessor.

   *   Places comments on the line with an embedded command following the
       last line the embedded command generates.  Note, for example, that
       the comment following the EXEC SQL INCLUDE SQLCA command in the
       source file is in the same column, but on a different line, in the
       modified source file.

In full preprocessing mode, the preprocessor also:

   *   Generates a C declaration of the sqlca and the sqlda in the type
       include file.

   *   Generates C statements providing conditional instructions
       following SQL commands encountered after one of the following SQL
       commands:  WHENEVER SQLERROR, WHENEVER SQLWARNING, and WHENEVER
       NOT FOUND.

   *   Generates C statements that call ALLBASE/SQL external procedures
       at run time.  These calls reference the module stored by the
       preprocessor in the DBEnvironment for execution at run time.
       Parameters used by these external calls are defined in the
       variable and type include files.


CAUTION Although you can access the preprocessor output files with an editor, you should never change the information generated by the C preprocessor. Your DBEnvironment or your system could be damaged at run time if preprocessor generated constructs are altered.
If you change non-preprocessor-generated constructs, make the changes to the source file, re-preprocess it, and re-compile the output files before putting the application program into production. Include Files There are three include files, which contain declarations and definitions used by the C functions created by the preprocessor and inserted into the modified source code file: * type include file: the name for this file, which contains type declarations, is: SQLTYPE * variable include file: the name for this file, which contains variable declarations, is: SQLVAR * externals include file: the name for this file, which contains external procedure declarations, is: SQLEXTN The sqlmodulename and ownername of sections are defined as global static variables in SQLVAR. It is advised that multiple source file applications be preprocessed all at one time so that only one SQLVAR file is generated. If the source files are preprocessed and compiled separately and combined at link time, runtime errors occur because the static global sqlmodulename variable from the first source file preprocessed is used and incorrect sections are executed. Therefore, all preprocessed sections in your program must reside in the same file for input to the C compiler. When you use file equations to redirect the include files, remember that the preprocessor always inserts the same #INCLUDE directives. Therefore, insure that the applicable file equations are in effect when you preprocess and when you compile. When the preprocessor is invoked, the following file equations must be in effect: :FILE SQLTYPE = MYTYPE :FILE SQLVAR = MYVAR :FILE SQLEXTN = MYEXTN Then when the C compiler is invoked, the following file equations must be in effect: :FILE SQLTYPE = MYTYPE :FILE SQLVAR = MYVAR :FILE SQLEXTN = MYEXTN :CC MYSQLPRG, $NEWPASS, $NULL ALLBASE/SQL Message File The ALLBASE/SQL message file is named sqlmsg. Messages placed in sqlmsg when you preprocess come from the ALLBASE/SQL message catalog. The default catalog is SQLCT000.PUB.SYS. For native language users, the name of the catalog is SQLCTxxx.PUB.SYS, where xxx is the number of the current language. If this catalog is not available, ALLBASE/SQL uses the default instead. Sqlmsg messages contain four parts: 1. A banner: For Series 900 systems: HP36216-02A.E1.02 C preprocessor/3000 ALLBASE/SQL (C)COPYRIGHT HEWLETT-PACKARD CO. 1982,1983,1984,1985,1986,1987,1988, 1989,1990,1991. ALL RIGHTS RESERVED. Banners are displayed when ISQL, SQLUtil, or a preprocessor is invoked. 2. A summary of the preprocessor invocation conditions: DBEnvironment = PARTSDBE.SOMEGRP.SOMEACCT Module Name = CEX2 3. Warnings and errors encountered during preprocessing: 32 SalesPriceInd : SQLID; | ****** Unsupported type syntax for host variable. (DBERR 10933) SELECT PartNumber, PartName, SalesPrice INTO :PartNumber, :PartName, :SalesPrice :SalesPriceInd FROM PurchDB.Parts WHERE PartNumber = :PartNumber; ****** ALLBASE/SQL query processing errors. (DBERR 10952) ****** in SQL statement ending in line 128 *** ALLBASE/SQL alignment error on column 3 in buffer 5. (DBERR 4200) There are errors. No sections stored. 4. A summary of the results of preprocessing: 2 ERRORS 0 WARNINGS END OF PREPROCESSING. Both the banner and the preprocessing summary results are also echoed to the terminal. As illustrated in Figure 2-6, a line number is often provided in sqlmsg. This line number references the line in the program source file containing the command in question. A message accompanied by a number may also appear. You can refer to the ALLBASE/SQL Message Manual for additional information on the exception condition when these numbered messages appear. ___________________________________________________________________________________ | | | : print sqlmsg | | HP36216-02A.E1.02 C preprocessor/3000 ALLBASE/SQL | | (C)COPYRIGHT HEWLETT-PACKARD CO. 1982,1983,1984,1985,1986,1987,1988, | | 1989,1990,1991. ALL RIGHTS RESERVED. | | | | DBEnvironment = PARTSDBE.SOMEGRP.SOMEACCT | | Module Name = CEX2 | | | | 32 SalesPriceInd : SQLID | | | | | ****** Unsupported type syntax for host variable. (DBERR 10933) | | | | | | SELECT PartNumber, PartName, SalesPrice INTO :PartNumber, :PartName,| | :SalesPrice :SalesPriceInd FROM PurchDB.Parts WHERE PartNumber= | | :PartNumber; | | | | ****** ALLBASE/SQL query processing errors. (DBERR 10952) | | ****** in SQL statement ending in line 128 | | *** ALLBASE/SQL alignment error on column 3 in buffer 5. (DBERR 4200) | | | | There are errors. No sections stored. | | 2 ERRORS 0 WARNINGS | | END OF PROCESSING. | | : | ___________________________________________________________________________________ Figure 2-6. Sample sqlmsg Showing Errors As Figure 2-7 illustrates, the preprocessor can terminate with the warning message ****** ALLBASE/SQL warnings. (DBWARN 10602) when the name of an object in the source file does not match the name of any object in the system catalog. Although a section is stored for the semantically incorrect command, the section is marked as invalid and will not execute at run time if it cannot be validated. _________________________________________________________________________________ | | | : ppc cex2,partsdbe,cex2p | | HP36216-02A.20.00.00 C preprocessor/3000 ALLBASE/SQL | | (C)COPYRIGHT HEWLETT-PACKARD CO. 1982,1983,1984,1985,1986,1987,1988, | | 1989,1990,1991. ALL RIGHTS RESERVED. | | | | 0 ERRORS 1 WARNINGS | | END OF PREPROCESSING | | | | : print sqlmsg | | | | HP36216-02A.E1.02 C preprocessor/3000 ALLBASE/SQL | | (C)COPYRIGHT HEWLETT-PACKARD CO. 1982,1983,1984,1985,1986,1987,1988, | | 1989,1990,1991. ALL RIGHTS RESERVED. | | | | DBEnvironment = PARTSDBE.SOMEGRP.SOMEACCT | | Module Name = CEX2 | | | | SELECT PartNumber, PartName, SalesPrice INTO :PartNumber, PartName,| | :SalesPrice :SalesPriceInd FROM PurchDB.Parts WHERE ParNumber = | | :PartNumber; | | | | ****** ALLBASE/SQL warnings. (DBWARN 10602) | | ****** in SQL statement ending in line 128 | | *** Column PARNUMBER not found. (DBERR 2211) | | | | 1 Sections stored in DBEnvironment. | | | | 0 ERRORS 1 WARNINGS | | END OF PREPROCESSING | _________________________________________________________________________________ Figure 2-7. Sample sqlmsg Showing Warning Stored Module Containing Sections In full preprocessing mode, the preprocessor stores a module in the DBEnvironment you specify at preprocessing time. By default, the preprocessor uses the source file name as the name for the module it stores. You can specify a module name with the MODULE option of the preprocessor command. The module contains a section for each embedded SQL command in your program except: BEGIN DECLARE SECTION INCLUDE BEGIN WORK OPEN CLOSE PREPARE COMMIT WORK RELEASE CONNECT ROLLBACK WORK DECLARE CURSOR SAVEPOINT DELETE WHERE CURRENT START DBE DESCRIBE STOP DBE END DECLARE SECTION SQLEXPLAIN EXECUTE TERMINATE USER EXECUTE IMMEDIATE UPDATE WHERE CURRENT FETCH WHENEVER The commands listed above either require no authorization to execute or are executed based on information contained in the compilable preprocessor output files. When the preprocessor stores a section, it actually stores what are known as an input tree and a run tree. The input tree consists of the uncompiled command. The run tree is the compiled, executable form of the command. If at run time a section is valid, ALLBASE/SQL executes the appropriate run tree when the SQL command is encountered in the application program. If a section is invalid, ALLBASE/SQL determines whether the objects referenced in the section exist and whether current authorization criteria are satisfied. When an invalid section can be validated, ALLBASE/SQL dynamically recompiles the input tree to create an executable run tree and executes the command. When a section cannot be validated, the command is not executed, and an error condition is returned to the program. There are three types of sections: 1. Sections for executing the SELECT command associated with a DECLARE CURSOR command. 2. Sections for executing the SELECT command associated with a CREATE VIEW command. 3. Sections for all other commands for which the preprocessor stores a section. Figure 2-8 illustrates the kind of information in the system catalog. All stored sections for each module in the DBEnvironment are referenced here. The query result illustrated was extracted from the system view named SYSTEM.SECTION by using ISQL. The columns in Figure 2-8 have the following meanings: * NAME: This column contains the name of the module to which a section belongs. You can specify a module name when you invoke the preprocessor; or the module name will default to the source code file name of the C program. If you are supplying a module name in a native language other than NATIVE-3000 (ASCII), be sure it is in the same language as that of the DBEnvironment. * OWNER: This column identifies the owner of the module. You can specify an owner name when you invoke the preprocessor,or the owner name will default to the login name associated with the preprocessing session. If you are supplying an owner name in a native language other than NATIVE-3000 (ASCII), be sure it is in the same language as that of the DBEnvironment. * DBEFILESET: This column indicates the DBEFileSet which contains the DBEFile(s) which in turn contains the section(s). * SECTION: This column gives the section number. Each section associated with a module is assigned a number by the preprocessor as it parses the related SQL command at preprocessing time. * TYPE: This column identifies the type of section: 1 = SELECT associated with a cursor 2 = SELECT defining a view 0 = All other sections * VALID: This column identifies whether a section is valid or invalid: 0 = invalid 1 = valid ___________________________________________________________________________________ | | | isql=> SELECT NAME,OWNER,DBEFILESET,SECTION,TYPE,VALID FROM SYSTEM.SECTION;| | | | SELECT NAME,OWNER,DBEFILESET,SECTION,TYPE,VALID FROM SYSTEM.SECTION; | | -------------------------------------------------------------------------- | | NAME |OWNER |DBEFILESET |SECTION |TYPE |VALID | | -------------------------------------------------------------------------- | | TABLE |SYSTEM |SYSTEM | 0| 2| 0 | | COLUMN |SYSTEM |SYSTEM | 0| 2| 0 | | INDEX |SYSTEM |SYSTEM | 0| 2| 0 | | SECTION |SYSTEM |SYSTEM | 0| 2| 0 | | DBEFILESET |SYSTEM |SYSTEM | 0| 2| 0 | | DBEFILE |SYSTEM |SYSTEM | 0| 2| 0 | | SPECAUTH |SYSTEM |SYSTEM | 0| 2| 0 | | TABAUTH |SYSTEM |SYSTEM | 0| 2| 0 | | COLAUTH |SYSTEM |SYSTEM | 0| 2| 0 | | MODAUTH |SYSTEM |SYSTEM | 0| 2| 0 | | GROUP |SYSTEM |SYSTEM | 0| 2| 0 | | VIEWDEF |SYSTEM |SYSTEM | 0| 2| 0 | | HASH |SYSTEM |SYSTEM | 0| 2| 0 | | CONSTRAINT |SYSTEM |SYSTEM | 0| 2| 0 | | CONSTRAINTCOL |SYSTEM |SYSTEM | 0| 2| 0 | | CONSTRAINTINDEX |SYSTEM |SYSTEM | 0| 2| 0 | | COLDEFAULT |SYSTEM |SYSTEM | 0| 2| 0 | | TEMPSPACE |SYSTEM |SYSTEM | 0| 2| 0 | | PARTINFO |PURCHDB |SYSTEM | 0| 2| 0 | | VENDORSTATISTICS |PURCHDB |SYSTEM | 0| 2| 0 | | CEX2 |PGMR1@ACCT2 |SYSTEM | 1| 0| 1 | | CEX7 |PGMR1@ACCT2 |SYSTEM | 1| 1| 1 | | CEX7 |PGMR1@ACCT2 |SYSTEM | 2| 0| 1 | | -------------------------------------------------------------------------- | | Number of rows selected is 16. | | U[p], d[own], l[eft], r[ight], t[op], b[ottom], pr[int] <n>,or e[nd]> | ___________________________________________________________________________________ Figure 2-8. Information in SYSTEM.SECTION on Stored Sections The first eleven rows in the query result shown in Figure 2-8 describe the sections stored for the system views. The next two rows describe the two views in the sample database: PurchDB.PartInfo and PurchDB.VendorStatistics. Views are always stored as invalid sections, because the run tree is always generated at run time. The remaining rows describe sections associated with two preprocessed programs. CEX2 contains only one section, for executing the SELECT command in the program illustrated in Figure 2-9. CEX7 contains two sections, one for executing the SELECT command associated with a DECLARE CURSOR command and one for executing a FETCH command. Stored sections remain in the DBEnvironment until they are deleted by using the ISQL DROP MODULE command: isql=> DROP MODULE cex2; or by invoking the preprocessor with the DROP option: : RUN PSQLC.PUB.SYS;INFO="PARTSDBE (DROP)" Stored sections are marked invalid when: * The UPDATE STATISTICS command is executed. * Tables accessed in the program are dropped, altered, or assigned new owners. * Indexes or DBEFileSets related to tables accessed in the program are changed. * Module owner authorization changes are made that affect the execution of embedded commands. When an invalid section is validated at run time, the validated section is committed when the program issues a COMMIT WORK command. If a COMMIT WORK command is not executed, ALLBASE/SQL must re-validate the section again the next time the program is executed. For this reason, you should embed COMMIT WORK commands even following SELECT commands, since the COMMIT WORK command may be needed even when data is not changed by a program. Installable Module File When the preprocessor stores a module in the DBEnvironment you named at preprocessing time, it places a copy of the module in an installable module file. The module in this file can be installed into a DBEnvironment different from the DBEnvironment accessed at preprocessing time by using the INSTALL command in ISQL. In order to install the module, you need CONNECT or DBA authority in the target DBEnvironment. The installable module file is named SQLMOD. The module also has an internal, SQL name, in this case PGMR1@ACCT2.CEX2 which is saved as part of the module at preprocessing time. PGMR1@ACCT2 is the login of the user who preprocessed source file cex2, and PGMR1@ACCT2 is the owner of the module. : isql isql=> CONNECT TO 'PARTSDBE.SOMEGRP.SOMEACCT'; isql=> INSTALL; File name> SQLMOD; Name of module in this file: PGMR1@ACCT2.CEX2 Number of sections installed: 1 COMMIT WORK to save to DBEnvironment. isql=> COMMIT WORK; isql=>


MPE/iX 5.0 Documentation