fhg
Volume 8, Number 35 -- October 15, 2008

A Practical Way to Add Exports to a Service Program

Published: October 15, 2008

by Ted Holt

My life was confusing enough already. Then along came IBM with binder language, the CL-like language we use to define the list of exports of a service program. Awhile back I sat down to try to find an effective way to deal with service program exports. Here's what I came up with.

When you create a service program, you must list the exports, that is, the data and/or modules that are available to callers. There is a shortcut. If you specify EXPORT(*ALL) in the Create Service Program (CRTSRVPGM) command, the system will generate the list of exports for you. However, you don't have any guarantee that the generated list will be compatible with existing callers, therefore you will need to rebind the newly created service program to existing callers. You can use binder language to avoid the rebinding process, because binder language gives you a way to order the list of exports.

Binder language is stored in physical file members, like RPG, CL, and DDS source code. Create a source physical file called QSRVSRC. I recommend you put it and the source code for all the modules in the same library.

The first line of a binder language source member is the Start Program Export (STRPGMEXP) command. The last line is the End Program Export (ENDPGMEXP) command. Between the two, use the EXPORT command to list each export. Here's an example:

strpgmexp pgmlvl(*current) lvlchk(*yes) signature('BR549')
export    symbol('JUNIOR')
export    symbol('SAMPLES')
endpgmexp

Notice that the STRPGMEXP command has three parameters:

  • PGMLVL (program level) may be *CURRENT, to indicate that the list of exports is the current list of exports, or *PRV, to indicate that the list of exports is that of a previous version of the service program. You may have one *CURRENT list and one or more *PRV lists.
  • LVLCHK (level check) determines whether callers will perform level checking on a service program at run-time (*YES) or not (*NO). If a caller finds that the list of exports for a service program has been changed, it issues message MCH443 (program signature violation).
  • In the SIGNATURE parameter, You may specify a signature of 16 bytes or less, or you may use the special value *GEN to tell the system to generate a signature. SIGNATURE(*GEN) is required with LVLCHK(*NO).

Suppose we have a service program, NUMBERS, which is made of one module, also called NUMBERS, which consists of two subprocedures, THREE and FOUR.

H nomain

D/copy prototypes,numbers

P Three           b                   export
D                 pi             5i 0
 /free
    return 3;
 /end-free
P                 e
 * =========================================
P Four            b                   export
D                 pi             5i 0
 /free
    return 4;
 /end-free
P                 e

For completeness, here's the prototype referred to in the source.

D Three           pr             5i 0
D Four            pr             5i 0

Which of the various combinations of the STRPGMEXP parameters would be most conducive to change? That is, what binder language would be easy to add exports to? What binder language would not require that callers be rebound to the service program? Here's one possibility:

strpgmexp pgmlvl(*current) lvlchk(*yes) signature('NUMBERS')
export    symbol('THREE')
export    symbol('FOUR')
endpgmexp

Suppose I decide to add three more subprocedures--ONE, TWO, and FIVE--to this module and service program.

H nomain

D/copy prototypes,numbers

P One             b                   export
D                 pi             5i 0
 /free
    return 1;
 /end-free
P                 e
 * ==========================================
P Two             b                   export
D                 pi             5i 0
 /free
    return 2;
 /end-free
P                 e
 * ==========================================
P Three           b                   export
D                 pi             5i 0
 /free
    return 3;
 /end-free
P                 e
 * ==========================================
P Four            b                   export
D                 pi             5i 0 
 /free
    return 4;
 /end-free
P                 e
 * ==========================================
P Five            b                   export
D                 pi             5i 0
 /free
    return 5;
 /end-free
P                 e

After I recreate the module, I am ready to recreate the service program. How should I modify the binder language?

I could change the previous binder language to a *PRV signature, and add a new current signature, like this:

strpgmexp pgmlvl(*current) lvlchk(*yes) signature(*gen)
export    symbol('ONE')
export    symbol('TWO')
export    symbol('THREE')
export    symbol('FOUR')
export    symbol('FIVE')
endpgmexp
strpgmexp pgmlvl(*prv) lvlchk(*yes) signature(*gen)
export    symbol('THREE')
export    symbol('FOUR')
endpgmexp

But guess what? This binder language won't work. When I run a program that calls this service program, calls to THREE return 1 and calls to FOUR return 2. To ensure that the callers continue to work correctly, I have to add the new exports to the end of the list, like this:

strpgmexp pgmlvl(*current) lvlchk(*yes) signature(*gen)
export    symbol('THREE')
export    symbol('FOUR')
export    symbol('ONE')
export    symbol('TWO')
export    symbol('FIVE')
endpgmexp
strpgmexp pgmlvl(*prv) lvlchk(*yes) signature(*gen)
export    symbol('THREE')
export    symbol('FOUR')
endpgmexp

According to my tests, I can add the subprocedures anywhere in the module. The only thing that matters to callers is that the new exports be added to the end of the list.

But if the new exports must be added to the end of the list, why fool around with *PRV lists anyway? For that reason, I use only a *CURRENT signature, to which I give a name, and I add new exports to the end of the list.

strpgmexp pgmlvl(*current) lvlchk(*yes) signature('NUMBERS')
export    symbol('THREE')
export    symbol('FOUR')
export    symbol('ONE')
export    symbol('TWO')
export    symbol('FIVE')
endpgmexp

The result is the same, and I have less complexity to deal with.

To sum it up:

  • Create one *CURRENT signature only.
  • Do not create *PRV signatures.
  • Name the signature, instead of letting the system generate a name.
  • Add new exports to the bottom of the list.




                     Post this story to del.icio.us
               Post this story to Digg
    Post this story to Slashdot


Sponsored By
GROUP8 SECURITY

The most effective way to improve security is by making the right business decisions
--not just the right technical decisions.
At the heart is the security equation: security=ƒ(cost, risk). Simply put, security is as much about business decisions (cost) as it is about mitigating risk. Technology alone cannot solve all of your problems.

If you're ready to take a new approach to security, learn more about Group8 and how our approach is designed to put you in control. We'll be your partner throughout the process and beyond, always there to make sure your security is the right fit for you.

Learn more. Call 775.852.8887 today.


Senior Technical Editor: Ted Holt
Technical Editor: Joe Hertvik
Contributing Technical Editors: Edwin Earley, Brian Kelly, Michael Sansoterra
Publisher and Advertising Director: Jenny Thomas
Advertising Sales Representative: Kim Reed
Contact the Editors: To contact anyone on the IT Jungle Team
Go to our contacts page and send us a message.

Sponsored Links

ARCAD Software:  October 22 Webcast! WDSc & RDi: Debugging with Don Yantzi
BCD:  Presto instantly Web enables 5250 Green Screen Apps with NO RPG, Cobol or DDS code changes
Vision Solutions:  A $20 gas card for completing a short i5/OS DR survey


 

IT Jungle Store Top Book Picks

Easy Steps to Internet Programming for AS/400, iSeries, and System i: List Price, $49.95
Getting Started with PHP for i5/OS: List Price, $59.95
The System i RPG & RPG IV Tutorial and Lab Exercises: List Price, $59.95
The System i Pocket RPG & RPG IV Guide: List Price, $69.95
The iSeries Pocket Database Guide: List Price, $59.00
The iSeries Pocket Developers' Guide: List Price, $59.00
The iSeries Pocket SQL Guide: List Price, $59.00
The iSeries Pocket Query Guide: List Price, $49.00
The iSeries Pocket WebFacing Primer: List Price, $39.00
Migrating to WebSphere Express for iSeries: List Price, $49.00
iSeries Express Web Implementer's Guide: List Price, $59.00
Getting Started with WebSphere Development Studio for iSeries: List Price, $79.95
Getting Started With WebSphere Development Studio Client for iSeries: List Price, $89.00
Getting Started with WebSphere Express for iSeries: List Price, $49.00
WebFacing Application Design and Development Guide: List Price, $55.00
Can the AS/400 Survive IBM?: List Price, $49.00
The All-Everything Machine: List Price, $29.95
Chip Wars: List Price, $29.95


 
The Four Hundred
IBM Doubles the Cores on Midrange Power Systems

Sundry October Power Systems Announcements

SMB Manufacturers Testing PLM Integration Possibilities

As I See It: What's Old is New

IBM Updates i Rational Tools, and HATS Too

The Linux Beacon
Why Blade Servers Still Don't Cut It, and How They Might

Intel Keeps Both Arms Swinging with Xeons, Jabs with Itanium

Microsoft Ponies Up Another $100 Million for Novell Linux

Mad Dog 21/21: Newtonian Economics

Two More Xeon-Based Galaxy Servers from Sun

Four Hundred Stuff
IBM Close to Delivering DB2/400 Storage Engine for MySQL

PKS Provides the Missing Link from RPG to EGL

VAI Evolving Products to Meet Customers' Future Needs

IBM Delivers New Storage Options for i

BlueWare Goes SaaS with i OS-Based Health Applications

Big Iron
For Some Customers, the Mainframe Is Green

Top Mainframe Stories From Around the Web

Chats, Webinars, Seminars, Shows, and Other Happenings

System i PTF Guide
September 20, 2008: Volume 10, Number 38

September 14, 2008: Volume 10, Number 37

September 7, 2008: Volume 10, Number 36

August 30, 2008: Volume 10, Number 35

August 23, 2008: Volume 10, Number 34

August 16, 2008: Volume 10, Number 33

The Windows Observer
Citrix Addresses Performance with XenApp 5

Server Buyers Shop Like It's 1999 in the Second Quarter

Intel Keeps Both Arms Swinging with Xeons, Jabs with Itanium

Mad Dog 21/21: Newtonian Economics

Microsoft Does Something About Those SQL Injection Attacks

The Unix Guardian
What the Heck Is the Midrange, Anyway?

Overseas and Notebook Sales Offset Printer Declines for HP in Q3

Two More Xeon-Based Galaxy Servers from Sun

Mad Dog 21/21: Newtonian Economics

Intel's Nehalems to Star at IDF, AMD Pitches Shanghai

Four Hundred Monitor
Four Hundred Monitor's
Full iSeries Events Calendar

THIS ISSUE SPONSORED BY:

Profound Logic Software
Group8 Security
Aldon


Printer Friendly Version


TABLE OF CONTENTS
Displaying Multiple Results Sets in Run SQL Scripts

A Practical Way to Add Exports to a Service Program

Admin Alert: Preventing Multiple IPs from Stopping Internet Traffic

Four Hundred Guru

BACK ISSUES

From the IT Jungle Forums
Data Queues vs. MQ Series: Performance

Removing blanks from a CL Variable

XML

SQL "Hidden" Field

Java Messages

MQ Help Desired





 
Subscription Information:
You can unsubscribe, change your email address, or sign up for any of IT Jungle's free e-newsletters through our Web site at http://www.itjungle.com/sub/subscribe.html.

Copyright © 1996-2008 Guild Companies, Inc. All Rights Reserved.
Guild Companies, Inc., 50 Park Terrace East, Suite 8F, New York, NY 10034

Privacy Statement