You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.9 KiB
58 lines
1.9 KiB
// Package stmtcache is a cache that can be used to implement lazy prepared statements. |
|
package stmtcache |
|
|
|
import ( |
|
"context" |
|
|
|
"github.com/jackc/pgconn" |
|
) |
|
|
|
const ( |
|
ModePrepare = iota // Cache should prepare named statements. |
|
ModeDescribe // Cache should prepare the anonymous prepared statement to only fetch the description of the statement. |
|
) |
|
|
|
// Cache prepares and caches prepared statement descriptions. |
|
type Cache interface { |
|
// Get returns the prepared statement description for sql preparing or describing the sql on the server as needed. |
|
Get(ctx context.Context, sql string) (*pgconn.StatementDescription, error) |
|
|
|
// Clear removes all entries in the cache. Any prepared statements will be deallocated from the PostgreSQL session. |
|
Clear(ctx context.Context) error |
|
|
|
// StatementErrored informs the cache that the given statement resulted in an error when it |
|
// was last used against the database. In some cases, this will cause the cache to maer that |
|
// statement as bad. The bad statement will instead be flushed during the next call to Get |
|
// that occurs outside of a failed transaction. |
|
StatementErrored(sql string, err error) |
|
|
|
// Len returns the number of cached prepared statement descriptions. |
|
Len() int |
|
|
|
// Cap returns the maximum number of cached prepared statement descriptions. |
|
Cap() int |
|
|
|
// Mode returns the mode of the cache (ModePrepare or ModeDescribe) |
|
Mode() int |
|
} |
|
|
|
// New returns the preferred cache implementation for mode and cap. mode is either ModePrepare or ModeDescribe. cap is |
|
// the maximum size of the cache. |
|
func New(conn *pgconn.PgConn, mode int, cap int) Cache { |
|
mustBeValidMode(mode) |
|
mustBeValidCap(cap) |
|
|
|
return NewLRU(conn, mode, cap) |
|
} |
|
|
|
func mustBeValidMode(mode int) { |
|
if mode != ModePrepare && mode != ModeDescribe { |
|
panic("mode must be ModePrepare or ModeDescribe") |
|
} |
|
} |
|
|
|
func mustBeValidCap(cap int) { |
|
if cap < 1 { |
|
panic("cache must have cap of >= 1") |
|
} |
|
}
|
|
|