HP 3000 Manuals

Invoking the C Preprocessor [ ALLBASE/SQL C Application Programming Guide ] MPE/iX 5.0 Documentation


ALLBASE/SQL C Application Programming Guide

Invoking the C Preprocessor 

You can use the preprocessor in two modes:

   1.  Full preprocessing mode:  includes SQL syntax checking, creating
       compilable output, storing a module in a DBEnvironment, and
       creating a file that contains an installable copy of the stored
       module.

   2.  Syntax checking mode:  checks your SQL syntax without doing any
       other preprocessor tasks.

As you develop the SQL portions of your C programs, syntax checking mode
is quite useful.  Preprocessing is quicker in this mode than in full
preprocessing mode.  In addition, you can start debugging your SQL
commands before the DBEnvironment itself is in place.

Command syntax for both modes is presented below.

Full Preprocessing Mode 

Use the following preprocessor command to:

   *   Check the embedded SQL command syntax.

   *   Create compilable output files that can be processed by the C
       compiler

   *   Store a module in the DBEnvironment named.

   *   Create a file containing an installable version of the module.

Preprocessor Syntax I 

                                             {MODULE(ModuleName)}
                                             {OWNER (OwnerName) }
RUN PSQLC.PUB.SYS;INFO= "DBEnvironmentName [({{DROP {PRESERVE}} }
                                             {{     {REVOKE  }} }
                                             {{               } }
                                             {{NODROP         } }

|...|)]"

Parameters 

DBEnvironmentName         Identifies the DBEnvironment in which a module
                          is to be stored.  You may use a backreference
                          to a file defined in a file equation for this
                          parameter.

ModuleName                Assigns a name to the stored module.  Module
                          names must follow the rules governing
                          ALLBASE/SQL basic names as described in the
                          ALLBASE/SQL Reference Manual.  If a module name
                          is not specified, the preprocessor uses the
                          PROGRAM-ID as the module name.

OwnerName                 Associates the stored module with a
                          User@Account, a ClassName, or a GroupName.  You
                          can specify an owner name for the module only
                          if you have DBA authority in the DBEnvironment
                          where the module is to be stored.  If not
                          specified, the owner name is your log-on
                          User@Account.  Any object names in SQLIN not
                          qualified with an owner name are qualified with
                          the OwnerName specified by the preprocessor, or
                          the user.

DROP                      Deletes any module currently stored in the
                          DBEnvironment by the ModuleName and OwnerName 
                          specified in the INFO string.

NODROP                    Terminates preprocessing if any module
                          currently exists in the DBEnvironment by the
                          ModuleName and OwnerName specified in the INFO
                          string.  If not specified, NODROP is assumed.

PRESERVE                  Is specified when the program being
                          preprocessed already has a stored module and
                          you want to preserve existing RUN authorities
                          for that module.  If not specified, PRESERVE is
                          assumed.  PRESERVE cannot be specified unless
                          DROP is also specified.

REVOKE                    Is specified when the program being
                          preprocessed already has a stored module and
                          you want to revoke existing RUN authorities for
                          that module.  REVOKE cannot be specified unless
                          DROP is also specified.

Description 

   1.  Before invoking the preprocessor in this mode when the program
       being preprocessed already has a stored module, ensure that the
       earlier version of the program is not being executed.

   2.  The preprocessor starts a DBE session in the DBEnvironment named
       in the RUN command by issuing a CONNECT TO 'DBEnvironmentName'
       command.  If the autostart flag is OFF, the DBE session can be
       initiated only after a START DBE command has been processed.

   3.  If the DBEnvironment to be accessed is operating in single-user
       mode, preprocessing can occur only when another DBE session for
       the DBEnvironment does not exist.

   4.  When the preprocessor's DBE session begins, ALLBASE/SQL processes
       a BEGIN WORK command.  When preprocessing is completed, the
       preprocessor submits a COMMIT WORK command, and any sections
       created are committed to the system catalog.  If the preprocessor
       detects an error in SQLIN, it processes a ROLLBACK WORK command
       before terminating, and no sections are stored in the
       DBEnvironment.  Preprocessor warnings do not prevent sections from
       being stored.

   5.  Since all preprocessor DBE sessions initiate only one transaction,
       any log file space used by the session is not available for re-use
       until after the session terminates.  If rollforward logging is not
       in effect, you can issue the CHECKPOINT command in ISQL before 
       preprocessing to increase the amount of available log space.
       Refer to the Database Administration Guide for additional
       information on log space management, such as using the START DBE
       NEWLOG command to increase the size of the log and recovering log
       space when rollforward logging is in effect.

   6.  During preprocessing, system catalog pages accessed for embedded
       commands are locked.  In multiuser mode, other DBE sessions
       accessing the same objects must wait, and the potential for a
       deadlock exists.  Therefore minimize competing transactions when
       preprocessing an application program.  Refer to the appendix
       "Locks Held on the System Catalog by SQL Commands" in the
       ALLBASE/SQL Database Administration Guide for information on
       operations that lock system catalog pages.

   7.  For improved runtime performance, use ISQL to submit the UPDATE
       STATISTICS command before preprocessing for each table accessed in
       a data manipulation command when an index on that table has been
       added or dropped and when data in the table is often changed.

   8.  If you specify an OwnerName or ModuleName in a language other than
       NATIVE-3000 (ASCII), be sure that the language you are using is
       also the language of the DBEnvironment in which the module will be
       stored.

Authorization 

To preprocess a program, you need DBA or CONNECT authority for the
DBEnvironment specified in the preprocessor command line.  You also need
table and view authorities for the tables and views which the program
will access at run time.

DBEnvironment CONNECT authority can also be explicitly GRANTed.  If you
have DBECreator or DBA authority or module OWNER authority, you have
CONNECT authority by default.

Table authorities are implicitly specified at the time the table is
CREATEd and depend on the table type (PUBLIC, PUBLICREAD, or PRIVATE).
Once a table has been created, its implicit authorities can be changed by
the table OWNER, the DBECreator, or another DBA. Table authorities are
removed by using the REVOKE command and are added by using the GRANT
command.

For example, for a PUBLIC table, you are implicitly GRANTed authority for
any type of table access when the table is created.  For a PUBLICREAD
table, you must have explicitly GRANTed authority for any table access
except READ access which is an implicit grant.  For a PRIVATE table,
there are no implicit grants at table creation time; only the table OWNER
or a DBA can access a PRIVATE table, unless specific authorities are
GRANTed to others.

Note, in the case of the sample database, PartsDBE, the creation script
REVOKEs all implicit table authorities, and desired authorities must be
explicitly GRANTed.


NOTE When preprocessing, you cannot name another user as module owner unless you are a DBA of the DBEnvironment or you are the current module owner.
Example :FILE SQLIN=CEX2 :RUN PSQLC.PUB.SYS;INFO=& "PartsDBE (MODULE(CEX2) OWNER(OwnerP@SomeAcct) REVOKE DROP)" WED, OCT 25, 1991, 1:38 PM 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. 0 ERRORS 1 WARNINGS END OF PREPROCESSING. END OF PROGRAM :EDITOR HP32501A.07.20 EDIT/3000 FRI, OCT 27, 1991, 10:17 AM (C)HEWLETT-PACKARD CO. 1990 /T SQLMSG;L ALL UNN FILE UNNUMBERED . . . SQLIN = CEX2.SOMEGRP.SOMEACCT DBEnvironment = partsdbe Module Name = CEX2 SELECT PARTNUMBER, PARTNAME, SALESPRICE INTO :PARTNUMBER, :PARTNAME, :SALESPRICE :SALESPRICEIND FROM PURCHDB.PARTS WHERE PARTNUMBER = :PARTNUMBER ; ****** ALLBASE/SQL warnings (DBWARN 10602) ****** in SQL statement ending in line 133 *** User SomeUser@SomeAcct does not have SELECT authority on PURCHDB.PARTS. (DBERR 2301) 1 Sections stored in DBEnvironment. 0 ERRORS 1 WARNINGS END OF PREPROCESSING / Syntax Checking Mode The following command only checks the syntax of the SQL commands embedded in the source code file. Preprocessor Syntax II RUN PSQLC.PUB.SYS;INFO="(SYNTAX)" Description 1. The preprocessor does not access a DBEnvironment when it is run in this mode. 2. When performing only syntax checking, the preprocessor does not convert the SQL commands into C statements. Therefore SQLOUT does not contain any preprocessor generated calls to ALLBASE/SQL external procedures. 3. SQLTYPE, SQLEXTN, SQLVAR, and SQLMOD are created, but incomplete. Authorization You do not need ALLBASE/SQL authorization when you use the preprocessor to only check SQL syntax. Example :FILE SQLIN=CEX2 :RUN PSQLC.PUB.SYS;INFO="(SYNTAX)" WED, OCT 25, 1991, 1:38 PM 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. Syntax checked. 1 ERRORS 0 WARNINGS END OF PREPROCESSING. PROGRAM TERMINATED IN AN ERROR STATE. (CIERR 976) :EDITOR HP32501A.07.20 EDIT/3000 FRI, OCT 27, 1991, 9:35 AM (C) HEWLETT-PACKARD CO. 1985 /T SQLMSG;L ALL UNN FILE UNNUMBERED . . . SQLIN = CEX2.SOMEGRP.SOMEACCT SELECT PARTNUMBER, PARTNAME, SALESPRICE INTO :PARTNUMBER, :PARTNAME, :SALESPRICE :SALESPRICEIND, FROM PURCHDB.PARTS WHERE PARTNUMBER = :PARTNUMBER ; ****** ALLBASE/SQL errors (DBERR 10977) ****** in SQL statement ending in line 176 *** Unexpected keyword. (DBERR 1006) Syntax checked. 1 ERRORS 0 WARNINGS END OF PREPROCESSING. / The line 176 referenced in SQLMSG is the line in SQLIN where the erroneous SQL command ends. DBEnvironment Access When you invoke the preprocessor in full preprocessing mode, you name an ALLBASE/SQL DBEnvironment. The preprocessor starts a DBE session for that DBEnvironment when preprocessing begins and terminates that session when preprocessing is completed. The preprocessor derives the name of the module from the source code file name unless you supply a different name when you invoke the preprocessor: : RUN PSQLC.PUB.SYS; INFO="DBEnvironment (MODULE (ModuleName))" When the preprocessor terminates its DBEnvironment session, it issues a COMMIT WORK command if it encountered no errors. Created sections are stored in the DBEnvironment and associated with the module name. See Figure 2-6 later in this chapter. ALLBASE/SQL accesses the DBEnvironment you specify during preprocessing, even if your program does not use SQL statements that store sections in this DBEnvironment. Therefore, you must specify the name of a valid DBEnvironment. In some cases an ALLBASE/SQL progam is used with one or more DBEnvironments in addition to the DBEnvironment accessed at preprocessing time. In these cases, use ISQL to install the installable module created by the preprocessor into each additional DBEnvironment accessed by your program. See the section "Installable Module File" in this chapter. An alternative method of accessing more than one DBEnvironment from the same program would be to divide the program into separate compilable files. Each source file would access a DBEnvironment. In each file, start and terminate a DBE session for the DBEnvironment accessed. Then preprocess and compile each file separately. When you invoke the preprocessor, identify the DBEnvironment accessed by the source file being preprocessed. After a file is preprocessed, it must be either saved under a different file name than the usual preprocessor output, or compiled with no linking before the next source file is preprocessed. When all source files have been preprocessed and compiled, link them together to create an executable program. For example if you want to preprocess several ALLBASE/SQL application programs in the same group and account and compile and link the programs later, or you plan to compile a preprocessed program during a future session, you should do the following for each program: * Before running the preprocessor, equate SQLIN to the name of the file containing the application you want to preprocess: :FILE SQLIN = InFile * After running the preprocessor, save and rename the output files if you do not want them overwritten. For example: :SAVE SQLOUTPUT :RENAME SQLOUT, OutFile :SAVE SQLMOD :RENAME SQLMOD, ModFile :SAVE SQLVAR :RENAME SQLVAR, VarFile * When you are ready to compile the program, you must equate the include file name to its standard ALLBASE/SQL name (SQLVAR).
NOTE A program that accesses more than one DBEnvironment must do so in sequence since only one DBEnvironment can be accessed at a time. Such program design may adversely affect performance and requires special consideration.
To preprocess a program, or to use an already preprocessed ALLBASE/SQL application program, you must satisfy the authorization requirements for each DBEnvironment accessed. Compiling and Linking Figure 2-1 shows the process of compiling and linking an embedded SQL C program.
[]
Figure 2-1. Compiling and Linking As shown in the figure, you submit to the C compiler one or more modified source code files and the related include files created by the preprocessor. The compiler then generates object code. To convert these object code files into an executable program, link them after compilation by invoking the link editor. This step creates an executable program file. To expedite the process of compiling and linking your embedded SQL programs, use the preprocessor UDCs described below. Using the Preprocessor UDCs Two UDC's for invoking the C preprocessor are provided with ALLBASE/SQL in the HPSQLUDC.PUB.SYS file: * PC, illustrated in Figure 2-2, invokes the preprocessor in full preprocessing mode. You specify the source file name, a DBEnvironment name, and a name for SQLMSG (if you do not want preprocessor messages to go to $STDLIST). :PC SourceFileName,DBEnvironment The PC UDC uses the following preprocessor INFO string parameters: ModuleName is the name of the source file. OwnerName is the log-on User@Account. PRESERVE and DROP are in effect. * PPC, illustrated in Figure 2-3, invokes the preprocessor in full preprocessing mode, then invokes the C compiler if preprocessing is successful and the linker if compilation is successful. To use this UDC, you specify the source file name, a DBEnvironment name, and an executable file name. You can specify a name for SQLMSG if you do not want preprocessor messages to go to $STDLIST: :PPC SourceFileName,DBEnvironment,ExecutableFileName This UDC uses the following preprocessor INFO string parameters: ModuleName is the source file name. OwnerName is the log-on User@Account. PRESERVE and DROP are in effect. If you make your own version of the UDC's, do not modify the record attributes for any of the preprocessor output files. Only modify the file limit (disc=FileLimit) if required.
NOTE Because the UDC's purge the preprocessor message file, if messages are sent to $STDLIST an error message appears when you use the UDC's, but preprocessing continues.
________________________________________________________ | | | PC srcfile,dbefile,msgfile=$stdlist | | continue | | setvar _savefence hpmsgfence | | setvar hpmsgfence 2 | | continue | | purge !msgfile | | purge sqlout | | purge sqlmod | | purge sqlvar | | purge sqltype | | purge sqlextn | | setvar hpmsgfence _savefence | | deletevar _savefence | | file sqlin = !srcfile | | file sqlmsg = !msgfile; rec=-80,16,f,ascii | | file sqlout; disc=10000,32; rec=-80,16,f,ascii| | file sqlmod; disc=1023,10,1; rec=250,,f,binary | | file sqlvar; disc=2048,32; rec=-80,16,f,ascii| | file sqltype; disc=2048,32; rec=-80,16,f,ascii| | file sqlextn; disc=2048,32; rec=-80,16,f,ascii| | continue | | run psqlc.pub.sys;info="!dbefile (drop)" | | reset sqlin | | reset sqlmsg | | reset sqlout | | reset sqlmod | | reset sqlvar | | reset sqltype | | reset sqlextn | ________________________________________________________ Figure 2-2. UDC for Preprocessing SQLIN ________________________________________________________ | | | PPC srcfile,dbefile,pgmfile,msgfile=$stdlist | | continue | | setvar _savefence hpmsgfence | | setvar hpmsgfence 2 | | continue | | purge !msgfile | | purge sqlout | | purge sqlmod | | purge sqlvar | | purge sqltype | | purge sqlextn | | setvar hpmsgfence _savefence | | deletevar _savefence | | file sqlin = !srcfile | | file sqlmsg = !msgfile; rec=-80,16,f,ascii | | file sqlout; disc=10000,32; rec=-80,16,f,ascii| | file sqlmod; disc=1023,10,1; rec=250,,f,binary | | file sqlvar; disc=2048,32; rec=-80,16,f,ascii| | file sqltype; disc=2048,32; rec=-80,16,f,ascii| | file sqlextn; disc=2048,32; rec=-80,16,f,ascii| | continue | | run psqlc.pub.sys;info="!dbefile (drop)" | | if jcw <= warn then | | continue | | ccxllk sqlout,!pgmfile,$null | | endif | | reset sqlin | | reset sqlmsg | | reset sqlout | | reset sqlmod | | reset sqlvar | | reset sqltype | | reset sqlextn | ________________________________________________________ Figure 2-3. UDC for Preprocessing, Compiling, and Preparing SQLIN The example in Figure 2-4 illustrates the use of PPC on an SQLIN that could be successfully preprocessed, but failed to compile because a C error exists in the file. In addition to generating an error message for the C error, the C compiler generates several warning messages. The warning messages are normal and will not cause runtime problems; they are due to the way the C preprocessor declares some of the variables in SQLVAR. ___________________________________________________________________________ | | | :PPC CEX2,PARTSDBE,CEX2P | | | | WED, OCT 25, 1991, 1:38 PM | | 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. | | | | SQLIN = CEX2.SOMEGRP.SOMEACCT | | DBEnvironment = partsdbe | | | | Module Name = CEX2 | | 1 Sections stored in DBEnvironment. | | | | 0 ERRORS 0 WARNINGS | | END OF PREPROCESSING. | | | | END OF PROGRAM | | | | END OF COMPILE | | | | HP Link Editor/XL (HP30315A.04.04) Copyright Hewlett-Packard Co 1986| | | | LinkEd> LINK FROM=$OLDPASS;RL= CCSTDRL.LIB.SYS;TO=c2p | | | | END OF PROGRAM | | : | ___________________________________________________________________________ Figure 2-4. Sample UDC Invocation The line number referenced in the compiler output messages is the C statement number in the compiler output listing. Because PPC sends the compiler output listing to $null, you must reinvoke the compiler, sending the compiler listing to an output file, to identify the line in error: :BUILD CLIST;DISC=10000,32;REC=-80,16,F,ASCII :CCXL SQLOUT,$OLDPASS,CLIST The C syntax error flagged in the example under "Syntax Checking Mode" appears as follows in CLIST: 00261 DISPAY "SELECT PartNumber, PartName and SalesPrice". Using the Preprocessor in Job Mode You can preprocess, compile, and prepare C ALLBASE/SQL programs in job mode. The following example illustrates a job file that uses the PPC UDC to preprocess several sample programs. !JOB JIM,MGR.HPDB,CPROG;OUTCLASS=,1 !ppc cexp01,PartsDBE,cexp01p !ppc cexp01a,PartsDBE,cexp01ap !ppc cexp02,PartsDBE,cexp02p . . !ppc cexp50,PartsDBE,cexp50p !TELL JIM,MGR.HPDB; C Preprocessing is complete! !EOJ'' Running the Program When an ALLBASE/SQL program is first created, it can only be executed by the module OWNER or a DBA. In addition, it can only operate on the DBEnvironment used at preprocessing time if a module was generated. If no module was generated because the SQL commands embedded in the program are only commands for which no sections are created, the program can be run against any DBEnvironment. The program created in the previous example can be executed as follows by the module owner: : run someprog To make the program executable by other users in other DBEnvironments: * Load the executable program file onto the machine where the production DBEnvironment resides. * Install any related module in the production DBEnvironment. * Ensure necessary module owner authorities exist. * Grant required authorities to program users. Accessing Multiple DBEnvironments An alternative method of accessing more than one DBEnvironment from the same program would be to divide the program into separate compilable files. Each source file would access a DBEnvironment. In each file, start and terminate a DBE session for the DBEnvironment accessed. Then preprocess and compile each file separately. When you invoke the preprocessor, identify the DBEnvironment accessed by the source file being preprocessed. After a file is preprocessed, it must be compiled so that no linking is performed before the next source file is preprocessed. When all source files have been preprocessed and compiled, link them together to create an executable program. An example of this technique follows: :RUN PSQLC.PUB.SYS;INFO="DBEnvironment1 (MODULE (ModuleName))" :CCXL SQLOUT, SQLOBJ1 . . :RUN PSQLC.PUB.SYS;INFO="DBEnvironment2 (MODULE (ModuleName))" :CCXL SQLOUT, SQLOBJ2 . . :LINK FROM=SQLOBJ1,SQLOBJ2;RL=STDRL.LIB.SYS;TO=SOMEPROG Note that a program which accesses more than one DBEnvironment must do so in sequence since only one DBEnvironment can be accessed at a time. Such program design may adversely affect performance and requires special consideration. To preprocess a program, or to use an already preprocessed ALLBASE/SQL application program, you must satisfy the authorization requirements for each DBEnvironment accessed.


MPE/iX 5.0 Documentation