Source: parts/executor/exec-postgres-file-js.js

"use strict";

var util = require('util');
var pg = require('pg');
var _ = require('lodash');

var debug = require("debug");
var logDev = debug('dbupdater:executor:postgresFileJs:dev');
var logLog = debug('dbupdater:executor:postgresFileJs:log');
var logWarn = debug('dbupdater:executor:postgresFileJs:warn');
var logErr = debug('dbupdater:executor:postgresFileJs:err');

var TaskExecAbstract = require('./exec-abstract');

/**
 * Выполняет JS файлы. Имена файлов должны соовпадать с регуляркой /^.*\.postgres\-file\-js\.js$/ т.е. файл должен заканчиваться на ".postgres-file-js.js"
 * внутри должен быть валидный NodeJS код. Можно использовать require. Сама задача должна быть оформлена в виде модуля и возвращать функцию с интерфейсом (dbClient, cb)
 * @example
 * // Имя файла 20150506-0053-grigorchuk.postgres-file-js.js
 * var _ = require('lodash');
 * module.exports = function (client, cb) {
 * var sql = 'CREATE TABLE "myyy" (' +
 *      '   name character varying(256) NOT NULL, ' +
 *      '   md5 character varying(128) NOT NULL, ' +
 *      '   executed timestamp without time zone NOT NULL DEFAULT now()' +
 *      ');';
 *      client.query(sql, cb);
 * };
 * @param {Object} config - параметры инициализации транспорта
 * @param {string} config.connString - строка подключения к БД
 * @returns {Executor.TaskExecPostgresFileJs}
 * @constructor
 * @augments Executor.TaskExecAbstract
 * @memberof Executor
 */
function TaskExecPostgresFileJs (config) {
    var self = this;

    if (self instanceof TaskExecPostgresFileJs === false) {
        return new TaskExecPostgresFileJs(config);
    }

    self.config = config || {};
    logDev('Config %j', self.config);
}

TaskExecPostgresFileJs.prototype = new TaskExecAbstract();

/**
 * Определяет принадлежность задачи этому executor'у (по имени задачи, применяя к нему регулярку /^.*\.postgres\-file\-js\.js$/ т.е. файл должен заканчиваться на ".postgres-file-js.js")
 * @abstract
 * @param {string} taskName - имя задачи
 * @returns {boolean} - результат, подходит ли этот формат под задачу (true - значит что этот executor будет выполнять эту задачу, при false продолжится поиск подходящего executor'а)
 */
TaskExecPostgresFileJs.prototype.matchType = function (taskName) {
    var match = !!taskName.match(/^.*\.postgres\-file\-js\.js$/);
    if (match) {
        logDev(util.format('Задача %s совпала с executor`ом exec-postgres-file-js', taskName));
    }
    return match;
};

/**
 * Выполняет файл.
 * @param {object} toExecuteTask - выполняемая задача
 * @param {string} toExecuteTask.name - имя выполенной задачи
 * @param {string} toExecuteTask.md5 - контрольная сумма текста задачи
 * @param {string} text - текст задачи
 * @param {function} cb - колбэк выполнения задачи
 * @param {?Error} cb.err - ошибка выполнения
 */
TaskExecPostgresFileJs.prototype.execute = function (toExecuteTask, text, cb) {
    var self = this,
        client;

    if (!self.config.connString) {
        cb(new Error('parametr "connString" is not set at taskSaver_postgresql config'));
        return;
    }

    pg.connect(self.config.connString, function(err, client, done) {
        if (err) {
            done();
            cb(err);
            return;
        }
        logDev('DB connected');

        try {
            logDev('executing js code:\n' + text);

            require(toExecuteTask.fullPath)(client, function (err) {
                done();
                cb(err);
            });
        } catch (e) {
            done();
            cb(e);
        }
    });
};

module.exports = TaskExecPostgresFileJs;