func (c *LRU) Mode() int {
	return c.mode
}
Mode returns the mode of the cache (ModePrepare or ModeDescribe)
package stmtcache
import (
	"container/list"
	"context"
	"fmt"
	"sync/atomic"
	"github.com/jackc/pgconn"
)
var lruCount uint64
type LRU struct {
	conn         *pgconn.PgConn
	mode         int
	cap          int
	prepareCount int
	m            map[string]*list.Element
	l            *list.List
	psNamePrefix string
	stmtsToClear []string
}
func NewLRU(conn *pgconn.PgConn, mode int, cap int) *LRU {
	mustBeValidMode(mode)
	mustBeValidCap(cap)
	n := atomic.AddUint64(&lruCount, 1)
	return &LRU{
		conn:         conn,
		mode:         mode,
		cap:          cap,
		m:            make(map[string]*list.Element),
		l:            list.New(),
		psNamePrefix: fmt.Sprintf("lrupsc_%d", n),
	}
}
func (c *LRU) Get(ctx context.Context, sql string) (*pgconn.StatementDescription, error) {
	txStatus := c.conn.TxStatus()
	if (txStatus == 'I' || txStatus == 'T') && len(c.stmtsToClear) > 0 {
		for _, stmt := range c.stmtsToClear {
			err := c.clearStmt(ctx, stmt)
			if err != nil {
				return nil, err
			}
		}
	}
	if el, ok := c.m[sql]; ok {
		c.l.MoveToFront(el)
		return el.Value.(*pgconn.StatementDescription), nil
	}
	if c.l.Len() == c.cap {
		err := c.removeOldest(ctx)
		if err != nil {
			return nil, err
		}
	}
	psd, err := c.prepare(ctx, sql)
	if err != nil {
		return nil, err
	}
	el := c.l.PushFront(psd)
	c.m[sql] = el
	return psd, nil
}
func (c *LRU) Clear(ctx context.Context) error {
	for c.l.Len() > 0 {
		err := c.removeOldest(ctx)
		if err != nil {
			return err
		}
	}
	return nil
}
func (c *LRU) StatementErrored(sql string, err error) {
	pgErr, ok := err.(*pgconn.PgError)
	if !ok {
		return
	}
	isInvalidCachedPlanError := pgErr.Severity == "ERROR" &&
		pgErr.Code == "0A000" &&
		pgErr.Message == "cached plan must not change result type"
	if isInvalidCachedPlanError {
		c.stmtsToClear = append(c.stmtsToClear, sql)
	}
}
func (c *LRU) clearStmt(ctx context.Context, sql string) error {
	elem, inMap := c.m[sql]
	if !inMap {
		return nil
	}
	c.l.Remove(elem)
	psd := elem.Value.(*pgconn.StatementDescription)
	delete(c.m, psd.SQL)
	if c.mode == ModePrepare {
		return c.conn.Exec(ctx, fmt.Sprintf("deallocate %s", psd.Name)).Close()
	}
	return nil
}
func (c *LRU) Len() int {
	return c.l.Len()
}
func (c *LRU) Cap() int {
	return c.cap
}