src/dbfs/common.c
changeset 28 e944453ca924
child 29 5de62ca9a5aa
equal deleted inserted replaced
27:461be4cd34a3 28:e944453ca924
       
     1 
       
     2 #include <string.h>
       
     3 
       
     4 #include "common.h"
       
     5 
       
     6 mode_t _dbfs_mode (const char *type) {
       
     7     if (!strcmp(type, "DIR"))
       
     8         return S_IFDIR;
       
     9 
       
    10     if (!strcmp(type, "REG"))
       
    11         return S_IFREG;
       
    12 
       
    13     else {
       
    14         WARNING("[dbfs] weird mode-type: %s", type);
       
    15         return 0;
       
    16     }
       
    17 }
       
    18 
       
    19 int _dbfs_check_res (const struct evsql_result_info *res, size_t rows, size_t cols) {
       
    20     int err = 0;
       
    21 
       
    22     // check if it failed
       
    23     if (res->error)
       
    24         NERROR(evsql_result_error(res));
       
    25         
       
    26     // not found?
       
    27     if (evsql_result_rows(res) == 0)
       
    28         SERROR(err = 1);
       
    29 
       
    30     // duplicate rows?
       
    31     if (rows && evsql_result_rows(res) != rows)
       
    32         ERROR("wrong number of rows returned");
       
    33     
       
    34     // correct number of columns
       
    35     if (evsql_result_cols(res) != cols)
       
    36         ERROR("wrong number of columns: %zu", evsql_result_cols(res));
       
    37 
       
    38     // good
       
    39     return 0;
       
    40 
       
    41 error:
       
    42     if (!err)
       
    43         err = -1;
       
    44 
       
    45     return err;
       
    46 }
       
    47 
       
    48 int _dbfs_stat_info (struct stat *st, const struct evsql_result_info *res, size_t row, size_t col_offset) {
       
    49     int err = 0;
       
    50     
       
    51     uint16_t mode;
       
    52     uint64_t size, nlink;
       
    53     const char *type;
       
    54     
       
    55     // extract the data
       
    56     if (0
       
    57         ||  evsql_result_string(res, row, col_offset + 0, &type,       0 ) // inodes.type
       
    58         ||  evsql_result_uint16(res, row, col_offset + 1, &mode,       0 ) // inodes.mode
       
    59         ||  evsql_result_uint64(res, row, col_offset + 2, &size,       0 ) // inodes.size
       
    60         ||  evsql_result_uint64(res, row, col_offset + 3, &nlink,      0 ) // count(*)
       
    61     )
       
    62         EERROR(err = EIO, "invalid db data");
       
    63 
       
    64     INFO("\tst_mode=S_IF%s | %ho, st_nlink=%llu, st_size=%llu", type, mode, (long long unsigned int) nlink, (long long unsigned int) size);
       
    65 
       
    66     // convert and store
       
    67     st->st_mode = _dbfs_mode(type) | mode;
       
    68     st->st_nlink = nlink;
       
    69     st->st_size = size;
       
    70     
       
    71     // good
       
    72     return 0;
       
    73 
       
    74 error:
       
    75     return -1;
       
    76 }
       
    77 
       
    78 
       
    79