src/dbfs/common.c
changeset 28 e944453ca924
child 29 5de62ca9a5aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dbfs/common.c	Wed Oct 15 01:14:22 2008 +0300
@@ -0,0 +1,79 @@
+
+#include <string.h>
+
+#include "common.h"
+
+mode_t _dbfs_mode (const char *type) {
+    if (!strcmp(type, "DIR"))
+        return S_IFDIR;
+
+    if (!strcmp(type, "REG"))
+        return S_IFREG;
+
+    else {
+        WARNING("[dbfs] weird mode-type: %s", type);
+        return 0;
+    }
+}
+
+int _dbfs_check_res (const struct evsql_result_info *res, size_t rows, size_t cols) {
+    int err = 0;
+
+    // check if it failed
+    if (res->error)
+        NERROR(evsql_result_error(res));
+        
+    // not found?
+    if (evsql_result_rows(res) == 0)
+        SERROR(err = 1);
+
+    // duplicate rows?
+    if (rows && evsql_result_rows(res) != rows)
+        ERROR("wrong number of rows returned");
+    
+    // correct number of columns
+    if (evsql_result_cols(res) != cols)
+        ERROR("wrong number of columns: %zu", evsql_result_cols(res));
+
+    // good
+    return 0;
+
+error:
+    if (!err)
+        err = -1;
+
+    return err;
+}
+
+int _dbfs_stat_info (struct stat *st, const struct evsql_result_info *res, size_t row, size_t col_offset) {
+    int err = 0;
+    
+    uint16_t mode;
+    uint64_t size, nlink;
+    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_uint64(res, row, col_offset + 2, &size,       0 ) // inodes.size
+        ||  evsql_result_uint64(res, row, col_offset + 3, &nlink,      0 ) // count(*)
+    )
+        EERROR(err = EIO, "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);
+
+    // convert and store
+    st->st_mode = _dbfs_mode(type) | mode;
+    st->st_nlink = nlink;
+    st->st_size = size;
+    
+    // good
+    return 0;
+
+error:
+    return -1;
+}
+
+
+