<commit_before>(function () {
    'use strict';

    var Promise = require('bluebird');
    var PreparedStatement = require('./statement');
    var utils = require('./utils');

    module.exports = Transaction;

    /**
     * Обертка над Firebird транзакцией
     *
     * @param connection  Соединение
     * @param driverTransaction Firebird транзакция
     * @constructor
     */
    function Transaction(connection, driverTransaction) {
        this.connection = connection;
        this.transaction = driverTransaction;
    }

    /**
     * Выполнить запрос на указанной транзакции
     *
     * @param {String} sql     Текст запроса
     * @param {Array}  params  Массив параметров запроса
     * @returns {Promise<data>}
     */
    Transaction.prototype.query = function (sql, params) {
        var self = this;
        utils.updateLastActive(self.connection);

        return new Promise(function (resolve, reject) {
            self.transaction.query(sql, params, function (err, result, output, isArray) {
                if (err) {
                    return reject(err);
                }

                resolve(result);
            });
        });
    };

    /**
     * Коммит транзакции
     *
     * @returns {Promise}
     */
    Transaction.prototype.commit = function () {
        utils.updateLastActive(this.connection);

        return Promise.promisify(this.transaction.commit.bind(this.transaction))();
    };

    /**
     * Враппер для коммита транзакции, который в случае успеха вернет переданный в него параметр или результат предыдущего обещания.
     *
     * @param [actualResult] Параметр который будет вернут обещанием после коммита транзакции
     * @returns {function(this:Transaction)} Фукнция-враппер
     */
    Transaction.prototype.commitAndReturn = function (actualResult) {
        return function (result) {
            result = actualResult || result;

            return this.commit()
                .then(function () {
                    return result;
                });
        }.bind(this);
    };

    /**
     * Откат транзакции
     *
     * @returns {Promise}
     */
    Transaction.prototype.rollback = function () {
        utils.updateLastActive(this.connection);

        return Promise.promisify(this.transaction.rollback.bind(this.transaction))();
    };

    /**
     * Враппер для отката транзакции, который после отката перебросит полученное исключение
     *
     * @returns {function(this:Transaction)} Фукнция-враппер
     */
    Transaction.prototype.rollbackAndRethrow = function () {
        return function (error) {
            return this.rollback()
                .finally(function () {
                    throw error;
                });
        }.bind(this);
    };

    /**
     * Создание prepared statement
     *
     * @param sql Текст запроса
     * @returns {Promise<PreparedStatement>}
     */
    Transaction.prototype.prepareStatement = function (sql) {
        var self = this;
        utils.updateLastActive(self.connection);

        return Promise.promisify(self.transaction.newStatement.bind(self.transaction))(sql)
            .then(function (statement) {
                return new PreparedStatement(self.connection, self, statement);
            });
    };<commit_msg>renamed last added methods for better understanding<commit_after>(function () {
    'use strict';

    var Promise = require('bluebird');
    var PreparedStatement = require('./statement');
    var utils = require('./utils');

    module.exports = Transaction;

    /**
     * Обертка над Firebird транзакцией
     *
     * @param connection  Соединение
     * @param driverTransaction Firebird транзакция
     * @constructor
     */
    function Transaction(connection, driverTransaction) {
        this.connection = connection;
        this.transaction = driverTransaction;
    }

    /**
     * Выполнить запрос на указанной транзакции
     *
     * @param {String} sql     Текст запроса
     * @param {Array}  params  Массив параметров запроса
     * @returns {Promise<data>}
     */
    Transaction.prototype.query = function (sql, params) {
        var self = this;
        utils.updateLastActive(self.connection);

        return new Promise(function (resolve, reject) {
            self.transaction.query(sql, params, function (err, result, output, isArray) {
                if (err) {
                    return reject(err);
                }

                resolve(result);
            });
        });
    };

    /**
     * Коммит транзакции
     *
     * @returns {Promise}
     */
    Transaction.prototype.commit = function () {
        utils.updateLastActive(this.connection);

        return Promise.promisify(this.transaction.commit.bind(this.transaction))();
    };

    /**
     * Враппер для коммита транзакции, который в случае успеха вернет переданный в него параметр или результат предыдущего обещания.
     *
     * @param [actualResult] Параметр который будет вернут обещанием после коммита транзакции
     * @returns {function(this:Transaction)} Функция-враппер
     */
    Transaction.prototype.createCommitAndReturn = function (actualResult) {
        return function (result) {
            result = actualResult || result;

            return this.commit()
                .then(function () {
                    return result;
                });
        }.bind(this);
    };

    /**
     * Откат транзакции
     *
     * @returns {Promise}
     */
    Transaction.prototype.rollback = function () {
        utils.updateLastActive(this.connection);

        return Promise.promisify(this.transaction.rollback.bind(this.transaction))();
    };

    /**
     * Враппер для отката транзакции, который после отката перебросит полученное исключение
     *
     * @returns {function(this:Transaction)} Функция-враппер
     */
    Transaction.prototype.createRollbackAndRethrow = function () {
        return function (error) {
            return this.rollback()
                .finally(function () {
                    throw error;
                });
        }.bind(this);
    };

    /**
     * Создание prepared statement
     *
     * @param sql Текст запроса
     * @returns {Promise<PreparedStatement>}
     */
    Transaction.prototype.prepareStatement = function (sql) {
        var self = this;
        utils.updateLastActive(self.connection);

        return Promise.promisify(self.transaction.newStatement.bind(self.transaction))(sql)
            .then(function (statement) {
                return new PreparedStatement(self.connection, self, statement);
            });
    };
{'fraction_non_alphanumeric': 0.10686095931997572, 'fraction_numerical': 0.0, 'mean_word_length': 2.121269540502132, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3597328', 'n_tokens_mistral': 1844, 'n_tokens_neox': 1902, 'n_words': 382}