modify stat-returning dbfs result functions to use new evsql new-evsql
authorTero Marttila <terom@fixme.fi>
Sat, 29 Nov 2008 01:30:43 +0200
branchnew-evsql
changeset 49 bb2ff0d2d343
parent 48 8b019d191353
child 50 881de320e483
modify stat-returning dbfs result functions to use new evsql
src/dbfs/attr.c
src/dbfs/common.c
src/dbfs/dbfs.h
src/dbfs/link.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");
--- 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;
--- 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 
  *  
--- 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) {