summaryrefslogtreecommitdiff
path: root/src/ingestor.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-09-09 23:45:39 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2025-09-10 18:28:33 +0100
commitc9b3d45d2598ebef2df889c0b9967ef473405528 (patch)
treeb99724362575e8a782bd3c2aebbd8f54b075a42b /src/ingestor.cpp
parent2eb8897706128f3590a5b4f9ee8f3e755b74f097 (diff)
downloadwebstat-c9b3d45d2598ebef2df889c0b9967ef473405528.tar.bz2
webstat-c9b3d45d2598ebef2df889c0b9967ef473405528.tar.xz
webstat-c9b3d45d2598ebef2df889c0b9967ef473405528.zip
Use curl_multi_poll in main ingestLog loop
Preparation step for having background curl operations.
Diffstat (limited to 'src/ingestor.cpp')
-rw-r--r--src/ingestor.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/ingestor.cpp b/src/ingestor.cpp
index 87167b5..6dd369e 100644
--- a/src/ingestor.cpp
+++ b/src/ingestor.cpp
@@ -58,7 +58,7 @@ namespace WebStat {
}
Ingestor::Ingestor(const utsname & host, DB::ConnectionPoolPtr dbpl) :
- hostnameId {crc32(host.nodename)}, dbpool {std::move(dbpl)}
+ hostnameId {crc32(host.nodename)}, dbpool {std::move(dbpl)}, curl {curl_multi_init()}
{
auto dbconn = dbpool->get();
auto ins = dbconn->modify(SQL::HOST_UPSERT, SQL::HOST_UPSERT_OPTS);
@@ -89,9 +89,18 @@ namespace WebStat {
void
Ingestor::ingestLog(std::FILE * input)
{
- while (auto line = scn::scan<std::string>(input, "{:[^\n]}\n")) {
- linesRead++;
- ingestLogLine(dbpool->get().get(), line->value());
+ curl_waitfd logIn {.fd = fileno(input), .events = CURL_WAIT_POLLIN, .revents = 0};
+
+ while (curl_multi_poll(curl.get(), &logIn, 1, INT_MAX, nullptr) == CURLM_OK) {
+ if (logIn.revents) {
+ if (auto line = scn::scan<std::string>(input, "{:[^\n]}\n")) {
+ linesRead++;
+ ingestLogLine(dbpool->get().get(), line->value());
+ }
+ else {
+ break;
+ }
+ }
}
}