#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define USERNAME "TEMP"
#define PASSWORD "SECRET"
#define SOC_SIZE 4096
#include "HTOracle.h"

#ifndef MSDOS
#else
extern unsigned char *malloc();
#endif

char *nullstring=" ";

EXEC SQL BEGIN DECLARE SECTION;
   char *username = USERNAME;
   char *password = PASSWORD;
   VARCHAR statement[240];
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;

SQLDA *bind_dp;
SQLDA *select_dp;

extern SQLDA *sqlald();

extern void sqlprc();
int precision, scale;

extern void sqlnul();
short null_ok;

short *indicator;



PUBLIC int HTOracle ARGS2(CONST char *, keywords, int, soc)
{
   int i,j,k;
   char variable[30];
   char *zozo;
   char *zezette;
   char apple[45];
   char parrot[50];
   char badaboum[SOC_SIZE];
   char tralala[SOC_SIZE];
  
       
  if (!keywords || *keywords=='\0') 
  {
      HTWriteASCII(soc,"<ISINDEX><title>ORION Oracle Database</title>");
      HTWriteASCII(soc,"<PLAINTEXT>This is an Oracle Server.   \nPlease enter your Request (no semicolon at the end)   ");
      return 0;
   }

   HTWriteASCII(soc,"<ISINDEX><title>ORION Oracle Database</title>");
   HTWriteASCII(soc,"<PLAINTEXT>Answer to Request\n\n\n");

   EXEC SQL WHENEVER SQLERROR GOTO sqlerror;

   EXEC SQL CONNECT :username IDENTIFIED BY :password;

   bind_dp = sqlald (40, 30, 30);
   bind_dp->N = 40;

   select_dp = sqlald (40, 30, 30);
   select_dp->N = 40;

   strcpy((char *)statement.arr,keywords);
   statement.len = strlen(statement.arr);
   while ((zozo=strchr((char *)statement.arr,'+')) != 0) *zozo=' ';

   EXEC SQL PREPARE S FROM :statement;
   EXEC SQL DECLARE C CURSOR FOR S;

   EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_dp;

   if (bind_dp->F < 0)
   {
       HTWriteASCII(soc, "Too many bind variables for descriptor.");
       goto sqlerror;
   }

   bind_dp->N = bind_dp->F;

   if (bind_dp->F > 0)
   {
       HTWriteASCII(soc, "\nEnter value for bind variable\n");
       goto sqlerror;
   }

   EXEC SQL OPEN C USING DESCRIPTOR bind_dp;

   if ((strncmp(statement.arr, "SELECT", 6) != 0) && 
            (strncmp(statement.arr, "select", 6) != 0))
       goto end_main;

   EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;

   if (select_dp->F < 0)
   {
       sprintf(badaboum, "\nToo many select-list variables for descriptor: %d",
            -(select_dp->F));
       HTWriteASCII(soc,badaboum);
       goto sqlerror;
   }
   
   select_dp->N =  select_dp->F;

   for (i=0; i<select_dp->F; i++)
   {
       sqlnul (&(select_dp->T[i]), &(select_dp->T[i]), &null_ok);

       switch (select_dp->T[i])
       {
            case 1 : break;

            case 2 : sqlprc (&(select_dp->L[i]), &precision, 
                         &scale);
                  if (precision == 0) precision = 40;
                  select_dp->L[i] = precision + 2;
                  if (scale < 0)
                         select_dp->L[i] += -scale;
                  break;

            case 8 : select_dp->L[i] = 240;
                  break;

            case 12 : select_dp->L[i] = 9;
                  break;

            case 23 : break;

            case 24 : select_dp->L[i] = 240;
                  break;
       }

       select_dp->V[i] = malloc(select_dp->L[i]);

#ifndef MSDOS
            select_dp->I[i] = (short *)malloc(sizeof(short));
#else
            select_dp->I[i] = (unsigned short *)malloc(sizeof
                  (short));
#endif
       strncpy(parrot,select_dp->S[i],30);
       if (select_dp->T[i] == 2)
       {  
                   /* erase blanks ending parrot */
            while ((zezette=strchr(parrot,' ')) != 0) *zezette='\0';  
                   /* end of erase */
            sprintf(badaboum,"%*.*s ", (int)select_dp->L[i],
                  (int)select_dp->L[i], parrot);
            HTWriteASCII(soc, badaboum);
       }
       else
       { 
            sprintf(badaboum,"%-*.*s ", (int)select_dp->L[i],
                  (int)select_dp->L[i], parrot);
            HTWriteASCII(soc, badaboum);
       }
 
   }
 
   HTWriteASCII(soc,"\n");

   for (i=0; i<select_dp->F; i++)
   {
       strcpy(apple,"------------------------------------------");
       sprintf(badaboum,"%*.*s ", (int)select_dp->L[i],
                  (int)select_dp->L[i], apple);
       HTWriteASCII(soc,badaboum); 
       if (select_dp->T[i] != 24)
            select_dp->T[i] = 1;
   }  
   HTWriteASCII(soc,"\n");


   EXEC SQL WHENEVER NOT FOUND GOTO end_main;
   for (;;)
   {
       EXEC SQL FETCH C USING DESCRIPTOR select_dp;

       for (i=0; i<select_dp->F; i++)
       {
            indicator = (short *)select_dp->I[i];
            if (*indicator < 0)
            {
                  sprintf(badaboum,"%-*.*s ", (int)select_dp->L[i],
                         (int)select_dp->L[i], nullstring);
                  HTWriteASCII(soc,badaboum);
            }
     
            else
            {
                  sprintf(badaboum,"%-*.*s ", (int)select_dp->L[i],
                         (int)select_dp->L[i], select_dp->V[i]);
                  HTWriteASCII(soc,badaboum);
            }

       }
       HTWriteASCII(soc,"\n");
   }


 end_main:
   sprintf (badaboum,"\n\n# of rows processed = %d\n\n\n", sqlca.sqlerrd[2]);
   HTWriteASCII(soc, badaboum);
   for (i=0; i<select_dp->F; i++)
   {
       free (select_dp->V[i]);
       free (select_dp->I[i]);
   }

   sqlclu (bind_dp);
   sqlclu (select_dp);

   EXEC SQL CLOSE C;
   EXEC SQL COMMIT WORK RELEASE;
   return;


 sqlerror:
   sprintf(badaboum,"\n%.70s",sqlca.sqlerrm.sqlerrmc);
   HTWriteASCII(soc, badaboum);
   EXEC SQL WHENEVER SQLERROR CONTINUE;
   EXEC SQL ROLLBACK WORK RELEASE;
   HTWriteASCII(soc,"\n\n\n");
   return;


}
