pkg/rules/databasesql/sqlcache.go (45 lines of code) (raw):
// Copyright (c) 2025 Alibaba Group Holding Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package databasesql
import (
"github.com/cespare/xxhash/v2"
lru "github.com/hashicorp/golang-lru/v2"
)
type SQLMeta struct {
stmt string
operation string
collection string
params []any
}
type SQLMetaCache struct {
cache *lru.Cache[uint64, SQLMeta]
}
func NewSQLMetaCache(size int) (*SQLMetaCache, error) {
cache, err := lru.New[uint64, SQLMeta](size)
if err != nil {
return nil, err
}
return &SQLMetaCache{
cache: cache,
}, nil
}
func computeHash(sql string) uint64 {
return xxhash.Sum64String(sql)
}
func (c *SQLMetaCache) Get(key string) (SQLMeta, bool) {
hash := computeHash(key)
return c.cache.Get(hash)
}
func (c *SQLMetaCache) Add(key string, value SQLMeta) bool {
hash := computeHash(key)
return c.cache.Add(hash, value)
}
func (c *SQLMetaCache) Remove(key string) bool {
hash := computeHash(key)
return c.cache.Remove(hash)
}
func (c *SQLMetaCache) Contains(key string) bool {
hash := computeHash(key)
return c.cache.Contains(hash)
}
func (c *SQLMetaCache) Len() int {
return c.cache.Len()
}