all repos

onasty @ 9421348652ad6c8a94f027262927826adedcca0e

a one-time notes service

onasty/internal/store/psqlutil/psqlutil.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: send emails on sign-up (#6)..., 1 year ago
1
package psqlutil
2
3
import (
4
	"context"
5
	"errors"
6
7
	pgxuuid "github.com/jackc/pgx-gofrs-uuid"
8
	"github.com/jackc/pgx/v5"
9
	"github.com/jackc/pgx/v5/pgconn"
10
	"github.com/jackc/pgx/v5/pgxpool"
11
)
12
13
type DB struct{ *pgxpool.Pool }
14
15
func Connect(ctx context.Context, dsn string) (*DB, error) {
16
	dbConf, err := pgxpool.ParseConfig(dsn)
17
	if err != nil {
18
		return nil, err
19
	}
20
21
	dbConf.AfterConnect = func(_ context.Context, c *pgx.Conn) error {
22
		pgxuuid.Register(c.TypeMap())
23
		return nil
24
	}
25
26
	db, err := pgxpool.NewWithConfig(ctx, dbConf)
27
	if err != nil {
28
		return nil, err
29
	}
30
31
	if err := db.Ping(ctx); err != nil {
32
		return nil, err
33
	}
34
35
	return &DB{
36
		Pool: db,
37
	}, nil
38
}
39
40
func (db *DB) Close() error {
41
	db.Pool.Close()
42
	return nil
43
}
44
45
// IsDuplicateErr function that checks if the error is a duplicate key violation.
46
func IsDuplicateErr(err error, constraintName ...string) bool {
47
	var pgErr *pgconn.PgError
48
	if errors.As(err, &pgErr) {
49
		if len(constraintName) == 0 || len(constraintName) == 1 {
50
			return pgErr.Code == "23505" && // unique_violation
51
				pgErr.ConstraintName == constraintName[0]
52
		}
53
		return pgErr.Code == "23505" // unique_violation
54
	}
55
	return false
56
}