diff --git a/cmd/futriis/main.go b/cmd/futriis/main.go new file mode 100644 index 0000000..59631dd --- /dev/null +++ b/cmd/futriis/main.go @@ -0,0 +1,81 @@ +// /futriis/cmd/futriis/main.go +// Клиентское приложение СУБД Futriis +// Обеспечивает интерактивный интерфейс для выполнения команд + +package main + +import ( + "fmt" + "os" + "os/signal" + "path/filepath" + "syscall" + + "futriis/internal/client" + "futriis/internal/engine" + "futriis/pkg/config" + "futriis/pkg/utils" +) + +func main() { + // Определяем путь к файлу конфигурации + configPath := "config.toml" + + // Проверяем, существует ли файл в текущей директории + if _, err := os.Stat(configPath); os.IsNotExist(err) { + // Если нет, пробуем найти в родительской директории (для случая запуска из cmd/futriis) + configPath = filepath.Join("..", "..", "config.toml") + + // Проверяем, существует ли файл по новому пути + if _, err := os.Stat(configPath); os.IsNotExist(err) { + // Если файл не найден, используем абсолютный путь относительно домашней директории + homeDir, _ := os.UserHomeDir() + configPath = filepath.Join(homeDir, "futriis", "config.toml") + } + } + + // Загружаем конфигурацию + cfg, err := config.Load(configPath) + if err != nil { + fmt.Printf("Ошибка загрузки конфигурации: %v\n", err) + os.Exit(1) + } + + // Инициализируем логгеры + utils.InitLogger("") + + // Инициализируем файловый логгер + if err := utils.InitFileLogger(cfg.Node.AOFFile); err != nil { + utils.PrintWarning("Не удалось инициализировать файловый логгер: %v", err) + } + defer func() { + if logger := utils.GetFileLogger(); logger != nil { + logger.Close() + } + }() + + // Создаём движок + eng := engine.NewEngine() + + // Выводим баннер с именем кластера из конфига и проверкой восстановления из AOF + utils.PrintBanner(cfg.Cluster.Name, eng.WasAOFRecovered()) + + // Создаём обработчик команд + handler := client.NewCommandHandler(eng) + + // Обработка сигналов для graceful shutdown + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigChan + fmt.Println() + os.Exit(0) + }() + + // Запускаем REPL + if err := handler.RunREPL(); err != nil { + utils.PrintError("%v", err) + os.Exit(1) + } +}