From a6884b049d958918d15c6c263a6c3c3421dc10a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=8D=E9=A9=AC?= Date: Fri, 12 Jul 2024 13:02:33 +0800 Subject: [PATCH] fix cache error. (#46) * fix cache error. * feat: augument type for fib-cache. --------- Co-authored-by: richardo2016 --- packages/orm/src/Model.ts | 2 +- packages/orm/src/Patch/fib-cache.ts | 46 +++++++++++++++++++++++ packages/orm/src/Singleton.ts | 31 +++++++-------- packages/orm/src/Typo/model.ts | 2 +- packages/orm/src/index.ts | 2 + packages/orm/typings/Patch/fib-cache.d.ts | 40 ++++++++++++++++++++ packages/orm/typings/Typo/model.d.ts | 3 +- packages/orm/typings/index.d.ts | 1 + 8 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 packages/orm/src/Patch/fib-cache.ts create mode 100644 packages/orm/typings/Patch/fib-cache.d.ts diff --git a/packages/orm/src/Model.ts b/packages/orm/src/Model.ts index 3f8f05e6..133f0d38 100644 --- a/packages/orm/src/Model.ts +++ b/packages/orm/src/Model.ts @@ -28,7 +28,7 @@ import { FxOrmSqlDDLSync } from '@fxjs/sql-ddl-sync'; import { FxOrmDMLDriver } from './Typo/DMLDriver'; import { FxOrmError } from './Typo/Error'; import { FxOrmQuery } from './Typo/query'; -const fc = require('fib-cache'); +import fc = require('fib-cache'); import type { FxSqlQuerySubQuery, diff --git a/packages/orm/src/Patch/fib-cache.ts b/packages/orm/src/Patch/fib-cache.ts new file mode 100644 index 00000000..ef323f14 --- /dev/null +++ b/packages/orm/src/Patch/fib-cache.ts @@ -0,0 +1,46 @@ +const fibCache = require('fib-cache'); + + +declare module "fib-cache" { + interface LRUOptions { + max?: number; + ttl?: number; + resolver?: (key: string) => any; + } + + interface LRUItem { + expiry: number; + key: string; + prev: LRUItem; + next: LRUItem; + owner: LRU; + value: any; + ready: Class_Event; + } + + export class LRU { + constructor(options?: LRUOptions); + items: Record; + size: number; + first: LRUItem; + last: LRUItem; + max: number; + ttl: number; + resolver: (key: string) => any; + + clear(): LRU; + delete_item(item: LRUItem): LRU; + delete(key: string): LRU; + entries(keys?: string[]): [string, any][]; + evict(): LRU; + get(key: string): any; + has(key: string): boolean; + keys(): string[]; + new_item(key: string, value?: any): LRUItem; + order_item(item: LRUItem): void; + set(key: string, value: any): LRU; + values(keys?: string[]): any[]; + } +} + +module.exports = fibCache; \ No newline at end of file diff --git a/packages/orm/src/Singleton.ts b/packages/orm/src/Singleton.ts index b42d47a2..d28916f5 100644 --- a/packages/orm/src/Singleton.ts +++ b/packages/orm/src/Singleton.ts @@ -27,7 +27,7 @@ export const clear: FxOrmNS.SingletonModule['clear'] = function (key?: string) { export const modelClear: FxOrmNS.SingletonModule['modelClear'] = function (model: FxOrmModel.Model, key?: string) { if (key && typeof key === "string") { - model.caches.remove(key); + model.caches.delete(key); } else { model.caches.clear(); } @@ -45,20 +45,21 @@ export const modelGet: FxOrmNS.SingletonModule['modelGet'] = function (model, ke if (opts.identityCache === false) return reFetchSync(); - if (model.caches.has(key)) - if (opts && opts.saveCheck && typeof model.caches.get(key).saved === "function" && !model.caches.get(key).saved()) + var value = model.caches.get(key); + + if (value !== undefined) + { + if (opts && opts.saveCheck && typeof value.saved === "function" && !value.saved()) // if not saved, don't return it, fetch original from db return reFetchSync(); - - const value = model.caches.get(key, function (_key: string) { - const new_value = reFetchSync(); - model.caches.set(_key, new_value); - - return new_value; - }); - - const expected_expire = typeof opts.identityCache === "number" ? (opts.identityCache * 1000) : model.caches.timeout; - const expire_expection_delta = expected_expire - model.caches.timeout; + }else + { + value = reFetchSync(); + model.caches.set(key, value); + } + + const expected_expire = typeof opts.identityCache === "number" ? (opts.identityCache * 1000) : model.caches.ttl; + const expire_expection_delta = expected_expire - model.caches.ttl; if (expire_expection_delta > 0) { coroutine.start(() => { @@ -69,14 +70,14 @@ export const modelGet: FxOrmNS.SingletonModule['modelGet'] = function (model, ke model.caches.set(key, value); if (expected_expire > Date.now()) { - model.caches.remove(key) + model.caches.delete(key) break } } }); } else if (expire_expection_delta < 0) { - setTimeout(() => model.caches.remove(key), expected_expire); + setTimeout(() => model.caches.delete(key), expected_expire); } return value; diff --git a/packages/orm/src/Typo/model.ts b/packages/orm/src/Typo/model.ts index 083a6743..20d0e40f 100644 --- a/packages/orm/src/Typo/model.ts +++ b/packages/orm/src/Typo/model.ts @@ -43,7 +43,7 @@ export namespace FxOrmModel { /* @nonenum */ uid: string; - caches: Class_LruCache; + caches: import('fib-cache').LRU; keys: string[]; diff --git a/packages/orm/src/index.ts b/packages/orm/src/index.ts index 9e2c0fcb..d83891f1 100644 --- a/packages/orm/src/index.ts +++ b/packages/orm/src/index.ts @@ -20,6 +20,8 @@ import { ORM } from './ORM'; export * as Property from "./Property"; +import './Patch/fib-cache'; + function isOrmLikeErrorEmitter(parsedDBDriver: IDbDriver | FxOrmNS.ORMLike): parsedDBDriver is FxOrmNS.ORMLike { return !parsedDBDriver.hasOwnProperty('host') && parsedDBDriver instanceof events.EventEmitter } diff --git a/packages/orm/typings/Patch/fib-cache.d.ts b/packages/orm/typings/Patch/fib-cache.d.ts new file mode 100644 index 00000000..d4f6466f --- /dev/null +++ b/packages/orm/typings/Patch/fib-cache.d.ts @@ -0,0 +1,40 @@ +/// +declare const fibCache: any; +declare module "fib-cache" { + interface LRUOptions { + max?: number; + ttl?: number; + resolver?: (key: string) => any; + } + interface LRUItem { + expiry: number; + key: string; + prev: LRUItem; + next: LRUItem; + owner: LRU; + value: any; + ready: Class_Event; + } + class LRU { + constructor(options?: LRUOptions); + items: Record; + size: number; + first: LRUItem; + last: LRUItem; + max: number; + ttl: number; + resolver: (key: string) => any; + clear(): LRU; + delete_item(item: LRUItem): LRU; + delete(key: string): LRU; + entries(keys?: string[]): [string, any][]; + evict(): LRU; + get(key: string): any; + has(key: string): boolean; + keys(): string[]; + new_item(key: string, value?: any): LRUItem; + order_item(item: LRUItem): void; + set(key: string, value: any): LRU; + values(keys?: string[]): any[]; + } +} diff --git a/packages/orm/typings/Typo/model.d.ts b/packages/orm/typings/Typo/model.d.ts index edfd4271..39db5759 100644 --- a/packages/orm/typings/Typo/model.d.ts +++ b/packages/orm/typings/Typo/model.d.ts @@ -1,4 +1,3 @@ -/// /// /// import type { FxOrmSqlDDLSync } from "@fxjs/sql-ddl-sync"; @@ -28,7 +27,7 @@ export declare namespace FxOrmModel { table: string; id: string[]; uid: string; - caches: Class_LruCache; + caches: import('fib-cache').LRU; keys: string[]; allProperties: Record; virtualProperties: Record; diff --git a/packages/orm/typings/index.d.ts b/packages/orm/typings/index.d.ts index 53ea7272..4c240085 100644 --- a/packages/orm/typings/index.d.ts +++ b/packages/orm/typings/index.d.ts @@ -12,6 +12,7 @@ import * as Helpers from "./Helpers"; import * as singleton from "./Singleton"; import { ORM } from './ORM'; export * as Property from "./Property"; +import './Patch/fib-cache'; export declare function connectSync(opts?: string | FxDbDriverNS.DBConnectionConfig): ORM; export declare function connect(uri?: string | FxDbDriverNS.DBConnectionConfig, cb?: FxOrmCoreCallbackNS.ExecutionCallback>): ORM; export { ORM } from './ORM';