src/dbfs/attr.c
author Tero Marttila <terom@fixme.fi>
Sat, 29 Nov 2008 01:30:43 +0200
branchnew-evsql
changeset 49 bb2ff0d2d343
parent 48 8b019d191353
permissions -rw-r--r--
modify stat-returning dbfs result functions to use new evsql
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "dbfs.h"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include "../lib/log.h"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include "../lib/misc.h"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
// max. size for a setattr UPDATE query
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#define DBFS_SETATTR_SQL_MAX 512
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
// for building the setattr UPDATE
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#define FIELD(to_set, flag, field, value) ((to_set) & (flag)) ? (field " = " value ", ") : ""
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    12
void _dbfs_attr_res (struct evsql_result *res, void *arg) {
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    struct fuse_req *req = arg;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    struct stat st; ZINIT(st);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    int err = 0;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    uint32_t ino;
49
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    18
    struct dbfs_stat_values stat_values;
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
49
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    20
    // result info
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    21
    static struct evsql_result_info result_info = {
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    22
        0, {
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    23
            {   EVSQL_FMT_BINARY,   EVSQL_TYPE_UINT32   },  // inodes.ino
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    24
            DBFS_STAT_RESULT_INFO,
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    25
            {   0,                  0                   }
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    26
        }
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    27
    };
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    28
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    29
    // begin
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    30
    if ((err = evsql_result_begin(&result_info, res)))
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    31
        EERROR(err, "query failed");
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    32
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    33
    // get the one row of data
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    34
    if ((err = evsql_result_next(res, &ino, DBFS_STAT_RESULT_VALUES(&stat_values))) <= 0)
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    35
        EERROR(err = (err ? err : ENOENT), "evsql_result_next");
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    36
36
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    37
    INFO("\t[dbfs.getattr %p] -> ino=%lu, stat follows", req, (unsigned long int) ino);
49
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    38
32
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    39
    // inode
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    40
    st.st_ino = ino;
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    41
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    // stat attrs
49
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    43
    if ((err = _dbfs_stat_info(&st, &stat_values)))
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        goto error;
49
bb2ff0d2d343 modify stat-returning dbfs result functions to use new evsql
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    45
    
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    // reply
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    if ((err = fuse_reply_attr(req, &st, st.st_nlink ? CACHE_TIMEOUT : 0)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        EERROR(err, "fuse_reply_entry");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
error:
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    if (err && (err = fuse_reply_err(req, err)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        EWARNING(err, "fuse_reply_err");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    // free
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    evsql_result_free(res);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
}
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
void dbfs_getattr (struct fuse_req *req, fuse_ino_t ino, struct fuse_file_info *fi) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    struct dbfs *ctx = fuse_req_userdata(req);
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
    60
    struct evsql_query *query;
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    int err;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    (void) fi;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    INFO("[dbfs.getattr %p] ino=%lu", req, ino);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    const char *sql =
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        "SELECT"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        " inodes.ino, " DBFS_STAT_COLS
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        " FROM inodes"
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    71
        " WHERE inodes.ino = $1::int4";
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        EVSQL_PARAM ( UINT32 ),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        EVSQL_PARAMS_END
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    };
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    // build params
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    if (0
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        ||  evsql_param_uint32(&params, 0, ino)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    // query
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
    86
    if ((query = evsql_query_params(ctx->db, NULL, sql, &params, _dbfs_attr_res, req)) == NULL)
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
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
    89
    // handle interrupts
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
    90
    fuse_req_interrupt_func(req, dbfs_interrupt_query, query);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    // wait
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    return;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
error:
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    if ((err = fuse_reply_err(req, err)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        EWARNING(err, "fuse_reply_err");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
}
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
void dbfs_setattr (struct fuse_req *req, fuse_ino_t ino, struct stat *attr, int to_set, struct fuse_file_info *fi) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    struct dbfs *ctx = fuse_req_userdata(req);
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
   103
    struct evsql_query *query;
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    int err;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    int ret;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    char sql_buf[DBFS_SETATTR_SQL_MAX];
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        EVSQL_PARAM ( UINT16 ), // inodes.mode
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        EVSQL_PARAM ( UINT32 ), // inodes.uid
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        EVSQL_PARAM ( UINT32 ), // inodes.gid
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
        EVSQL_PARAM ( UINT32 ), // data size
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        EVSQL_PARAM ( UINT32 ), // ino
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        EVSQL_PARAMS_END
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    };
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    // log
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    INFO("[dbfs.setattr %p] ino=%lu, fileop=%p: ", req, ino, fi && fi->fh ? (void*) fi->fh : NULL);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    if (to_set & FUSE_SET_ATTR_MODE) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        // ignore the S_IFMT
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        attr->st_mode &= 07777;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        INFO("\tmode    = %08o", attr->st_mode);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    }
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    if (to_set & FUSE_SET_ATTR_UID)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        INFO("\tuid     = %u", attr->st_uid);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    if (to_set & FUSE_SET_ATTR_GID)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        INFO("\tgid     = %u", attr->st_gid);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    if (to_set & FUSE_SET_ATTR_SIZE)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        INFO("\tsize    = %lu", attr->st_size);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    if (to_set & FUSE_SET_ATTR_ATIME)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
        INFO("\tatime   = %lu", attr->st_atime);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    if (to_set & FUSE_SET_ATTR_MTIME)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        INFO("\tmtime   = %lu", attr->st_mtime);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    // the SQL
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    if ((ret = snprintf(sql_buf, DBFS_SETATTR_SQL_MAX,
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        "UPDATE inodes SET"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        " %s%s%s%s ino = ino"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        " WHERE inodes.ino = $5::int4"
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
   149
        " RETURNING inodes.ino, " DBFS_STAT_COLS,
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        FIELD(to_set, FUSE_SET_ATTR_MODE,   "mode", "$1::int2"),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        FIELD(to_set, FUSE_SET_ATTR_UID,    "uid",  "$2::int4"),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        FIELD(to_set, FUSE_SET_ATTR_GID,    "gid",  "$3::int4"),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        FIELD(to_set, FUSE_SET_ATTR_SIZE,   "data", "lo_otruncate(data, $4::int4)")
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    )) >= DBFS_SETATTR_SQL_MAX && (err = EIO))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        ERROR("sql_buf is too small: %i", ret);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    // the params...
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    if (0
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        || (                                  evsql_params_clear(&params)                    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        || ((to_set & FUSE_SET_ATTR_MODE ) && evsql_param_uint16(&params, 0, attr->st_mode)  )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
        || ((to_set & FUSE_SET_ATTR_UID  ) && evsql_param_uint32(&params, 1, attr->st_uid)   )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        || ((to_set & FUSE_SET_ATTR_GID  ) && evsql_param_uint32(&params, 2, attr->st_gid)   )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        || ((to_set & FUSE_SET_ATTR_SIZE ) && evsql_param_uint32(&params, 3, attr->st_size)  )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        || (                                  evsql_param_uint32(&params, 4, ino)            )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
    // trace the query
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
    evsql_query_debug(sql_buf, &params);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    // query... we can pretend it's a getattr :)
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
   173
    if ((query = evsql_query_params(ctx->db, NULL, sql_buf, &params, _dbfs_attr_res, req)) == NULL)
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
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
   176
    // handle interrupts
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
   177
    fuse_req_interrupt_func(req, dbfs_interrupt_query, query);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    // wait
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    return;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
error:
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    if ((err = fuse_reply_err(req, err)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        EWARNING(err, "fuse_reply_err");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
}