#pragma once #include "wayy_db/table.hpp" #include #include #include #include #include namespace wayy_db { /// High-level database interface managing multiple tables class Database { public: /// Create an in-memory database Database(); /// Create or open a persistent database at the given path explicit Database(const std::string& path); /// Move-only semantics Database(Database&&) = default; Database& operator=(Database&&) = default; Database(const Database&) = delete; Database& operator=(const Database&) = delete; ~Database() = default; /// Database path (empty for in-memory) const std::string& path() const { return path_; } /// Check if database is persistent bool is_persistent() const { return !path_.empty(); } /// List all table names std::vector tables() const; /// Check if a table exists bool has_table(const std::string& name) const; /// Get a table by name (loads from disk if persistent and not cached) Table& table(const std::string& name); Table& operator[](const std::string& name) { return table(name); } /// Create a new table Table& create_table(const std::string& name); /// Add an existing table to the database void add_table(Table table); /// Drop a table (removes from disk if persistent) void drop_table(const std::string& name); /// Save all modified tables to disk (no-op for in-memory) void save(); /// Reload table list from disk void refresh(); private: std::string path_; std::unordered_map tables_; std::unordered_map loaded_; // Track which tables are loaded // Mutex for thread-safe access (mutable allows const methods to lock) // Uses shared_mutex for concurrent reads, exclusive writes mutable std::shared_mutex mutex_; /// Get the directory path for a table std::string table_path(const std::string& name) const; /// Scan directory for existing tables void scan_tables(); }; } // namespace wayy_db