vona-module-a-orm 5.1.29 → 5.1.31
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/dist/.metadata/index.d.ts.map +1 -1
- package/dist/index.js +142 -43
- package/dist/index.js.map +1 -1
- package/dist/lib/bean.model/bean.model_view.d.ts.map +1 -1
- package/dist/service/columns_.d.ts.map +1 -1
- package/dist/service/databaseDialectBase_.d.ts +24 -3
- package/dist/service/databaseDialectBase_.d.ts.map +1 -1
- package/dist/service/transactionFiber_.d.ts +2 -0
- package/dist/service/transactionFiber_.d.ts.map +1 -1
- package/dist/service/transaction_.d.ts.map +1 -1
- package/dist/types/columns.d.ts +1 -0
- package/dist/types/columns.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/.metadata/index.ts +34 -39
- package/src/lib/bean.model/bean.model_view.ts +10 -6
- package/src/service/columns_.ts +1 -2
- package/src/service/databaseDialectBase_.ts +140 -33
- package/src/service/transactionFiber_.ts +8 -2
- package/src/service/transaction_.ts +5 -8
- package/src/types/columns.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bean.model_view.d.ts","sourceRoot":"","sources":["../../../src/lib/bean.model/bean.model_view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,qBAAa,aAAa,CAAC,OAAO,SAAS,EAAE,CAAE,SAAQ,aAAa,CAAC,OAAO,CAAC;IACrE,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,GAAG,GAChD,OAAO,CAAC,IAAI,CAAC;IA0BV,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO;IASxD,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,GAAG,GAChD,OAAO,CAAC,IAAI,CAAC;IASV,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,KAAK,GAAG,GACvD,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"bean.model_view.d.ts","sourceRoot":"","sources":["../../../src/lib/bean.model/bean.model_view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,qBAAa,aAAa,CAAC,OAAO,SAAS,EAAE,CAAE,SAAQ,aAAa,CAAC,OAAO,CAAC;IACrE,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,GAAG,GAChD,OAAO,CAAC,IAAI,CAAC;IA0BV,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO;IASxD,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,GAAG,GAChD,OAAO,CAAC,IAAI,CAAC;IASV,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,KAAK,GAAG,GACvD,OAAO,CAAC,IAAI,CAAC;IAKV,SAAS,CAAC,SAAS,EAAE,MAAM;IAK3B,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,KAAK,GAAG,EACxD,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAAC,IAAI,CAAC;IAgBV,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOnD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAa9C,wBAAwB;YAoBxB,yBAAyB;CAexC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columns_.d.ts","sourceRoot":"","sources":["../../src/service/columns_.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,qBACa,cAAe,SAAQ,QAAQ;IAC1C,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,oBAAoB,CAAsB;IAElD,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS;IAIhC,OAAO,KAAK,EAAE,GAEb;IAED,OAAO,KAAK,mBAAmB,GAM9B;IAEK,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"columns_.d.ts","sourceRoot":"","sources":["../../src/service/columns_.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,qBACa,cAAe,SAAQ,QAAQ;IAC1C,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,oBAAoB,CAAsB;IAElD,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS;IAIhC,OAAO,KAAK,EAAE,GAEb;IAED,OAAO,KAAK,mBAAmB,GAM9B;IAEK,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAenD,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAepE,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM;CAGhC"}
|
|
@@ -4,6 +4,16 @@ import { BeanBase } from 'vona';
|
|
|
4
4
|
import type { ITableColumn } from '../types/columns.ts';
|
|
5
5
|
import type { ConfigDatabaseClient } from '../types/config.ts';
|
|
6
6
|
import type { IDatabaseDialectCapabilities, IFetchDatabasesResultItem, IFetchIndexesResultItem, TypeDatabaseDialectTableColumnsFn } from '../types/dialect.ts';
|
|
7
|
+
type ColumnDefaultLiteral = {
|
|
8
|
+
kind: 'string';
|
|
9
|
+
value: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'boolean';
|
|
12
|
+
value: boolean;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'number';
|
|
15
|
+
value: string;
|
|
16
|
+
};
|
|
7
17
|
export declare class ServiceDatabaseDialectBase extends BeanBase {
|
|
8
18
|
protected _capabilities?: IDatabaseDialectCapabilities;
|
|
9
19
|
protected _configBase?: Partial<ConfigDatabaseClient>;
|
|
@@ -15,14 +25,25 @@ export declare class ServiceDatabaseDialectBase extends BeanBase {
|
|
|
15
25
|
fetchIndexes(_schemaBuilder: Knex.SchemaBuilder, _tableName: string): Promise<IFetchIndexesResultItem[]>;
|
|
16
26
|
insert(_builder: Knex.QueryBuilder, _datas: any[]): Promise<[TableIdentity[], Knex.QueryBuilder]>;
|
|
17
27
|
select(_builder: Knex.QueryBuilder, datas: any[], _fn: TypeDatabaseDialectTableColumnsFn): Promise<any[]>;
|
|
28
|
+
fetchColumns(connection: Knex, tableName: string): Promise<Record<string, Knex.ColumnInfo>>;
|
|
18
29
|
query(_result: any): void;
|
|
19
30
|
viewDependents(_builder: Knex.QueryBuilder, _viewName: string): Promise<string[]>;
|
|
20
31
|
coerceColumn(column: Knex.ColumnInfo): ITableColumn;
|
|
32
|
+
protected _isMysqlBooleanColumn(column: Pick<ITableColumn, 'columnType'>): boolean;
|
|
33
|
+
protected selectAsMysql(_builder: Knex.QueryBuilder, datas: any[], fn: TypeDatabaseDialectTableColumnsFn): Promise<any[]>;
|
|
21
34
|
protected selectAsSqlite3(_builder: Knex.QueryBuilder, datas: any[], fn: TypeDatabaseDialectTableColumnsFn): Promise<any[]>;
|
|
22
35
|
protected insertAsMysql(builder: Knex.QueryBuilder, datas: any[]): Promise<[TableIdentity[], Knex.QueryBuilder]>;
|
|
23
36
|
protected insertAsPg(builder: Knex.QueryBuilder, datas: any[]): Promise<[TableIdentity[], Knex.QueryBuilder]>;
|
|
24
|
-
protected _coerceColumnValue(
|
|
25
|
-
protected
|
|
26
|
-
protected
|
|
37
|
+
protected _coerceColumnValue(column: Pick<ITableColumn, 'type' | 'columnType'>, value: unknown): {} | undefined;
|
|
38
|
+
protected _isBooleanColumn(column: Pick<ITableColumn, 'type' | 'columnType'>): boolean;
|
|
39
|
+
protected _columnTypeName(type: string): string;
|
|
40
|
+
protected _coerceColumnLiteral(value: string): ColumnDefaultLiteral | undefined;
|
|
41
|
+
protected _unwrapColumnDefault(value: string): string;
|
|
42
|
+
protected _isScalarColumnDefault(value: string): boolean;
|
|
43
|
+
protected _isColumnDefaultBalanced(value: string): boolean;
|
|
44
|
+
protected _isExpressionColumnDefault(value: string): boolean;
|
|
45
|
+
protected _safeInteger(value: string): string | number;
|
|
46
|
+
protected _safeNumber(value: string): number | undefined;
|
|
27
47
|
}
|
|
48
|
+
export {};
|
|
28
49
|
//# sourceMappingURL=databaseDialectBase_.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"databaseDialectBase_.d.ts","sourceRoot":"","sources":["../../src/service/databaseDialectBase_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAW,MAAM,MAAM,CAAC;AAGzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,EAClC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"databaseDialectBase_.d.ts","sourceRoot":"","sources":["../../src/service/databaseDialectBase_.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,5 +10,7 @@ export declare class ServiceTransactionFiber extends BeanBase {
|
|
|
10
10
|
compensate(cb: FunctionAny): void;
|
|
11
11
|
doCommit(): Promise<void>;
|
|
12
12
|
doRollback(): Promise<void>;
|
|
13
|
+
commitsDone(): Promise<void>;
|
|
14
|
+
compensatesDone(): Promise<void>;
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=transactionFiber_.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionFiber_.d.ts","sourceRoot":"","sources":["../../src/service/transactionFiber_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKhC,qBACa,uBAAwB,SAAQ,QAAQ;IACnD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,uBAAuB,CAAiC;IAEhE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;IAKpD,IAAW,UAAU,sCAEpB;IAED,MAAM,CAAC,EAAE,EAAE,WAAW;IAItB,UAAU,CAAC,EAAE,EAAE,WAAW;IAIpB,QAAQ;
|
|
1
|
+
{"version":3,"file":"transactionFiber_.d.ts","sourceRoot":"","sources":["../../src/service/transactionFiber_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKhC,qBACa,uBAAwB,SAAQ,QAAQ;IACnD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,uBAAuB,CAAiC;IAEhE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;IAKpD,IAAW,UAAU,sCAEpB;IAED,MAAM,CAAC,EAAE,EAAE,WAAW;IAItB,UAAU,CAAC,EAAE,EAAE,WAAW;IAIpB,QAAQ;IAKR,UAAU;IAKV,WAAW;IAIX,eAAe;CAGtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction_.d.ts","sourceRoot":"","sources":["../../src/service/transaction_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EACV,oCAAoC,EACpC,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAKtE,qBACa,kBAAmB,SAAQ,QAAQ;IAC9C,OAAO,CAAC,GAAG,CAAY;IAEvB,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS;IAIhC,IAAI,gBAAgB,wDAEnB;IAED,IAAI,gBAAgB,IAAI,uBAAuB,GAAG,SAAS,CAE1D;IAED,IAAI,aAAa,YAEhB;IAED,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAElD;IAEK,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oCAAoC;IAW5E,UAAU,CAAC,EAAE,EAAE,WAAW;IAOpB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;YAiDhF,uBAAuB;
|
|
1
|
+
{"version":3,"file":"transaction_.d.ts","sourceRoot":"","sources":["../../src/service/transaction_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EACV,oCAAoC,EACpC,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAKtE,qBACa,kBAAmB,SAAQ,QAAQ;IAC9C,OAAO,CAAC,GAAG,CAAY;IAEvB,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS;IAIhC,IAAI,gBAAgB,wDAEnB;IAED,IAAI,gBAAgB,IAAI,uBAAuB,GAAG,SAAS,CAE1D;IAED,IAAI,aAAa,YAEhB;IAED,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAElD;IAEK,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oCAAoC;IAW5E,UAAU,CAAC,EAAE,EAAE,WAAW;IAOpB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;YAiDhF,uBAAuB;CAmCtC"}
|
package/dist/types/columns.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/types/columns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/types/columns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEzD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/.metadata/index.ts
CHANGED
|
@@ -4,15 +4,15 @@ export * from '../bean/aopMethod.transaction.ts';
|
|
|
4
4
|
import type { IAopMethodOptionsTransaction } from '../bean/aopMethod.transaction.ts';
|
|
5
5
|
import 'vona-module-a-aspect';
|
|
6
6
|
declare module 'vona-module-a-aspect' {
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
export interface IAopMethodRecord {
|
|
9
9
|
'a-orm:transaction': IAopMethodOptionsTransaction;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
}
|
|
14
14
|
declare module 'vona-module-a-orm' {
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
export interface AopMethodTransaction {
|
|
17
17
|
/** @internal */
|
|
18
18
|
get scope(): ScopeModuleAOrm;
|
|
@@ -22,7 +22,7 @@ declare module 'vona-module-a-orm' {
|
|
|
22
22
|
get $beanFullName(): 'a-orm.aopMethod.transaction';
|
|
23
23
|
get $onionName(): 'a-orm:transaction';
|
|
24
24
|
get $onionOptions(): IAopMethodOptionsTransaction;
|
|
25
|
-
}
|
|
25
|
+
}
|
|
26
26
|
}
|
|
27
27
|
/** aopMethod: end */
|
|
28
28
|
/** bean: begin */
|
|
@@ -31,15 +31,15 @@ export * from '../bean/bean.model.ts';
|
|
|
31
31
|
|
|
32
32
|
import 'vona';
|
|
33
33
|
declare module 'vona' {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
|
|
35
|
+
|
|
36
36
|
}
|
|
37
37
|
declare module 'vona-module-a-orm' {
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
export interface BeanDatabase {
|
|
40
40
|
/** @internal */
|
|
41
41
|
get scope(): ScopeModuleAOrm;
|
|
42
|
-
}
|
|
42
|
+
}
|
|
43
43
|
}
|
|
44
44
|
/** bean: end */
|
|
45
45
|
/** bean: begin */
|
|
@@ -74,15 +74,15 @@ export * from '../service/transaction_.ts';
|
|
|
74
74
|
|
|
75
75
|
import 'vona-module-a-bean';
|
|
76
76
|
declare module 'vona-module-a-bean' {
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
export interface IServiceRecord {
|
|
79
79
|
'a-orm:database': never;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
}
|
|
84
84
|
declare module 'vona-module-a-orm' {
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
export interface ServiceDatabase {
|
|
87
87
|
/** @internal */
|
|
88
88
|
get scope(): ScopeModuleAOrm;
|
|
@@ -91,8 +91,7 @@ declare module 'vona-module-a-orm' {
|
|
|
91
91
|
export interface ServiceDatabase {
|
|
92
92
|
get $beanFullName(): 'a-orm.service.database';
|
|
93
93
|
get $onionName(): 'a-orm:database';
|
|
94
|
-
|
|
95
|
-
}
|
|
94
|
+
}
|
|
96
95
|
}
|
|
97
96
|
/** service: end */
|
|
98
97
|
/** service: begin */
|
|
@@ -115,15 +114,15 @@ export * from '../bean/broadcast.columnsClear.ts';
|
|
|
115
114
|
|
|
116
115
|
import { type IDecoratorBroadcastOptions } from 'vona-module-a-broadcast';
|
|
117
116
|
declare module 'vona-module-a-broadcast' {
|
|
118
|
-
|
|
117
|
+
|
|
119
118
|
export interface IBroadcastRecord {
|
|
120
119
|
'a-orm:columnsClear': IDecoratorBroadcastOptions;
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
|
|
122
|
+
|
|
124
123
|
}
|
|
125
124
|
declare module 'vona-module-a-orm' {
|
|
126
|
-
|
|
125
|
+
|
|
127
126
|
export interface BroadcastColumnsClear {
|
|
128
127
|
/** @internal */
|
|
129
128
|
get scope(): ScopeModuleAOrm;
|
|
@@ -133,7 +132,7 @@ declare module 'vona-module-a-orm' {
|
|
|
133
132
|
get $beanFullName(): 'a-orm.broadcast.columnsClear';
|
|
134
133
|
get $onionName(): 'a-orm:columnsClear';
|
|
135
134
|
get $onionOptions(): IDecoratorBroadcastOptions;
|
|
136
|
-
}
|
|
135
|
+
}
|
|
137
136
|
}
|
|
138
137
|
/** broadcast: end */
|
|
139
138
|
/** broadcast: begin */
|
|
@@ -148,11 +147,11 @@ export * from '../bean/event.columnsClear.ts';
|
|
|
148
147
|
|
|
149
148
|
import 'vona';
|
|
150
149
|
declare module 'vona' {
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
|
|
151
|
+
|
|
153
152
|
}
|
|
154
153
|
declare module 'vona-module-a-orm' {
|
|
155
|
-
|
|
154
|
+
|
|
156
155
|
export interface EventClientNameReal {
|
|
157
156
|
/** @internal */
|
|
158
157
|
get scope(): ScopeModuleAOrm;
|
|
@@ -161,7 +160,6 @@ declare module 'vona-module-a-orm' {
|
|
|
161
160
|
export interface EventClientNameReal {
|
|
162
161
|
get $beanFullName(): 'a-orm.event.clientNameReal';
|
|
163
162
|
get $onionName(): 'a-orm:clientNameReal';
|
|
164
|
-
|
|
165
163
|
}
|
|
166
164
|
|
|
167
165
|
export interface EventColumnsClear {
|
|
@@ -172,8 +170,7 @@ declare module 'vona-module-a-orm' {
|
|
|
172
170
|
export interface EventColumnsClear {
|
|
173
171
|
get $beanFullName(): 'a-orm.event.columnsClear';
|
|
174
172
|
get $onionName(): 'a-orm:columnsClear';
|
|
175
|
-
|
|
176
|
-
}
|
|
173
|
+
}
|
|
177
174
|
}
|
|
178
175
|
/** event: end */
|
|
179
176
|
/** event: begin */
|
|
@@ -187,7 +184,7 @@ export interface IModuleEvent {
|
|
|
187
184
|
/** event: begin */
|
|
188
185
|
import type { TypeEventClientNameRealData, TypeEventClientNameRealResult } from '../bean/event.clientNameReal.ts';
|
|
189
186
|
import type { TypeEventColumnsClearData, TypeEventColumnsClearResult } from '../bean/event.columnsClear.ts';
|
|
190
|
-
import type { EventOn } from 'vona-module-a-event';
|
|
187
|
+
import type { EventOn } from 'vona-module-a-event';
|
|
191
188
|
declare module 'vona-module-a-event' {
|
|
192
189
|
export interface IEventRecord {
|
|
193
190
|
'a-orm:clientNameReal': EventOn<TypeEventClientNameRealData, TypeEventClientNameRealResult>;
|
|
@@ -201,16 +198,16 @@ export * from '../bean/hmr.model.ts';
|
|
|
201
198
|
|
|
202
199
|
import 'vona';
|
|
203
200
|
declare module 'vona' {
|
|
204
|
-
|
|
201
|
+
|
|
205
202
|
export interface IHmrRecord {
|
|
206
203
|
'a-orm:entity': never;
|
|
207
204
|
'a-orm:model': never;
|
|
208
205
|
}
|
|
209
206
|
|
|
210
|
-
|
|
207
|
+
|
|
211
208
|
}
|
|
212
209
|
declare module 'vona-module-a-orm' {
|
|
213
|
-
|
|
210
|
+
|
|
214
211
|
export interface HmrEntity {
|
|
215
212
|
/** @internal */
|
|
216
213
|
get scope(): ScopeModuleAOrm;
|
|
@@ -219,7 +216,6 @@ declare module 'vona-module-a-orm' {
|
|
|
219
216
|
export interface HmrEntity {
|
|
220
217
|
get $beanFullName(): 'a-orm.hmr.entity';
|
|
221
218
|
get $onionName(): 'a-orm:entity';
|
|
222
|
-
|
|
223
219
|
}
|
|
224
220
|
|
|
225
221
|
export interface HmrModel {
|
|
@@ -230,8 +226,7 @@ declare module 'vona-module-a-orm' {
|
|
|
230
226
|
export interface HmrModel {
|
|
231
227
|
get $beanFullName(): 'a-orm.hmr.model';
|
|
232
228
|
get $onionName(): 'a-orm:model';
|
|
233
|
-
|
|
234
|
-
}
|
|
229
|
+
}
|
|
235
230
|
}
|
|
236
231
|
/** hmr: end */
|
|
237
232
|
/** queue: begin */
|
|
@@ -239,15 +234,15 @@ export * from '../bean/queue.doubleDelete.ts';
|
|
|
239
234
|
|
|
240
235
|
import { type IDecoratorQueueOptions } from 'vona-module-a-queue';
|
|
241
236
|
declare module 'vona-module-a-queue' {
|
|
242
|
-
|
|
237
|
+
|
|
243
238
|
export interface IQueueRecord {
|
|
244
239
|
'a-orm:doubleDelete': IDecoratorQueueOptions;
|
|
245
240
|
}
|
|
246
241
|
|
|
247
|
-
|
|
242
|
+
|
|
248
243
|
}
|
|
249
244
|
declare module 'vona-module-a-orm' {
|
|
250
|
-
|
|
245
|
+
|
|
251
246
|
export interface QueueDoubleDelete {
|
|
252
247
|
/** @internal */
|
|
253
248
|
get scope(): ScopeModuleAOrm;
|
|
@@ -257,7 +252,7 @@ declare module 'vona-module-a-orm' {
|
|
|
257
252
|
get $beanFullName(): 'a-orm.queue.doubleDelete';
|
|
258
253
|
get $onionName(): 'a-orm:doubleDelete';
|
|
259
254
|
get $onionOptions(): IDecoratorQueueOptions;
|
|
260
|
-
}
|
|
255
|
+
}
|
|
261
256
|
}
|
|
262
257
|
/** queue: end */
|
|
263
258
|
/** queue: begin */
|
|
@@ -271,15 +266,15 @@ export * from '../bean/schedule.softDeletionPrune.ts';
|
|
|
271
266
|
|
|
272
267
|
import { type IDecoratorScheduleOptions } from 'vona-module-a-schedule';
|
|
273
268
|
declare module 'vona-module-a-schedule' {
|
|
274
|
-
|
|
269
|
+
|
|
275
270
|
export interface IScheduleRecord {
|
|
276
271
|
'a-orm:softDeletionPrune': IDecoratorScheduleOptions;
|
|
277
272
|
}
|
|
278
273
|
|
|
279
|
-
|
|
274
|
+
|
|
280
275
|
}
|
|
281
276
|
declare module 'vona-module-a-orm' {
|
|
282
|
-
|
|
277
|
+
|
|
283
278
|
export interface ScheduleSoftDeletionPrune {
|
|
284
279
|
/** @internal */
|
|
285
280
|
get scope(): ScopeModuleAOrm;
|
|
@@ -289,7 +284,7 @@ declare module 'vona-module-a-orm' {
|
|
|
289
284
|
get $beanFullName(): 'a-orm.schedule.softDeletionPrune';
|
|
290
285
|
get $onionName(): 'a-orm:softDeletionPrune';
|
|
291
286
|
get $onionOptions(): IDecoratorScheduleOptions;
|
|
292
|
-
}
|
|
287
|
+
}
|
|
293
288
|
}
|
|
294
289
|
/** schedule: end */
|
|
295
290
|
/** config: begin */
|
|
@@ -333,7 +328,7 @@ declare module 'vona' {
|
|
|
333
328
|
export interface IBeanScopeContainer {
|
|
334
329
|
orm: ScopeModuleAOrm;
|
|
335
330
|
}
|
|
336
|
-
|
|
331
|
+
|
|
337
332
|
export interface IBeanScopeConfig {
|
|
338
333
|
'a-orm': ReturnType<typeof config>;
|
|
339
334
|
}
|
|
@@ -62,10 +62,12 @@ export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
|
62
62
|
callback: (tableBuilder: Knex.CreateTableBuilder) => any,
|
|
63
63
|
): Promise<void> {
|
|
64
64
|
await this.schema.createTable(tableName, callback);
|
|
65
|
+
this.db.columns.columnsClear(tableName);
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
async dropTable(tableName: string) {
|
|
68
69
|
await this.schema.dropTable(tableName);
|
|
70
|
+
this.db.columns.columnsClear(tableName);
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
async alterTable(
|
|
@@ -75,15 +77,17 @@ export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
|
75
77
|
): Promise<void> {
|
|
76
78
|
if (!alterViewAuto) {
|
|
77
79
|
// alter table
|
|
78
|
-
return await this.schema.alterTable(tableName, table => {
|
|
79
|
-
return callback(table);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
await this._viewDependentsAll_handle(tableName, async () => {
|
|
83
80
|
await this.schema.alterTable(tableName, table => {
|
|
84
81
|
return callback(table);
|
|
85
82
|
});
|
|
86
|
-
}
|
|
83
|
+
} else {
|
|
84
|
+
await this._viewDependentsAll_handle(tableName, async () => {
|
|
85
|
+
await this.schema.alterTable(tableName, table => {
|
|
86
|
+
return callback(table);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
this.db.columns.columnsClear(tableName);
|
|
87
91
|
}
|
|
88
92
|
|
|
89
93
|
async viewDependents(viewName: string): Promise<string[]> {
|
package/src/service/columns_.ts
CHANGED
|
@@ -32,8 +32,7 @@ export class ServiceColumns extends BeanBase {
|
|
|
32
32
|
let columns = this.serviceColumnsCache.getColumnsCache(tableName);
|
|
33
33
|
if (!columns) {
|
|
34
34
|
const dialect = this.db.dialect;
|
|
35
|
-
const
|
|
36
|
-
const map = await connection(tableName).columnInfo();
|
|
35
|
+
const map = await dialect.fetchColumns(this.db.connection, tableName);
|
|
37
36
|
columns = {};
|
|
38
37
|
for (const name in map) {
|
|
39
38
|
columns[name] = dialect.coerceColumn(map[name]);
|
|
@@ -15,17 +15,17 @@ import type {
|
|
|
15
15
|
} from '../types/dialect.ts';
|
|
16
16
|
|
|
17
17
|
const BOOLEAN_COLUMN_TYPES = ['bit', 'bool', 'boolean'];
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
|
|
18
|
+
const INTEGER_COLUMN_TYPES = ['tinyint', 'smallint', 'mediumint', 'int', 'integer'];
|
|
19
|
+
const FLOAT_COLUMN_TYPES = ['float', 'double'];
|
|
20
|
+
const GENERATED_DEFAULT_PATTERN =
|
|
21
|
+
/^(?:current_timestamp\b(?:\s*\(\s*\d*\s*\))?|current_date\b|current_time\b(?:\s*\(\s*\d*\s*\))?|now\s*\(\s*\)|nextval\s*\()/i;
|
|
22
|
+
const NUMBER_LITERAL_PATTERN = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
|
|
23
|
+
const QUOTED_LITERAL_PATTERN = /^'((?:''|[^'])*)'$/;
|
|
24
|
+
|
|
25
|
+
type ColumnDefaultLiteral =
|
|
26
|
+
| { kind: 'string'; value: string }
|
|
27
|
+
| { kind: 'boolean'; value: boolean }
|
|
28
|
+
| { kind: 'number'; value: string };
|
|
29
29
|
|
|
30
30
|
@Service()
|
|
31
31
|
@Virtual()
|
|
@@ -79,6 +79,13 @@ export class ServiceDatabaseDialectBase extends BeanBase {
|
|
|
79
79
|
return datas;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
async fetchColumns(
|
|
83
|
+
connection: Knex,
|
|
84
|
+
tableName: string,
|
|
85
|
+
): Promise<Record<string, Knex.ColumnInfo>> {
|
|
86
|
+
return await connection(tableName).columnInfo();
|
|
87
|
+
}
|
|
88
|
+
|
|
82
89
|
query(_result) {
|
|
83
90
|
throw new Error('Not Implemented');
|
|
84
91
|
}
|
|
@@ -89,10 +96,37 @@ export class ServiceDatabaseDialectBase extends BeanBase {
|
|
|
89
96
|
|
|
90
97
|
coerceColumn(column: Knex.ColumnInfo): ITableColumn {
|
|
91
98
|
const result = { type: column.type } as ITableColumn;
|
|
92
|
-
|
|
99
|
+
const columnType = (column as Knex.ColumnInfo & { columnType?: string }).columnType;
|
|
100
|
+
if (columnType) result.columnType = columnType;
|
|
101
|
+
result.default = this._coerceColumnValue(result, column.defaultValue);
|
|
93
102
|
return result;
|
|
94
103
|
}
|
|
95
104
|
|
|
105
|
+
protected _isMysqlBooleanColumn(column: Pick<ITableColumn, 'columnType'>) {
|
|
106
|
+
return column.columnType?.trim().toLowerCase() === 'tinyint(1)';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected async selectAsMysql(
|
|
110
|
+
_builder: Knex.QueryBuilder,
|
|
111
|
+
datas: any[],
|
|
112
|
+
fn: TypeDatabaseDialectTableColumnsFn,
|
|
113
|
+
): Promise<any[]> {
|
|
114
|
+
const columns = await fn();
|
|
115
|
+
for (const data of datas) {
|
|
116
|
+
for (const columnName in columns) {
|
|
117
|
+
const column = columns[columnName];
|
|
118
|
+
if (
|
|
119
|
+
Object.prototype.hasOwnProperty.call(data, columnName) &&
|
|
120
|
+
this._isMysqlBooleanColumn(column)
|
|
121
|
+
) {
|
|
122
|
+
const value = data[columnName];
|
|
123
|
+
if (!isNil(value)) data[columnName] = safeBoolean(value);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return datas;
|
|
128
|
+
}
|
|
129
|
+
|
|
96
130
|
protected async selectAsSqlite3(
|
|
97
131
|
_builder: Knex.QueryBuilder,
|
|
98
132
|
datas: any[],
|
|
@@ -105,7 +139,9 @@ export class ServiceDatabaseDialectBase extends BeanBase {
|
|
|
105
139
|
const column = columns[columnName];
|
|
106
140
|
if (Object.prototype.hasOwnProperty.call(data, columnName)) {
|
|
107
141
|
const value = data[columnName];
|
|
108
|
-
if (column.type
|
|
142
|
+
if (BOOLEAN_COLUMN_TYPES.includes(column.type) && !isNil(value)) {
|
|
143
|
+
data[columnName] = safeBoolean(value);
|
|
144
|
+
} else if (column.type === 'json' && !isNil(value) && typeof value === 'string') {
|
|
109
145
|
data[columnName] = JSON.parse(value);
|
|
110
146
|
} else if (column.type === 'datetime' && !isNil(value)) {
|
|
111
147
|
data[columnName] = new Date(value);
|
|
@@ -155,34 +191,105 @@ export class ServiceDatabaseDialectBase extends BeanBase {
|
|
|
155
191
|
return [items.map(item => item.id), builder];
|
|
156
192
|
}
|
|
157
193
|
|
|
158
|
-
protected _coerceColumnValue(
|
|
194
|
+
protected _coerceColumnValue(column: Pick<ITableColumn, 'type' | 'columnType'>, value: unknown) {
|
|
159
195
|
if (isNil(value)) return undefined;
|
|
160
|
-
if (
|
|
161
|
-
|
|
162
|
-
if (
|
|
163
|
-
this._columnTypePrefixes(type, TIMESTAMP_COLUMN_TYPE_PREFIXES) &&
|
|
164
|
-
value === 'CURRENT_TIMESTAMP'
|
|
165
|
-
) {
|
|
166
|
-
return undefined; // new Date();
|
|
196
|
+
if (typeof value !== 'string') {
|
|
197
|
+
return this._isBooleanColumn(column) ? safeBoolean(value as any) : value;
|
|
167
198
|
}
|
|
168
|
-
|
|
169
|
-
|
|
199
|
+
|
|
200
|
+
const literal = this._coerceColumnLiteral(value);
|
|
201
|
+
if (literal === undefined) return undefined;
|
|
202
|
+
if (this._isBooleanColumn(column)) return safeBoolean(literal.value);
|
|
203
|
+
if (literal.kind === 'boolean') return literal.value;
|
|
204
|
+
|
|
205
|
+
const type = this._columnTypeName(column.type);
|
|
206
|
+
if (literal.kind === 'string') return literal.value;
|
|
207
|
+
if (INTEGER_COLUMN_TYPES.includes(type)) return this._safeInteger(literal.value);
|
|
208
|
+
if (FLOAT_COLUMN_TYPES.includes(type)) return this._safeNumber(literal.value);
|
|
209
|
+
return literal.value;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
protected _isBooleanColumn(column: Pick<ITableColumn, 'type' | 'columnType'>) {
|
|
213
|
+
return (
|
|
214
|
+
this._isMysqlBooleanColumn(column) ||
|
|
215
|
+
BOOLEAN_COLUMN_TYPES.includes(this._columnTypeName(column.type))
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
protected _columnTypeName(type: string) {
|
|
220
|
+
return type.trim().toLowerCase().match(/^\w+/)?.[0] ?? '';
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
protected _coerceColumnLiteral(value: string): ColumnDefaultLiteral | undefined {
|
|
224
|
+
const literal = this._unwrapColumnDefault(value);
|
|
225
|
+
if (literal === '') return undefined;
|
|
226
|
+
const literalLower = literal.toLowerCase();
|
|
227
|
+
if (literalLower === 'null' || GENERATED_DEFAULT_PATTERN.test(literal)) return undefined;
|
|
228
|
+
const quoted = literal.match(QUOTED_LITERAL_PATTERN);
|
|
229
|
+
if (quoted) return { kind: 'string', value: quoted[1].replaceAll("''", "'") };
|
|
230
|
+
if (literalLower === 'true' || literalLower === 't') return { kind: 'boolean', value: true };
|
|
231
|
+
if (literalLower === 'false' || literalLower === 'f') return { kind: 'boolean', value: false };
|
|
232
|
+
if (NUMBER_LITERAL_PATTERN.test(literal)) return { kind: 'number', value: literal };
|
|
233
|
+
if (this._isExpressionColumnDefault(literal)) return undefined;
|
|
234
|
+
return { kind: 'string', value: literal };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
protected _unwrapColumnDefault(value: string) {
|
|
238
|
+
let literal = value.trim();
|
|
239
|
+
while (literal.startsWith('(') && literal.endsWith(')')) {
|
|
240
|
+
const inner = literal.slice(1, -1).trim();
|
|
241
|
+
if (!inner || !this._isColumnDefaultBalanced(inner)) break;
|
|
242
|
+
literal = inner;
|
|
170
243
|
}
|
|
171
|
-
|
|
172
|
-
|
|
244
|
+
const castIndex = literal.indexOf('::');
|
|
245
|
+
if (castIndex > 0 && this._isScalarColumnDefault(literal.slice(0, castIndex).trim())) {
|
|
246
|
+
literal = literal.slice(0, castIndex).trim();
|
|
173
247
|
}
|
|
174
|
-
|
|
175
|
-
if (value.indexOf('NULL::') === 0) return undefined;
|
|
176
|
-
return value;
|
|
248
|
+
return literal;
|
|
177
249
|
}
|
|
178
250
|
|
|
179
|
-
|
|
180
|
-
|
|
251
|
+
protected _isScalarColumnDefault(value: string) {
|
|
252
|
+
return (
|
|
253
|
+
value.toLowerCase() === 'null' ||
|
|
254
|
+
QUOTED_LITERAL_PATTERN.test(value) ||
|
|
255
|
+
value.toLowerCase() === 'true' ||
|
|
256
|
+
value.toLowerCase() === 'false' ||
|
|
257
|
+
NUMBER_LITERAL_PATTERN.test(value)
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
protected _isColumnDefaultBalanced(value: string) {
|
|
262
|
+
let depth = 0;
|
|
263
|
+
let quoted = false;
|
|
264
|
+
for (let index = 0; index < value.length; index++) {
|
|
265
|
+
const char = value[index];
|
|
266
|
+
if (char === "'") {
|
|
267
|
+
if (quoted && value[index + 1] === "'") {
|
|
268
|
+
index++;
|
|
269
|
+
} else {
|
|
270
|
+
quoted = !quoted;
|
|
271
|
+
}
|
|
272
|
+
} else if (!quoted && char === '(') {
|
|
273
|
+
depth++;
|
|
274
|
+
} else if (!quoted && char === ')') {
|
|
275
|
+
if (depth === 0) return false;
|
|
276
|
+
depth--;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return !quoted && depth === 0;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
protected _isExpressionColumnDefault(value: string) {
|
|
283
|
+
return /[()*/+\-\s]/.test(value);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
protected _safeInteger(value: string) {
|
|
181
287
|
const num = Number(value);
|
|
182
|
-
return Number.
|
|
288
|
+
return Number.isSafeInteger(num) ? num : value;
|
|
183
289
|
}
|
|
184
290
|
|
|
185
|
-
protected
|
|
186
|
-
|
|
291
|
+
protected _safeNumber(value: string) {
|
|
292
|
+
const num = Number(value);
|
|
293
|
+
return Number.isFinite(num) ? num : undefined;
|
|
187
294
|
}
|
|
188
295
|
}
|
|
@@ -30,13 +30,19 @@ export class ServiceTransactionFiber extends BeanBase {
|
|
|
30
30
|
|
|
31
31
|
async doCommit() {
|
|
32
32
|
await this._connection.commit();
|
|
33
|
-
await this._transactionConsistency.commitsDone();
|
|
34
33
|
this._connection = undefined as any;
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
async doRollback() {
|
|
38
37
|
await this._connection.rollback();
|
|
39
|
-
await this._transactionConsistency.compensatesDone();
|
|
40
38
|
this._connection = undefined as any;
|
|
41
39
|
}
|
|
40
|
+
|
|
41
|
+
async commitsDone() {
|
|
42
|
+
await this._transactionConsistency.commitsDone();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async compensatesDone() {
|
|
46
|
+
await this._transactionConsistency.compensatesDone();
|
|
47
|
+
}
|
|
42
48
|
}
|