#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "global.h"
#include "field.h"
#include "db_misc.h"

extern char allowpassword;
extern struct field_t *fields;

void field_trigger(void)
{
  struct field_t *f = NULL;

  if (fields == NULL)
     return;

  if (fields->next == NULL)
     return;

  for (f = fields; f->next; f = f->next)
      proc_field(f->next->tname, f->next->fields);  
}

int fields_okay(void)
{
  int ret = 0, eret = 0;
  struct field_t *f = NULL;
  char nb[3] = { 0, 0, 0 };

  if (fields == NULL)
     return 1;

  if (fields->next == NULL)
     return 1;

  *nb = '0';
  *(nb + 1) = '0';

  for (eret = 1, f = fields; f->next; f = f->next) {
      ret = test_fields(f->next->fields, nb);
      if (ret == 0)
         eret = 0;
  }

  return eret;
}

int test_fields(char **nfields, char *nb)
{
  int i = 0, eret = 0;
  char *p = NULL, *g = NULL;

  for (eret = 1, i = 0; nfields[i]; i++, inc_nb(nb)) {
      p = cgi_is_var(nfields[i]);
      if (p == NULL) {
         /*
            Special case variable which may not yet be defined.
         */
         if (!(strcasecmp(nfields[i], "pass"))) {
            g = f_global_par("RP");
            if ((g == NULL) || (!(*g)))
               eret = 0;       

            else
               global_par(nb, g);
         }

         else
            eret = 0;
      }

      else
         global_par(nb, p);
  }

  return eret;
}

/*
   Silly, but fun to write. :)
*/
void inc_nb(char *nb)
{
  if (*(nb + 1) < '9') {
     (*(nb + 1))++;
     return;
  }

  if (*(nb + 1) == '9') {
     if (*nb == '9')
        return;

     *(nb + 1) = '0';
     nb[0]++;
     return;
  }
}

void proc_field(char *tname, char **nfields)
{
  char **fields = NULL, *p = NULL;
  int ret = 0, i = 0, n = 0, k = 0;

  for (n = 0; nfields[n]; n++);

  fields = (char **)malloc(sizeof(char *) * (n + 1));

  if (fields == NULL)
     global_error("Out of memory during field processing", 0, 0);
  
  for (i = 0; nfields[i]; i++) {
      fields[i] = cgi_is_var(nfields[i]);

      if ((fields[i] == NULL) || (!(*fields[i]))) {
         if (!(strcasecmp(nfields[i], "pass"))) {
            p = f_global_par("RP");
            if ((p == NULL) || (!(*p)))
	       global_error("Internal field check error.", 0, 0);
            else
               fields[i] = p;
         }         
         else
	    global_error("Internal field check error.", 0, 0);
      }
  }

  fields[i] = NULL;

  ret = db_open();

  if (ret == DB_E_CREDENTIALS)
     global_error("Unable to authenticate with database.", 0, 0);

  else if (ret == DB_E_CONNECT)
     global_error("Unable to connect to database.", 0, 0);

  else if (ret == DB_E_DATABASE)
     global_error("Unable to switch to database.", 0, 0);

  /*
     Using db_null.c
  */  
  else if (ret == DB_E_NONE)
     return;

  db_insert_data(tname, nfields, fields);

  db_close();
}


syntax highlighted by Code2HTML, v. 0.9.1