int table_put(Table* table, const char* key, void* value) { if (table->count == table->size) { int error = table_extend(table); if (error != 0) { return error; } } // search for the free slot int id; char** keys = table->keys; for (id = 0; keys[id] != NULL; id++) ; //copy key keys[id] = (char*) malloc(strlen(key) + 1); if (keys[id] == NULL) { return -1; } strcpy(keys[id], key); // copy value table->values[id] = value; table->count++; return 0; }
/* ** Insert a record and return its address. The table gets extended ** as necessary. */ char *pit_table_insert(PTable pt, char *record) { register char *pr; register time_t now = time(NULL); if (pt->number_of_records >= pt->number_of_slots) { pt = table_extend(pt); } else { if (HAS_ID(pt) && pt->auto_increment >= pt->index_size) { table_extend_index(pt); } } pr = table_available_slot(pt); memmove(pr, record, pt->record_size); pt->number_of_records++; if (HAS_ID(pt)) { /* ** Save current slot address in the index. */ register char **pi = table_available_index(pt); *pi = pr; /* ** Update record id if the table has primary key. The id must ** be the first record field of type "unsigned long". */ pt->auto_increment++; *(int *)*pi = pt->auto_increment; } /* ** Update created_at and/or updated_at which must be last one or ** two record fields of type "time_t". */ if (HAS_CREATED_AT(pt) || HAS_UPDATED_AT(pt)) { *(time_t *)(pr + pt->record_size - sizeof(time_t)) = now; } if (HAS_CREATED_AT(pt) && HAS_UPDATED_AT(pt)) { *(time_t *)(pr + pt->record_size - sizeof(time_t) * 2) = now; } return pr; }