diff options
| -rw-r--r-- | server/src/Makefile.am | 14 | ||||
| -rw-r--r-- | server/src/luaresume.cc | 142 | ||||
| -rw-r--r-- | server/src/luaresume.h | 52 | ||||
| -rw-r--r-- | server/src/resumeparser.cc | 21 | ||||
| -rw-r--r-- | server/src/resumeparser.h | 3 | ||||
| -rw-r--r-- | server/src/server.cc | 2 | 
6 files changed, 228 insertions, 6 deletions
| diff --git a/server/src/Makefile.am b/server/src/Makefile.am index 6721b8c..75e72d9 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -20,7 +20,9 @@ pracrod_SOURCES = \  	luaformatmapper.cc \  	luaformatmapperutils.cc \  	luaquerymapper.cc \ +	luaresume.cc \  	macroparser.cc \ +	mltokenizer.cc \   	resumeparser.cc \  	saxparser.cc \  	server.cc \ @@ -45,7 +47,9 @@ EXTRA_DIST = \  	luaformatmapper.h \  	luaformatmapperutils.h \  	luaquerymapper.h \ +	luaresume.h \  	macroparser.h \ +	mltokenizer.h \   	resumeparser.h \  	saxparser.h \  	server.h \ @@ -64,7 +68,8 @@ TESTFILES = \  	test_server \  	test_database \  	test_macroparser \ -	test_xml_encode_decode +	test_xml_encode_decode \ +	test_mltokenizer  TESTLOGS = `for F in ${TESTFILES}; do echo $$F.log; done` @@ -75,8 +80,11 @@ test: $(TESTFILES)  test_clean:  	rm -f $(TESTFILES) -test_formattools: formattools.cc luaformatmapper.cc luaformatmapperutils.cc -	@../../tools/test formattools.cc luaformatmapper.cc luaformatmapperutils.cc exception.cc log.cc $(LUA_LIBS) +test_mltokenizer: mltokenizer.cc +	@../../tools/test mltokenizer.cc + +test_formattools: formattools.cc luaformatmapper.cc luaformatmapperutils.cc mltokenizer.cc +	@../../tools/test formattools.cc luaformatmapper.cc mltokenizer.cc luaformatmapperutils.cc exception.cc log.cc $(LUA_LIBS)  test_queryhandler: queryhandler.cc  	@../../tools/test queryhandler.cc tcpsocket.cc exception.cc log.cc diff --git a/server/src/luaresume.cc b/server/src/luaresume.cc new file mode 100644 index 0000000..ce6df98 --- /dev/null +++ b/server/src/luaresume.cc @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            lua.cc + * + *  Thu May 29 16:30:50 CEST 2008 + *  Copyright 2008 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of Pracro. + * + *  Pracro is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  Pracro is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Pracro; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#include "luaresume.h" + +#include <stdio.h> + +#define GLOBAL_POINTER "_pracroGlobalLUAObjectPointerThisShouldBeANameThatIsNotAccidentallyOverwritten" + +static int _getValue(lua_State *L) +{ +  int n = lua_gettop(L); // number of arguments +  if(n != 1) { +    char errstr[512]; +    sprintf(errstr, "Number of args expected 0, got %d", n); +    lua_pushstring(L, errstr); +    lua_error(L); +    return 1; +  } + +  std::string name = lua_tostring(L, lua_gettop(L)); + +  lua_getglobal(L, GLOBAL_POINTER); +  LUAResume *lua = (LUAResume*)lua_touserdata(L, lua_gettop(L)); + +  if(!lua) { +    lua_pushstring(L, "No LUA pointer!"); +    lua_error(L); +    return 1; +  } + +  std::string value = lua->getValue(name); +  lua_pushstring(L, value.c_str()); + +  return 1; +} + +LUAResume::LUAResume(Commit &c) +  : commit(c) +{ +  L = luaL_newstate(); +  if(L == NULL) { +    error("Could not create LUA state."); +    return; +  } + +  luaL_openlibs(L);                + +  lua_pushlightuserdata(L, this); // Push the pointer to 'this' instance +  lua_setglobal(L, GLOBAL_POINTER); // Assign it to a global lua var. + +  lua_register(L, "getValue", _getValue); +} + +LUAResume::~LUAResume() +{ +  lua_close(L); +} + +std::string LUAResume::getValue(std::string name) +{ +  if(commit.fields.find(name) == commit.fields.end()) { +    error("LUAResume: No such field '" + name + "'"); +    return ""; +  } + +  return commit.fields[name]; +} + +std::string LUAResume::run(std::string program) +{ +  if(L == NULL) { +    error("LUA state not initialized!"); +    return false; +  } + +  printf("Running %s\n", program.c_str()); + +  /* +  lua_pushstring(L, value.toStdString().c_str()); +  lua_setglobal(L, "value"); + +  lua_pushstring(L, name.toStdString().c_str()); +  lua_setglobal(L, "name"); +  */ + +  int top = lua_gettop(L); + +  if(luaL_loadbuffer(L, program.c_str(), program.size(), "lua resume generator")) { +    error(lua_tostring(L, lua_gettop(L))); +    return false; +  } + +  // Run the loaded code +  if(lua_pcall(L, 0, LUA_MULTRET, 0)) { +    error(lua_tostring(L, lua_gettop(L))); +    return false; +  } + +  if(top != lua_gettop(L) - 1) { +    error("Program did not return a single value.\n"); +    return false; +  } + +  if(lua_isstring(L, lua_gettop(L)) == false) { +    error("Program did not return a string value.\n"); +    return false; +  } + +  std::string res = lua_tostring(L, lua_gettop(L)); +  lua_pop(L, 1); + +  return res; +} + +void LUAResume::error(std::string message) +{ +  printf("LUA ERROR: %s\n", message.c_str()); +} diff --git a/server/src/luaresume.h b/server/src/luaresume.h new file mode 100644 index 0000000..5a1896e --- /dev/null +++ b/server/src/luaresume.h @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            lua.h + * + *  Thu May 29 16:30:50 CEST 2008 + *  Copyright 2008 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of Pracro. + * + *  Pracro is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  Pracro is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Pracro; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#ifndef __PRACRO_LUARESUME_H__ +#define __PRACRO_LUARESUME_H__ + +#include <lua.hpp> +#include <lauxlib.h> + +#include "transaction.h" +#include <string> + +class LUAResume { +public: +  LUAResume(Commit &commit); +  ~LUAResume(); +   +  std::string run(std::string program); + +  std::string getValue(std::string name); + +  void error(std::string message); + +private: +  lua_State *L; +  Commit &commit; +}; + +#endif/*__PRACRO_LUARESUME_H__*/ diff --git a/server/src/resumeparser.cc b/server/src/resumeparser.cc index 45d3645..bf3483e 100644 --- a/server/src/resumeparser.cc +++ b/server/src/resumeparser.cc @@ -26,10 +26,13 @@   */  #include "resumeparser.h" +#include "luaresume.h"  #include <string.h> -std::string resume_parser(const char *format, Commit &commit) +static std::string resume_parser_format(Resume &r, Commit &commit)  { +  const char* format = r.attributes["format"].c_str(); +    std::string resume;    std::string var; @@ -95,3 +98,19 @@ std::string resume_parser(const char *format, Commit &commit)    return resume;  } + +static std::string resume_parser_lua(Resume &resume, Commit &commit) +{ +  LUAResume luaresume(commit); +   +  return luaresume.run(resume.attributes["format"]); +} + +std::string resume_parser(Resume &resume, Commit &commit) +{ +  if(resume.attributes["language"] == "lua") +    return resume_parser_lua(resume, commit); + +  // Default to pracro format language. +  return resume_parser_format(resume, commit); +} diff --git a/server/src/resumeparser.h b/server/src/resumeparser.h index 3bf134b..0d3ff0c 100644 --- a/server/src/resumeparser.h +++ b/server/src/resumeparser.h @@ -29,7 +29,8 @@  #include <string>  #include "transaction.h" +#include "template.h" -std::string resume_parser(const char *format, Commit &commit); +std::string resume_parser(Resume &resume, Commit &commit);  #endif/*__PRACRO_RESUMEPARSER_H__*/ diff --git a/server/src/server.cc b/server/src/server.cc index 763964e..01e9398 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -94,7 +94,7 @@ static std::string handleTransaction(Transaction *transaction,          db->commit(transaction->user, transaction->cpr, *macro, commit.fields); -        std::string resume = resume_parser(macro->resume.attributes["format"].c_str(), commit); +        std::string resume = resume_parser(macro->resume, commit);          bool store_in_journal = true;          // We always need to store in journal! | 
