Ctrl K
ComunidadGuías…

server/src/session_history_storage.h

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @file src/session_history_storage.h
 * @brief Internal SQLite storage helpers for the session history subsystem.
 */
#pragma once

// standard includes
#include <cstdint>
#include <filesystem>
#include <memory>
#include <optional>
#include <string>
#include <vector>

// lib includes
#include <sqlite3.h>

// local includes
#include "session_history.h"

namespace session_history::storage {

  struct sqlite_deleter {
    void operator()(sqlite3 *db) const;
  };

  using db_ptr = std::unique_ptr<sqlite3, sqlite_deleter>;

  struct stmt_deleter {
    void operator()(sqlite3_stmt *stmt) const;
  };

  using stmt_ptr = std::unique_ptr<sqlite3_stmt, stmt_deleter>;

  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<session_summary_t> read_session_summaries(sqlite3 *db, int limit, int offset);
  std::optional<session_detail_t> 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