terom@34: terom@34: #include "../lib/log.h" terom@34: terom@34: #include "dbfs.h" terom@34: terom@34: void dbfs_rename_res (const struct evsql_result_info *res, void *arg) { terom@34: struct fuse_req *req = arg; terom@34: int err; terom@34: terom@34: // check the results terom@34: if ((err = _dbfs_check_res(res, 0, 0))) terom@34: SERROR(err = (err == 1 ? ENOENT : EIO)); terom@34: terom@34: // just reply terom@34: if ((err = -fuse_reply_err(req, 0))) terom@34: EERROR(err, "fuse_reply_err"); terom@34: terom@34: // log terom@34: INFO("[dbfs.rename %p] -> OK", req); terom@34: terom@34: // fallthrough for result_free terom@34: err = 0; terom@34: terom@34: error: terom@34: if (err && (err = -fuse_reply_err(req, err))) terom@34: EWARNING(err, "fuse_reply_err"); terom@34: terom@34: evsql_result_free(res); terom@34: } terom@34: terom@34: void dbfs_rename (struct fuse_req *req, fuse_ino_t parent, const char *name, fuse_ino_t newparent, const char *newname) { terom@34: struct dbfs *dbfs_ctx = fuse_req_userdata(req); terom@34: int err; terom@34: terom@34: INFO("[dbfs.rename %p] parent=%lu, name=%s, newparent=%lu, newname=%s", req, parent, name, newparent, newname); terom@34: terom@34: // just one UPDATE terom@34: const char *sql = terom@34: "UPDATE" terom@34: " file_tree" terom@34: " SET parent = $1::int4, name = $2::varchar" terom@34: " WHERE parent = $3::int4 AND name = $4::varchar"; terom@34: terom@34: static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) { terom@34: EVSQL_PARAM ( UINT32 ), terom@34: EVSQL_PARAM ( STRING ), terom@34: EVSQL_PARAM ( UINT32 ), terom@34: EVSQL_PARAM ( STRING ), terom@34: terom@34: EVSQL_PARAMS_END terom@34: }; terom@34: terom@34: if (0 terom@34: || evsql_param_uint32(¶ms, 0, newparent) terom@34: || evsql_param_string(¶ms, 1, newname) terom@34: || evsql_param_uint32(¶ms, 2, parent) terom@34: || evsql_param_string(¶ms, 3, name) terom@34: ) terom@34: SERROR(err = EIO); terom@34: terom@34: // query terom@34: if (evsql_query_params(dbfs_ctx->db, NULL, sql, ¶ms, dbfs_rename_res, req) == NULL) terom@34: SERROR(err = EIO); terom@34: terom@34: // good, wait terom@34: return; terom@34: terom@34: error: terom@34: if ((err = fuse_reply_err(req, err))) terom@34: EWARNING(err, "fuse_reply_err"); terom@34: }