diff --git a/DocService/sources/baseConnector.js b/DocService/sources/baseConnector.js index 0ae04cd2..e1e04399 100644 --- a/DocService/sources/baseConnector.js +++ b/DocService/sources/baseConnector.js @@ -41,6 +41,7 @@ var sqlDataBaseType = { }; const connectorUtilities = require('./connectorUtilities'); +const utils = require('./../../Common/sources/utils'); var bottleneck = require("bottleneck"); var config = require('config'); var configSql = config.get('services.CoAuthoring.sql'); @@ -252,6 +253,36 @@ exports.getChangesPromise = function (ctx, docId, optStartIndex, optEndIndex, op }); }); }; +exports.getDocumentsWithChanges = baseConnector.getDocumentsWithChanges ?? function (ctx) { + return new Promise(function(resolve, reject) { + const sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE EXISTS(SELECT id FROM ${cfgTableChanges} WHERE tenant=${cfgTableResult}.tenant AND id = ${cfgTableResult}.id LIMIT 1);`; + baseConnector.sqlQuery(ctx, sqlCommand, function(error, result) { + if (error) { + reject(error); + } else { + resolve(result); + } + }, false, false); + }); +} +exports.getExpired = baseConnector.getExpired ?? function(ctx, maxCount, expireSeconds) { + return new Promise(function(resolve, reject) { + const values = []; + const expireDate = new Date(); + utils.addSeconds(expireDate, -expireSeconds); + const date = addSqlParam(expireDate, values); + const count = addSqlParam(maxCount, values); + const sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE last_open_date <= ${date}` + + ` AND NOT EXISTS(SELECT tenant, id FROM ${cfgTableChanges} WHERE ${cfgTableChanges}.tenant = ${cfgTableResult}.tenant AND ${cfgTableChanges}.id = ${cfgTableResult}.id LIMIT 1) LIMIT ${count};`; + baseConnector.sqlQuery(ctx, sqlCommand, function(error, result) { + if (error) { + reject(error); + } else { + resolve(result); + } + }, false, false, values); + }); +} exports.isLockCriticalSection = function (id) { return !!(g_oCriticalSection[id]); diff --git a/DocService/sources/changes2forgotten.js b/DocService/sources/changes2forgotten.js index 59ecd17e..34f43cc0 100644 --- a/DocService/sources/changes2forgotten.js +++ b/DocService/sources/changes2forgotten.js @@ -58,18 +58,6 @@ var LOOP_TIMEOUT = 1000; var EXEC_TIMEOUT = WAIT_TIMEOUT + utils.getConvertionTimeout(undefined); let addSqlParam = sqlBase.baseConnector.addSqlParameter; -function getDocumentsWithChanges(ctx) { - return new Promise(function(resolve, reject) { - let sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE EXISTS(SELECT id FROM ${cfgTableChanges} WHERE tenant=${cfgTableResult}.tenant AND id = ${cfgTableResult}.id LIMIT 1);`; - sqlBase.baseConnector.sqlQuery(ctx, sqlCommand, function(error, result) { - if (error) { - reject(error); - } else { - resolve(result); - } - }, undefined, undefined); - }); -} function updateDoc(ctx, docId, status, callback) { return new Promise(function(resolve, reject) { let values = []; @@ -109,7 +97,7 @@ function shutdown() { ctx.logger.debug('shutdown start wait pubsub deliver'); yield utils.sleep(LOOP_TIMEOUT); - let documentsWithChanges = yield getDocumentsWithChanges(ctx); + let documentsWithChanges = yield sqlBase.getDocumentsWithChanges(ctx); ctx.logger.debug('shutdown docs with changes count = %s', documentsWithChanges.length); let docsWithEmptyForgotten = []; let docsWithOutOfDateForgotten = []; diff --git a/DocService/sources/oracleBaseConnector.js b/DocService/sources/oracleBaseConnector.js index 03fa7192..d0b109b6 100644 --- a/DocService/sources/oracleBaseConnector.js +++ b/DocService/sources/oracleBaseConnector.js @@ -35,9 +35,12 @@ const oracledb = require('oracledb'); const config = require('config'); const connectorUtilities = require('./connectorUtilities'); +const utils = require('./../../Common/sources/utils'); +const {result} = require("underscore"); const configSql = config.get('services.CoAuthoring.sql'); const cfgTableResult = configSql.get('tableResult'); +const cfgTableChanges = configSql.get('tableChanges'); const cfgMaxPacketSize = configSql.get('max_allowed_packet'); const connectionConfiguration = { @@ -154,6 +157,26 @@ function getTableColumns(ctx, tableName) { return executeQuery(ctx, `SELECT LOWER(column_name) AS column_name FROM user_tab_columns WHERE table_name = '${tableName.toUpperCase()}'`); } +function getDocumentsWithChanges(ctx) { + const existingId = `SELECT id FROM ${cfgTableChanges} WHERE tenant=${cfgTableResult}.tenant AND id = ${cfgTableResult}.id AND ROWNUM <= 1`; + const sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE EXISTS(${existingId})`; + + return executeQuery(ctx, sqlCommand); +} + +function getExpired(ctx, maxCount, expireSeconds) { + const expireDate = new Date(); + utils.addSeconds(expireDate, -expireSeconds); + + const values = []; + const date = addSqlParameter(expireDate, values); + const count = addSqlParameter(maxCount, values); + const notExistingTenantAndId = `SELECT tenant, id FROM ${cfgTableChanges} WHERE ${cfgTableChanges}.tenant = ${cfgTableResult}.tenant AND ${cfgTableChanges}.id = ${cfgTableResult}.id AND ROWNUM <= 1` + const sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE last_open_date <= ${date} AND NOT EXISTS(${notExistingTenantAndId}) AND ROWNUM <= ${count}`; + + return executeQuery(ctx, sqlCommand, values); +} + function makeUpdateSql(dateNow, task, values, opt_updateUserIndex) { const lastOpenDate = addSqlParameter(dateNow, values); @@ -306,6 +329,8 @@ module.exports = { addSqlParameter, concatParams, getTableColumns, + getDocumentsWithChanges, + getExpired, upsert, insertChanges } diff --git a/DocService/sources/taskresult.js b/DocService/sources/taskresult.js index 379e9e39..f4751777 100644 --- a/DocService/sources/taskresult.js +++ b/DocService/sources/taskresult.js @@ -314,24 +314,6 @@ function removeIf(ctx, mask) { }, undefined, undefined, values); }); } -function getExpired(ctx, maxCount, expireSeconds) { - return new Promise(function(resolve, reject) { - let values = []; - let expireDate = new Date(); - utils.addSeconds(expireDate, -expireSeconds); - let sqlParam1 = addSqlParam(expireDate, values); - let sqlParam2 = addSqlParam(maxCount, values); - let sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE last_open_date <= ${sqlParam1}` + - ` AND NOT EXISTS(SELECT tenant, id FROM ${cfgTableChanges} WHERE ${cfgTableChanges}.tenant = ${cfgTableResult}.tenant AND ${cfgTableChanges}.id = ${cfgTableResult}.id LIMIT 1) LIMIT ${sqlParam2};`; - sqlBase.baseConnector.sqlQuery(ctx, sqlCommand, function(error, result) { - if (error) { - reject(error); - } else { - resolve(result); - } - }, undefined, undefined, values); - }); -} exports.TaskResultData = TaskResultData; exports.upsert = upsert; @@ -342,4 +324,4 @@ exports.restoreInitialPassword = restoreInitialPassword; exports.addRandomKeyTask = addRandomKeyTask; exports.remove = remove; exports.removeIf = removeIf; -exports.getExpired = getExpired; +exports.getExpired = sqlBase.getExpired;