src/dbfs/common.c
author Tero Marttila <terom@fixme.fi>
Sat, 29 Nov 2008 01:12:00 +0200
branchnew-evsql
changeset 48 8b019d191353
parent 41 6abda2fa4579
child 49 bb2ff0d2d343
permissions -rw-r--r--
update dbfs code to work with new evsql
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <string.h>
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
     4
#include "dbfs.h"
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
     5
#include "../lib/log.h"
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
mode_t _dbfs_mode (const char *type) {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    if (!strcmp(type, "DIR"))
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        return S_IFDIR;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    if (!strcmp(type, "REG"))
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        return S_IFREG;
32
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    13
    
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    14
    if (!strcmp(type, "LNK"))
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    15
        return S_IFLNK;
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    else {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        WARNING("[dbfs] weird mode-type: %s", type);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        return 0;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    }
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
}
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    23
int _dbfs_check_res (struct evsql_result *res, size_t rows, size_t cols) {
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    int err = 0;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    // check if it failed
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    27
    if (evsql_result_check(res))
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        NERROR(evsql_result_error(res));
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    // not found?
34
460f995d3769 fix readdir to use ORDER BY, rename
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    31
    if (evsql_result_rows(res) == 0 && evsql_result_affected(res) == 0)
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        SERROR(err = 1);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    // duplicate rows?
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    if (rows && evsql_result_rows(res) != rows)
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        ERROR("wrong number of rows returned");
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    // correct number of columns
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    if (evsql_result_cols(res) != cols)
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        ERROR("wrong number of columns: %zu", evsql_result_cols(res));
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    // good
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    return 0;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
error:
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    if (!err)
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        err = -1;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    return err;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
}
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    52
err_t dbfs_check_result (struct evsql_result *res, size_t rows, size_t cols) {
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    53
    err_t err;
34
460f995d3769 fix readdir to use ORDER BY, rename
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    54
36
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    55
    // number of rows returned/affected
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    56
    size_t nrows = evsql_result_rows(res) ? : evsql_result_affected(res);
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    57
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    58
    // did the query fail outright?
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    59
    if (evsql_result_check(res))
36
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    60
        // dump error message
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    61
        NXERROR(err = EIO, evsql_result_error(res));
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    62
    
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    63
    // SELECT/DELETE/UPDATE WHERE didn't match any rows -> ENOENT
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    64
    if (nrows == 0)
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    65
        XERROR(err = ENOENT, "no rows returned/affected");
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    66
    
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    67
    // duplicate rows where one expected?
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    68
    if (rows && nrows != rows)
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    69
        XERROR(err = EIO, "wrong number of rows: %zu -> %zu", rows, nrows);
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    70
    
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    71
    // correct number of columns
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    72
    if (evsql_result_cols(res) != cols)
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    73
        XERROR(err = EIO, "wrong number of columns: %zu -> %zu", cols, evsql_result_cols(res));
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    74
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    75
    // good
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    76
    return 0;
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    77
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    78
error:
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    79
    return err;
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    80
}
34
460f995d3769 fix readdir to use ORDER BY, rename
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    81
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    82
int _dbfs_stat_info (struct stat *st, struct evsql_result *res, size_t row, size_t col_offset) {
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    int err = 0;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    uint16_t mode;
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    86
    uint32_t size = 0;  // NULL for non-REG inodes
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    87
    uint64_t nlink = 0; // will be NULL for non-GROUP BY queries
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    const char *type;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    // extract the data
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    91
    if ((0
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        ||  evsql_result_string(res, row, col_offset + 0, &type,       0 ) // inodes.type
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        ||  evsql_result_uint16(res, row, col_offset + 1, &mode,       0 ) // inodes.mode
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    94
        ||  evsql_result_uint32(res, row, col_offset + 2, &size,       1 ) // size
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    95
        ||  evsql_result_uint64(res, row, col_offset + 3, &nlink,      1 ) // count(*)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    96
    ) && (err = EIO))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    97
        ERROR("invalid db data");
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    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);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    // convert and store
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    st->st_mode = _dbfs_mode(type) | mode;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    st->st_nlink = nlink;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    st->st_size = size;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    // good
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    return 0;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
error:
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   110
    return err;
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
}
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114