mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-04-07 14:04:35 +08:00
Fixed sql requests which have used 'LIMIT' clause in oracle database
This commit is contained in:
@ -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]);
|
||||
|
||||
@ -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 = [];
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user