From 290486d3e7322648d30704a8722eaf0308f982c4 Mon Sep 17 00:00:00 2001 From: Mike Dvorkin Date: Fri, 9 Jul 2010 21:49:30 -0700 Subject: [PATCH] Implemented table_delete() --- src/table.c | 61 +++++++++++++++++++++++++++++++++++++++++------- src/table.c.out | Bin 13816 -> 0 bytes 2 files changed, 53 insertions(+), 8 deletions(-) delete mode 100755 src/table.c.out diff --git a/src/table.c b/src/table.c index 6f96f0a..ecc9ea4 100755 --- a/src/table.c +++ b/src/table.c @@ -108,13 +108,50 @@ PTable table_extend(PTable pt) { } /* -** Find record by id and return its address. +** Find a record by id and return its address. */ uchar *table_find(PTable pt, ulong id) { - if (pt->number_of_records == 0 || id < 0 || id > pt->auto_increment) { + if (pt->number_of_records == 0 || id <= 0 || id > pt->auto_increment) { return NULL; } else { - return *(pt->index + id); + return *(pt->index + id - 1); + } +} + +/* +** Delete a record y its id and return the address of next record. +*/ +uchar *table_delete(PTable pt, ulong id) { + register uchar *pr = (uchar *)table_find(pt, id); + + if (pr) { + register ulong i; + register uchar **pi; + /* + ** Overwrite current record by shifting over remaining records. + */ + memmove(pr, pr + pt->record_size, (pt->number_of_records - id) * pt->record_size); + /* + ** Set the slot occupied by the last record to zero. + */ + memset(table_last_record(pt), 0, pt->record_size); + /* + ** Set current record pointer to NULL, then update the rest of the index to point + ** to the shifted records. + */ + pi = pt->index + id - 1; + *pi++ = NULL; + + printf("shift: %lu/%lu\n", id, pt->auto_increment); + for (i = id; i < pt->auto_increment; i++) { + printf("Shift: %08lX - %08lX\n", (ulong)*pi, (ulong)(*pi - pt->record_size)); + *pi++ -= pt->record_size; + } + pt->number_of_records--; + + return pr; + } else { + return NULL; } } @@ -185,10 +222,10 @@ int main() { } Record; Record rec, *prec; - int i; + ulong i, total = 4; pt = table_initialize(sizeof(Record), TABLE_HAS_ID | TABLE_HAS_TIMESTAMPS); - for(i = 0; i <= 100; i++) { + for(i = 0; i < total; i++) { rec.id = 0; rec.id2 = 42; rec.created_at = rec.updated_at = (time_t)0; @@ -200,11 +237,19 @@ int main() { (ulong)prec->created_at, (ulong)prec->updated_at); } + prec = (Record *)table_delete(pt, 1); + prec = (Record *)table_delete(pt, 2); + printf("DEL/id: %08lX, id2: %lu, created_at: %lu, updated_at: %lu)\n", + prec->id, prec->id2, prec->created_at, prec->updated_at); - for(i = 100; i >= 0; i--) { + for(i = total; i > 0; i--) { prec = (Record *)table_find(pt, i); - printf("id: %08lX, id2: %lu, created_at: %lu, updated_at: %lu)\n", - prec->id, prec->id2, prec->created_at, prec->updated_at); + if (prec) { + printf("id: %08lX, id2: %lu, created_at: %lu, updated_at: %lu)\n", + prec->id, prec->id2, prec->created_at, prec->updated_at); + } else { + printf("%lu not found\n", i); + } } table_free(pt); diff --git a/src/table.c.out b/src/table.c.out deleted file mode 100755 index 90995a95e183f93a75891b31a7e300a74bb32035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13816 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 HC}aNyJ`L}?