]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Add a generic redis request method
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 11 Sep 2018 10:02:30 +0000 (11:02 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 11 Sep 2018 10:02:30 +0000 (11:02 +0100)
lualib/lua_redis.lua

index 33757b1548acfef9d049304e051d50d54d0a4cf1..44cb75f4a5a59ef0e915203b8e780dd5ca98e1d1 100644 (file)
@@ -1018,4 +1018,94 @@ end
 
 exports.redis_connect_sync = redis_connect_sync
 
+--[[[
+-- @function lua_redis.request(redis_params, attrs, req)
+-- Sends a request to Redis (modern API)
+-- @param redis_params a table of redis server parameters
+-- @param attrs a table of redis request attributes (e.g. task, or ev_base + cfg + session)
+-- @param req a table of request: a command + command options
+--]]
+
+exports.request = function(redis_params, attrs, req)
+  local lua_util = require "lua_util"
+
+  if not attrs or not redis_params or not req then
+    logger.errx('invalid arguments for redis request')
+    return false,nil,nil
+  end
+
+  if not (attrs.task or (attrs.config and attrs.ev_base)) then
+    logger.errx('invalid attributes for redis request')
+    return false,nil,nil
+  end
+
+  local opts = lua_util.shallowcopy(attrs)
+
+  local log_obj = opts.task or opts.config
+
+  local addr
+
+  if opts.callback then
+    -- Wrap callback
+    local callback = opts.callback
+    local function rspamd_redis_make_request_cb(err, data)
+      if err then
+        addr:fail()
+      else
+        addr:ok()
+      end
+      callback(err, data, addr)
+    end
+    opts.callback = rspamd_redis_make_request_cb
+  end
+
+  local rspamd_redis = require "rspamd_redis"
+  local is_write = opts.is_write
+
+  if opts.key then
+    if is_write then
+      addr = redis_params['write_servers']:get_upstream_by_hash(attrs.key)
+    else
+      addr = redis_params['read_servers']:get_upstream_by_hash(attrs.key)
+    end
+  else
+    if is_write then
+      addr = redis_params['write_servers']:get_upstream_master_slave(attrs.key)
+    else
+      addr = redis_params['read_servers']:get_upstream_round_robin(attrs.key)
+    end
+  end
+
+  if not addr then
+    logger.errx(log_obj, 'cannot select server to make redis request')
+  end
+
+  opts.host = addr:get_addr()
+  opts.timeout = redis_params.timeout
+
+  if type(req) == 'string' then
+    opts.cmd = req
+  else
+    -- XXX: modifies the input table
+    opts.cmd = table.remove(req, 1);
+    opts.args = req
+  end
+
+  if redis_params.password then
+    opts.password = redis_params.password
+  end
+
+  if redis_params.db then
+    opts.dbname = redis_params.db
+  end
+
+  local ret,conn = rspamd_redis.make_request(opts)
+  if not ret then
+    logger.errx(log_obj, 'cannot execute redis request')
+    addr:fail()
+  end
+
+  return ret,conn,addr
+end
+
 return exports