Skip to content

Commit e1dbd71

Browse files
committed
Transactions on postgres
1 parent a8850f5 commit e1dbd71

File tree

1 file changed

+54
-14
lines changed

1 file changed

+54
-14
lines changed

src/Adapters/Storage/Postgres/PostgresStorageAdapter.js

+54-14
Original file line numberDiff line numberDiff line change
@@ -1236,8 +1236,8 @@ export class PostgresStorageAdapter implements StorageAdapter {
12361236
createObject(
12371237
className: string,
12381238
schema: SchemaType,
1239-
object: any
1240-
/* transactionalSession: ?any */
1239+
object: any,
1240+
transactionalSession: ?any
12411241
) {
12421242
debug('createObject', className, object);
12431243
let columnsArray = [];
@@ -1366,7 +1366,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
13661366
const qs = `INSERT INTO $1:name (${columnsPattern}) VALUES (${valuesPattern})`;
13671367
const values = [className, ...columnsArray, ...valuesArray];
13681368
debug(qs, values);
1369-
return this._client
1369+
const promise = (transactionalSession
1370+
? transactionalSession.t
1371+
: this._client
1372+
)
13701373
.none(qs, values)
13711374
.then(() => ({ ops: [object] }))
13721375
.catch(error => {
@@ -1386,6 +1389,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
13861389
}
13871390
throw error;
13881391
});
1392+
if (transactionalSession) {
1393+
transactionalSession.batch.push(promise);
1394+
}
1395+
return promise;
13891396
}
13901397

13911398
// Remove all objects that match the given Parse Query.
@@ -1394,8 +1401,8 @@ export class PostgresStorageAdapter implements StorageAdapter {
13941401
deleteObjectsByQuery(
13951402
className: string,
13961403
schema: SchemaType,
1397-
query: QueryType
1398-
/* transactionalSession: ?any */
1404+
query: QueryType,
1405+
transactionalSession: ?any
13991406
) {
14001407
debug('deleteObjectsByQuery', className, query);
14011408
const values = [className];
@@ -1407,7 +1414,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
14071414
}
14081415
const qs = `WITH deleted AS (DELETE FROM $1:name WHERE ${where.pattern} RETURNING *) SELECT count(*) FROM deleted`;
14091416
debug(qs, values);
1410-
return this._client
1417+
const promise = (transactionalSession
1418+
? transactionalSession.t
1419+
: this._client
1420+
)
14111421
.one(qs, values, a => +a.count)
14121422
.then(count => {
14131423
if (count === 0) {
@@ -1425,6 +1435,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
14251435
}
14261436
// ELSE: Don't delete anything if doesn't exist
14271437
});
1438+
if (transactionalSession) {
1439+
transactionalSession.batch.push(promise);
1440+
}
1441+
return promise;
14281442
}
14291443
// Return value not currently well specified.
14301444
findOneAndUpdate(
@@ -1449,8 +1463,8 @@ export class PostgresStorageAdapter implements StorageAdapter {
14491463
className: string,
14501464
schema: SchemaType,
14511465
query: QueryType,
1452-
update: any
1453-
/* transactionalSession: ?any */
1466+
update: any,
1467+
transactionalSession: ?any
14541468
): Promise<[any]> {
14551469
debug('updateObjectsByQuery', className, query, update);
14561470
const updatePatterns = [];
@@ -1707,7 +1721,14 @@ export class PostgresStorageAdapter implements StorageAdapter {
17071721
where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
17081722
const qs = `UPDATE $1:name SET ${updatePatterns.join()} ${whereClause} RETURNING *`;
17091723
debug('update: ', qs, values);
1710-
return this._client.any(qs, values);
1724+
const promise = (transactionalSession
1725+
? transactionalSession.t
1726+
: this._client
1727+
).any(qs, values);
1728+
if (transactionalSession) {
1729+
transactionalSession.batch.push(promise);
1730+
}
1731+
return promise;
17111732
}
17121733

17131734
// Hopefully, we can get rid of this. It's only used for config and hooks.
@@ -2359,15 +2380,34 @@ export class PostgresStorageAdapter implements StorageAdapter {
23592380
}
23602381
23612382
createTransactionalSession(): Promise<any> {
2362-
return Promise.resolve();
2383+
return new Promise(resolve => {
2384+
const transactionalSession = {};
2385+
transactionalSession.result = this._client.tx(t => {
2386+
transactionalSession.t = t;
2387+
transactionalSession.promise = new Promise(resolve => {
2388+
transactionalSession.resolve = resolve;
2389+
});
2390+
transactionalSession.batch = [];
2391+
resolve(transactionalSession);
2392+
return transactionalSession.promise;
2393+
});
2394+
});
23632395
}
23642396
2365-
commitTransactionalSession(): Promise<void> {
2366-
return Promise.resolve();
2397+
commitTransactionalSession(transactionalSession: any): Promise<void> {
2398+
transactionalSession.resolve(
2399+
transactionalSession.t.batch(transactionalSession.batch)
2400+
);
2401+
return transactionalSession.result;
23672402
}
23682403
2369-
abortTransactionalSession(): Promise<void> {
2370-
return Promise.resolve();
2404+
abortTransactionalSession(transactionalSession: any): Promise<void> {
2405+
const result = transactionalSession.result.catch();
2406+
transactionalSession.batch.push(Promise.reject());
2407+
transactionalSession.resolve(
2408+
transactionalSession.t.batch(transactionalSession.batch)
2409+
);
2410+
return result;
23712411
}
23722412
}
23732413

0 commit comments

Comments
 (0)