From 2477d1c2698cf220fdf8a18a4dbf045de954bc81 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 9 Oct 2017 01:01:28 +0200 Subject: mod_storage_internal: Add support for archive key deduplication (like mod_storage_sql) --- plugins/mod_storage_internal.lua | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'plugins/mod_storage_internal.lua') diff --git a/plugins/mod_storage_internal.lua b/plugins/mod_storage_internal.lua index 76052575..9f44866a 100644 --- a/plugins/mod_storage_internal.lua +++ b/plugins/mod_storage_internal.lua @@ -44,17 +44,36 @@ local archive = {}; driver.archive = { __index = archive }; function archive:append(username, key, value, when, with) - key = key or id(); when = when or now(); if not st.is_stanza(value) then return nil, "unsupported-datatype"; end value = st.preserialize(st.clone(value)); - value.key = key; value.when = when; value.with = with; value.attr.stamp = datetime.datetime(when); value.attr.stamp_legacy = datetime.legacy(when); + + if key then + local items, err = datamanager.list_load(username, host, self.store); + if not items and err then return items, err; end + if items then + items = array(items); + items:filter(function (item) + return item.key ~= key; + end); + value.key = key; + items:push(value); + local ok, err = datamanager.list_store(username, host, self.store, items); + if not ok then return ok, err; end + return key; + end + else + key = id(); + end + + value.key = key; + local ok, err = datamanager.list_append(username, host, self.store, value); if not ok then return ok, err; end return key; -- cgit v1.2.3