vona-module-a-orm 5.0.96 → 5.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +0 -0
- package/cli/entity/metadata/generate.ts +2 -1
- package/cli/model/metadata/generate.ts +6 -2
- package/cli/model/metadata/magic.ts +15 -6
- package/dist/.metadata/index.d.ts +1 -0
- package/dist/.metadata/index.d.ts.map +1 -0
- package/dist/.metadata/locales.d.ts +1 -0
- package/dist/.metadata/locales.d.ts.map +1 -0
- package/dist/.metadata/this.d.ts +1 -0
- package/dist/.metadata/this.d.ts.map +1 -0
- package/dist/bean/aopMethod.transaction.d.ts +2 -1
- package/dist/bean/aopMethod.transaction.d.ts.map +1 -0
- package/dist/bean/bean.database.d.ts +2 -1
- package/dist/bean/bean.database.d.ts.map +1 -0
- package/dist/bean/bean.databaseDialectBase.d.ts +2 -1
- package/dist/bean/bean.databaseDialectBase.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_cache.d.ts +5 -1
- package/dist/bean/bean.model/bean.model_cache.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_crud.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts +3 -1
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud_table.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_crud_table.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_knex.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_knex.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_meta.d.ts +3 -2
- package/dist/bean/bean.model/bean.model_meta.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_utils.d.ts +5 -3
- package/dist/bean/bean.model/bean.model_utils.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_view.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_view.d.ts.map +1 -0
- package/dist/bean/bean.model.d.ts +1 -0
- package/dist/bean/bean.model.d.ts.map +1 -0
- package/dist/bean/bean.modelBase.d.ts +1 -0
- package/dist/bean/bean.modelBase.d.ts.map +1 -0
- package/dist/bean/broadcast.columnsClear.d.ts +2 -1
- package/dist/bean/broadcast.columnsClear.d.ts.map +1 -0
- package/dist/bean/event.clientNameReal.d.ts +2 -1
- package/dist/bean/event.clientNameReal.d.ts.map +1 -0
- package/dist/bean/event.columnsClear.d.ts +2 -1
- package/dist/bean/event.columnsClear.d.ts.map +1 -0
- package/dist/bean/hmr.entity.d.ts +1 -0
- package/dist/bean/hmr.entity.d.ts.map +1 -0
- package/dist/bean/hmr.model.d.ts +1 -0
- package/dist/bean/hmr.model.d.ts.map +1 -0
- package/dist/bean/queue.doubleDelete.d.ts +2 -1
- package/dist/bean/queue.doubleDelete.d.ts.map +1 -0
- package/dist/bean/schedule.softDeletionPrune.d.ts +1 -0
- package/dist/bean/schedule.softDeletionPrune.d.ts.map +1 -0
- package/dist/common/buildWhere.d.ts +1 -0
- package/dist/common/buildWhere.d.ts.map +1 -0
- package/dist/common/checkWhere.d.ts +1 -0
- package/dist/common/checkWhere.d.ts.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/utils.d.ts +2 -1
- package/dist/common/utils.d.ts.map +1 -0
- package/dist/config/config.d.ts +1 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/errors.d.ts +1 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/locale/en-us.d.ts +1 -0
- package/dist/config/locale/en-us.d.ts.map +1 -0
- package/dist/config/locale/zh-cn.d.ts +1 -0
- package/dist/config/locale/zh-cn.d.ts.map +1 -0
- package/dist/extend/index.d.ts +1 -0
- package/dist/extend/index.d.ts.map +1 -0
- package/dist/extend/schemaBuilder.d.ts +1 -0
- package/dist/extend/schemaBuilder.d.ts.map +1 -0
- package/dist/extend/tableBuilder.d.ts +1 -0
- package/dist/extend/tableBuilder.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +94 -15
- package/dist/index.js.map +1 -0
- package/dist/lib/const.d.ts +1 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/databaseDialect.d.ts +1 -0
- package/dist/lib/databaseDialect.d.ts.map +1 -0
- package/dist/lib/dto/dto.d.ts +3 -0
- package/dist/lib/dto/dto.d.ts.map +1 -0
- package/dist/lib/dto/dtoAggregate.d.ts +3 -2
- package/dist/lib/dto/dtoAggregate.d.ts.map +1 -0
- package/dist/lib/dto/dtoCreate.d.ts +2 -1
- package/dist/lib/dto/dtoCreate.d.ts.map +1 -0
- package/dist/lib/dto/dtoGet.d.ts +2 -1
- package/dist/lib/dto/dtoGet.d.ts.map +1 -0
- package/dist/lib/dto/dtoGroup.d.ts +2 -1
- package/dist/lib/dto/dtoGroup.d.ts.map +1 -0
- package/dist/lib/dto/dtoListAndCount.d.ts +4 -0
- package/dist/lib/dto/dtoListAndCount.d.ts.map +1 -0
- package/dist/lib/dto/dtoMutate.d.ts +3 -2
- package/dist/lib/dto/dtoMutate.d.ts.map +1 -0
- package/dist/lib/dto/dtoQuery.d.ts +1 -0
- package/dist/lib/dto/dtoQuery.d.ts.map +1 -0
- package/dist/lib/dto/dtoQueryPage.d.ts +1 -0
- package/dist/lib/dto/dtoQueryPage.d.ts.map +1 -0
- package/dist/lib/dto/dtoSelectAndCount.d.ts +2 -1
- package/dist/lib/dto/dtoSelectAndCount.d.ts.map +1 -0
- package/dist/lib/dto/dtoUpdate.d.ts +2 -1
- package/dist/lib/dto/dtoUpdate.d.ts.map +1 -0
- package/dist/lib/dto/index.d.ts +1 -0
- package/dist/lib/dto/index.d.ts.map +1 -0
- package/dist/lib/entity.d.ts +1 -0
- package/dist/lib/entity.d.ts.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/model.d.ts +1 -0
- package/dist/lib/model.d.ts.map +1 -0
- package/dist/lib/modelCacheBase.d.ts +2 -1
- package/dist/lib/modelCacheBase.d.ts.map +1 -0
- package/dist/lib/relations.d.ts +5 -4
- package/dist/lib/relations.d.ts.map +1 -0
- package/dist/lib/relationsDynamic.d.ts +5 -4
- package/dist/lib/relationsDynamic.d.ts.map +1 -0
- package/dist/lib/relationsMutate.d.ts +4 -3
- package/dist/lib/relationsMutate.d.ts.map +1 -0
- package/dist/lib/relationsStatic.d.ts +1 -0
- package/dist/lib/relationsStatic.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/main.d.ts +2 -1
- package/dist/main.d.ts.map +1 -0
- package/dist/service/cacheEntity_.d.ts +1 -0
- package/dist/service/cacheEntity_.d.ts.map +1 -0
- package/dist/service/cacheQuery_.d.ts +1 -0
- package/dist/service/cacheQuery_.d.ts.map +1 -0
- package/dist/service/columnsCache_.d.ts +2 -1
- package/dist/service/columnsCache_.d.ts.map +1 -0
- package/dist/service/columns_.d.ts +2 -1
- package/dist/service/columns_.d.ts.map +1 -0
- package/dist/service/database.d.ts +2 -1
- package/dist/service/database.d.ts.map +1 -0
- package/dist/service/databaseAsyncLocalStorage_.d.ts +1 -0
- package/dist/service/databaseAsyncLocalStorage_.d.ts.map +1 -0
- package/dist/service/databaseClient_.d.ts +2 -1
- package/dist/service/databaseClient_.d.ts.map +1 -0
- package/dist/service/db_.d.ts +2 -1
- package/dist/service/db_.d.ts.map +1 -0
- package/dist/service/entityResolver_.d.ts +1 -0
- package/dist/service/entityResolver_.d.ts.map +1 -0
- package/dist/service/modelResolver_.d.ts +1 -0
- package/dist/service/modelResolver_.d.ts.map +1 -0
- package/dist/service/relations_.d.ts +2 -1
- package/dist/service/relations_.d.ts.map +1 -0
- package/dist/service/transactionAsyncLocalStorage_.d.ts +1 -0
- package/dist/service/transactionAsyncLocalStorage_.d.ts.map +1 -0
- package/dist/service/transactionConsistency/342/200/214_.d.ts +1 -0
- package/dist/service/transactionConsistency/342/200/214_.d.ts.map +1 -0
- package/dist/service/transactionFiber_.d.ts +1 -0
- package/dist/service/transactionFiber_.d.ts.map +1 -0
- package/dist/service/transactionState_.d.ts +2 -1
- package/dist/service/transactionState_.d.ts.map +1 -0
- package/dist/service/transaction_.d.ts +2 -1
- package/dist/service/transaction_.d.ts.map +1 -0
- package/dist/types/columns.d.ts +1 -0
- package/dist/types/columns.d.ts.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/database.d.ts +1 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/depth.d.ts +1 -0
- package/dist/types/depth.d.ts.map +1 -0
- package/dist/types/dialect.d.ts +1 -0
- package/dist/types/dialect.d.ts.map +1 -0
- package/dist/types/dto/dtoAggregate.d.ts +1 -0
- package/dist/types/dto/dtoAggregate.d.ts.map +1 -0
- package/dist/types/dto/dtoGet.d.ts +3 -2
- package/dist/types/dto/dtoGet.d.ts.map +1 -0
- package/dist/types/dto/dtoGroup.d.ts +1 -0
- package/dist/types/dto/dtoGroup.d.ts.map +1 -0
- package/dist/types/dto/dtoListAndCount.d.ts +8 -0
- package/dist/types/dto/dtoListAndCount.d.ts.map +1 -0
- package/dist/types/dto/dtoMutate.d.ts +8 -9
- package/dist/types/dto/dtoMutate.d.ts.map +1 -0
- package/dist/types/dto/dtoQueryBase.d.ts +1 -0
- package/dist/types/dto/dtoQueryBase.d.ts.map +1 -0
- package/dist/types/dto/dtoQueryPageBase.d.ts +1 -0
- package/dist/types/dto/dtoQueryPageBase.d.ts.map +1 -0
- package/dist/types/dto/dtoSelectAndCount.d.ts +2 -1
- package/dist/types/dto/dtoSelectAndCount.d.ts.map +1 -0
- package/dist/types/dto/index.d.ts +2 -0
- package/dist/types/dto/index.d.ts.map +1 -0
- package/dist/types/entity.d.ts +1 -0
- package/dist/types/entity.d.ts.map +1 -0
- package/dist/types/entityBase.d.ts +1 -0
- package/dist/types/entityBase.d.ts.map +1 -0
- package/dist/types/entityBaseEmpty.d.ts +1 -0
- package/dist/types/entityBaseEmpty.d.ts.map +1 -0
- package/dist/types/entityBaseInner.d.ts +1 -0
- package/dist/types/entityBaseInner.d.ts.map +1 -0
- package/dist/types/entityBaseSimple.d.ts +1 -0
- package/dist/types/entityBaseSimple.d.ts.map +1 -0
- package/dist/types/extra.d.ts +1 -0
- package/dist/types/extra.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.d.ts +1 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/model.d.ts +3 -2
- package/dist/types/model.d.ts.map +1 -0
- package/dist/types/modelAggr.d.ts +2 -1
- package/dist/types/modelAggr.d.ts.map +1 -0
- package/dist/types/modelCount.d.ts +2 -1
- package/dist/types/modelCount.d.ts.map +1 -0
- package/dist/types/modelGeneral.d.ts +4 -3
- package/dist/types/modelGeneral.d.ts.map +1 -0
- package/dist/types/modelGroup.d.ts +2 -1
- package/dist/types/modelGroup.d.ts.map +1 -0
- package/dist/types/modelIncrement.d.ts +19 -0
- package/dist/types/modelIncrement.d.ts.map +1 -0
- package/dist/types/modelWhere.d.ts +2 -1
- package/dist/types/modelWhere.d.ts.map +1 -0
- package/dist/types/onion/databaseDialect.d.ts +1 -0
- package/dist/types/onion/databaseDialect.d.ts.map +1 -0
- package/dist/types/onion/entity.d.ts +1 -0
- package/dist/types/onion/entity.d.ts.map +1 -0
- package/dist/types/onion/index.d.ts +1 -0
- package/dist/types/onion/index.d.ts.map +1 -0
- package/dist/types/onion/model.d.ts +1 -0
- package/dist/types/onion/model.d.ts.map +1 -0
- package/dist/types/onion/table.d.ts +1 -0
- package/dist/types/onion/table.d.ts.map +1 -0
- package/dist/types/relations.d.ts +10 -11
- package/dist/types/relations.d.ts.map +1 -0
- package/dist/types/relationsAggr.d.ts +2 -1
- package/dist/types/relationsAggr.d.ts.map +1 -0
- package/dist/types/relationsColumns.d.ts +5 -4
- package/dist/types/relationsColumns.d.ts.map +1 -0
- package/dist/types/relationsDef.d.ts +5 -4
- package/dist/types/relationsDef.d.ts.map +1 -0
- package/dist/types/relationsDefDynamic.d.ts +6 -5
- package/dist/types/relationsDefDynamic.d.ts.map +1 -0
- package/dist/types/relationsDefMutate.d.ts +1 -0
- package/dist/types/relationsDefMutate.d.ts.map +1 -0
- package/dist/types/relationsGroup.d.ts +1 -0
- package/dist/types/relationsGroup.d.ts.map +1 -0
- package/dist/types/relationsMutate.d.ts +4 -3
- package/dist/types/relationsMutate.d.ts.map +1 -0
- package/dist/types/relationsTables.d.ts +1 -0
- package/dist/types/relationsTables.d.ts.map +1 -0
- package/dist/types/transaction.d.ts +1 -0
- package/dist/types/transaction.d.ts.map +1 -0
- package/dist-cli/entity/metadata/generate.js +1 -1
- package/dist-cli/model/metadata/generate.js +4 -2
- package/dist-cli/model/metadata/magic.js +2 -2
- package/package.json +40 -36
- package/src/.metadata/index.ts +348 -0
- package/src/.metadata/locales.ts +13 -0
- package/src/.metadata/this.ts +2 -0
- package/src/bean/aopMethod.transaction.ts +18 -0
- package/src/bean/bean.database.ts +57 -0
- package/src/bean/bean.databaseDialectBase.ts +149 -0
- package/src/bean/bean.model/bean.model_cache.ts +815 -0
- package/src/bean/bean.model/bean.model_crud.ts +46 -0
- package/src/bean/bean.model/bean.model_crud_inner.ts +281 -0
- package/src/bean/bean.model/bean.model_crud_table.ts +59 -0
- package/src/bean/bean.model/bean.model_knex.ts +60 -0
- package/src/bean/bean.model/bean.model_meta.ts +204 -0
- package/src/bean/bean.model/bean.model_utils.ts +275 -0
- package/src/bean/bean.model/bean.model_view.ts +129 -0
- package/src/bean/bean.model.ts +8 -0
- package/src/bean/bean.modelBase.ts +8 -0
- package/src/bean/broadcast.columnsClear.ts +24 -0
- package/src/bean/event.clientNameReal.ts +10 -0
- package/src/bean/event.columnsClear.ts +13 -0
- package/src/bean/hmr.entity.ts +12 -0
- package/src/bean/hmr.model.ts +16 -0
- package/src/bean/queue.doubleDelete.ts +29 -0
- package/src/bean/schedule.softDeletionPrune.ts +45 -0
- package/src/common/buildWhere.ts +238 -0
- package/src/common/checkWhere.ts +128 -0
- package/src/common/index.ts +3 -0
- package/src/common/utils.ts +74 -0
- package/src/config/config.ts +60 -0
- package/src/config/errors.ts +3 -0
- package/src/config/locale/en-us.ts +8 -0
- package/src/config/locale/zh-cn.ts +8 -0
- package/src/extend/index.ts +12 -0
- package/src/extend/schemaBuilder.ts +29 -0
- package/src/extend/tableBuilder.ts +87 -0
- package/src/index.ts +10 -0
- package/src/lib/const.ts +58 -0
- package/src/lib/databaseDialect.ts +7 -0
- package/src/lib/dto/dto.ts +21 -0
- package/src/lib/dto/dtoAggregate.ts +51 -0
- package/src/lib/dto/dtoCreate.ts +14 -0
- package/src/lib/dto/dtoGet.ts +159 -0
- package/src/lib/dto/dtoGroup.ts +57 -0
- package/src/lib/dto/dtoListAndCount.ts +16 -0
- package/src/lib/dto/dtoMutate.ts +82 -0
- package/src/lib/dto/dtoQuery.ts +9 -0
- package/src/lib/dto/dtoQueryPage.ts +9 -0
- package/src/lib/dto/dtoSelectAndCount.ts +20 -0
- package/src/lib/dto/dtoUpdate.ts +16 -0
- package/src/lib/dto/index.ts +1 -0
- package/src/lib/entity.ts +25 -0
- package/src/lib/index.ts +9 -0
- package/src/lib/model.ts +7 -0
- package/src/lib/modelCacheBase.ts +98 -0
- package/src/lib/relations.ts +118 -0
- package/src/lib/relationsDynamic.ts +75 -0
- package/src/lib/relationsMutate.ts +60 -0
- package/src/lib/relationsStatic.ts +18 -0
- package/src/lib/utils.ts +45 -0
- package/src/main.ts +79 -0
- package/src/service/cacheEntity_.ts +37 -0
- package/src/service/cacheQuery_.ts +20 -0
- package/src/service/columnsCache_.ts +69 -0
- package/src/service/columns_.ts +64 -0
- package/src/service/database.ts +126 -0
- package/src/service/databaseAsyncLocalStorage_.ts +29 -0
- package/src/service/databaseClient_.ts +124 -0
- package/src/service/db_.ts +77 -0
- package/src/service/entityResolver_.ts +25 -0
- package/src/service/modelResolver_.ts +19 -0
- package/src/service/relations_.ts +444 -0
- package/src/service/transactionAsyncLocalStorage_.ts +31 -0
- package/src/service/transactionConsistency/342/200/214_.ts +37 -0
- package/src/service/transactionFiber_.ts +42 -0
- package/src/service/transactionState_.ts +35 -0
- package/src/service/transaction_.ts +147 -0
- package/src/types/columns.ts +8 -0
- package/src/types/config.ts +23 -0
- package/src/types/database.ts +64 -0
- package/src/types/depth.ts +55 -0
- package/src/types/dialect.ts +17 -0
- package/src/types/dto/dtoAggregate.ts +3 -0
- package/src/types/dto/dtoGet.ts +23 -0
- package/src/types/dto/dtoGroup.ts +3 -0
- package/src/types/dto/dtoListAndCount.ts +7 -0
- package/src/types/dto/dtoMutate.ts +231 -0
- package/src/types/dto/dtoQueryBase.ts +18 -0
- package/src/types/dto/dtoQueryPageBase.ts +18 -0
- package/src/types/dto/dtoSelectAndCount.ts +11 -0
- package/src/types/dto/index.ts +8 -0
- package/src/types/entity.ts +15 -0
- package/src/types/entityBase.ts +11 -0
- package/src/types/entityBaseEmpty.ts +1 -0
- package/src/types/entityBaseInner.ts +18 -0
- package/src/types/entityBaseSimple.ts +9 -0
- package/src/types/extra.ts +23 -0
- package/src/types/index.ts +30 -0
- package/src/types/logger.ts +6 -0
- package/src/types/model.ts +152 -0
- package/src/types/modelAggr.ts +69 -0
- package/src/types/modelCount.ts +40 -0
- package/src/types/modelGeneral.ts +61 -0
- package/src/types/modelGroup.ts +48 -0
- package/src/types/modelIncrement.ts +50 -0
- package/src/types/modelWhere.ts +85 -0
- package/src/types/onion/databaseDialect.ts +22 -0
- package/src/types/onion/entity.ts +33 -0
- package/src/types/onion/index.ts +4 -0
- package/src/types/onion/model.ts +68 -0
- package/src/types/onion/table.ts +1 -0
- package/src/types/relations.ts +243 -0
- package/src/types/relationsAggr.ts +31 -0
- package/src/types/relationsColumns.ts +116 -0
- package/src/types/relationsDef.ts +152 -0
- package/src/types/relationsDefDynamic.ts +128 -0
- package/src/types/relationsDefMutate.ts +11 -0
- package/src/types/relationsGroup.ts +58 -0
- package/src/types/relationsMutate.ts +118 -0
- package/src/types/relationsTables.ts +38 -0
- package/src/types/transaction.ts +23 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BeanBase } from 'vona';
|
|
2
|
+
import { Service } from 'vona-module-a-bean';
|
|
3
|
+
|
|
4
|
+
import type { ITableColumns, ITableColumnsDefault } from '../types/columns.ts';
|
|
5
|
+
import type { ServiceDb } from './db_.ts';
|
|
6
|
+
|
|
7
|
+
import { ServiceColumnsCache } from './columnsCache_.ts';
|
|
8
|
+
|
|
9
|
+
@Service()
|
|
10
|
+
export class ServiceColumns extends BeanBase {
|
|
11
|
+
private _db: ServiceDb;
|
|
12
|
+
private _serviceColumnsCache: ServiceColumnsCache;
|
|
13
|
+
|
|
14
|
+
protected __init__(db: ServiceDb) {
|
|
15
|
+
this._db = db;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private get db() {
|
|
19
|
+
return this._db;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private get serviceColumnsCache() {
|
|
23
|
+
if (!this._serviceColumnsCache) {
|
|
24
|
+
const clientNameReal = this.scope.service.database.prepareClientNameReal(this.db.clientName);
|
|
25
|
+
this._serviceColumnsCache = this.bean._getBeanSelector(ServiceColumnsCache, clientNameReal);
|
|
26
|
+
}
|
|
27
|
+
return this._serviceColumnsCache;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async columns(tableName?: string): Promise<ITableColumns> {
|
|
31
|
+
if (!tableName) return {};
|
|
32
|
+
let columns = this.serviceColumnsCache.getColumnsCache(tableName);
|
|
33
|
+
if (!columns) {
|
|
34
|
+
const dialect = this.db.dialect;
|
|
35
|
+
const connection = this.db.connection;
|
|
36
|
+
const map = await connection(tableName).columnInfo();
|
|
37
|
+
columns = {};
|
|
38
|
+
for (const name in map) {
|
|
39
|
+
columns[name] = dialect.coerceColumn(map[name]);
|
|
40
|
+
}
|
|
41
|
+
this.serviceColumnsCache.setColumnsCache(tableName, columns);
|
|
42
|
+
}
|
|
43
|
+
return columns;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async defaultData(tableName?: string): Promise<ITableColumnsDefault> {
|
|
47
|
+
if (!tableName) return {};
|
|
48
|
+
let data = this.serviceColumnsCache.getColumnsDefaultCache(tableName);
|
|
49
|
+
if (!data) {
|
|
50
|
+
data = {};
|
|
51
|
+
// columns
|
|
52
|
+
const columns = await this.columns(tableName);
|
|
53
|
+
for (const columnName in columns) {
|
|
54
|
+
data[columnName] = columns[columnName].default;
|
|
55
|
+
}
|
|
56
|
+
this.serviceColumnsCache.setColumnsDefaultCache(tableName, data);
|
|
57
|
+
}
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
columnsClear(tableName?: string) {
|
|
62
|
+
return this.scope.service.database.columnsClear(this.db.clientName, tableName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { isNil } from '@cabloy/utils';
|
|
2
|
+
import { appResource, BeanBase, deepExtend } from 'vona';
|
|
3
|
+
import { Service } from 'vona-module-a-bean';
|
|
4
|
+
|
|
5
|
+
import type { BeanDatabaseDialectBase } from '../bean/bean.databaseDialectBase.ts';
|
|
6
|
+
import type { ConfigDatabaseClient } from '../types/config.ts';
|
|
7
|
+
import type { IDatabaseClientDialectRecord, IDatabaseClientRecord, IDbInfo } from '../types/database.ts';
|
|
8
|
+
|
|
9
|
+
import { ServiceDatabaseClient } from './databaseClient_.ts';
|
|
10
|
+
|
|
11
|
+
@Service()
|
|
12
|
+
export class ServiceDatabase extends BeanBase {
|
|
13
|
+
get configDatabase() {
|
|
14
|
+
return this.app.config.database;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
getClientConfig(clientName: keyof IDatabaseClientRecord, clientConfig?: ConfigDatabaseClient, original?: boolean): ConfigDatabaseClient {
|
|
18
|
+
// clientConfig
|
|
19
|
+
if (!clientConfig) {
|
|
20
|
+
clientConfig = this.configDatabase.clients[clientName];
|
|
21
|
+
}
|
|
22
|
+
// check
|
|
23
|
+
if (!clientConfig) {
|
|
24
|
+
throw new Error(`database config not found: ${clientName}`);
|
|
25
|
+
}
|
|
26
|
+
if (original) return clientConfig;
|
|
27
|
+
// configBaseClient
|
|
28
|
+
const dialect = this.bean.database.getDialect(clientConfig.client);
|
|
29
|
+
// combine
|
|
30
|
+
clientConfig = deepExtend({}, this.configDatabase.base, dialect.configBase, clientConfig);
|
|
31
|
+
// ready
|
|
32
|
+
return clientConfig!;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
prepareDbInfo(dbInfoOrClientName?: Partial<IDbInfo> | keyof IDatabaseClientRecord): IDbInfo {
|
|
36
|
+
let level;
|
|
37
|
+
let clientName;
|
|
38
|
+
if (typeof dbInfoOrClientName === 'string') {
|
|
39
|
+
level = undefined;
|
|
40
|
+
clientName = dbInfoOrClientName;
|
|
41
|
+
} else {
|
|
42
|
+
level = dbInfoOrClientName?.level;
|
|
43
|
+
clientName = dbInfoOrClientName?.clientName;
|
|
44
|
+
}
|
|
45
|
+
// check if selector
|
|
46
|
+
if (clientName && clientName.includes(':')) return clientName;
|
|
47
|
+
// check if default
|
|
48
|
+
clientName = this.prepareClientName(clientName ?? this.bean.database.current?.clientName);
|
|
49
|
+
// level
|
|
50
|
+
level = level ?? this.bean.database.current?.level ?? 0;
|
|
51
|
+
return { level, clientName };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
prepareClientNameSelector(dbInfo: IDbInfo, dialect: BeanDatabaseDialectBase | keyof IDatabaseClientDialectRecord) {
|
|
55
|
+
const dialect2 = typeof dialect === 'string' ? this.bean.database.getDialect(dialect) : dialect;
|
|
56
|
+
if (!dialect2.capabilities.level) return dbInfo.clientName;
|
|
57
|
+
// combine
|
|
58
|
+
return dbInfo.level === 0 ? dbInfo.clientName : `${dbInfo.clientName}:${dbInfo.level}`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
parseClientNameSelector(clientNameSelector: string): IDbInfo {
|
|
62
|
+
if (isNil(clientNameSelector)) throw new Error('invalid clientNameSelector');
|
|
63
|
+
const [clientName, level] = clientNameSelector.split(':');
|
|
64
|
+
if (!clientName) throw new Error('clientName must be specified');
|
|
65
|
+
return {
|
|
66
|
+
level: Number(level ?? 0),
|
|
67
|
+
clientName: clientName as keyof IDatabaseClientRecord,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
prepareClientName(clientName?: keyof IDatabaseClientRecord): keyof IDatabaseClientRecord {
|
|
72
|
+
return !clientName || clientName === 'default' ? this.getDefaultClientName() : clientName;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
getDefaultClientName(): keyof IDatabaseClientRecord {
|
|
76
|
+
const defaultClient = this.app.config.database.defaultClient;
|
|
77
|
+
if (typeof defaultClient === 'function') {
|
|
78
|
+
return defaultClient(this.ctx);
|
|
79
|
+
}
|
|
80
|
+
// check instance
|
|
81
|
+
const instanceName = this.ctx.instanceName;
|
|
82
|
+
if (!isNil(instanceName)) {
|
|
83
|
+
const configInstanceBase = this.$scope.instance.service.instance.getConfigInstanceBase(instanceName);
|
|
84
|
+
if (configInstanceBase?.isolate) {
|
|
85
|
+
return configInstanceBase.isolateClient!;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return defaultClient;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
prepareClientNameReal(clientName?: keyof IDatabaseClientRecord): keyof IDatabaseClientRecord {
|
|
92
|
+
return this.scope.event.clientNameReal.emitSync(this.prepareClientName(clientName), clientName => {
|
|
93
|
+
return clientName;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
columnsClear(clientName?: keyof IDatabaseClientRecord, tableName?: string) {
|
|
98
|
+
this.columnsClearWorker(clientName, tableName);
|
|
99
|
+
this.scope.broadcast.columnsClear.emit({ clientName, tableName });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private columnsClearWorker(clientName?: keyof IDatabaseClientRecord, tableName?: string) {
|
|
103
|
+
this.scope.event.columnsClear.emitSync({ clientName: this.prepareClientNameReal(clientName), tableName });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async reloadClients(clientName?: keyof IDatabaseClientRecord, clientConfig?: ConfigDatabaseClient) {
|
|
107
|
+
clientName = this.prepareClientName(clientName);
|
|
108
|
+
await this.bean.mutate.reloadInstances(ServiceDatabaseClient, { clientName, clientConfig });
|
|
109
|
+
this.columnsClear(clientName);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async reloadClientsWorker(clientName?: keyof IDatabaseClientRecord, clientConfig?: ConfigDatabaseClient) {
|
|
113
|
+
clientName = this.prepareClientName(clientName);
|
|
114
|
+
await this.bean.mutate.reloadInstancesWorker({
|
|
115
|
+
beanFullName: appResource.getBeanFullName(ServiceDatabaseClient) as any,
|
|
116
|
+
data: { clientName, clientConfig },
|
|
117
|
+
});
|
|
118
|
+
this.columnsClearWorker(clientName);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async disposeClients(clientName?: keyof IDatabaseClientRecord) {
|
|
122
|
+
clientName = this.prepareClientName(clientName);
|
|
123
|
+
await this.bean.mutate.removeInstances(ServiceDatabaseClient, { clientName });
|
|
124
|
+
this.columnsClear(clientName);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FunctionAsync } from 'vona';
|
|
2
|
+
|
|
3
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
4
|
+
import { BeanBase } from 'vona';
|
|
5
|
+
import { Service } from 'vona-module-a-bean';
|
|
6
|
+
|
|
7
|
+
import { ServiceDb } from '../service/db_.ts';
|
|
8
|
+
|
|
9
|
+
@Service()
|
|
10
|
+
export class ServiceDatabaseAsyncLocalStorage extends BeanBase {
|
|
11
|
+
dbStorage: AsyncLocalStorage<ServiceDb>;
|
|
12
|
+
|
|
13
|
+
protected __init__() {
|
|
14
|
+
this.dbStorage = new AsyncLocalStorage();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get current(): ServiceDb {
|
|
18
|
+
return this.dbStorage.getStore()!;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async run<RESULT>(store: ServiceDb, fn: FunctionAsync<RESULT>): Promise<RESULT> {
|
|
22
|
+
if (store === this.current) {
|
|
23
|
+
return fn();
|
|
24
|
+
}
|
|
25
|
+
return this.dbStorage.run(store, () => {
|
|
26
|
+
return fn();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
import { catchError } from '@cabloy/utils';
|
|
4
|
+
import knex from 'knex';
|
|
5
|
+
import { deepExtend } from 'vona';
|
|
6
|
+
import { Service } from 'vona-module-a-bean';
|
|
7
|
+
import { BeanMutateBase } from 'vona-module-a-beanmutate';
|
|
8
|
+
|
|
9
|
+
import type { ConfigDatabaseClient } from '../types/config.ts';
|
|
10
|
+
import type { IDatabaseClientRecord } from '../types/database.ts';
|
|
11
|
+
|
|
12
|
+
import { ServiceDb } from './db_.ts';
|
|
13
|
+
|
|
14
|
+
export interface IPrepareDatabaseNameResult {
|
|
15
|
+
database?: string;
|
|
16
|
+
filename?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Service()
|
|
20
|
+
export class ServiceDatabaseClient extends BeanMutateBase {
|
|
21
|
+
level: number;
|
|
22
|
+
clientName: keyof IDatabaseClientRecord;
|
|
23
|
+
clientNameSelector: string;
|
|
24
|
+
clientConfig: ConfigDatabaseClient;
|
|
25
|
+
private _knex: Knex;
|
|
26
|
+
private _db: ServiceDb;
|
|
27
|
+
|
|
28
|
+
get configDatabase() {
|
|
29
|
+
return this.app.config.database;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get connection(): Knex {
|
|
33
|
+
return this._knex;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
get db(): ServiceDb {
|
|
37
|
+
return this._db;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected __init__(clientNameSelector?: string, clientConfig?: ConfigDatabaseClient) {
|
|
41
|
+
super.__init__();
|
|
42
|
+
// db
|
|
43
|
+
this._db = this.bean._newBean(ServiceDb, this);
|
|
44
|
+
// load
|
|
45
|
+
this.__load(clientNameSelector!, clientConfig);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected async __dispose__() {
|
|
49
|
+
await super.__dispose__();
|
|
50
|
+
this._db = undefined as any;
|
|
51
|
+
await this.__close();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected async onReloadInstance({ clientName, clientConfig }) {
|
|
55
|
+
if (clientName === this.clientName) {
|
|
56
|
+
await this.reload(clientConfig);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected async onRemoveInstance({ clientName }) {
|
|
61
|
+
if (clientName === this.clientName) {
|
|
62
|
+
await super.onRemoveInstance({ clientName });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private __load(clientNameSelector: string, clientConfig?: ConfigDatabaseClient) {
|
|
67
|
+
// name
|
|
68
|
+
this.clientNameSelector = clientNameSelector;
|
|
69
|
+
const dbInfo = this.scope.service.database.parseClientNameSelector(clientNameSelector);
|
|
70
|
+
this.level = dbInfo.level;
|
|
71
|
+
this.clientName = dbInfo.clientName;
|
|
72
|
+
// config: inited by bean.database.getClient
|
|
73
|
+
this.clientConfig = clientConfig!;
|
|
74
|
+
// knex
|
|
75
|
+
this._knex = knex(deepExtend({}, this.clientConfig));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private async __close() {
|
|
79
|
+
if (this._knex) {
|
|
80
|
+
await catchError(() => {
|
|
81
|
+
return this._knex.destroy();
|
|
82
|
+
});
|
|
83
|
+
this._knex = undefined as any;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async reload(clientConfig?: ConfigDatabaseClient) {
|
|
88
|
+
const clientConfigReal = this.scope.service.database.getClientConfig(this.clientName, clientConfig);
|
|
89
|
+
this.$mutate([this.clientNameSelector, clientConfigReal]);
|
|
90
|
+
await this.__close();
|
|
91
|
+
this.__load(this.clientNameSelector, clientConfigReal);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
getDatabaseName(): string {
|
|
95
|
+
const connection = this.clientConfig.connection as any;
|
|
96
|
+
return connection.database || connection.filename;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private _prepareDatabaseName(databaseName: string): IPrepareDatabaseNameResult {
|
|
100
|
+
const result: IPrepareDatabaseNameResult = {};
|
|
101
|
+
const connection = this.clientConfig.connection as any;
|
|
102
|
+
if (connection.database !== undefined) {
|
|
103
|
+
result.database = databaseName;
|
|
104
|
+
} else if (connection.filename !== undefined) {
|
|
105
|
+
result.filename = databaseName;
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// only used by startup, so no consider that workers broadcast
|
|
111
|
+
async changeConfigConnectionAndReloadWorker(databaseName: string): Promise<void> {
|
|
112
|
+
// set databaseName
|
|
113
|
+
const connDatabaseName = this._prepareDatabaseName(databaseName);
|
|
114
|
+
// set config
|
|
115
|
+
// * should not use this.clientConfig.connection, because password is hidden
|
|
116
|
+
const config = this.scope.service.database.getClientConfig(this.clientName, undefined, true);
|
|
117
|
+
config.connection = Object.assign({}, config.connection, connDatabaseName);
|
|
118
|
+
// only used by startup, so no consider that workers broadcast
|
|
119
|
+
this.configDatabase.clients[this.clientName] = config;
|
|
120
|
+
// reload
|
|
121
|
+
await this.scope.service.database.reloadClientsWorker(this.clientName, config);
|
|
122
|
+
// await this.scope.service.database.reloadClients(this.clientName, config);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { FunctionAny } from 'vona';
|
|
2
|
+
|
|
3
|
+
import { BeanBase } from 'vona';
|
|
4
|
+
import { Service } from 'vona-module-a-bean';
|
|
5
|
+
|
|
6
|
+
import type { BeanDatabaseDialectBase } from '../bean/bean.databaseDialectBase.ts';
|
|
7
|
+
import type { IDatabaseClientDialectRecord, IDbInfo } from '../types/database.ts';
|
|
8
|
+
import type { ITransactionConsistencyCommitOptions } from '../types/transaction.ts';
|
|
9
|
+
import type { ServiceDatabaseClient } from './databaseClient_.ts';
|
|
10
|
+
|
|
11
|
+
import { ServiceColumns } from './columns_.ts';
|
|
12
|
+
import { ServiceTransaction } from './transaction_.ts';
|
|
13
|
+
|
|
14
|
+
@Service()
|
|
15
|
+
export class ServiceDb extends BeanBase {
|
|
16
|
+
private _client: ServiceDatabaseClient;
|
|
17
|
+
private _columns: ServiceColumns;
|
|
18
|
+
private _transaction: ServiceTransaction;
|
|
19
|
+
|
|
20
|
+
protected __init__(client: ServiceDatabaseClient) {
|
|
21
|
+
this._client = client;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get info(): IDbInfo {
|
|
25
|
+
return { level: this.level, clientName: this.clientName };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
get level() {
|
|
29
|
+
return this._client.level;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get clientName() {
|
|
33
|
+
return this._client.clientName;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
get client() {
|
|
37
|
+
return this._client;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get columns() {
|
|
41
|
+
if (!this._columns) {
|
|
42
|
+
this._columns = this.app.bean._newBean(ServiceColumns, this);
|
|
43
|
+
}
|
|
44
|
+
return this._columns;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
get transaction() {
|
|
48
|
+
if (!this._transaction) {
|
|
49
|
+
this._transaction = this.app.bean._newBean(ServiceTransaction, this);
|
|
50
|
+
}
|
|
51
|
+
return this._transaction;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get inTransaction() {
|
|
55
|
+
return this.transaction.inTransaction;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get connection() {
|
|
59
|
+
return this.transaction.connection ?? this.client.connection;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get dialectName(): keyof IDatabaseClientDialectRecord {
|
|
63
|
+
return this.client.clientConfig.client;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
get dialect(): BeanDatabaseDialectBase {
|
|
67
|
+
return this.bean.database.getDialect(this.dialectName);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async commit(cb: FunctionAny, options?: ITransactionConsistencyCommitOptions) {
|
|
71
|
+
return await this.transaction.commit(cb, options);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
compensate(cb: FunctionAny) {
|
|
75
|
+
return this.transaction.compensate(cb);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { appResource, BeanBase } from 'vona';
|
|
2
|
+
import { Service } from 'vona-module-a-bean';
|
|
3
|
+
import { $columnsAll } from 'vona-module-a-ormutils';
|
|
4
|
+
|
|
5
|
+
const SymbolModuleScope = Symbol('SymbolModuleScope');
|
|
6
|
+
|
|
7
|
+
@Service()
|
|
8
|
+
export class ServiceEntityResolver extends BeanBase {
|
|
9
|
+
protected [SymbolModuleScope]: string;
|
|
10
|
+
private __instances: Record<string, any> = {};
|
|
11
|
+
|
|
12
|
+
constructor(moduleScope: string) {
|
|
13
|
+
super();
|
|
14
|
+
this[SymbolModuleScope] = moduleScope;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
protected __get__(prop: string) {
|
|
18
|
+
if (!this.__instances[prop]) {
|
|
19
|
+
const beanFullName = `${this[SymbolModuleScope]}.entity.${prop}`;
|
|
20
|
+
const beanOptions = appResource.getBean(beanFullName)!;
|
|
21
|
+
this.__instances[prop] = $columnsAll(beanOptions.beanClass, true, true);
|
|
22
|
+
}
|
|
23
|
+
return this.__instances[prop];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BeanBase } from 'vona';
|
|
2
|
+
import { Service } from 'vona-module-a-bean';
|
|
3
|
+
|
|
4
|
+
const SymbolModuleScope = Symbol('SymbolModuleScope');
|
|
5
|
+
|
|
6
|
+
@Service()
|
|
7
|
+
export class ServiceModelResolver extends BeanBase {
|
|
8
|
+
protected [SymbolModuleScope]: string;
|
|
9
|
+
|
|
10
|
+
constructor(moduleScope: string) {
|
|
11
|
+
super();
|
|
12
|
+
this[SymbolModuleScope] = moduleScope;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
protected __get__(prop: string) {
|
|
16
|
+
const beanFullName = `${this[SymbolModuleScope]}.model.${prop}`;
|
|
17
|
+
return this.bean._getBean(beanFullName as any);
|
|
18
|
+
}
|
|
19
|
+
}
|