diff --git a/src/RESTAPI/RESTAPI_board_timepoint_handler.cpp b/src/RESTAPI/RESTAPI_board_timepoint_handler.cpp index 356d88f..4188bc1 100644 --- a/src/RESTAPI/RESTAPI_board_timepoint_handler.cpp +++ b/src/RESTAPI/RESTAPI_board_timepoint_handler.cpp @@ -34,6 +34,15 @@ namespace OpenWifi { AnalyticsObjects::DeviceTimePointList Points; StorageService()->TimePointsDB().SelectRecords(fromDate, endDate, maxRecords, Points.points); + + // sort by timestamp & serial number. + std::sort( Points.points.begin(), Points.points.end()); + + // your first point's serial number is your separator. So you need to slice the points array + // into timestamp slots + + + Poco::JSON::Object Answer; Points.to_json(Answer); return ReturnObject(Answer); diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.h b/src/RESTObjects/RESTAPI_AnalyticsObjects.h index 819526d..e3c4fb2 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.h +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.h @@ -210,6 +210,31 @@ namespace OpenWifi { void to_json(Poco::JSON::Object &Obj) const; bool from_json(const Poco::JSON::Object::Ptr &Obj); + + inline bool operator<(const DeviceTimePoint &rhs) const { + if(timestamp < rhs.timestamp) + return true; + if(timestamp > rhs.timestamp) + return false; + if(device_info.serialNumber < rhs.device_info.serialNumber) + return true; + return false; + } + + inline bool operator==(const DeviceTimePoint &rhs) const { + return timestamp==rhs.timestamp && device_info.serialNumber==rhs.device_info.serialNumber; + } + + inline bool operator>(const DeviceTimePoint &rhs) const { + if(timestamp > rhs.timestamp) + return true; + if(timestamp < rhs.timestamp) + return false; + if(device_info.serialNumber > rhs.device_info.serialNumber) + return true; + return false; + } + }; struct DeviceTimePointList { diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index cc75328..8b6e0a2 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -1802,7 +1802,7 @@ namespace OpenWifi { [[nodiscard]] inline bool NeedAdditionalInfo() const { return QB_.AdditionalInfo; } [[nodiscard]] inline const std::vector & SelectedRecords() const { return QB_.Select; } - [[nodiscard]] inline const Poco::JSON::Object::Ptr & ParseStream() { + [[nodiscard]] inline const Poco::JSON::Object::Ptr ParseStream() { return IncomingParser_.parse(Request->stream()).extract(); } @@ -1855,28 +1855,28 @@ namespace OpenWifi { } [[nodiscard]] inline uint64_t GetParameter(const std::string &Name, const uint64_t Default) { - auto Hint = std::find_if(Parameters_.begin(),Parameters_.end(),[Name](const std::pair &S){ return S.first==Name; }); + auto Hint = std::find_if(Parameters_.begin(),Parameters_.end(),[&](const std::pair &S){ return S.first==Name; }); if(Hint==Parameters_.end() || !is_number(Hint->second)) return Default; return std::stoull(Hint->second); } [[nodiscard]] inline bool GetBoolParameter(const std::string &Name, bool Default=false) { - auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[Name](const std::pair &S){ return S.first==Name; }); + auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[&](const std::pair &S){ return S.first==Name; }); if(Hint==end(Parameters_) || !is_bool(Hint->second)) return Default; return Hint->second=="true"; } [[nodiscard]] inline std::string GetParameter(const std::string &Name, const std::string &Default="") { - auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[Name](const std::pair &S){ return S.first==Name; }); + auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[&](const std::pair &S){ return S.first==Name; }); if(Hint==end(Parameters_)) return Default; return Hint->second; } [[nodiscard]] inline bool HasParameter(const std::string &Name, std::string &Value) { - auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[Name](const std::pair &S){ return S.first==Name; }); + auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[&](const std::pair &S){ return S.first==Name; }); if(Hint==end(Parameters_)) return false; Value = Hint->second; @@ -1884,7 +1884,7 @@ namespace OpenWifi { } [[nodiscard]] inline bool HasParameter(const std::string &Name, uint64_t & Value) { - auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[Name](const std::pair &S){ return S.first==Name; }); + auto Hint = std::find_if(begin(Parameters_),end(Parameters_),[&](const std::pair &S){ return S.first==Name; }); if(Hint==end(Parameters_)) return false; Value = std::stoull(Hint->second); @@ -2852,7 +2852,7 @@ namespace OpenWifi { RESTAPI_ExtServer() noexcept: SubSystemServer("RESTAPI_ExtServer", "RESTAPIServer", "openwifi.restapi"), - Pool_("RESTAPI_ExternalPool") + Pool_("RESTAPI_ExtServer",4,50,120) { } }; @@ -2993,9 +2993,9 @@ namespace OpenWifi { RESTAPI_IntServer() noexcept: SubSystemServer("RESTAPI_IntServer", "REST-ISRV", "openwifi.internal.restapi"), - Pool_("RESTAPI_IntServerPool") - { - } + Pool_("RESTAPI_IntServer",4,50,120) + { + } }; inline auto RESTAPI_IntServer() { return RESTAPI_IntServer::instance(); }; @@ -3711,14 +3711,12 @@ namespace OpenWifi { Server_.InitLogging(); for(const auto & Svr: ConfigServersList_) { - Logger().information(Poco::format("Starting: %s:%s Keyfile:%s CertFile: %s", Svr.Address(), std::to_string(Svr.Port()), - Svr.KeyFile(),Svr.CertFile())); - - auto Sock{ MicroService::instance().NoAPISecurity() ? Svr.CreateSocket(Logger()) : Svr.CreateSecureSocket(Logger())}; if(MicroService::instance().NoAPISecurity()) { - Logger().information("Security has been disabled for APIs."); + Logger().information(Poco::format("Starting: %s:%s. Security has been disabled for APIs.", Svr.Address(), std::to_string(Svr.Port()))); } else { + Logger().information(Poco::format("Starting: %s:%s Keyfile:%s CertFile: %s", Svr.Address(), std::to_string(Svr.Port()), + Svr.KeyFile(),Svr.CertFile())); Svr.LogCert(Logger()); if (!Svr.RootCA().empty()) Svr.LogCas(Logger()); @@ -3729,7 +3727,14 @@ namespace OpenWifi { Params->setMaxQueued(200); Params->setKeepAlive(true); - auto NewServer = std::make_unique(new ExtRequestHandlerFactory(Server_), Pool_, Sock, Params); + std::unique_ptr NewServer; + if(MicroService::instance().NoAPISecurity()) { + auto Sock{Svr.CreateSocket(Logger())}; + NewServer = std::make_unique(new ExtRequestHandlerFactory(Server_), Pool_, Sock, Params); + } else { + auto Sock{Svr.CreateSecureSocket(Logger())}; + NewServer = std::make_unique(new ExtRequestHandlerFactory(Server_), Pool_, Sock, Params); + }; NewServer->start(); RESTServers_.push_back(std::move(NewServer)); } @@ -3742,14 +3747,12 @@ namespace OpenWifi { Server_.InitLogging(); for(const auto & Svr: ConfigServersList_) { - Logger().information(Poco::format("Starting: %s:%s Keyfile:%s CertFile: %s", Svr.Address(), std::to_string(Svr.Port()), - Svr.KeyFile(),Svr.CertFile())); - - auto Sock{ MicroService::instance().NoAPISecurity() ? Svr.CreateSocket(Logger()) : Svr.CreateSecureSocket(Logger())}; if(MicroService::instance().NoAPISecurity()) { - Logger().information("Security has been disabled for APIs."); + Logger().information(Poco::format("Starting: %s:%s. Security has been disabled for APIs.", Svr.Address(), std::to_string(Svr.Port()))); } else { + Logger().information(Poco::format("Starting: %s:%s Keyfile:%s CertFile: %s", Svr.Address(), std::to_string(Svr.Port()), + Svr.KeyFile(),Svr.CertFile())); Svr.LogCert(Logger()); if (!Svr.RootCA().empty()) Svr.LogCas(Logger()); @@ -3760,7 +3763,14 @@ namespace OpenWifi { Params->setMaxQueued(200); Params->setKeepAlive(true); - auto NewServer = std::make_unique(new IntRequestHandlerFactory(Server_), Pool_, Sock, Params); + std::unique_ptr NewServer; + if(MicroService::instance().NoAPISecurity()) { + auto Sock{Svr.CreateSocket(Logger())}; + NewServer = std::make_unique(new ExtRequestHandlerFactory(Server_), Pool_, Sock, Params); + } else { + auto Sock{Svr.CreateSecureSocket(Logger())}; + NewServer = std::make_unique(new ExtRequestHandlerFactory(Server_), Pool_, Sock, Params); + }; NewServer->start(); RESTServers_.push_back(std::move(NewServer)); } diff --git a/src/framework/StorageClass.h b/src/framework/StorageClass.h index 78e6050..e88ec64 100644 --- a/src/framework/StorageClass.h +++ b/src/framework/StorageClass.h @@ -57,7 +57,7 @@ namespace OpenWifi { inline int Setup_PostgreSQL(); protected: - Poco::SharedPtr Pool_; + std::unique_ptr Pool_; Poco::Data::SQLite::Connector SQLiteConn_; Poco::Data::PostgreSQL::Connector PostgresConn_; Poco::Data::MySQL::Connector MySQLConn_; @@ -73,18 +73,22 @@ namespace OpenWifi { Logger().notice("SQLite StorageClass enabled."); dbType_ = sqlite; auto DBName = MicroService::instance().DataDir() + "/" + MicroService::instance().ConfigGetString("storage.type.sqlite.db"); - auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64); - auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60); - SQLiteConn_.registerConnector(); - Pool_ = Poco::SharedPtr(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 4, NumSessions, IdleTime)); + int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64); + int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60); + + Poco::Data::SQLite::Connector::registerConnector(); +// Pool_ = std::make_unique(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8, +// (int)NumSessions, (int)IdleTime)); + Pool_ = std::make_unique(SQLiteConn_.name(), DBName, 8, + (int)NumSessions, (int)IdleTime); return 0; } inline int StorageClass::Setup_MySQL() { Logger().notice("MySQL StorageClass enabled."); dbType_ = mysql; - auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.mysql.maxsessions", 64); - auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.mysql.idletime", 60); + int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.mysql.maxsessions", 64); + int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.mysql.idletime", 60); auto Host = MicroService::instance().ConfigGetString("storage.type.mysql.host"); auto Username = MicroService::instance().ConfigGetString("storage.type.mysql.username"); auto Password = MicroService::instance().ConfigGetString("storage.type.mysql.password"); @@ -99,8 +103,8 @@ namespace OpenWifi { ";port=" + Port + ";compress=true;auto-reconnect=true"; - MySQLConn_.registerConnector(); - Pool_ = Poco::SharedPtr(new Poco::Data::SessionPool(MySQLConn_.name(), ConnectionStr, 4, NumSessions, IdleTime)); + Poco::Data::MySQL::Connector::registerConnector(); + Pool_ = std::make_unique(MySQLConn_.name(), ConnectionStr, 8, NumSessions, IdleTime); return 0; } @@ -108,8 +112,8 @@ namespace OpenWifi { inline int StorageClass::Setup_PostgreSQL() { Logger().notice("PostgreSQL StorageClass enabled."); dbType_ = pgsql; - auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.postgresql.maxsessions", 64); - auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.postgresql.idletime", 60); + int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.postgresql.maxsessions", 64); + int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.postgresql.idletime", 60); auto Host = MicroService::instance().ConfigGetString("storage.type.postgresql.host"); auto Username = MicroService::instance().ConfigGetString("storage.type.postgresql.username"); auto Password = MicroService::instance().ConfigGetString("storage.type.postgresql.password"); @@ -125,8 +129,8 @@ namespace OpenWifi { " port=" + Port + " connect_timeout=" + ConnectionTimeout; - PostgresConn_.registerConnector(); - Pool_ = Poco::SharedPtr(new Poco::Data::SessionPool(PostgresConn_.name(), ConnectionStr, 4, NumSessions, IdleTime)); + Poco::Data::PostgreSQL::Connector::registerConnector(); + Pool_ = std::make_unique(PostgresConn_.name(), ConnectionStr, 8, NumSessions, IdleTime); return 0; }