mod_storage_sql2: Add a 'caps' table for indicating support for optional features
[prosody.git] / plugins / mod_storage_sql2.lua
index 90e9ead0c1b2308058961b52832788bc4ca405d2..21299f334f9bc932f3f051ad67b49856611d2780 100644 (file)
@@ -2,7 +2,7 @@
 local json = require "util.json";
 local xml_parse = require "util.xml".parse;
 local uuid = require "util.uuid";
-local resolve_relative_path = require "core.configmanager".resolve_relative_path;
+local resolve_relative_path = require "util.paths".resolve_relative_path;
 
 local stanza_mt = require"util.stanza".stanza_mt;
 local getmetatable = getmetatable;
@@ -113,8 +113,6 @@ do -- process options to get a db connection
        --local dburi = db2uri(params);
        engine = mod_sql:create_engine(params);
 
-       engine:set_encoding();
-
        if module:get_option("sql_manage_tables", true) then
                -- Automatically create table, ignore failure (table probably already exists)
                create_table();
@@ -198,7 +196,9 @@ local keyval_store = {};
 keyval_store.__index = keyval_store;
 function keyval_store:get(username)
        user,store = username,self.store;
-       return select(2, engine:transaction(keyval_store_get));
+       local ok, result = engine:transaction(keyval_store_get);
+       if not ok then return ok, result; end
+       return result;
 end
 function keyval_store:set(username, data)
        user,store = username,self.store;
@@ -215,10 +215,13 @@ function keyval_store:users()
 end
 
 local archive_store = {}
+archive_store.caps = {
+       total = true;
+};
 archive_store.__index = archive_store
-function archive_store:append(username, key, when, with, value)
-       if value == nil then -- COMPAT early versions
-               when, with, value, key = key, when, with, value
+function archive_store:append(username, key, value, when, with)
+       if type(when) ~= "number" then
+               value, when, with = when, with, value;
        end
        local user,store = username,self.store;
        return engine:transaction(function()
@@ -281,7 +284,7 @@ function archive_store:find(username, query)
        local user,store = username,self.store;
        local total;
        local ok, result = engine:transaction(function()
-               local sql_query = "SELECT `key`, `type`, `value`, `when` FROM `prosodyarchive` WHERE %s ORDER BY `sort_id` %s%s;";
+               local sql_query = "SELECT `key`, `type`, `value`, `when`, `with` FROM `prosodyarchive` WHERE %s ORDER BY `sort_id` %s%s;";
                local args = { host, user or "", store, };
                local where = { "`host` = ?", "`user` = ?", "`store` = ?", };
 
@@ -289,7 +292,7 @@ function archive_store:find(username, query)
 
                -- Total matching
                if query.total then
-                       local stats = engine:select(sql_query:gsub("^(SELECT).-(FROM)", "%1 COUNT(*) %2"):format(t_concat(where, " AND "), "DESC", ""), unpack(args));
+                       local stats = engine:select("SELECT COUNT(*) FROM `prosodyarchive` WHERE " .. t_concat(where, " AND "), unpack(args));
                        if stats then
                                local _total = stats()
                                total = _total and _total[1];
@@ -313,7 +316,7 @@ function archive_store:find(username, query)
        return function()
                local row = result();
                if row ~= nil then
-                       return row[1], deserialize(row[2], row[3]), row[4];
+                       return row[1], deserialize(row[2], row[3]), row[4], row[5];
                end
        end, total;
 end
@@ -325,6 +328,10 @@ function archive_store:delete(username, query)
                local sql_query = "DELETE FROM `prosodyarchive` WHERE %s;";
                local args = { host, user or "", store, };
                local where = { "`host` = ?", "`user` = ?", "`store` = ?", };
+               if user == true then
+                       table.remove(args, 2);
+                       table.remove(where, 2);
+               end
                archive_where(query, args, where);
                archive_where_id_range(query, args, where);
                sql_query = sql_query:format(t_concat(where, " AND "));