Menu

PRCEDpp

Database (3)
rwaury
Attachments
prcedpp.pdf (582820 bytes)

PRCEDpp is a light-weight class abstraction build above IBM i's QSQPRCED interface for Extended Dynamic SQL. PRCEDpp allows to easily manage connections, SQL statements, Cursors, return sets and SQL packages (a persistent cache that allows dynamioc SQL applications a considerable performance gain).

PRCEDpp can run locally and directly connect to the database or remotely on Windows, Linux or UNIX systems either using SAP's XDN driver or IBM's XDA driver.

A PDF generated by doxygen is attached to this article.


Files

PRCEDpp.cpp
PRCEDpp.h
PRCEDPrint.cpp
PRCEDPrint.h
QxdaUTIL.cpp
QxdaUTIL.h


Classes


Functions


Usage

Example:

*******************************************************************************

        Function: Test PRCEDpp C++ Classes for QSQPRCED Database Access.

*******************************************************************************

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <ebcdic.h>

#include <PRCEDpp.h>
#include <PRCEDPrint.h>

#define FILE "TWOLOB"                           // Max 10 Characters 

#define CURSOR "cursor000000000001"             // Max 18 Characters 

#define STATEMENT "\"IAPJICLAOEONAAAA\""        // Max 18 Characters 

#define PACKAGE "AS4EXTRA"                      // Max 10 Characters 
//#define PACKAGE FILE                            // Max 10 Characters 
//#define LIBRARY "R3MOEDATA "                    // Max 10 Characters 
//#define LIBRARY "R3MOEX0000"                    // Max 10 Characters 
#define LIBRARY "ERIC"                          // Max 10 Characters 

// ************************************************************************ 
// **** Utilities ********************************************************* 
// ************************************************************************ 

#if defined(_WIN32) || defined(__OS400_TGTVRM__)
        typedef wchar_t u2char_t;
#else
        typedef short u2char_t;
#endif

// ************************************************************************ 
// **** Main ************************************************************** 
// ************************************************************************ 

main(int argc, char *argv[])
        {
        SQLCtrlBlock CB;
        char Buffer[4096] = {0};
        short Indicators[1024] = {0};

        char *StatementText = "SELECT NAMELEN, NAME, ADDRESS, TELLEN, "
                              "TELEPHONE, AGE FROM R3MOEDATA/TWOLOB "
                              "WHERE AGE = ?";
        try     {
                // ============================== 
                // ====== Create Package ======== 
                // ============================== 

                PRCED_Statement Statement(CB,
                                          STATEMENT,
                                          LIBRARY, PACKAGE);

                int rc = Statement.CreatePackage();

                // ===================== 
                // ====== Prepare ====== 
                // ===================== 

                rc = Statement.Prepare(StatementText);

                // ======================
                // ====== Describe ======
                // ======================

                DAVariables DescVars;
                rc = rc || Statement.Describe(DescVars);
                if (rc == 0)
                        {
                        int nCols = DescVars.GetColumnCount();
                        for (int Col=0; Col < nCols; Col++)
                                {
                                PrintColumn(DescVars,Col);
                                }
                        }

                // ================== 
                // ====== Open ====== 
                // ================== 

                int BlockedRows = 2;
                PRCED_Cursor Cursor(Statement,CURSOR);

                int Age = 42;
                char AgeBuffer[64];
                short AgeIndBuffer[1] = {0};
                DAVariables InVars;
                InVars.AddVariable(DA_INT_TYPE,"AGE",0);
                InVars.SetBuffers(AgeBuffer,AgeIndBuffer,NULL);
                InVars.SetVariable(0,0,&Age,sizeof(Age));

                rc = rc || Cursor.Open(InVars,BlockedRows);

                // =================== 
                // ====== Fetch ====== 
                // =================== 

                DAVariables OutVars;
                OutVars.AddVariable(DA_INT_TYPE,"NAMELEN",0);
                OutVars.AddVariable(DA_DBCLOB_TYPE,"NAME",300);
                OutVars.AddVariable(DA_WCHAR_TYPE,"ADDRESS",30);
                OutVars.AddVariable(DA_INT_TYPE,"TELLEN",0);
                OutVars.AddVariable(DA_DBCLOB_TYPE,"TELEPHONE",300);
                OutVars.AddVariable(DA_INT_TYPE,"AGE",0);
                OutVars.SetBuffers(Buffer,Indicators,NULL);

                while (rc == 0)
                        {
                        rc = rc || Cursor.Fetch(OutVars);
                        int nCols = OutVars.GetColumnCount();
                        int nProcessed = Cursor.GetRowsProcessed();
                        for (int Row=0; Row < nProcessed; Row++)
                                {
                                for (int Col=0; Col < nCols; Col++)
                                        {
                                        PrintVariable(OutVars,Row,Col);
                                        }
                                }
                        }

                Cursor.Close();
                }
        catch (ASError &Error)
                {
                char *ErrorText = Error.GetText();
                printf("ERROR: %s: %s\n",ErrorText,Error.GetExceptionID());
                }
        catch (ErrorClass &Error)
                {
                char *ErrorText = Error.GetText();
                printf("ERROR: %s\n",ErrorText);
                }

        return 0;
        }

Related

Wiki: Home