Initial commit: Эфир мессенджер
This commit is contained in:
52
internal/repository/sqlite/db.go
Normal file
52
internal/repository/sqlite/db.go
Normal file
@@ -0,0 +1,52 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user