#include #include #include #include #include #include #include #include #include #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); } .