function captureOperation()

in packages/mysql/lib/mysql_p.js [194:260]


function captureOperation(name) {
  return function() {
    var args = resolveArguments(arguments);
    var parent = AWSXRay.resolveSegment(args.segment);
    var command;
    var originalOperation = this['__'+name];

    if (args.segment) {
      delete arguments[arguments.length-1];
    }

    if (!parent) {
      AWSXRay.getLogger().info('Failed to capture MySQL. Cannot resolve sub/segment.');
      return originalOperation.apply(this, arguments);
    }

    var config = this.config.connectionConfig || this.config;
    var subsegment = parent.addNewSubsegment(config.database + '@' + config.host);

    if (args.callback) {
      var cb = args.callback;

      if (AWSXRay.isAutomaticMode()) {
        args.callback = function autoContext(err, data) {
          var session = AWSXRay.getNamespace();

          session.run(function() {
            AWSXRay.setSegment(subsegment);
            cb(err, data);
          });

          subsegment.close(err);
        };
      } else {
        args.callback = function wrappedCallback(err, data) {
          cb(err, data);
          subsegment.close(err);
        };
      }
    }

    command = originalOperation.call(this, args.sql, args.values, args.callback);

    if (!args.callback) {
      var errorCapturer = function (err) {
        subsegment.close(err);
      };

      if (isPromise(command)) {
        command.then(() => {
          subsegment.close();
        }).catch (errorCapturer);
      } else {
        command.on('end', function() {
          subsegment.close();
        });

        command.on(events.errorMonitor || 'error', errorCapturer);
      }
    }

    subsegment.addSqlData(createSqlData(config, args.values, args.sql));
    subsegment.namespace = 'remote';

    return command;
  };
}