diff options
| -rw-r--r-- | server/src/luaquerymapper.cc | 22 | ||||
| -rw-r--r-- | server/src/luaquerymapper.h | 1 | ||||
| -rw-r--r-- | server/src/server.cc | 19 | 
3 files changed, 29 insertions, 13 deletions
| diff --git a/server/src/luaquerymapper.cc b/server/src/luaquerymapper.cc index b698fe9..2de1d3c 100644 --- a/server/src/luaquerymapper.cc +++ b/server/src/luaquerymapper.cc @@ -78,6 +78,8 @@ LUAQueryMapper::LUAQueryMapper(QueryResult &res)    // Run program (init)    lua_pcall(L, 0, LUA_MULTRET, 0); + +  clean_top = lua_gettop(L);  }  LUAQueryMapper::~LUAQueryMapper() @@ -87,6 +89,14 @@ LUAQueryMapper::~LUAQueryMapper()  Value LUAQueryMapper::map(const std::string &mapper)  { +  Value v; + +  if(mapper == "") { +    printf("Empty LUA mapper detected!\n"); +    v.timestamp = 0; +    v.value = ""; +  } +    int s = luaL_loadbuffer(L, mapper.c_str(), mapper.size(), "mapper");    switch(s) {    case 0: //no errors; @@ -104,8 +114,16 @@ Value LUAQueryMapper::map(const std::string &mapper)    // Run the loaded code    lua_pcall(L, 0, LUA_MULTRET, 0); -  Value v; -   +  // Check if app messed up the stack. +  if(lua_gettop(L) != clean_top) { +    printf("LUA mapper messed up the stack (wrong number of return values)!\n"); +    lua_pop(L, lua_gettop(L) - clean_top); +    Value v; +    v.timestamp = 0; +    v.value = ""; +    return v; +  } +    v.timestamp = lua_tointeger(L, lua_gettop(L));    lua_pop(L, 1);    v.value = lua_tostring(L, lua_gettop(L)); diff --git a/server/src/luaquerymapper.h b/server/src/luaquerymapper.h index d5e03b0..83866a0 100644 --- a/server/src/luaquerymapper.h +++ b/server/src/luaquerymapper.h @@ -52,6 +52,7 @@ public:  private:    lua_State *L; +  int clean_top;  }; diff --git a/server/src/server.cc b/server/src/server.cc index a896102..9229f28 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -51,17 +51,14 @@ static std::string error_box(std::string message)  {    std::string errorbox; -  errorbox += "    <course name=\"error\">\n"; -  errorbox += "      <macro name=\"error\">\n"; -  errorbox += "        <window caption=\"ERROR!\" height=\"240\" layout=\"vbox\" " -               "name=\"err\" width=\"320\">\n"; -  errorbox += "          <textedit name=\"errorlabel\" value=\""; -  errorbox += message; -  errorbox += "\"/>\n"; -  errorbox += "          <button action=\"cancel\" caption=\"Luk\" name=\"cancel\"/>\n"; -  errorbox += "        </window>\n"; -  errorbox += "      </macro>\n"; -  errorbox += "     </course>\n"; +  errorbox += "  <course name=\"error\">\n"; +  errorbox += "    <macro name=\"error\">\n"; +  errorbox += "      <window caption=\"ERROR!\" height=\"240\" layout=\"vbox\" name=\"err\" width=\"320\">\n"; +  errorbox += "        <textedit name=\"errorlabel\" value=\"" + message + "\"/>\n"; +  errorbox += "        <button action=\"cancel\" caption=\"Luk\" name=\"cancel\"/>\n"; +  errorbox += "      </window>\n"; +  errorbox += "    </macro>\n"; +  errorbox += "  </course>\n";    return errorbox;  } | 
