Files
server/DocService/sources/converterservice.js
Sergey.Konovalov 413877d135 значения по умолчанию для codepage, delimiter в ConverterService
git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/nodeJSProjects@65476 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-18 10:38:16 +03:00

119 lines
4.5 KiB
JavaScript

var taskResult = require('./taskresult');
var logger = require('./../../Common/sources/logger');
var utils = require('./../../Common/sources/utils');
var constants = require('./../../Common/sources/constants');
var commonDefines = require('./../../Common/sources/commondefines');
var docsCoServer = require('./DocsCoServer');
var storage = require('./../../Common/sources/storage-base');
var formatChecker = require('./../../Common/sources/formatchecker');
var statsDClient = require('./../../Common/sources/statsdclient');
//todo
var CONVERT_TIMEOUT = 6 * 60 * 1000;
var CONVERT_ASYNC_DELAY = 1000;
var clientStatsD = statsDClient.getClient();
function* getConvertStatus(cmd, selectRes, req) {
var status = {url: undefined, err: constants.NO_ERROR};
if (selectRes.length > 0) {
var row = selectRes[0];
switch (row.tr_status) {
case taskResult.FileStatus.Ok:
status.url = yield storage.getSignedUrl(utils.getBaseUrlByRequest(req), cmd.getDocId() + '/' + cmd.getTitle());
break;
case taskResult.FileStatus.Err:
case taskResult.FileStatus.ErrToReload:
status.err = row.tr_status_info;
break;
case taskResult.FileStatus.NeedParams:
case taskResult.FileStatus.SaveVersion:
case taskResult.FileStatus.UpdateVersion:
status.err = constants.UNKNOWN;
break;
}
var lastOpenDate = row.tr_last_open_date;
//todo
if (new Date().getTime() - lastOpenDate.getTime() > CONVERT_TIMEOUT) {
status.err = constants.UNKNOWN;
}
}
return status;
}
exports.convert = function(req, res) {
utils.spawn(function* () {
var docId = 'null';
try {
var startDate = null;
if(clientStatsD) {
startDate = new Date();
}
var cmd = new commonDefines.InputCommand();
cmd.setCommand('conv');
cmd.setVKey(req.query['vkey']);
cmd.setUrl(req.query['url']);
cmd.setEmbeddedFonts(false);//req.query['embeddedfonts'];
cmd.setFormat(req.query['filetype']);
var outputtype = req.query['outputtype'];
docId = 'conv_' + req.query['key'] + '_' + outputtype;
cmd.setDocId(docId);
cmd.setTitle(constants.OUTPUT_NAME + '.' + outputtype);
cmd.setOutputFormat(formatChecker.getFormatFromString(outputtype));
cmd.setCodepage(commonDefines.c_oAscEncodingsMap[req.query['codePage']] || commonDefines.c_oAscCodePageUtf8);
cmd.setDelimiter(req.query['delimiter'] || commonDefines.c_oAscCsvDelimiter.Comma);
var async = 'true' == req.query['async'];
logger.debug('Start convert request docId = %s', docId);
var task = new taskResult.TaskResultData();
task.key = docId;
task.format = cmd.getFormat();
task.status = taskResult.FileStatus.WaitQueue;
task.statusInfo = constants.NO_ERROR;
task.title = cmd.getTitle();
var upsertRes = yield taskResult.upsert(task);
//var bCreate = (upsertRes.affectedRows == 1);
var bExist = (upsertRes.affectedRows > 1);
var selectRes;
var status;
if (bExist) {
selectRes = yield taskResult.select(task);
status = yield* getConvertStatus(cmd, selectRes, req);
} else {
var queueData = new commonDefines.TaskQueueData();
queueData.setCmd(cmd);
queueData.setToFile(cmd.getTitle());
yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW);
//wait
if (!async) {
var waitTime = 0;
while (true) {
yield utils.sleep(CONVERT_ASYNC_DELAY);
selectRes = yield taskResult.select(task);
status = yield* getConvertStatus(cmd, selectRes, req);
waitTime += CONVERT_ASYNC_DELAY;
if (waitTime > CONVERT_TIMEOUT) {
status.err = constants.CONVERT_TIMEOUT;
}
if (status.url || constants.NO_ERROR != status.err) {
break;
}
}
} else {
status = {url: undefined, percent: 0, err: constants.NO_ERROR};
}
}
utils.fillXmlResponse(res, status.url, status.err);
logger.debug('End convert request url %s status %s docId = %s', status.url, status.err, docId);
if(clientStatsD) {
clientStatsD.timing('coauth.convertservice', new Date() - startDate);
}
}
catch (e) {
logger.error('Error convert: docId = %s\r\n%s', docId, e.stack);
utils.fillXmlResponse(res, undefined, constants.UNKNOWN);
}
});
};