snapshot of https://github.com/sqlc-dev/sqlc.git (main, 2026-09-16; blobs > 131072B omitted)
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled
This commit is contained in:
61
internal/pgx/poolcache/poolcache.go
Normal file
61
internal/pgx/poolcache/poolcache.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package poolcache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
type Cache struct {
|
||||
lock sync.RWMutex
|
||||
closed bool
|
||||
pools map[string]*pgxpool.Pool
|
||||
}
|
||||
|
||||
func New() *Cache {
|
||||
return &Cache{
|
||||
pools: map[string]*pgxpool.Pool{},
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cache) Open(ctx context.Context, uri string) (*pgxpool.Pool, error) {
|
||||
if c.closed {
|
||||
return nil, fmt.Errorf("poolcache is closed")
|
||||
}
|
||||
|
||||
c.lock.RLock()
|
||||
existing, found := c.pools[uri]
|
||||
c.lock.RUnlock()
|
||||
|
||||
if found {
|
||||
return existing, nil
|
||||
}
|
||||
|
||||
pool, err := pgxpool.New(ctx, uri)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c.lock.Lock()
|
||||
c.pools[uri] = pool
|
||||
c.lock.Unlock()
|
||||
|
||||
return pool, nil
|
||||
}
|
||||
|
||||
func (c *Cache) Close() error {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
||||
var closeErr error
|
||||
for _, pool := range c.pools {
|
||||
pool.Close()
|
||||
}
|
||||
|
||||
c.closed = true
|
||||
clear(c.pools)
|
||||
|
||||
return closeErr
|
||||
}
|
||||
Reference in New Issue
Block a user