Skip to content

Commit 764565e

Browse files
committed
fix(database): Early callback deletion
1 parent 499f543 commit 764565e

File tree

3 files changed

+67
-43
lines changed

3 files changed

+67
-43
lines changed

src/plugins/core/scripting/database.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <rapidjson/writer.h>
77
#include <rapidjson/stringbuffer.h>
88

9-
#define FetchPluginName(state) luabridge::getGlobal(state, "plugin_name").tostring()
9+
std::string FetchPluginName(lua_State* state);
1010
#define FetchPluginByState(state) g_pluginManager->FetchPlugin(FetchPluginName(state))
1111

1212
struct DatabaseQueryQueue
@@ -28,6 +28,7 @@ void DatabaseQueryThread()
2828
{
2929
DatabaseQueryQueue queue = queryQueue.front();
3030

31+
RegisterCallStack* callStack = new RegisterCallStack(queue.plugin->GetName(), string_format("database::Query(database=%p, query=\"%s\")", (void*)queue.db, queue.query.c_str()));
3132
auto queryResult = queue.db->Query(queue.query.c_str());
3233
if (queue.plugin->GetKind() == PluginKind_t::Lua)
3334
{
@@ -77,14 +78,15 @@ void DatabaseQueryThread()
7778
try
7879
{
7980
std::string error = queue.db->GetError();
80-
if (error == "MySQL server has gone away")
81+
if (error == "MySQL server has gone away") {
8182
if (queue.db->Connect())
8283
{
83-
delete ((luabridge::LuaRef*)queue.callback);
84+
delete callStack;
8485
continue;
8586
}
8687
else
8788
error = queue.db->GetError();
89+
}
8890

8991
if (ref.isFunction())
9092
ref(error.size() == 0 ? luabridge::LuaRef(state) : error, tbl);
@@ -95,6 +97,7 @@ void DatabaseQueryThread()
9597
}
9698
}
9799

100+
delete callStack;
98101
delete ((luabridge::LuaRef*)queue.callback);
99102
queryQueue.pop_front();
100103
}

src/plugins/lua/scripting/core.cpp

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include "../../../utils/utils.h"
44

5-
int customPrint(lua_State *state)
5+
int customPrint(lua_State* state)
66
{
77
std::string prefix = string_format("[Swiftly] %s[%16s]\e[39m ", GetTerminalStringColor(luabridge::getGlobal(state, "plugin_name").tostring()).c_str(), ("plugin:" + luabridge::getGlobal(state, "plugin_name").tostring()).c_str());
88

@@ -19,7 +19,7 @@ int customPrint(lua_State *state)
1919
lua_call(state, 1, 1);
2020

2121
size_t l = 0;
22-
const char *s = lua_tolstring(state, -1, &l);
22+
const char* s = lua_tolstring(state, -1, &l);
2323
if (s == nullptr)
2424
{
2525
outputArr.push_back("An error has occured while trying to call 'print'.\nError: 'tostring' must return a string to 'print'\n");
@@ -43,26 +43,47 @@ int customPrint(lua_State *state)
4343
return 0;
4444
}
4545

46-
void SetupLuaEnvironment(LuaPlugin *plugin, lua_State *state)
46+
std::map<std::string, lua_State*> pluginNamesMap = {};
47+
std::map<lua_State*, std::string> pluginNamesMap2 = {};
48+
49+
std::string FetchPluginName(lua_State* state)
50+
{
51+
return pluginNamesMap2.at(state);
52+
}
53+
54+
void SetupLuaEnvironment(LuaPlugin* plugin, lua_State* state)
4755
{
56+
if (pluginNamesMap.find(plugin->GetName()) == pluginNamesMap.end()) {
57+
pluginNamesMap.insert({ plugin->GetName(), state });
58+
pluginNamesMap2.insert({ state, plugin->GetName() });
59+
}
60+
else {
61+
lua_State* st = pluginNamesMap[plugin->GetName()];
62+
pluginNamesMap2.erase(st);
63+
64+
pluginNamesMap2.insert({ state, plugin->GetName() });
65+
pluginNamesMap[plugin->GetName()] = state;
66+
}
67+
4868
luabridge::getGlobalNamespace(state)
4969
.addCFunction("print", &customPrint)
50-
.addFunction("GetCurrentPluginName", +[](lua_State *L) -> std::string
51-
{ return FetchPluginName(L); })
70+
.addFunction("GetCurrentPluginName", +[](lua_State* L) -> std::string
71+
{ return FetchPluginName(L); })
5272
.addFunction("CreateTextTable", +[](std::vector<std::vector<std::string>> data)
53-
{
54-
TextTable tbl('-', '|', '+');
73+
{
74+
TextTable tbl('-', '|', '+');
5575

56-
for(auto vec : data) {
57-
for(std::string str : vec)
58-
tbl.add(" " + str + " ");
76+
for (auto vec : data) {
77+
for (std::string str : vec)
78+
tbl.add(" " + str + " ");
5979

60-
tbl.endOfRow();
61-
}
80+
tbl.endOfRow();
81+
}
6282

63-
std::stringstream outputTable;
64-
outputTable << tbl;
65-
return outputTable.str(); });
83+
std::stringstream outputTable;
84+
outputTable << tbl;
85+
return outputTable.str();
86+
});
6687

6788
luabridge::setGlobal(state, plugin->GetName(), "plugin_name");
6889

src/plugins/lua/scripting/core.h

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,31 @@
55
#include "../../../entrypoint.h"
66
#include "../../../types/EventResult.h"
77

8-
#define FetchPluginName(state) luabridge::getGlobal(state, "plugin_name").tostring()
8+
std::string FetchPluginName(lua_State* state);
99
#define FetchPluginByState(state) g_pluginManager->FetchPlugin(FetchPluginName(state))
1010

11-
void SetupLuaLogs(LuaPlugin *plugin, lua_State *state);
12-
void SetupLuaTypes(LuaPlugin *plugin, lua_State *state);
13-
void SetupLuaTranslations(LuaPlugin *plugin, lua_State *state);
14-
void SetupLuaConfiguration(LuaPlugin *plugin, lua_State *state);
15-
void SetupLuaFiles(LuaPlugin *plugin, lua_State *state);
16-
void SetupLuaPrecacher(LuaPlugin *plugin, lua_State *state);
17-
void SetupLuaCommands(LuaPlugin *plugin, lua_State *state);
18-
void SetupLuaPlayerManager(LuaPlugin *plugin, lua_State *state);
19-
void SetupLuaEvents(LuaPlugin *plugin, lua_State *state);
20-
void SetupLuaHTTP(LuaPlugin *plugin, lua_State *state);
21-
void SetupLuaDatabase(LuaPlugin *plugin, lua_State *state);
22-
void SetupLuaMenus(LuaPlugin *plugin, lua_State *state);
23-
void SetupLuaUtils(LuaPlugin *plugin, lua_State *state);
24-
void SetupLuaConvars(LuaPlugin *plugin, lua_State *state);
25-
void SetupLuaClasses(LuaPlugin *plugin, lua_State *state);
26-
void SetupLuaGeneratedTypes(LuaPlugin *plugin, lua_State *state);
27-
void SetupLuaCoreClasses(LuaPlugin *plugin, lua_State *state);
28-
void SetupLuaServer(LuaPlugin *plugin, lua_State *state);
29-
void SetupLuaPlayer(LuaPlugin *plugin, lua_State *state);
30-
void SetupLuaEntities(LuaPlugin *plugin, lua_State *state);
31-
void SetupLuaMemory(LuaPlugin *plugin, lua_State *state);
32-
void SetupLuaHooks(LuaPlugin *plugin, lua_State *state);
33-
void SetupLuaUserMessages(LuaPlugin *plugin, lua_State *state);
34-
void SetupLuaWeapons(LuaPlugin *plugin, lua_State *state);
11+
void SetupLuaLogs(LuaPlugin* plugin, lua_State* state);
12+
void SetupLuaTypes(LuaPlugin* plugin, lua_State* state);
13+
void SetupLuaTranslations(LuaPlugin* plugin, lua_State* state);
14+
void SetupLuaConfiguration(LuaPlugin* plugin, lua_State* state);
15+
void SetupLuaFiles(LuaPlugin* plugin, lua_State* state);
16+
void SetupLuaPrecacher(LuaPlugin* plugin, lua_State* state);
17+
void SetupLuaCommands(LuaPlugin* plugin, lua_State* state);
18+
void SetupLuaPlayerManager(LuaPlugin* plugin, lua_State* state);
19+
void SetupLuaEvents(LuaPlugin* plugin, lua_State* state);
20+
void SetupLuaHTTP(LuaPlugin* plugin, lua_State* state);
21+
void SetupLuaDatabase(LuaPlugin* plugin, lua_State* state);
22+
void SetupLuaMenus(LuaPlugin* plugin, lua_State* state);
23+
void SetupLuaUtils(LuaPlugin* plugin, lua_State* state);
24+
void SetupLuaConvars(LuaPlugin* plugin, lua_State* state);
25+
void SetupLuaClasses(LuaPlugin* plugin, lua_State* state);
26+
void SetupLuaGeneratedTypes(LuaPlugin* plugin, lua_State* state);
27+
void SetupLuaCoreClasses(LuaPlugin* plugin, lua_State* state);
28+
void SetupLuaServer(LuaPlugin* plugin, lua_State* state);
29+
void SetupLuaPlayer(LuaPlugin* plugin, lua_State* state);
30+
void SetupLuaEntities(LuaPlugin* plugin, lua_State* state);
31+
void SetupLuaMemory(LuaPlugin* plugin, lua_State* state);
32+
void SetupLuaHooks(LuaPlugin* plugin, lua_State* state);
33+
void SetupLuaUserMessages(LuaPlugin* plugin, lua_State* state);
34+
void SetupLuaWeapons(LuaPlugin* plugin, lua_State* state);
3535
void SetupLuaCHandle(LuaPlugin* plugin, lua_State* state);

0 commit comments

Comments
 (0)