if rw.Lock then no need for nested rw.RLock
parent
78511f25f3
commit
58904c8619
|
|
@ -14,16 +14,19 @@ type DB struct {
|
||||||
scheme string
|
scheme string
|
||||||
conn string
|
conn string
|
||||||
rw *sync.RWMutex
|
rw *sync.RWMutex
|
||||||
|
locked *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDB(ctx context.Context, scheme, conn string) (DB, error) {
|
func NewDB(ctx context.Context, scheme, conn string) (DB, error) {
|
||||||
ctx, can := context.WithTimeout(ctx, time.Second*10)
|
ctx, can := context.WithTimeout(ctx, time.Second*10)
|
||||||
defer can()
|
defer can()
|
||||||
|
|
||||||
|
locked := false
|
||||||
db := DB{
|
db := DB{
|
||||||
scheme: scheme,
|
scheme: scheme,
|
||||||
conn: conn,
|
conn: conn,
|
||||||
rw: &sync.RWMutex{},
|
rw: &sync.RWMutex{},
|
||||||
|
locked: &locked,
|
||||||
}
|
}
|
||||||
|
|
||||||
sql, err := db.dial(ctx)
|
sql, err := db.dial(ctx)
|
||||||
|
|
@ -38,12 +41,18 @@ func NewDB(ctx context.Context, scheme, conn string) (DB, error) {
|
||||||
func (db DB) WithLock(cb func() error) error {
|
func (db DB) WithLock(cb func() error) error {
|
||||||
db.rw.Lock()
|
db.rw.Lock()
|
||||||
defer db.rw.Unlock()
|
defer db.rw.Unlock()
|
||||||
|
*db.locked = true
|
||||||
|
defer func() {
|
||||||
|
*db.locked = false
|
||||||
|
}()
|
||||||
return cb()
|
return cb()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db DB) Exec(ctx context.Context, q string, args ...any) error {
|
func (db DB) Exec(ctx context.Context, q string, args ...any) error {
|
||||||
db.rw.RLock()
|
if !*db.locked {
|
||||||
defer db.rw.RUnlock()
|
db.rw.RLock()
|
||||||
|
defer db.rw.RUnlock()
|
||||||
|
}
|
||||||
return db.exec(ctx, q, args...)
|
return db.exec(ctx, q, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,8 +68,10 @@ func (db DB) exec(ctx context.Context, q string, args ...any) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db DB) Query(ctx context.Context, cb func(*sql.Rows) error, q string, args ...any) error {
|
func (db DB) Query(ctx context.Context, cb func(*sql.Rows) error, q string, args ...any) error {
|
||||||
db.rw.RLock()
|
if !*db.locked {
|
||||||
defer db.rw.RUnlock()
|
db.rw.RLock()
|
||||||
|
defer db.rw.RUnlock()
|
||||||
|
}
|
||||||
return db.query(ctx, cb, q, args...)
|
return db.query(ctx, cb, q, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue