/** * @file src/session_history_storage.h * @brief Internal SQLite storage helpers for the session history subsystem. */ #pragma once // standard includes #include #include #include #include #include #include // lib includes #include // local includes #include "session_history.h" namespace session_history::storage { struct sqlite_deleter { void operator()(sqlite3 *db) const; }; using db_ptr = std::unique_ptr; struct stmt_deleter { void operator()(sqlite3_stmt *stmt) const; }; using stmt_ptr = std::unique_ptr; enum class delete_apply_e { deleted, not_found, failed }; struct prune_options_t { int max_history_sessions = 0; double prune_sessions_ended_before_unix = 0; std::uint64_t max_db_size_bytes = 0; }; stmt_ptr prepare(sqlite3 *db, const char *sql); bool exec(sqlite3 *db, const char *sql); double now_unix(); void tighten_history_db_permissions(const std::filesystem::path &db_path); bool open_write_db(const std::string &db_path, db_ptr &out_db); bool open_read_db(const std::string &db_path, db_ptr &out_db); bool open_memory_db(db_ptr &out_db); bool apply_schema_and_migrations(sqlite3 *db, int schema_version); bool process_begin(sqlite3 *db, const session_metadata_t &metadata); bool process_begin_at(sqlite3 *db, const session_metadata_t &metadata, double start_time_unix); bool process_end(sqlite3 *db, const std::string &uuid); bool process_end_at(sqlite3 *db, const std::string &uuid, double end_time_unix); bool process_sample(sqlite3 *db, const session_sample_t &sample, int max_samples_per_session); bool process_event(sqlite3 *db, const session_event_t &event, int max_events_per_session); delete_apply_e process_delete(sqlite3 *db, const std::string &uuid); bool process_prune(sqlite3 *db, const prune_options_t &options); bool checkpoint(sqlite3 *db); #ifdef SUNSHINE_TESTS bool force_set_end_time(sqlite3 *db, const std::string &uuid, double end_time_unix); #endif std::vector read_session_summaries(sqlite3 *db, int limit, int offset); std::optional read_session_detail( sqlite3 *db, const std::string &uuid, bool include_all, int default_detail_sample_limit, int default_detail_event_limit); } // namespace session_history::storage