The logging framework routines are written in C, so you can use them directly from your C stored procedures without having to make a call to the logging stored procedures. The example C stored procedure below uses the logging API. To use the logging methods, include the splogger shared library in your project.
Include splogger.h in your C stored procedure that will define the logging methods prototypes.
Listing 8. Logging framework API — splogger.h header file
#ifndef SPLOGGER_H_
#define SPLOGGER_H_
#endif /*SPLOGGER_H_*/
#include <sys/timeb.h>
#define NAMESIZE 31
#define DBSIZE 9
typedef struct _handle Handle;
struct _handle
{
char spName[NAMESIZE+DBSIZE];
struct timeb startTime; /* Pass starttime to know total elapsed time */
struct timeb prevTime; /* Pass previous time to know elapsed time
since previous logger step */
};
#define BYTEHANDLESIZE (sizeof(Handle))
void openLog(char *name, char *handle);
void closeLog(char *handle);
void setDBName(struct sqludf_dbinfo *dbInfo);
void logger(char *handle, char *fmt, ... );
void logginfo(char *handle, char *fmt, ... );
Listing 9. Sample C stored procedure to show logging methods API
SQL_API_RC SQL_API_FN Snow
(
char outMessage[100],
sqlint16 *outMessageNullInd,
char sqlstate[6],
char qualName[28],
char specName[19],
char diagMsg[71],
struct sqludf_dbinfo *dbInfo
)
{
char byteHandle[BYTEHANDLESIZE];
char dbName[128] = "";
setDBName(dbInfo);
openLog("TESTSP", byteHandle);
strncpy(outMessage, (char *)(dbInfo->dbname), dbInfo->dbnamelen);
outMessage[dbInfo->dbnamelen] = '\0';
logger(byteHandle, "The database name from dbInfo is %s", outMessage);
strcat(outMessage, "::");
logger(byteHandle, "The HOME variable is %s", getenv("HOME"));
strcat(outMessage, getenv("HOME"));
strcat(outMessage, "::");
strcat(outMessage, (char *)(dbInfo->appl_id));
logger(byteHandle, "The Application ID is %s", (char *)(dbInfo->appl_id));
*outMessageNullInd = 0;
closeLog(byteHandle);
return 0;
}
Use the following SQL to register the example stored procedure.
Listing 10. Registering the example stored procedure
CREATE PROCEDURE DB.SNOW ( OUT MSG VARCHAR(100) ) DYNAMIC RESULT SETS 0 DETERMINISTIC LANGUAGE C PARAMETER STYLE SQL DBINFO FENCED NOT THREADSAFE NO SQL PROGRAM TYPE SUB EXTERNAL NAME 'splogger!Snow';