# HG changeset patch # User Tero Marttila # Date 1227915043 -7200 # Node ID bb2ff0d2d343edad0ba5ce2882d532b5a0a67c70 # Parent 8b019d19135329a8e35c3f215bd0781a4102937e modify stat-returning dbfs result functions to use new evsql diff -r 8b019d191353 -r bb2ff0d2d343 src/dbfs/attr.c --- a/src/dbfs/attr.c Sat Nov 29 01:12:00 2008 +0200 +++ b/src/dbfs/attr.c Sat Nov 29 01:30:43 2008 +0200 @@ -15,27 +15,34 @@ int err = 0; uint32_t ino; + struct dbfs_stat_values stat_values; - // check the results - if ((err = _dbfs_check_res(res, 1, 5))) - SERROR(err = (err == 1 ? ENOENT : EIO)); - - // get our data - if (0 - || evsql_result_uint32(res, 0, 0, &ino, 0 ) // inodes.ino - ) - EERROR(err = EIO, "invalid db data"); - - + // result info + static struct evsql_result_info result_info = { + 0, { + { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT32 }, // inodes.ino + DBFS_STAT_RESULT_INFO, + { 0, 0 } + } + }; + + // begin + if ((err = evsql_result_begin(&result_info, res))) + EERROR(err, "query failed"); + + // get the one row of data + if ((err = evsql_result_next(res, &ino, DBFS_STAT_RESULT_VALUES(&stat_values))) <= 0) + EERROR(err = (err ? err : ENOENT), "evsql_result_next"); + INFO("\t[dbfs.getattr %p] -> ino=%lu, stat follows", req, (unsigned long int) ino); - + // inode st.st_ino = ino; // stat attrs - if ((err = _dbfs_stat_info(&st, res, 0, 1))) + if ((err = _dbfs_stat_info(&st, &stat_values))) goto error; - + // reply if ((err = fuse_reply_attr(req, &st, st.st_nlink ? CACHE_TIMEOUT : 0))) EERROR(err, "fuse_reply_entry"); diff -r 8b019d191353 -r bb2ff0d2d343 src/dbfs/common.c --- a/src/dbfs/common.c Sat Nov 29 01:12:00 2008 +0200 +++ b/src/dbfs/common.c Sat Nov 29 01:30:43 2008 +0200 @@ -79,29 +79,15 @@ return err; } -int _dbfs_stat_info (struct stat *st, struct evsql_result *res, size_t row, size_t col_offset) { +int _dbfs_stat_info (struct stat *st, struct dbfs_stat_values *values) { int err = 0; - uint16_t mode; - uint32_t size = 0; // NULL for non-REG inodes - uint64_t nlink = 0; // will be NULL for non-GROUP BY queries - const char *type; - - // extract the data - if ((0 - || evsql_result_string(res, row, col_offset + 0, &type, 0 ) // inodes.type - || evsql_result_uint16(res, row, col_offset + 1, &mode, 0 ) // inodes.mode - || evsql_result_uint32(res, row, col_offset + 2, &size, 1 ) // size - || evsql_result_uint64(res, row, col_offset + 3, &nlink, 1 ) // count(*) - ) && (err = EIO)) - ERROR("invalid db data"); - - 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); + 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(type) | mode; - st->st_nlink = nlink; - st->st_size = size; + st->st_mode = _dbfs_mode(values->type) | values->mode; + st->st_nlink = values->nlink; + st->st_size = values->size; // good return 0; diff -r 8b019d191353 -r bb2ff0d2d343 src/dbfs/dbfs.h --- a/src/dbfs/dbfs.h Sat Nov 29 01:12:00 2008 +0200 +++ b/src/dbfs/dbfs.h Sat Nov 29 01:30:43 2008 +0200 @@ -27,9 +27,6 @@ // XXX: not sure how this should work #define CACHE_TIMEOUT 1.0 -// columns used for stat_info -#define DBFS_STAT_COLS " inodes.type, inodes.mode, dbfs_size(inodes.type, inodes.data, inodes.link_path), (SELECT COUNT(*) FROM inodes i LEFT JOIN file_tree ft ON (i.ino = ft.ino) WHERE i.ino = inodes.ino) AS nlink" - /* * Convert the CHAR(4) inodes.type from SQL into a mode_t. * @@ -56,6 +53,30 @@ err_t dbfs_check_result (struct evsql_result *res, size_t rows, size_t cols); /* + * Stat fields + */ + +// columns used for stat_info +#define DBFS_STAT_COLS " inodes.type, inodes.mode, dbfs_size(inodes.type, inodes.data, inodes.link_path), (SELECT COUNT(*) FROM inodes i LEFT JOIN file_tree ft ON (i.ino = ft.ino) WHERE i.ino = inodes.ino) AS nlink" + + +#define DBFS_STAT_RESULT_INFO \ + { EVSQL_FMT_BINARY, EVSQL_TYPE_STRING }, \ + { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT16 }, \ + { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT32 }, \ + { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT64 } + +struct dbfs_stat_values { + const char *type; + uint16_t mode; + uint32_t size; + uint64_t nlink; +}; + +#define DBFS_STAT_RESULT_VALUES(ptr) \ + &(ptr)->type, &(ptr)->mode, &(ptr)->size, &(ptr)->nlink + +/* * Fill a `struct state` with info retrieved from a SQL query. * * The result must contain four columns, starting at the given offset: @@ -63,7 +84,7 @@ * * Note that this does not fill the st_ino field */ -int _dbfs_stat_info (struct stat *st, struct evsql_result *res, size_t row, size_t col_offset); +int _dbfs_stat_info (struct stat *st, struct dbfs_stat_values *values); /** interrupt.c * diff -r 8b019d191353 -r bb2ff0d2d343 src/dbfs/link.c --- a/src/dbfs/link.c Sat Nov 29 01:12:00 2008 +0200 +++ b/src/dbfs/link.c Sat Nov 29 01:30:43 2008 +0200 @@ -13,26 +13,34 @@ void dbfs_entry_res (struct evsql_result *res, void *arg) { struct fuse_req *req = arg; struct fuse_entry_param e; ZINIT(e); - int err = 0; + err_t err = 0; uint32_t ino; - - // check the results - if ((err = _dbfs_check_res(res, 1, 5))) - SERROR(err = (err == 1 ? ENOENT : EIO)); - - // get the data - if (0 - || evsql_result_uint32(res, 0, 0, &ino, 0 ) // inodes.ino - ) - EERROR(err = EIO, "invalid db data"); - + struct dbfs_stat_values stat_values; + + // result info + static struct evsql_result_info result_info = { + 0, { + { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT32 }, // inodes.ino + DBFS_STAT_RESULT_INFO, + { 0, 0 } + } + }; + + // begin + if ((err = evsql_result_begin(&result_info, res))) + EERROR(err, "query failed"); + + // get the one row of data + if ((err = evsql_result_next(res, &ino, DBFS_STAT_RESULT_VALUES(&stat_values))) <= 0) + EERROR(err = (err ? err : ENOENT), "evsql_result_next"); + INFO("\t[dbfs.lookup] -> ino=%u", ino); // stat attrs - if ((err = _dbfs_stat_info(&e.attr, res, 0, 1))) + if ((err = _dbfs_stat_info(&e.attr, &stat_values))) goto error; - + // other attrs e.ino = e.attr.st_ino = ino; e.attr_timeout = CACHE_TIMEOUT; @@ -46,8 +54,8 @@ if (err && (err = -fuse_reply_err(req, err))) EWARNING(err, "fuse_reply_err"); - // free - evsql_result_free(res); + // done + evsql_result_end(res); } void dbfs_lookup (struct fuse_req *req, fuse_ino_t parent, const char *name) {