@@ -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