#include <windows.h>
#include <commctrl.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <wsqllib.h>
#include <winlib/winlib.h>

#include "sqlbase.h"
#include "dbinit.h"
#include "dbroutes.h"
#include "dbutil.h"
#include "sqlcmd.h"


void OrderBy(VARS *v)
{
       char *p;

       if ((p = GetInput(v->hwndMain, "Order By", v->order, 300)))
               strcpy(v->order, p);
}


void Search(void *arg)
{
       SQLRESULT *newRow, *prevRow = NULL;
       SQLRESFIELD *rf, *newField, *prevField;
       MYSQL_ROW row;
       int i, fc, first;
       char *p, *s;
       SQLFIELD *f;
       HWND focus;
       VARS *v = (VARS*)arg;

       v->sqlCmdActive = TRUE;

       ShowStatus(v->hwndStatus, 0, "Processing...");

       sprintf(v->buf, "SELECT * FROM %s", v->table);

       first = 1;

       for (i = 0, f = v->fields; i < v->nFields;
                       i++, f = f->next) {
               s = GetText(v, i);
               if (strlen(s)) {
                       if (! first)
                               strcat(v->buf, " AND ");
                       else
                               strcat(v->buf, " WHERE ");
                       first = 0;
                       sprintf(v->buf2, "%s LIKE '%s'", f->name, s);
                       strcat(v->buf, v->buf2);
               }
       }

       sprintf(v->buf2, " ORDER BY %s", v->order);
       strcat(v->buf, v->buf2);

       if (! SQLQuery(0, v->buf))
               goto end;

   while (v->result) {
       rf = v->result->fields;
               while (rf) {
                       free(rf->data);
                       p = (char*)rf;
                       rf = rf->next;
                       free(p);
               }
               p = (char*)v->result;
               v->result = v->result->next;
               free(p);
   }

       v->numRows = 0;
       while ((row = SQLFetchRow(0))) {
               newRow = malloc(sizeof(SQLRESULT));
               newRow->fields = prevField = NULL;

               for (i = 0; i < v->nFields; i++) {
                       newField = malloc(sizeof(SQLRESFIELD));
                       newField->next = NULL;

                       if (row[i] == NULL)
                               newField->data = NewString("");
                       else
                               newField->data = NewString(row[i]);

                       if (! newRow->fields)
                               newRow->fields = newField;
                       if (prevField)
                               prevField->next = newField;
                       prevField = newField;
               }

               newRow->next = NULL;
               if (! v->result)
               v->result = newRow;
               if (prevRow)
               prevRow->next = newRow;
               prevRow = newRow;
               v->numRows++;
       }

       SQLEndQuery(0);

       ShowStatus(v->hwndStatus, 0, "");
       if (! v->numRows) {
               ShowStatus(v->hwndStatus, 0, "No rows found");
               goto end;
       }

       v->rowNum = 0;
       SetFields(v);

end:
       v->sqlCmdActive = FALSE;
}


void AddRow(VARS *v)
{
       int empty = 1;
       int i, first;
       char *s;

       if (Empty(v))
               return;

       if (! Prompt(v->hwndMain, "Add Row", "Add row?", 1))
               return;

       sprintf(v->buf, "INSERT INTO %s VALUES (", v->table);

       first = 1;
       for (i = 0; i < v->nFields; i++) {
               if (! first)
                       strcat (v->buf, ", ");
               first = 0;
               s = GetText(v, i);
               sprintf(v->buf2, "'%s'", s);
               strcat(v->buf, v->buf2);
       }
       strcat(v->buf, ")");

       SQLQuery(0, v->buf);
}


void DeleteRow(VARS *v)
{
       char *p;
       int i, first;
       SQLFIELD *f;
       SQLRESULT *row, *prevRow = NULL;
       SQLRESFIELD *rf;
       char *s;

       if (! v->result)
               return;

       if (Empty(v))
               return;

       if (! Prompt(v->hwndMain, "Delete Row", "Delete row?", 0))
               return;

       sprintf(v->buf, "DELETE FROM %s WHERE ", v->table);

       first = 1;
       for (i = 0, f = v->fields; i < v->nFields;
                       i++, f = f->next) {
               s = GetText(v, i);
               if (strlen(s)) {
                       if (! first)
                               strcat(v->buf, " AND ");
                       first = 0;
                       sprintf(v->buf2, "%s='%s'", f->name, s);
                       strcat(v->buf, v->buf2);
               }
       }

       if (! SQLQuery(0, v->buf))
               return;

   for (i = 0, row = v->result; i < v->rowNum; i++, row = row->next)
               prevRow = row;
   if (prevRow)
               prevRow->next = row->next;
   else
               v->result = v->result->next;

       rf = row->fields;
       while (rf) {
               free(rf->data);
               p = (char*)rf;
               rf = rf->next;
               free(p);
       }
       free(row);
       v->numRows--;

       if (v->rowNum > 0)
               v->rowNum--;

       if (v->numRows)
               SetFields(v);
       else
               ClearFields(v);
}


void UpdateRow(VARS *v)
{
       char *p;
       int i, first;
       SQLFIELD *f;
       SQLRESULT *row, *newRow, *prevRow = NULL;
       SQLRESFIELD *rf, *newField, *prevField;
       char *s;

       if (! v->result)
               return;

       if (Empty(v))
               return;

       if (! Prompt(v->hwndMain, "Update Row", "Update row?", 1))
               return;

       sprintf(v->buf, "UPDATE %s SET ", v->table);

       first = 1;
       for (i = 0, f = v->fields; i < v->nFields;
                       i++, f = f->next) {
               s = GetText(v, i);
               if (! first)
                       strcat(v->buf, ", ");
               first = 0;
               sprintf(v->buf2, "%s='%s'", f->name, s);
               strcat(v->buf, v->buf2);
       }

       strcat(v->buf, " WHERE ");

       for (i = 0, row = v->result; i < v->rowNum; i++)
               row = row->next;

       first = 1;
       for (i = 0, f = v->fields, rf = row->fields;
                       i < v->nFields;
                       i++, f = f->next, rf = rf->next) {
               s = rf->data;
               if (strlen(s)) {
                       if (! first)
                               strcat(v->buf, " AND ");
                       first = 0;
                       sprintf(v->buf2, "%s='%s'", f->name, s);
                       strcat(v->buf, v->buf2);
               }
       }

       if (! SQLQuery(0, v->buf))
               return;

       newRow = malloc(sizeof(SQLRESULT));
       newRow->fields = prevField = NULL;

       for (i = 0; i < v->nFields; i++) {
               newField = malloc(sizeof(SQLRESFIELD));
               newField->next = NULL;

               s = GetText(v, i);
               newField->data = NewString(s);

               if (! newRow->fields)
                       newRow->fields = newField;
               if (prevField)
                       prevField->next = newField;
               prevField = newField;
       }

   for (i = 0, row = v->result; i < v->rowNum; i++, row = row->next)
               prevRow = row;

       newRow->next = row->next;
   if (prevRow)
               prevRow->next = newRow;
   else
               v->result = newRow;

       rf = row->fields;
       while (rf) {
               free(rf->data);
               p = (char*)rf;
               rf = rf->next;
               free(p);
       }
       free(row);
}