From 73427f743cd03a2cdc5c402fdae9be98b1ac6f02 Mon Sep 17 00:00:00 2001 From: Mike Dvorkin Date: Mon, 19 Jul 2010 23:39:35 -0700 Subject: [PATCH] Moved 'current' to table header; fixed table load; added project show and delete --- src/pit.h | 2 -- src/project.c | 55 +++++++++++++++++++++++++++++++++----------- src/table.c | 60 +++++++++++++++++++++++++++++++----------------- src/table.c.out | Bin 0 -> 14272 bytes src/table.h | 19 +++++++++------ 5 files changed, 92 insertions(+), 44 deletions(-) create mode 100755 src/table.c.out diff --git a/src/pit.h b/src/pit.h index 90461be..be5fc6e 100644 --- a/src/pit.h +++ b/src/pit.h @@ -9,7 +9,6 @@ typedef unsigned char uchar; typedef struct { ulong id; - int current; /* 1 if the project is current, 0 otherwise. */ char name[128]; /* Project name. */ char status[16]; /* Project status. */ ulong number_of_open_tasks; /* Number of open tasks. */ @@ -25,7 +24,6 @@ typedef struct { typedef struct { ulong id; ulong project_id; /* Which project the task belongs to? */ - int current; /* 1 if the task is current, 0 otherwise. */ int priority; /* Task priority. */ char name[128]; /* Task name. */ char status[16]; /* Task status. */ diff --git a/src/project.c b/src/project.c index dbfdcbb..b2c5bce 100644 --- a/src/project.c +++ b/src/project.c @@ -27,7 +27,7 @@ static void list_projects() pit_db_load(); for(i = 0, pp = (PProject)projects->slots; i < projects->number_of_records; i++, pp++) { - printf("%lu: [%s] %s\n", pp->id, pp->status, pp->name); + printf("%c %lu: [%s] %s\n", (pp->id == projects->current ? '*' : ' '), pp->id, pp->status, pp->name); } } @@ -35,8 +35,10 @@ static void create_project(char *name, char *status) { pit_db_load(); - if (!already_exist(name)) { - Project p; + if (already_exist(name)) { + die("project with the same name already exists"); + } else { + Project p, *pp; memset(&p, 0, sizeof(p)); @@ -47,33 +49,54 @@ static void create_project(char *name, char *status) strncpy(p.name, name, sizeof(p.name) - 1); strncpy(p.status, status, sizeof(p.status) - 1); - p.current = 1; p.number_of_open_tasks = 0; p.number_of_closed_tasks = 0; p.closed_by = 0; p.created_by = p.updated_by = 1; // TODO p.closed_at = 0; p.created_at = p.updated_at = time(NULL); - pit_table_insert(projects, (uchar *)&p); + pp = (PProject)pit_table_insert(projects, (uchar *)&p); + pit_table_mark(projects, pp->id); pit_db_save(); } } -static int show_project(unsigned long number) +static int show_project(ulong number) { - printf("showing project %lu\n", number); + PProject pp; + + pit_db_load(); + pp = (PProject)pit_table_find(projects, number); + if (pp) { + printf("%lu: [%s] %s\n", pp->id, pp->status, pp->name); + pit_table_mark(projects, pp->id); + pit_db_save(); + } else { + die("could not find the project"); + } return 1; } static int delete_project(unsigned long number) { + PProject pp; + printf("deleting project %lu\n", number); + pit_db_load(); + pp = (PProject)pit_table_delete(projects, number); + if (pp) { + pit_table_mark(projects, 0); + pit_db_save(); + } else { + die("could not delete the project"); + } return 1; } int pit_project(char *argv[]) { char **arg = &argv[1]; + unsigned long number; if (!*arg) { list_projects(); @@ -83,21 +106,25 @@ int pit_project(char *argv[]) } else { create_project(*arg, *(arg + 1)); } - } else if (!strcmp(*arg, "-d") || !strcmp(*arg, "-s")) { + } else if (!strcmp(*arg, "-d")) { if (!*++arg) { die("missing project number"); } else { - unsigned long number = atoi(*arg); + number = atoi(*arg); if (!number) { die("invalid project number"); } else { - if (!strcmp(*--arg, "-d")) { - delete_project(number); - } else { - show_project(number); - } + delete_project(number); } } + /* } else if (!strcmp(*arg, "-e")) { TODO: Edit */ + } else { + number = atoi(*arg); + if (!number) { + die("invalid project parameters"); + } else { + show_project(number); + } } return 1; diff --git a/src/table.c b/src/table.c index d47e190..e3f880a 100644 --- a/src/table.c +++ b/src/table.c @@ -4,7 +4,7 @@ #include #include "pit.h" -#define TABLE_INCREMENT 5 +#define TABLE_INCREMENT 10 /* ** Initialize the table by alloocating necessary memory chunks. */ @@ -17,6 +17,7 @@ PTable pit_table_initialize(ulong record_size, ulong flags) { pt->number_of_slots = TABLE_INCREMENT; pt->number_of_records = 0; pt->auto_increment = 0; + pt->current = 0; pt->slots = calloc(TABLE_INCREMENT, pt->record_size); pt->index = calloc(TABLE_INCREMENT, sizeof(uchar *)); @@ -104,8 +105,8 @@ uchar *pit_table_find(PTable pt, ulong id) { } /* -** Delete a record by its ID. Return the address of next record or NULL -** if deleted last record. +** Delete a record by its ID. Return the address of deleted record or NULL +** if the record was not found. */ uchar *pit_table_delete(PTable pt, ulong id) { // TODO: retrn NULL (or raise?) if table doesn't have id. @@ -138,11 +139,7 @@ uchar *pit_table_delete(PTable pt, ulong id) { pt->number_of_records--; } - if (pr && pt->number_of_records > 0) { - return pr; - } else { - return NULL; - } + return pr; } /* @@ -184,6 +181,20 @@ uchar *pit_table_insert(PTable pt, uchar *record) { return *pi; } +/* +** Find current record. +*/ +uchar *pit_table_current(PTable pt) { + return pit_table_find(pt, pt->current); +} + +/* +** Set current record as indicated by the id, then find and return it. +*/ +uchar *pit_table_mark(PTable pt, ulong id) { + return pit_table_find(pt, pt->current = id); +} + /* ** Release pt->slots and pt->index memory chunks, then free the table itself. */ @@ -209,9 +220,9 @@ int pit_table_save(FILE *file, PTable pt) { register int written = 0; /* ** Save table header data: flags, record_size, number_of_slots, - ** number_of_records, and auto_increment. + ** number_of_records, and auto_increment, current. */ - written += fwrite(pt, sizeof(ulong), 5, file); + written += fwrite(pt, sizeof(ulong), 6, file); /* ** Save the records. Note that we save the actual (not allocated) data. */ @@ -233,9 +244,9 @@ PTable pit_table_load(FILE *file) { /* ** First read the header. */ - read += fread(pt, sizeof(ulong), 5, file); + read += fread(pt, sizeof(ulong), 6, file); /* - ** Now allocate slots and index based n original number of slots. + ** Now allocate slots and index based on the original number of slots. */ /*** printf("Allocating %lu slots\n", pt->number_of_slots); ***/ pt->slots = pr = calloc(pt->number_of_slots, pt->record_size); @@ -244,9 +255,9 @@ PTable pit_table_load(FILE *file) { ** Now read the records into the slots and rebuild the index. */ read += fread(pt->slots, pt->record_size, pt->number_of_records, file); - for(i = 0; i < pt->number_of_records; i++, pi++) { + for(i = 1; i <= pt->number_of_slots; i++, pi++) { // TODO: if table doesn't have id || has id && id matches... - if ((ulong)*pr == i + 1) { + if ((ulong)*pr == i) { *pi = pr; pr += pt->record_size; } @@ -254,7 +265,6 @@ PTable pit_table_load(FILE *file) { return pt; } - /* #define TEST */ #if defined(TEST) @@ -268,7 +278,7 @@ typedef struct { void dump(Record *prec) { if (prec) { - printf("(%08lX) id: %08lu, value: %lu, created_at: %lu, updated_at: %lu)\n", + printf("(%08lX) id: %08lu, value: %lu, created_at: %lu, updated_at: %lu\n", (ulong)prec, prec->id, prec->value, prec->created_at, prec->updated_at); } else { printf("(NULL)\n"); @@ -293,7 +303,7 @@ int main() { PTable pt; Record rec, *prec; - ulong i, total = 30; + ulong i, total = 3; pt = pit_table_initialize(sizeof(Record), TABLE_HAS_ID | TABLE_HAS_TIMESTAMPS); for(i = 0; i < total; i++) { @@ -305,10 +315,17 @@ int main() { prec = (Record *)pit_table_insert(pt, (uchar *)&rec); dump(prec); } - for (i = 20; i < total; i++) { - printf("Deleting %lu\n", i + 1); - prec = (Record *)pit_table_delete(pt, i + 1); - } + prec = (Record *)pit_table_find(pt, total - 1); + pit_table_mark(pt, prec->id); + printf("current: %lu\n", pt->current); + + // for (i = 20; i < total; i++) { + // printf("Deleting %lu\n", i + 1); + // prec = (Record *)pit_table_delete(pt, i + 1); + // } + printf("Deleting %lu\n", 1L); + prec = (Record *)pit_table_delete(pt, 1); + printf("current: %lu\n", pt->current); dump_all(pt); FILE *file = fopen("/tmp/.pit", "w"); @@ -318,6 +335,7 @@ int main() { file = fopen("/tmp/.pit", "r"); pt = pit_table_load(file); dump_all(pt); + printf("current: %lu\n", pt->current); fclose(file); pit_table_free(pt); diff --git a/src/table.c.out b/src/table.c.out new file mode 100755 index 0000000000000000000000000000000000000000..b174e0d414bbfc8b133f50ce8923d3cc434b41db GIT binary patch literal 14272 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 K