Приложение 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;
  }