#include <Poco/FormattingChannel.h>\r
#include <Poco/PatternFormatter.h>\r
#include <iostream>\r
+#include <string>\r
+#include <cstring>\r
\r
#ifdef _WIN32\r
#include <direct.h>\r
#include <unistd.h>\r
#endif\r
\r
-FMSApp::FMSApp():m_displayhelp(false),m_showoptions(false),m_setoption(false),m_logtype("file")\r
+FMSApp::FMSApp():m_displayhelp(false),m_showoptions(false),m_setoption(false),m_logtype("file"),m_workingdirectory("")\r
{\r
-\r
+ // get current working dir so we can go to it later\r
+ char wd[1024];\r
+ char *wdptr=NULL;\r
+ memset(wd,0,1024);\r
+ wdptr=getcwd(wd,1023);\r
+ if(wdptr)\r
+ {\r
+ m_workingdirectory=wdptr;\r
+ }\r
}\r
\r
void FMSApp::defineOptions(Poco::Util::OptionSet &options)\r
{\r
ServerApplication::initialize(self);\r
\r
- // set working directory to program directory\r
- int rval=chdir(config().getString("application.dir").c_str());\r
+ // set working directory - fall back on application.dir if working directory isn't set\r
+ // if we are runing as a service, then working directory needs to be set to the application directory\r
+ if(m_workingdirectory=="" || config().getBool("application.runAsService",false)==true)\r
+ {\r
+ m_workingdirectory=config().getString("application.dir");\r
+ }\r
+ int rval=chdir(m_workingdirectory.c_str());\r
\r
SetupDB();\r
SetupDefaultOptions();\r
\r
// running as a daemon would reset the working directory to / before calling main\r
// so we need to set the working directory again\r
- // set working directory to program directory\r
- int rval=chdir(config().getString("application.dir").c_str());\r
+ int rval=chdir(m_workingdirectory.c_str());\r
\r
if(m_displayhelp)\r
{\r
{\r
logger().information("FMS startup v"FMS_VERSION);\r
\r
+ std::string tempval="";\r
+ Option::Instance()->Get("VacuumOnStartup",tempval);\r
+ if(tempval=="true")\r
+ {\r
+ logger().information("VACUUMing database");\r
+ SQLite3DB::DB::Instance()->Execute("VACUUM;");\r
+ }\r
+\r
StartThreads();\r
\r
if(isInteractive()==true)\r