From 9bca61313ee79c05f82eea7df528aa1b34f8110a Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 1 Apr 2020 12:17:26 -0700 Subject: [PATCH] ircd::m::device: Add unconditional direct putter; setter to check for duplicate value. --- include/ircd/m/device.h | 1 + matrix/device.cc | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/include/ircd/m/device.h b/include/ircd/m/device.h index 94ec35f81..1e41ca4c9 100644 --- a/include/ircd/m/device.h +++ b/include/ircd/m/device.h @@ -132,6 +132,7 @@ struct ircd::m::device static bool has(const user &, const string_view &id, const string_view &prop); static bool has(const user &, const string_view &id); static bool del(const user &, const string_view &id); + static bool put(const user &, const string_view &id, const string_view &prop, const string_view &val); static bool set(const user &, const string_view &id, const string_view &prop, const string_view &val); static bool set(const user &, const device &); diff --git a/matrix/device.cc b/matrix/device.cc index 163d9fc92..b9c28a235 100644 --- a/matrix/device.cc +++ b/matrix/device.cc @@ -55,16 +55,18 @@ ircd::m::device::set(const m::user &user, json::at<"device_id"_>(device) }; - json::for_each(device, [&user, &device_id] + bool ret {false}; + json::for_each(device, [&user, &device_id, &ret] (const auto &prop, auto &&val) { - if(!json::defined(json::value(val))) - return; - - set(user, device_id, prop, val); + if constexpr(std::is_assignable()) + { + if(json::defined(json::value(val))) + ret |= set(user, device_id, prop, val); + } }); - return true; + return ret; } bool @@ -72,6 +74,28 @@ ircd::m::device::set(const m::user &user, const string_view &id, const string_view &prop, const string_view &val) +{ + bool dup {false}; + const bool got + { + get(std::nothrow, user, id, prop, [&val, &dup] + (const json::string &existing) + { + dup = val == existing; + }) + }; + + assert(!dup || got); + return !dup? + put(user, id, prop, val): + false; +} + +bool +ircd::m::device::put(const m::user &user, + const string_view &id, + const string_view &prop, + const string_view &val) { char buf[m::event::TYPE_MAX_SIZE]; const string_view type{fmt::sprintf