5
5
*/
6
6
7
7
import * as crypto from "crypto" ;
8
- import { injectable , inject } from "inversify" ;
8
+ import { injectable , inject , optional } from "inversify" ;
9
9
import { Repository , EntityManager , DeepPartial , UpdateQueryBuilder , Brackets } from "typeorm" ;
10
10
import {
11
11
MaybeWorkspace ,
@@ -37,7 +37,6 @@ import {
37
37
SnapshotState ,
38
38
PrebuiltWorkspaceState ,
39
39
} from "@gitpod/gitpod-protocol" ;
40
- import { TypeORM } from "./typeorm" ;
41
40
import { DBWorkspace } from "./entity/db-workspace" ;
42
41
import { DBWorkspaceInstance } from "./entity/db-workspace-instance" ;
43
42
import { DBSnapshot } from "./entity/db-snapshot" ;
@@ -56,6 +55,7 @@ import {
56
55
reportWorkspaceInstancePurged ,
57
56
reportWorkspacePurged ,
58
57
} from "./metrics" ;
58
+ import { TransactionalDBImpl , UndefinedEntityManager } from "./transactional-db-impl" ;
59
59
60
60
type RawTo < T > = ( instance : WorkspaceInstance , ws : Workspace ) => T ;
61
61
interface OrderBy {
@@ -64,46 +64,54 @@ interface OrderBy {
64
64
}
65
65
66
66
@injectable ( )
67
- export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB {
68
- protected abstract getManager ( ) : Promise < EntityManager > ;
67
+ export class TypeORMWorkspaceDBImpl extends TransactionalDBImpl < WorkspaceDB > implements WorkspaceDB {
68
+ constructor ( @inject ( UndefinedEntityManager ) @optional ( ) transactionalEM : EntityManager | undefined ) {
69
+ super ( transactionalEM ) ;
70
+ }
71
+
72
+ protected createTransactionalDB ( transactionalEM : EntityManager ) : WorkspaceDB {
73
+ return new TypeORMWorkspaceDBImpl ( transactionalEM ) ;
74
+ }
69
75
70
76
protected async getWorkspaceRepo ( ) : Promise < Repository < DBWorkspace > > {
71
- return ( await this . getManager ( ) ) . getRepository < DBWorkspace > ( DBWorkspace ) ;
77
+ return ( await this . getEntityManager ( ) ) . getRepository < DBWorkspace > ( DBWorkspace ) ;
72
78
}
73
79
74
80
protected async getWorkspaceInstanceRepo ( ) : Promise < Repository < DBWorkspaceInstance > > {
75
- return ( await this . getManager ( ) ) . getRepository < DBWorkspaceInstance > ( DBWorkspaceInstance ) ;
81
+ return ( await this . getEntityManager ( ) ) . getRepository < DBWorkspaceInstance > ( DBWorkspaceInstance ) ;
76
82
}
77
83
78
84
protected async getWorkspaceInstanceUserRepo ( ) : Promise < Repository < DBWorkspaceInstanceUser > > {
79
- return ( await this . getManager ( ) ) . getRepository < DBWorkspaceInstanceUser > ( DBWorkspaceInstanceUser ) ;
85
+ return ( await this . getEntityManager ( ) ) . getRepository < DBWorkspaceInstanceUser > ( DBWorkspaceInstanceUser ) ;
80
86
}
81
87
82
88
protected async getRepositoryWhitelist ( ) : Promise < Repository < DBRepositoryWhiteList > > {
83
- return ( await this . getManager ( ) ) . getRepository < DBRepositoryWhiteList > ( DBRepositoryWhiteList ) ;
89
+ return ( await this . getEntityManager ( ) ) . getRepository < DBRepositoryWhiteList > ( DBRepositoryWhiteList ) ;
84
90
}
85
91
86
92
protected async getSnapshotRepo ( ) : Promise < Repository < DBSnapshot > > {
87
- return ( await this . getManager ( ) ) . getRepository < DBSnapshot > ( DBSnapshot ) ;
93
+ return ( await this . getEntityManager ( ) ) . getRepository < DBSnapshot > ( DBSnapshot ) ;
88
94
}
89
95
90
96
protected async getPrebuiltWorkspaceRepo ( ) : Promise < Repository < DBPrebuiltWorkspace > > {
91
- return ( await this . getManager ( ) ) . getRepository < DBPrebuiltWorkspace > ( DBPrebuiltWorkspace ) ;
97
+ return ( await this . getEntityManager ( ) ) . getRepository < DBPrebuiltWorkspace > ( DBPrebuiltWorkspace ) ;
92
98
}
93
99
94
100
protected async getPrebuildInfoRepo ( ) : Promise < Repository < DBPrebuildInfo > > {
95
- return ( await this . getManager ( ) ) . getRepository < DBPrebuildInfo > ( DBPrebuildInfo ) ;
101
+ return ( await this . getEntityManager ( ) ) . getRepository < DBPrebuildInfo > ( DBPrebuildInfo ) ;
96
102
}
97
103
98
104
protected async getPrebuiltWorkspaceUpdatableRepo ( ) : Promise < Repository < DBPrebuiltWorkspaceUpdatable > > {
99
- return ( await this . getManager ( ) ) . getRepository < DBPrebuiltWorkspaceUpdatable > ( DBPrebuiltWorkspaceUpdatable ) ;
105
+ return ( await this . getEntityManager ( ) ) . getRepository < DBPrebuiltWorkspaceUpdatable > (
106
+ DBPrebuiltWorkspaceUpdatable ,
107
+ ) ;
100
108
}
101
109
102
110
public async connect ( maxTries : number = 3 , timeout : number = 2000 ) : Promise < void > {
103
111
let tries = 1 ;
104
112
while ( tries <= maxTries ) {
105
113
try {
106
- await this . getManager ( ) ;
114
+ await this . getEntityManager ( ) ;
107
115
return ;
108
116
} catch ( err ) {
109
117
log . error ( `DB connection error (attempt ${ tries } of ${ maxTries } )` , err ) ;
@@ -114,10 +122,6 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB {
114
122
throw new Error ( "Could not establish connection to database!" ) ;
115
123
}
116
124
117
- public async transaction < T > ( code : ( db : WorkspaceDB ) => Promise < T > ) : Promise < T > {
118
- return code ( this ) ;
119
- }
120
-
121
125
async storeInstance ( instance : WorkspaceInstance ) : Promise < WorkspaceInstance > {
122
126
const inst = await this . internalStoreInstance ( instance ) ;
123
127
return inst ;
@@ -1197,34 +1201,4 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB {
1197
1201
}
1198
1202
}
1199
1203
1200
- @injectable ( )
1201
- export class TypeORMWorkspaceDBImpl extends AbstractTypeORMWorkspaceDBImpl {
1202
- @inject ( TypeORM ) protected readonly typeorm : TypeORM ;
1203
-
1204
- protected async getManager ( ) {
1205
- return ( await this . typeorm . getConnection ( ) ) . manager ;
1206
- }
1207
-
1208
- public async transaction < T > ( code : ( db : WorkspaceDB ) => Promise < T > ) : Promise < T > {
1209
- const connection = await this . typeorm . getConnection ( ) ;
1210
- return connection . transaction ( ( manager ) => {
1211
- return code ( new TransactionalWorkspaceDbImpl ( manager ) ) ;
1212
- } ) ;
1213
- }
1214
- }
1215
-
1216
- export class TransactionalWorkspaceDbImpl extends AbstractTypeORMWorkspaceDBImpl {
1217
- constructor ( protected readonly manager : EntityManager ) {
1218
- super ( ) ;
1219
- }
1220
-
1221
- protected async getManager ( ) {
1222
- return this . manager ;
1223
- }
1224
-
1225
- public async transaction < T > ( code : ( sb : WorkspaceDB ) => Promise < T > ) : Promise < T > {
1226
- return await code ( this ) ;
1227
- }
1228
- }
1229
-
1230
1204
type InstanceJoinResult = DBWorkspace & { instance : WorkspaceInstance } ;
0 commit comments