52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
|
|
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()
|
|||
|
|
}
|