コード例 #1
0
ファイル: index.c プロジェクト: klihub/murphy
mdb_row_t *mdb_index_get_row(mdb_table_t *tbl, int idxlen, void *idxval)
{
    mdb_index_t *ix;

    MDB_CHECKARG(tbl && idxlen >= 0 && idxval, NULL);

    ix = &tbl->index;

    return mdb_hash_get_data(ix->hash, idxlen, idxval);
}
コード例 #2
0
ファイル: mqi.c プロジェクト: 01org/murphy
mqi_handle_t mqi_get_table_handle(char *table_name)
{
    void *data;

    MDB_CHECKARG(table_name, MQI_HANDLE_INVALID);
    MDB_PREREQUISITE(dbs && ndb > 0, MQI_HANDLE_INVALID);

    data = mdb_hash_get_data(table_name_hash, 0,table_name);

    if (data != NULL)
        return data - NULL;
    else
        return MQI_HANDLE_INVALID;
}
コード例 #3
0
ファイル: index.c プロジェクト: klihub/murphy
int mdb_index_create(mdb_table_t *tbl, char **index_columns)
{
    mdb_index_t     *ix;
    mdb_column_t    *col;
    mqi_data_type_t  type;
    int              beg, end;
    int             *idxcols;
    int              i,j, idx;

    MDB_CHECKARG(tbl && index_columns && index_columns[0], -1);

    ix = &tbl->index;

    beg = end = 0;
    type = mqi_unknown;
    idxcols = NULL;

    for (i = 0;    index_columns[i];    i++) {
        if (!(idx = mdb_hash_get_data(tbl->chash,0,index_columns[i]) - NULL)) {
            errno = ENOENT;
            return -1;
        }

        col = tbl->columns + --idx;
        col->flags |= MQI_COLUMN_KEY;

        if (i == 0) {
            type = col->type;
            beg  = col->offset;
            end  = beg + col->length;
        }
        else {
            type = mqi_blob;

            if (col->offset == end)
                end += col->length;
            else if (col->offset == beg - col->length)
                beg = col->offset;
            else {
                type = mqi_unknown;
                break; /* not an adjacent column */
            }
        }

        if (!(idxcols = realloc(idxcols, sizeof(int) * (i+1)))) {
            errno = ENOMEM;
            return -1;
        }

        for (j = 0;  j < i;  j++) {
            if (idx == idxcols[j])
                break;

            if (idx < idxcols[j]) {
                memmove(idxcols + j+1, idxcols + j, sizeof(*idxcols) * (i-j));
                break;
            }
        }

        idxcols[j] = idx;
    }

    if (type == mqi_unknown || beg < 0 || end <= beg ||
        end - beg > MDB_INDEX_LENGTH_MAX)
    {
        free(idxcols);
        errno = EIO;
        return -1;
    }

    ix->type    = type;
    ix->length  = end - beg;
    ix->offset  = beg;
    ix->ncolumn = i;
    ix->columns = idxcols;

    switch (type) {
    case mqi_varchar:
        ix->hash = INDEX_HASH_CREATE(varchar);
        ix->sequence = INDEX_SEQUENCE_CREATE(varchar);
        break;
    case mqi_integer:
        ix->hash = INDEX_HASH_CREATE(integer);
        ix->sequence = INDEX_SEQUENCE_CREATE(integer);
        break;
    case mqi_unsignd:
        ix->hash = INDEX_HASH_CREATE(unsignd);
        ix->sequence = INDEX_SEQUENCE_CREATE(unsignd);
        break;
    case mqi_blob:
        ix->hash = INDEX_HASH_CREATE(blob);
        ix->sequence = INDEX_SEQUENCE_CREATE(blob);
        break;
    default:
        free(idxcols);
        memset(ix, 0, sizeof(*ix));
        break;
    }

    return 0;
}