summaryrefslogtreecommitdiff
path: root/server/src/luaquerymapper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/luaquerymapper.cc')
-rw-r--r--server/src/luaquerymapper.cc79
1 files changed, 45 insertions, 34 deletions
diff --git a/server/src/luaquerymapper.cc b/server/src/luaquerymapper.cc
index df25778..5b66a35 100644
--- a/server/src/luaquerymapper.cc
+++ b/server/src/luaquerymapper.cc
@@ -28,6 +28,8 @@
#include <sstream>
+#include "exception.h"
+
static std::string loadresultstring(QueryResult &res, std::string group = "")
{
std::string s;
@@ -55,29 +57,24 @@ LUAQueryMapper::LUAQueryMapper(QueryResult &res)
{
L = luaL_newstate();
if(L == NULL) {
- // throw LUADataParserException("Could not create LUA state.");
+ error("Could not create LUA state.");
+ return;
}
luaL_openlibs(L);
std::string preload = loadresultstring(res);
- int s = luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload");
- switch(s) {
- case 0: //no errors;
- break;
- case LUA_ERRSYNTAX: //syntax error during pre-compilation;
- case LUA_ERRMEM: //memory allocation error.
- case LUA_ERRFILE: //cannot open/read the file.
- //throw LUADataParserException(lua_tostring(L, lua_gettop(L)));
- break;
- default:
- //throw LUADataParserException("Unknown return value of luaL_loadfile.");
- break;
+ if(luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload")) {
+ error(lua_tostring(L, lua_gettop(L)));
+ return;
}
// Run program (init)
- lua_pcall(L, 0, LUA_MULTRET, 0);
+ if(lua_pcall(L, 0, LUA_MULTRET, 0)) {
+ error(lua_tostring(L, lua_gettop(L)));
+ return;
+ }
clean_top = lua_gettop(L);
}
@@ -91,47 +88,61 @@ Value LUAQueryMapper::map(const std::string &mapper)
{
Value v;
+ if(L == NULL) {
+ error("LUA state not initialized!");
+ return v;
+ }
+
if(mapper == "") {
- printf("Empty LUA mapper detected!\n");
- v.timestamp = 0;
- v.value = "";
+ error("Empty LUA mapper detected in " + mapper);
+ return v;
}
- int s = luaL_loadbuffer(L, mapper.c_str(), mapper.size(), "mapper");
- switch(s) {
- case 0: //no errors;
- break;
- case LUA_ERRSYNTAX: //syntax error during pre-compilation;
- case LUA_ERRMEM: //memory allocation error.
- case LUA_ERRFILE: //cannot open/read the file.
- //throw LUADataParserException(lua_tostring(L, lua_gettop(L)));
- break;
- default:
- //throw LUADataParserException("Unknown return value of luaL_loadfile.");
- break;
+ // Load the mapper
+ if(luaL_loadbuffer(L, mapper.c_str(), mapper.size(), "mapper")) {
+ error(lua_tostring(L, lua_gettop(L)) + std::string(" in ") + mapper);
+ return v;
}
// Run the loaded code
- lua_pcall(L, 0, LUA_MULTRET, 0);
+ if(lua_pcall(L, 0, LUA_MULTRET, 0)) {
+ error(lua_tostring(L, lua_gettop(L)) + std::string(" in ") + mapper);
+ return v;
+ }
// Check if app messed up the stack.
if(lua_gettop(L) != clean_top + 2) {
- printf("LUA mapper messed up the stack (wrong number of return values)!\n");
+ error("Wrong number of return values in " + mapper);
lua_pop(L, lua_gettop(L) - clean_top);
- Value v;
- v.timestamp = 0;
- v.value = "";
return v;
}
+ // Check if the types are right
+ if(lua_isnumber(L, lua_gettop(L)) == false) {
+ error("Timestamp is not an integer in " + mapper);
+ lua_pop(L, 2);
+ return v;
+ }
v.timestamp = lua_tointeger(L, lua_gettop(L));
lua_pop(L, 1);
+
+ // Check if the types are right
+ if(lua_isstring(L, lua_gettop(L)) == false) {
+ error("Value is not a string in " + mapper);
+ lua_pop(L, 1);
+ return v;
+ }
v.value = lua_tostring(L, lua_gettop(L));
lua_pop(L, 1);
return v;
}
+void LUAQueryMapper::error(std::string message)
+{
+ throw Exception("ERROR in LUAQueryMapper: " + message);
+}
+
#ifdef TEST_LUAQUERYMAPPER
#include "queryhandler.h"