Skip to content
View All / Assembler : Getting Connected to DB2

Assembler : Getting Connected to DB2

At the end of another week of chasing my tail and trying not to get in too much trouble with Mrs DB2 Dinosaur, I’ve resolved to write a quick post about getting the assembler component of the DB2 monitor connected to DB2.

Whilst this is fairly well documented in the manuals, we have a slightly different set of requirements, as:

a) We aren’t running application code / allocating a plan or package, and
b) We are running commands and talking to the IFI

Probably you already looked at this in the DB2 V9 Application Programming and SQL Guide and you’re wondering why this warrants a post. Well, go find the same information in the V10 manuals, little warm blooded squishy. You’ll find that Chapter 30 (Programming for the Call Attach Facility) has disappeared. As I may have mentioned before, I am a bit lazy, so it may be that this is still in the documentation set somewhere else. Then again…

Anyway, I like the CAF as it’s fairly simple and we can get to issue commands, drive the IFI and run dynamic SQL from it without having to write an encyclopedia of code.

Loading the Interface
The interface entry point that we use for CAF is DSNALI, so we make this available to our code with the LOAD macro, and save the entry point that’s returned to us. Note that I generally get all of my loading done early on in the code so that I don’t do all the work, for example, and then find I can’t write the report, so in this example, I’ve loaded the IFI interface DSNWLI2 as well:

             LOAD   EP=DSNALI    LOAD CAF
ST     R0,ADSNALI
LOAD   EP=DSNWLI2   LOAD CAF IFI
ST     R0,ADSNWLI2

                 :
ADSNALI      DS     F            EP OF DB2 CAF (DSNALI)
ADSNWLI2     DS     F            EP OF DSNWLI2 (DB2 CAF IFI)

Connect
Driving the connection looks a bit like this:

      L        R15,ADSNALI
LA       R5,IFISSID
LA       R6,ENECB        DB2 TERMINATION ECB
LA       R7,STECB        DB2 STARTUP ECB
LA       R8,RIBPTR       DB2 RIB PTR
CALL    (15),(ALICONN,(5),(6),(7),(8)),VL,MF=(E,CALLBLK)
LTR      R15,R15
BE       DOCMD

           :
ALICONN  DC    CL12’CONNECT ‘
           :
RIBPTR  DS F   RELEASE INFORMATION BLOCK
STECB   DS F   SUBSYSTEM START ECB
ENECB   DS F   SUBSYSTEM SHUTDOWN ECB

IFISSID DS CL4 DB2 SUBSYSTEM ID

This is about as simple as anything gets in DB2! The ENECB gets posted if DB2 is running and gets a shutdown request, and STECB is posted if DB2 is down and gets a start request. RIBPTR is set following a successful connect request and points to the DB2 Release Information Block (RIB) – see xxxx.SDSNMACS(DSNDRIB) for the mapping.

On return, R15 is the return code (0 = okay), and R0 is the reason code – e.g. x’00F30002′.

Disconnect
Once you’ve finished doing all of the things that you want to do with DB2 over CAF, please remember to close up shop nicely – i.e. stop the traces you started, close the plan you opened, and disconnect:

* CALL DSNALI TO DISCONNECT
DISCDB2   DS 0H
L R15,ADSNALI
CALL (15),(ALIDISC),VL,MF=(E,CALLBLK)
B THEEND AND SHUTDOWN

            :
ALIDISC   DC CL12’DISCONNECT ‘

So, now that we know how to get connected, next time we’ll see how to get our traces started and allocate an OPn trace buffer.

Roar.

Follow James on Twitter @db2dinosaur