92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package db
|
||
|
||
import (
|
||
"fmt"
|
||
"reflect"
|
||
|
||
"log"
|
||
|
||
"git.belvedersky.ru/common/logger"
|
||
"git.belvedersky.ru/common/logger/service"
|
||
|
||
_ "github.com/jackc/pgx/stdlib"
|
||
"github.com/jmoiron/sqlx"
|
||
)
|
||
|
||
type DbConfig struct {
|
||
Host string // Хост
|
||
Port string // Порт
|
||
User string // Пользователь
|
||
Password string // Пароль
|
||
Db string // База
|
||
}
|
||
|
||
type PostgresRepository struct {
|
||
postgres *sqlx.DB
|
||
logger *service.LoggerService
|
||
Err service.TypeError
|
||
}
|
||
|
||
// Сервис для работы с базой
|
||
func New(cfg *DbConfig, l *logger.Logger) *PostgresRepository {
|
||
conn := fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=disable", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Db)
|
||
db, err := sqlx.Connect("pgx", conn)
|
||
if err != nil {
|
||
log.Fatalf("%v Ошибка подключения бд: %v", conn, err.Error())
|
||
}
|
||
return &PostgresRepository{postgres: db, logger: (*service.LoggerService)(l.Create("db")), Err: service.TypeError{Code: 500, Description: "Postgres Error"}}
|
||
}
|
||
|
||
func (s *PostgresRepository) GetDb() *sqlx.DB {
|
||
return s.postgres
|
||
}
|
||
|
||
func (s *PostgresRepository) GetLog() *service.LoggerService {
|
||
return s.logger
|
||
}
|
||
|
||
func (s *PostgresRepository) Close() {
|
||
if err := s.postgres.Close(); err != nil {
|
||
s.logger.Error(service.LogErrorStruct{Error: s.Err, Message: err.Error()})
|
||
}
|
||
}
|
||
|
||
func (s *PostgresRepository) Batch(query string, data []interface{}) error {
|
||
tx, err := s.postgres.Beginx()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
v := reflect.ValueOf(data[0])
|
||
maxBulkInsert := ((1 << 16) / v.NumField()) - 1
|
||
|
||
for i := 0; i < len(data); i += maxBulkInsert {
|
||
batch := data[i:min(i+maxBulkInsert, len(data))]
|
||
_, err := tx.NamedExec(query, batch)
|
||
if err != nil {
|
||
e := tx.Rollback()
|
||
if e != nil {
|
||
log.Printf("Couldn't rollback %+v", e)
|
||
}
|
||
log.Println(err)
|
||
}
|
||
}
|
||
|
||
err = tx.Commit()
|
||
if err != nil {
|
||
e := tx.Rollback()
|
||
if e != nil {
|
||
log.Printf("Couldn't rollback %+v", err)
|
||
}
|
||
log.Printf("Couldn't commit %+v", err)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func min(a, b int) int {
|
||
if a <= b {
|
||
return a
|
||
}
|
||
return b
|
||
}
|