| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 | var urlParse        = require('url').parse;var ClientConstants = require('./protocol/constants/client');var Charsets        = require('./protocol/constants/charsets');var SSLProfiles     = null;module.exports = ConnectionConfig;function ConnectionConfig(options) {  if (typeof options === 'string') {    options = ConnectionConfig.parseUrl(options);  }  this.host               = options.host || 'localhost';  this.port               = options.port || 3306;  this.localAddress       = options.localAddress;  this.socketPath         = options.socketPath;  this.user               = options.user || undefined;  this.password           = options.password || undefined;  this.database           = options.database;  this.connectTimeout     = (options.connectTimeout === undefined)    ? (10 * 1000)    : options.connectTimeout;  this.insecureAuth       = options.insecureAuth || false;  this.supportBigNumbers  = options.supportBigNumbers || false;  this.bigNumberStrings   = options.bigNumberStrings || false;  this.dateStrings        = options.dateStrings || false;  this.debug              = options.debug;  this.trace              = options.trace !== false;  this.stringifyObjects   = options.stringifyObjects || false;  this.timezone           = options.timezone || 'local';  this.flags              = options.flags || '';  this.queryFormat        = options.queryFormat;  this.pool               = options.pool || undefined;  this.ssl                = (typeof options.ssl === 'string')    ? ConnectionConfig.getSSLProfile(options.ssl)    : (options.ssl || false);  this.localInfile        = (options.localInfile === undefined)    ? true    : options.localInfile;  this.multipleStatements = options.multipleStatements || false;  this.typeCast           = (options.typeCast === undefined)    ? true    : options.typeCast;  if (this.timezone[0] === ' ') {    // "+" is a url encoded char for space so it    // gets translated to space when giving a    // connection string..    this.timezone = '+' + this.timezone.substr(1);  }  if (this.ssl) {    // Default rejectUnauthorized to true    this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false;  }  this.maxPacketSize = 0;  this.charsetNumber = (options.charset)    ? ConnectionConfig.getCharsetNumber(options.charset)    : options.charsetNumber || Charsets.UTF8_GENERAL_CI;  // Set the client flags  var defaultFlags = ConnectionConfig.getDefaultFlags(options);  this.clientFlags = ConnectionConfig.mergeFlags(defaultFlags, options.flags);}ConnectionConfig.mergeFlags = function mergeFlags(defaultFlags, userFlags) {  var allFlags = ConnectionConfig.parseFlagList(defaultFlags);  var newFlags = ConnectionConfig.parseFlagList(userFlags);  // Merge the new flags  for (var flag in newFlags) {    if (allFlags[flag] !== false) {      allFlags[flag] = newFlags[flag];    }  }  // Build flags  var flags = 0x0;  for (var flag in allFlags) {    if (allFlags[flag]) {      // TODO: Throw here on some future release      flags |= ClientConstants['CLIENT_' + flag] || 0x0;    }  }  return flags;};ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) {  var num = Charsets[charset.toUpperCase()];  if (num === undefined) {    throw new TypeError('Unknown charset \'' + charset + '\'');  }  return num;};ConnectionConfig.getDefaultFlags = function getDefaultFlags(options) {  var defaultFlags = [    '-COMPRESS',          // Compression protocol *NOT* supported    '-CONNECT_ATTRS',     // Does *NOT* send connection attributes in Protocol::HandshakeResponse41    '+CONNECT_WITH_DB',   // One can specify db on connect in Handshake Response Packet    '+FOUND_ROWS',        // Send found rows instead of affected rows    '+IGNORE_SIGPIPE',    // Don't issue SIGPIPE if network failures    '+IGNORE_SPACE',      // Let the parser ignore spaces before '('    '+LOCAL_FILES',       // Can use LOAD DATA LOCAL    '+LONG_FLAG',         // Longer flags in Protocol::ColumnDefinition320    '+LONG_PASSWORD',     // Use the improved version of Old Password Authentication    '+MULTI_RESULTS',     // Can handle multiple resultsets for COM_QUERY    '+ODBC',              // Special handling of ODBC behaviour    '-PLUGIN_AUTH',       // Does *NOT* support auth plugins    '+PROTOCOL_41',       // Uses the 4.1 protocol    '+PS_MULTI_RESULTS',  // Can handle multiple resultsets for COM_STMT_EXECUTE    '+RESERVED',          // Unused    '+SECURE_CONNECTION', // Supports Authentication::Native41    '+TRANSACTIONS'       // Expects status flags  ];  if (options && options.localInfile !== undefined && !options.localInfile) {    // Disable LOCAL modifier for LOAD DATA INFILE    defaultFlags.push('-LOCAL_FILES');  }  if (options && options.multipleStatements) {    // May send multiple statements per COM_QUERY and COM_STMT_PREPARE    defaultFlags.push('+MULTI_STATEMENTS');  }  return defaultFlags;};ConnectionConfig.getSSLProfile = function getSSLProfile(name) {  if (!SSLProfiles) {    SSLProfiles = require('./protocol/constants/ssl_profiles');  }  var ssl = SSLProfiles[name];  if (ssl === undefined) {    throw new TypeError('Unknown SSL profile \'' + name + '\'');  }  return ssl;};ConnectionConfig.parseFlagList = function parseFlagList(flagList) {  var allFlags = Object.create(null);  if (!flagList) {    return allFlags;  }  var flags = !Array.isArray(flagList)    ? String(flagList || '').toUpperCase().split(/\s*,+\s*/)    : flagList;  for (var i = 0; i < flags.length; i++) {    var flag   = flags[i];    var offset = 1;    var state  = flag[0];    if (state === undefined) {      // TODO: throw here on some future release      continue;    }    if (state !== '-' && state !== '+') {      offset = 0;      state  = '+';    }    allFlags[flag.substr(offset)] = state === '+';  }  return allFlags;};ConnectionConfig.parseUrl = function(url) {  url = urlParse(url, true);  var options = {    host     : url.hostname,    port     : url.port,    database : url.pathname.substr(1)  };  if (url.auth) {    var auth = url.auth.split(':');    options.user     = auth.shift();    options.password = auth.join(':');  }  if (url.query) {    for (var key in url.query) {      var value = url.query[key];      try {        // Try to parse this as a JSON expression first        options[key] = JSON.parse(value);      } catch (err) {        // Otherwise assume it is a plain string        options[key] = value;      }    }  }  return options;};
 |