User Exit (Open Systems Only)

End users can construct CONNX user exits that will be called during Adabas processing.  User exits can be call before each Adabas call, after each Adabas call, or both.

CONNX User exists are only available on Open Systems.

The User exist must be constructed as DLL on windows, or a shared library on unix.

 

To enable a user exit, the following configuration setting must be enabled on the Adabas server.

On unix, these should be added to the connxserver script as additional environment variables.

On windows, they should be added using the CONNX Configuration Manager under the CONNX\ADABAS key.

 

The following setting will determine when the user exit is called.

USEREXITFLAGS

1 = PRECALL - Call before every Adabas call

2 = POSTCALL - Call after every Adabas call

3 = PRECALL and POSTCALL - Call before and after every Adabas call

 

The following setting is the name of the 64bit user exit.  Use this setting if the CONNX server is configured as 64bit.

USEREXITNAME64

 

The following setting is the name of the 32bit user exit.  Use this setting if the CONNX server is configured as 32bit.

USEREXITNAME32

 

The only requirement of the user exit DLL is that it must have a C entry point with the name of UserExitFunc.

The UserExitFunc function has the following signature:

extern "C" int UserExitFunc(unsigned int threadid, // unique session number

const char *userid,        // user name passed to the CONNX Adabas server

const char * clientid,     // clientid (if any) passed to the CONNX Adabas server

void * AdabasControlBlock, // the Adabas control block

void * szFormatBuffer,     // the Adabas format buffer

void * szRecordBuffer,     // the Adabas record buffer

void *szSearchBuffer,      // the Adabas search buffer

void *szValueBuffer,       // the Adabas value buffer

void *szISNBuffer,         // the Adabas ISN buffer

int nPrePost )             // integer flag to indicate whether this is a pre (0) or post (1) call.

 

 

 

Here is a C++ example of a user exit DLL function:

// adauserexit.cpp : Defines the exported functions for the DLL application

//

#include "stdafx.h"

#include "adauserexit.h"

#include <stdio.h>

#include <stdlib.h>

#pragma pack(1)

typedef       struct        _ADABASCONTROLBLOCK

{

       char cb_cmd_res[2];  // Reserved

       char cb_cmd_code[2]; // Command Code

       char cb_cmd_id[4];   // COMMAND ID

       short cb_file_nr;

       short cb_return_code;

       int cb_isn;

       int cb_isn_l1;

       int cb_isn_quantity;

       unsigned short cb_fmt_buf_lng;

       unsigned short cb_rec_buf_lng;

       unsigned short cb_sea_buf_lng;

       unsigned short cb_val_buf_lng;

       unsigned short cb_isn_buf_lng;

       char cb_cop1;

       char cb_cop2;

       char cb_add1[8];

       char cb_add2[4];

       char cb_add3[8];

       char cb_add4[8];

       char cb_add5[8];

       int cb_cmd_time;

       char cb_user_area[4];

} ADABASCONTROLBLOCK;

#pragma pack()

// This is an example of an exported function.

extern "C" ADAUSEREXIT_API int UserExitFunc(unsigned int threadid,

const char *userid,

const char * clientid,

void * AdabasControlBlock,

void * szFormatBuffer,

void * szRecordBuffer,  

void *szSearchBuffer,

void *szValueBuffer,

void *szISNBuffer,

int nPrePost )

{

       FILE * fp;

       fp = fopen("c:\\adaexit.log", "a+");

       ADABASCONTROLBLOCK * pBlock = (ADABASCONTROLBLOCK *)AdabasControlBlock;

       fprintf(fp, "thread (%d), user(%s), clientid(%s), adabas command(%2.2s)\n",

        threadid, userid, clientid, pBlock->cb_cmd_code);

       fclose(fp);

       return 0;

}