]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Slightly rework lua shingles to simplify storage
authorVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 8 Jan 2025 15:14:37 +0000 (15:14 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 8 Jan 2025 15:14:37 +0000 (15:14 +0000)
src/fuzzy_storage.c
src/lua/lua_classnames.c
src/lua/lua_classnames.h
src/lua/lua_common.h
src/lua/lua_shingles.cxx

index c7a1af470b97b68b5dbde95dac4298318a3d90e0..a916af3c96bde32f4e2071f2aff192519d044a50 100644 (file)
@@ -1321,9 +1321,7 @@ rspamd_fuzzy_check_callback(struct rspamd_fuzzy_reply *result, void *ud)
                rspamd_fuzzy_extensions_tolua(L, session);
                /* We push shingles merely for commands that modify content to avoid extra work */
                if (is_shingle && cmd->cmd != FUZZY_CHECK) {
-                       struct rspamd_shingle **pshingle = lua_newuserdata(L, sizeof(*pshingle));
-                       rspamd_lua_setclass(L, RSPAMD_LUA_SHINGLE_CLASS, -1);
-                       *pshingle = &session->cmd.sgl;
+                       lua_newshingle(L, &session->cmd.sgl);
                        nargs++;
                }
 
@@ -1506,9 +1504,7 @@ rspamd_fuzzy_process_command(struct fuzzy_session *session)
 
                /* We push shingles merely for commands that modify content to avoid extra work */
                if (is_shingle && cmd->cmd != FUZZY_CHECK) {
-                       struct rspamd_shingle **pshingle = lua_newuserdata(L, sizeof(*pshingle));
-                       rspamd_lua_setclass(L, RSPAMD_LUA_SHINGLE_CLASS, -1);
-                       *pshingle = &session->cmd.sgl;
+                       lua_newshingle(L, &session->cmd.sgl);
                        nargs++;
                }
 
index 7ce2f8abc6c0d18a4877b47ef31c5b994c892d5e..2b5a90fe0ee70a5c4c41340d96749ac3b659e0bf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2024 Vsevolod Stakhov
+ * Copyright 2025 Vsevolod Stakhov
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -67,6 +67,7 @@ const char *rspamd_url_classname = "rspamd{url}";
 const char *rspamd_worker_classname = "rspamd{worker}";
 const char *rspamd_zstd_compress_classname = "rspamd{zstd_compress}";
 const char *rspamd_zstd_decompress_classname = "rspamd{zstd_decompress}";
+const char *rspamd_shingle_classname = "rspamd{shingle}";
 
 KHASH_INIT(rspamd_lua_static_classes, const char *, const char *, 1, rspamd_str_hash, rspamd_str_equal);
 
@@ -133,6 +134,7 @@ RSPAMD_CONSTRUCTOR(rspamd_lua_init_classnames)
        CLASS_PUT_STR(worker);
        CLASS_PUT_STR(zstd_compress);
        CLASS_PUT_STR(zstd_decompress);
+       CLASS_PUT_STR(shingle);
 
        /* Check consistency */
        g_assert(kh_size(lua_static_classes) == RSPAMD_MAX_LUA_CLASSES);
index 53db5f8c2f983a495e8f2d2f11d32781b95dd0a0..6e3a6441f2ca145cc21ddf2e5aaa6e2fe00d62c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2024 Vsevolod Stakhov
+ * Copyright 2025 Vsevolod Stakhov
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -70,9 +70,10 @@ extern const char *rspamd_url_classname;
 extern const char *rspamd_worker_classname;
 extern const char *rspamd_zstd_compress_classname;
 extern const char *rspamd_zstd_decompress_classname;
+extern const char *rspamd_shingle_classname;
 
 /* Keep it consistent when adding new classes */
-#define RSPAMD_MAX_LUA_CLASSES 48
+#define RSPAMD_MAX_LUA_CLASSES 49
 
 /*
  * Return a static class name for a given name (only for known classes) or NULL
index 23bccbd3047af25d5884cdb9b92aaae347cb2e59..f5a4967ba22bece54503072b13454961ea9623ab 100644 (file)
@@ -456,6 +456,12 @@ struct rspamd_dns_resolver *lua_check_dns_resolver(lua_State *L, int pos);
 
 struct rspamd_lua_url *lua_check_url(lua_State *L, int pos);
 
+/**
+ * Creates a new shingle object from the existing shingle
+ */
+struct rspamd_shingle;
+void lua_newshingle(lua_State *L, const struct rspamd_shingle *sh);
+
 enum rspamd_lua_parse_arguments_flags {
        RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT = 0,
        RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING,
@@ -708,8 +714,6 @@ int rspamd_lua_geti(lua_State *L, int index, int i);
 #define RSPAMD_PREFIX_INDEX "PREFIX"
 #define RSPAMD_VERSION_INDEX "VERSION"
 
-#define RSPAMD_LUA_SHINGLE_CLASS "rspamd{shingle}"
-
 #ifdef WITH_LUA_TRACE
 extern ucl_object_t *lua_traces;
 #define LUA_TRACE_POINT                                                            \
index b19a00c08bba66c5f849ffebf2eadc419e3e84b8..8e14d8ba87ecc9c22f9fca54d69397c72a3d5ae2 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "lua_common.h"
+#include "lua_classnames.h"
 #include "shingles.h"
 #include "fmt/format.h"
 
@@ -56,9 +57,21 @@ static const struct luaL_reg shinglelib_m[] = {
 static struct rspamd_shingle *
 lua_check_shingle(lua_State *L, int pos)
 {
-       void *ud = rspamd_lua_check_udata(L, pos, RSPAMD_LUA_SHINGLE_CLASS);
+       void *ud = rspamd_lua_check_udata(L, pos, rspamd_shingle_classname);
        luaL_argcheck(L, ud != nullptr, pos, "'shingle' expected");
-       return *static_cast<struct rspamd_shingle **>(ud);
+       return static_cast<struct rspamd_shingle *>(ud);
+}
+
+void lua_newshingle(lua_State *L, const struct rspamd_shingle *sh)
+{
+       auto *nsh = static_cast<struct rspamd_shingle *>(
+               lua_newuserdata(L, sizeof(struct rspamd_shingle)));
+
+       if (sh != nullptr) {
+               memcpy(nsh, sh, sizeof(struct rspamd_shingle));
+       }
+
+       rspamd_lua_setclass(L, rspamd_shingle_classname, -1);
 }
 
 static int
@@ -115,6 +128,6 @@ lua_shingle_get_string(lua_State *L)
 
 void luaopen_shingle(lua_State *L)
 {
-       rspamd_lua_new_class(L, RSPAMD_LUA_SHINGLE_CLASS, shinglelib_m);
+       rspamd_lua_new_class(L, rspamd_shingle_classname, shinglelib_m);
        lua_pop(L, 1);
 }