Files
efir-api-server/internal/repository/sqlite/db.go

52 lines
1.3 KiB
Go
Raw Normal View History

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()
}