Приложение 12. Пример анализа результатов трансляции хранимой процедуры
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inter.h"
#include "exlib.h"
#define SIZE 8192
static void PrintDescErr(TCBL * pCBL, L_LONG CodErr);
static L_BYTE Load(L_CHAR * Buf, const L_CHAR * fname, L_LONG size);
static void ProcPrintError(TCBL * pCBL);
#ifndef WINCE
int main(int argc, const char * argv[])
#else
int excreat()
#endif
{
TCBL CBLconnect;
L_CHAR Name_Pass[] = "SYSTEM/MANAGER8";
L_CHAR Node[] = " ";
L_WORD Priority = 0;
L_LONG PrzExe = M_EXCLUSIVE | Q_ENCODE | M_BINARY;
L_LONG Err;
L_CHAR Buf[SIZE];
if (argc != 2)
{
printf("Usage:ExCreat input_file\n");
exit(1);
}
memset(&CBLconnect,0,sizeof(TCBL));
Err = LinterOPEN(&CBLconnect, Name_Pass, Node, Priority, PrzExe);
if (Err != NORMAL)
ProcPrintError(&CBLconnect);
printf("Connect to RDBMS Linter\n");
if (Load(Buf, argv[1], SIZE))
{
Err = LinterNotSelect(&CBLconnect, Buf);
if (Err != NORMAL)
ProcPrintError(&CBLconnect);
printf("created/alterd procedure\n");
}
else
printf("can't Load text from file %s", argv[1]);
printf("End Example\n");
return 0;
}
static void PrintDescErr(TCBL * pCBL, L_LONG CodErr)
{
L_CHAR Str[256];
if (NORMAL != LinterGETE(pCBL, CodErr, Str, 255))
{
printf("LinterGETE -- Error=%ld\n", pCBL->CodErr);
exit(1);
}
printf("%s", Str);
}
static void ProcPrintError(TCBL * pCBL)
{
ERRS_DESCR *ErrDesc;
L_BYTE Buf[4096];
L_WORD Len,
CntErr,
i;
L_WORD dp;
L_CHAR cp[101];
L_LONG Err;
if (pCBL->CodErr != NORMAL)
{
printf("Linter Error: %ld\n", pCBL->CodErr);
if (pCBL->CodErr != Proc_Translation_Error)
exit(1);
}
else
return;
Err = LinterGETE(pCBL, Proc_Translation_Error, Buf, sizeof(Buf));
if (Err != NORMAL)
{
printf("ProcPrintError -- Linter error %ld\n", Err);
exit(1);
}
CntErr = *((L_WORD *) Buf);
ErrDesc = (ERRS_DESCR *) (Buf + sizeof(L_WORD));
for (i = 0; i < CntErr; i++)
{
if (ErrDesc->Row != -1)
printf("Error in line %ld position %ld: ",
ErrDesc->Row, ErrDesc->Position);
else
printf("Error: ");
switch (ErrDesc->ArgType)
{
case PROC_ERR_ARGSHORT:
dp = *((L_WORD *) (ErrDesc + 1));
PrintDescErr(pCBL, ErrDesc->CodErr + PROC_ERR_BASE);
printf(": %d", dp);
ErrDesc = (ERRS_DESCR *) ((L_WORD *) (ErrDesc + 1) + 1);
break;
case PROC_ERR_ARGSTRING:
Len = *((L_WORD *) (ErrDesc + 1));
memcpy(cp, (L_WORD *) (ErrDesc + 1) + 1, Len);
cp[Len] = 0;
PrintDescErr(pCBL, ErrDesc->CodErr + PROC_ERR_BASE);
printf(": %s", cp);
ErrDesc = (ERRS_DESCR *) ((L_BYTE *) (ErrDesc + 1)
+ sizeof(L_WORD) + Len);
break;
default:
PrintDescErr(pCBL, ErrDesc->CodErr + PROC_ERR_BASE);
ErrDesc++;
}
printf("\n");
}
printf("End Example\n");
exit(1);
}
static L_BYTE Load(L_CHAR * Buf, const L_CHAR * fname, L_LONG size)
{
L_LONG ret;
FILE *file;
file = fopen(fname, "r");
if (file == NULL)
{
printf("Error: can't open file %s\n", fname);
exit(1);
}
ret = fread(Buf, size, 1, file);
if (ret > 0)
ret = feof(file);
fclose(file);
if (ret)
return 0;
return 1;
}