src/dbfs/common.c
author Tero Marttila <terom@fixme.fi>
Sat, 29 Nov 2008 01:30:43 +0200
branchnew-evsql
changeset 49 bb2ff0d2d343
parent 48 8b019d191353
child 50 881de320e483
permissions -rw-r--r--
modify stat-returning dbfs result functions to use new evsql

#include <string.h>

#include "dbfs.h"
#include "../lib/log.h"

mode_t _dbfs_mode (const char *type) {
    if (!strcmp(type, "DIR"))
        return S_IFDIR;

    if (!strcmp(type, "REG"))
        return S_IFREG;
    
    if (!strcmp(type, "LNK"))
        return S_IFLNK;

    else {
        WARNING("[dbfs] weird mode-type: %s", type);
        return 0;
    }
}

int _dbfs_check_res (struct evsql_result *res, size_t rows, size_t cols) {
    int err = 0;

    // check if it failed
    if (evsql_result_check(res))
        NERROR(evsql_result_error(res));
        
    // not found?
    if (evsql_result_rows(res) == 0 && evsql_result_affected(res) == 0)
        SERROR(err = 1);

    // duplicate rows?
    if (rows && evsql_result_rows(res) != rows)
        ERROR("wrong number of rows returned");
    
    // correct number of columns
    if (evsql_result_cols(res) != cols)
        ERROR("wrong number of columns: %zu", evsql_result_cols(res));

    // good
    return 0;

error:
    if (!err)
        err = -1;

    return err;
}

err_t dbfs_check_result (struct evsql_result *res, size_t rows, size_t cols) {
    err_t err;

    // number of rows returned/affected
    size_t nrows = evsql_result_rows(res) ? : evsql_result_affected(res);

    // did the query fail outright?
    if (evsql_result_check(res))
        // dump error message
        NXERROR(err = EIO, evsql_result_error(res));
    
    // SELECT/DELETE/UPDATE WHERE didn't match any rows -> ENOENT
    if (nrows == 0)
        XERROR(err = ENOENT, "no rows returned/affected");
    
    // duplicate rows where one expected?
    if (rows && nrows != rows)
        XERROR(err = EIO, "wrong number of rows: %zu -> %zu", rows, nrows);
    
    // correct number of columns
    if (evsql_result_cols(res) != cols)
        XERROR(err = EIO, "wrong number of columns: %zu -> %zu", cols, evsql_result_cols(res));

    // good
    return 0;

error:
    return err;
}

int _dbfs_stat_info (struct stat *st, struct dbfs_stat_values *values) {
    int err = 0;
    
    INFO("\tst_mode=S_IF%s | %ho, st_nlink=%llu, st_size=%llu", values->type, values->mode, (long long unsigned int) values->nlink, (long long unsigned int) values->size);

    // convert and store
    st->st_mode = _dbfs_mode(values->type) | values->mode;
    st->st_nlink = values->nlink;
    st->st_size = values->size;
    
    // good
    return 0;

error:
    return err;
}