Fixed sql requests which have used 'LIMIT' clause in oracle database

This commit is contained in:
Georgii Petrov
2023-08-23 09:05:53 +03:00
parent 1a76a8c62b
commit aaf28f2acf
4 changed files with 58 additions and 32 deletions

View File

@ -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]);

View File

@ -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 = [];

View File

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

View File

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