/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/core/database.cpp
121 строка
4 KB
Андрей
feat: top N keys + scan stream (range/top/all) with pagination
14 июл 2026, 12:56
14 июл 2026, 12:56
56c6264
Код
Авторство
О чём код?
#include "database.hpp" #include <stdexcept> namespace sstorage { //============================================================================ // Конструктор / деструктор //============================================================================ Database::Database(const Config& config) : config_(config), lsm_(std::make_unique<LSMTree>(config.dataDirectory(), config.lsmOptions())) { } Database::~Database() { close(); } //============================================================================ // open / close //============================================================================ bool Database::open() { if (opened_) return true; if (!lsm_->open()) return false; opened_ = true; return true; } void Database::close() { if (!opened_) return; if (lsm_) lsm_->close(); opened_ = false; } //============================================================================ // put — валидация размеров + делегация LSM //============================================================================ bool Database::put(const std::string& key, const std::string& value) { if (!opened_) return false; if (key.empty()) return false; // пустой ключ запрещён if (key.size() > config_.maxKeySize()) return false; if (value.size() > config_.maxValueSize()) return false; return lsm_->put(key, value); } //============================================================================ // get //============================================================================ std::optional<std::string> Database::get(const std::string& key) { if (!opened_ || key.empty()) return std::nullopt; return lsm_->get(key); } //============================================================================ // remove //============================================================================ bool Database::remove(const std::string& key) { if (!opened_) return false; if (key.empty() || key.size() > config_.maxKeySize()) return false; return lsm_->remove(key); } //============================================================================ // scan //============================================================================ std::vector<std::pair<std::string, std::string>> Database::scan( const std::string& fromKey, const std::string& toKey, size_t limit) { if (!opened_) return {}; return lsm_->scan(fromKey, toKey, limit); } //============================================================================ // Потоковый обход + top. См. contract S1. //============================================================================ size_t Database::scanStream(const std::string& fromKey, const std::string& toKey, size_t limit, const ScanCallback& callback) { if (!opened_) return 0; return lsm_->scanStream(fromKey, toKey, limit, callback); } size_t Database::scanAll(size_t limit, const ScanCallback& callback) { if (!opened_) return 0; return lsm_->scanAll(limit, callback); } std::vector<std::pair<std::string, std::string>> Database::top(size_t n) { if (!opened_) return {}; return lsm_->top(n); } //============================================================================ // Административные операции //============================================================================ bool Database::flush() { if (!opened_) return false; return lsm_->flush(); } bool Database::compact() { if (!opened_) return false; return lsm_->compact(); } //============================================================================ // stats — пересбор LSM-статистики в DatabaseStats //============================================================================ DatabaseStats Database::stats() const { DatabaseStats s; if (!lsm_) return s; auto lsmStats = lsm_->stats(); s.memtableSize = lsmStats.memtableSize; s.immutableCount = lsmStats.immutableCount; s.levelRecords = lsmStats.levelSizes; s.levelFileCounts = lsmStats.levelFileCounts; s.totalRecords = lsmStats.totalRecords; return s; } }