51 lines
1.0 KiB
JavaScript
51 lines
1.0 KiB
JavaScript
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
// Copyright (c) 2015-2024 MariaDB Corporation Ab
|
|
|
|
'use strict';
|
|
const LRU = require('lru-cache');
|
|
|
|
/**
|
|
* LRU prepare cache
|
|
*
|
|
*/
|
|
class LruPrepareCache {
|
|
#lruCache;
|
|
#info;
|
|
constructor(info, prepareCacheLength) {
|
|
this.#info = info;
|
|
this.#lruCache = new LRU.LRUCache({
|
|
max: prepareCacheLength,
|
|
dispose: (value, key) => value.unCache()
|
|
});
|
|
}
|
|
|
|
get(sql) {
|
|
const key = this.#info.database + '|' + sql;
|
|
const cachedItem = this.#lruCache.get(key);
|
|
if (cachedItem) {
|
|
return cachedItem.incrementUse();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
set(sql, cache) {
|
|
const key = this.#info.database + '|' + sql;
|
|
this.#lruCache.set(key, cache);
|
|
}
|
|
|
|
toString() {
|
|
let keyStr = '';
|
|
for (const value of this.#lruCache.keys()) {
|
|
keyStr += '[' + value + '],';
|
|
}
|
|
if (keyStr.length > 1) keyStr = keyStr.substring(0, keyStr.length - 1);
|
|
return 'info{cache:' + keyStr + '}';
|
|
}
|
|
|
|
reset() {
|
|
this.#lruCache.clear();
|
|
}
|
|
}
|
|
|
|
module.exports = LruPrepareCache;
|