chore: auto-commit (13 archivos)

- CMakeLists.txt
- agent_protocol.cpp
- agent_protocol.h
- app.md
- appicon.ico
- hosts_db.cpp
- hosts_db.h
- http_client.cpp
- http_client.h
- main.cpp
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 00:31:32 +02:00
commit 477bcd00f0
13 changed files with 1821 additions and 0 deletions
+97
View File
@@ -0,0 +1,97 @@
#include "samples_db.h"
#include <sqlite3.h>
namespace pex {
static const char* k_schema = R"SQL(
CREATE TABLE IF NOT EXISTS samples (
host_id INTEGER NOT NULL,
unix_ts INTEGER NOT NULL,
cpu_pct REAL NOT NULL,
ram_used_mb REAL NOT NULL,
ram_total_mb REAL NOT NULL,
disk_read_mb_s REAL NOT NULL,
disk_write_mb_s REAL NOT NULL,
net_rx_mb_s REAL NOT NULL,
net_tx_mb_s REAL NOT NULL,
gpu_pct REAL NOT NULL,
PRIMARY KEY(host_id, unix_ts)
);
CREATE INDEX IF NOT EXISTS idx_samples_host_ts ON samples(host_id, unix_ts);
)SQL";
SamplesDb::SamplesDb() = default;
SamplesDb::~SamplesDb() { close(); }
bool SamplesDb::open(const std::string& path) {
if (sqlite3_open(path.c_str(), &db_) != SQLITE_OK) {
db_ = nullptr;
return false;
}
char* err = nullptr;
if (sqlite3_exec(db_, k_schema, nullptr, nullptr, &err) != SQLITE_OK) {
sqlite3_free(err);
close();
return false;
}
return true;
}
void SamplesDb::close() {
if (db_) { sqlite3_close(db_); db_ = nullptr; }
}
bool SamplesDb::insert(const Sample& s) {
if (!db_) return false;
const char* sql =
"INSERT OR REPLACE INTO samples(host_id,unix_ts,cpu_pct,ram_used_mb,ram_total_mb,"
"disk_read_mb_s,disk_write_mb_s,net_rx_mb_s,net_tx_mb_s,gpu_pct) "
"VALUES(?,?,?,?,?,?,?,?,?,?)";
sqlite3_stmt* st = nullptr;
if (sqlite3_prepare_v2(db_, sql, -1, &st, nullptr) != SQLITE_OK) return false;
sqlite3_bind_int64(st, 1, s.host_id);
sqlite3_bind_int64(st, 2, s.unix_ts);
sqlite3_bind_double(st, 3, s.cpu_pct);
sqlite3_bind_double(st, 4, s.ram_used_mb);
sqlite3_bind_double(st, 5, s.ram_total_mb);
sqlite3_bind_double(st, 6, s.disk_read_mb_s);
sqlite3_bind_double(st, 7, s.disk_write_mb_s);
sqlite3_bind_double(st, 8, s.net_rx_mb_s);
sqlite3_bind_double(st, 9, s.net_tx_mb_s);
sqlite3_bind_double(st, 10, s.gpu_pct);
bool ok = sqlite3_step(st) == SQLITE_DONE;
sqlite3_finalize(st);
return ok;
}
std::vector<Sample> SamplesDb::query_range(int64_t host_id, int64_t unix_from, int64_t unix_to) {
std::vector<Sample> out;
if (!db_) return out;
const char* sql =
"SELECT host_id,unix_ts,cpu_pct,ram_used_mb,ram_total_mb,"
"disk_read_mb_s,disk_write_mb_s,net_rx_mb_s,net_tx_mb_s,gpu_pct "
"FROM samples WHERE host_id=? AND unix_ts BETWEEN ? AND ? ORDER BY unix_ts ASC";
sqlite3_stmt* st = nullptr;
if (sqlite3_prepare_v2(db_, sql, -1, &st, nullptr) != SQLITE_OK) return out;
sqlite3_bind_int64(st, 1, host_id);
sqlite3_bind_int64(st, 2, unix_from);
sqlite3_bind_int64(st, 3, unix_to);
while (sqlite3_step(st) == SQLITE_ROW) {
Sample s;
s.host_id = sqlite3_column_int64(st, 0);
s.unix_ts = sqlite3_column_int64(st, 1);
s.cpu_pct = (float)sqlite3_column_double(st, 2);
s.ram_used_mb = (float)sqlite3_column_double(st, 3);
s.ram_total_mb = (float)sqlite3_column_double(st, 4);
s.disk_read_mb_s = (float)sqlite3_column_double(st, 5);
s.disk_write_mb_s = (float)sqlite3_column_double(st, 6);
s.net_rx_mb_s = (float)sqlite3_column_double(st, 7);
s.net_tx_mb_s = (float)sqlite3_column_double(st, 8);
s.gpu_pct = (float)sqlite3_column_double(st, 9);
out.push_back(s);
}
sqlite3_finalize(st);
return out;
}
} // namespace pex