UNPKG

@sap/xsodata

Version:

Expose data from a HANA database as OData V2 service with help of .xsodata files.

174 lines (148 loc) 5.22 kB
'use strict'; const async = require('async'); const connect = require('../db/connect'); const utils = require('./../utils/utils'); const contentIdHelper = require('./contentIdHelper'); const sqlDelete = require('./../sql/createDeleteStatements'); const dataCollectorDelete = require('./../sql/dataCollectorDelete'); const serializer = require('./../serializer/serializer'); const exitProcessor = require('./exitProcessor'); const { eventDelete } = require('./eventActionHandler'); const eventBefore = eventDelete.eventBefore; const eventAfter = eventDelete.eventAfter; const eventPrecommit = eventDelete.eventPrecommit; const eventPostCommit = eventDelete.eventPostCommit; function executeDelete(context, asyncDone) { const dbSeg = context.oData.dbSegmentLast; const entityType = dbSeg.entityType; const _delete = (entityType.modifications || {})['delete'] || {}; if (_delete.using) { exitProcessor.executeExit( _delete.using, 'using', 'delete', context, asyncDone ); } else { dataCollectorDelete.deleteTable(context, asyncDone); } } exports.process = function (context, asyncDone) { context.logger.silly('resourceProcessorDelete', 'process'); async.waterfall( [ utils.injectContext(context), //preparation utils.try(sqlDelete.createDeleteStatementsForCreateTmpTables), utils.try(dataCollectorDelete.createTmpTables), utils.try( contentIdHelper.createNewContentIdFromRecordMapFromPayload ), utils.try(sqlDelete.createDeleteStatementsForDelete), utils.try(dataCollectorDelete.insertDataToDelTable), //execution utils.try(eventBefore), utils.try(executeDelete), utils.try(eventAfter), //commit handling utils.try(eventPrecommit), utils.try(dataCollectorDelete.commit), utils.try(eventPostCommit), // cleanup utils.try(dataCollectorDelete.truncateTempTables), utils.try(dataCollectorDelete.dropTempTables), utils.try(dataCollectorDelete.commit), //post processing utils.try(serializer.serializeNoContent), ], function (err, context) { if (err) { const dbClient = context.db.client; if (dbClient) { //ROLLBack the changes return connect.dbRollback( context, dbClient, function (errDB) { if (errDB) { return asyncDone(errDB, context); } return asyncDone(err, context); } ); } } return asyncDone(err, context); } ); }; exports.processInBatchCreateTables = function (context, asyncDone) { context.logger.silly( 'resourceProcessorDelete', 'processInBatchCreateTables' ); async.waterfall( [ utils.injectContext(context), utils.try(sqlDelete.createDeleteStatementsForCreateTmpTables), utils.try(dataCollectorDelete.createTmpTables), utils.try( contentIdHelper.createNewContentIdFromRecordMapFromPayload ), ], function (err, context) { return asyncDone(err, context); } ); }; exports.processInBatch = function (context, asyncDone) { context.logger.silly('resourceProcessorDelete', 'processInBatch'); async.waterfall( [ utils.injectContext(context), //preparation utils.try(sqlDelete.createDeleteStatementsForDelete), utils.try(dataCollectorDelete.insertDataToDelTable), //execution utils.try(eventBefore), utils.try(executeDelete), utils.try(eventAfter), ], function (err, context) { return asyncDone(err, context); } ); }; exports.processInBatchPreCommitRun = function (context, asyncDone) { context.logger.silly( 'resourceProcessorDelete', 'processInBatchPreCommitRun' ); async.waterfall( [utils.injectContext(context), utils.try(eventPrecommit)], function (err, context) { return asyncDone(err, context); } ); }; exports.processInBatchPostCommitRun = function (context, asyncDone) { context.logger.silly( 'resourceProcessorDelete', 'processInBatchPostCommitRun' ); async.waterfall( [ utils.injectContext(context), utils.try(eventPostCommit), // cleanup utils.try(dataCollectorDelete.truncateTempTables), utils.try(dataCollectorDelete.dropTempTables), // postprocessing utils.try(serializer.serializeNoContent), ], function (err, context) { return asyncDone(err, context); } ); };