--- /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;
+}
+
+
+