Exemple #1
0
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;
}
Exemple #2
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;
}