@@ -1236,8 +1236,8 @@ export class PostgresStorageAdapter implements StorageAdapter {
1236
1236
createObject (
1237
1237
className : string ,
1238
1238
schema : SchemaType ,
1239
- object : any
1240
- /* transactionalSession: ?any */
1239
+ object : any ,
1240
+ transactionalSession : ?any
1241
1241
) {
1242
1242
debug ( 'createObject' , className , object ) ;
1243
1243
let columnsArray = [ ] ;
@@ -1366,7 +1366,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
1366
1366
const qs = `INSERT INTO $1:name (${ columnsPattern } ) VALUES (${ valuesPattern } )` ;
1367
1367
const values = [ className , ...columnsArray , ...valuesArray ] ;
1368
1368
debug ( qs , values ) ;
1369
- return this . _client
1369
+ const promise = ( transactionalSession
1370
+ ? transactionalSession . t
1371
+ : this . _client
1372
+ )
1370
1373
. none ( qs , values )
1371
1374
. then ( ( ) => ( { ops : [ object ] } ) )
1372
1375
. catch ( error => {
@@ -1386,6 +1389,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
1386
1389
}
1387
1390
throw error ;
1388
1391
} ) ;
1392
+ if ( transactionalSession ) {
1393
+ transactionalSession . batch . push ( promise ) ;
1394
+ }
1395
+ return promise ;
1389
1396
}
1390
1397
1391
1398
// Remove all objects that match the given Parse Query.
@@ -1394,8 +1401,8 @@ export class PostgresStorageAdapter implements StorageAdapter {
1394
1401
deleteObjectsByQuery (
1395
1402
className : string ,
1396
1403
schema : SchemaType ,
1397
- query : QueryType
1398
- /* transactionalSession: ?any */
1404
+ query : QueryType ,
1405
+ transactionalSession : ?any
1399
1406
) {
1400
1407
debug ( 'deleteObjectsByQuery' , className , query ) ;
1401
1408
const values = [ className ] ;
@@ -1407,7 +1414,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
1407
1414
}
1408
1415
const qs = `WITH deleted AS (DELETE FROM $1:name WHERE ${ where . pattern } RETURNING *) SELECT count(*) FROM deleted` ;
1409
1416
debug ( qs , values ) ;
1410
- return this . _client
1417
+ const promise = ( transactionalSession
1418
+ ? transactionalSession . t
1419
+ : this . _client
1420
+ )
1411
1421
. one ( qs , values , a => + a . count )
1412
1422
. then ( count => {
1413
1423
if ( count === 0 ) {
@@ -1425,6 +1435,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
1425
1435
}
1426
1436
// ELSE: Don't delete anything if doesn't exist
1427
1437
} ) ;
1438
+ if ( transactionalSession ) {
1439
+ transactionalSession . batch . push ( promise ) ;
1440
+ }
1441
+ return promise ;
1428
1442
}
1429
1443
// Return value not currently well specified.
1430
1444
findOneAndUpdate (
@@ -1449,8 +1463,8 @@ export class PostgresStorageAdapter implements StorageAdapter {
1449
1463
className : string ,
1450
1464
schema : SchemaType ,
1451
1465
query : QueryType ,
1452
- update : any
1453
- /* transactionalSession: ?any */
1466
+ update : any ,
1467
+ transactionalSession : ?any
1454
1468
) : Promise < [ any ] > {
1455
1469
debug ( 'updateObjectsByQuery' , className , query , update ) ;
1456
1470
const updatePatterns = [ ] ;
@@ -1707,7 +1721,14 @@ export class PostgresStorageAdapter implements StorageAdapter {
1707
1721
where . pattern . length > 0 ? `WHERE ${ where . pattern } ` : '' ;
1708
1722
const qs = `UPDATE $1:name SET ${ updatePatterns . join ( ) } ${ whereClause } RETURNING *` ;
1709
1723
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 ;
1711
1732
}
1712
1733
1713
1734
// Hopefully, we can get rid of this. It's only used for config and hooks.
@@ -2359,15 +2380,34 @@ export class PostgresStorageAdapter implements StorageAdapter {
2359
2380
}
2360
2381
2361
2382
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
+ });
2363
2395
}
2364
2396
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;
2367
2402
}
2368
2403
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;
2371
2411
}
2372
2412
}
2373
2413
0 commit comments