From f2710089a722fc55970813fab2d27ae3e23a9c97 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 13 Jan 2009 10:01:52 +0000 Subject: Added a 'language' tag in resume, to be able to switch parser. Implemented the lua resume parser. --- server/src/Makefile.am | 14 ++++- server/src/luaresume.cc | 142 +++++++++++++++++++++++++++++++++++++++++++++ server/src/luaresume.h | 52 +++++++++++++++++ server/src/resumeparser.cc | 21 ++++++- server/src/resumeparser.h | 3 +- server/src/server.cc | 2 +- 6 files changed, 228 insertions(+), 6 deletions(-) create mode 100644 server/src/luaresume.cc create mode 100644 server/src/luaresume.h 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 + +#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 +#include + +#include "transaction.h" +#include + +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 -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 #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! -- cgit v1.2.3