package sqlite import ( "database/sql" "fmt" "messenger/internal/pkg/logger" "time" _ "modernc.org/sqlite" ) type DB struct { *sql.DB } func NewDB(dbPath string) (*DB, error) { // Подключение к SQLite с оптимизациями db, err := sql.Open("sqlite", fmt.Sprintf("%s?_journal=WAL&_foreign_keys=on&_busy_timeout=5000", dbPath)) if err != nil { return nil, fmt.Errorf("failed to open database: %w", err) } // Настройка пула соединений db.SetMaxOpenConns(25) db.SetMaxIdleConns(10) db.SetConnMaxLifetime(5 * time.Minute) // Проверка соединения if err := db.Ping(); err != nil { return nil, fmt.Errorf("failed to ping database: %w", err) } // Автоматически выполняем миграции if err := RunMigrations(db, "./migrations"); err != nil { logger.Error("Failed to run migrations", "error", err) // Не возвращаем ошибку, продолжаем работу } logger.Info("SQLite database connected", "path", dbPath) return &DB{DB: db}, nil } func (db *DB) Close() error { logger.Info("Closing SQLite database connection") return db.DB.Close() } // BeginTx начинает транзакцию func (db *DB) BeginTx() (*sql.Tx, error) { return db.DB.Begin() }