2014-10-23 10:52:21 -04:00
|
|
|
var urlParse = require('url').parse;
|
|
|
|
var ClientConstants = require('./constants/client');
|
|
|
|
var Charsets = require('./constants/charsets');
|
2015-01-28 15:33:44 -05:00
|
|
|
var SSLProfiles = null;
|
2014-10-23 10:52:21 -04:00
|
|
|
|
|
|
|
module.exports = ConnectionConfig;
|
|
|
|
function ConnectionConfig(options) {
|
|
|
|
if (typeof options === 'string') {
|
|
|
|
options = ConnectionConfig.parseUrl(options);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.isServer = options.isServer;
|
|
|
|
this.stream = options.stream;
|
|
|
|
|
|
|
|
this.host = options.host || 'localhost';
|
|
|
|
this.port = options.port || 3306;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.localAddress = options.localAddress;
|
2014-10-23 10:52:21 -04:00
|
|
|
this.socketPath = options.socketPath;
|
|
|
|
this.user = options.user || undefined;
|
|
|
|
this.password = options.password || undefined;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.passwordSha1 = options.passwordSha1 || undefined;
|
2014-10-23 10:52:21 -04:00
|
|
|
this.database = options.database;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.connectTimeout = (options.connectTimeout === undefined)
|
|
|
|
? (10 * 1000)
|
|
|
|
: options.connectTimeout;
|
2014-10-23 10:52:21 -04:00
|
|
|
this.insecureAuth = options.insecureAuth || false;
|
|
|
|
this.supportBigNumbers = options.supportBigNumbers || false;
|
|
|
|
this.bigNumberStrings = options.bigNumberStrings || false;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.dateStrings = options.dateStrings || false;
|
2014-10-23 10:52:21 -04:00
|
|
|
this.debug = options.debug;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.trace = options.trace !== false;
|
|
|
|
this.stringifyObjects = options.stringifyObjects || false;
|
2014-10-23 10:52:21 -04:00
|
|
|
this.timezone = options.timezone || 'local';
|
|
|
|
this.flags = options.flags || '';
|
|
|
|
this.queryFormat = options.queryFormat;
|
|
|
|
this.pool = options.pool || undefined;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.ssl = (typeof options.ssl === 'string')
|
|
|
|
? ConnectionConfig.getSSLProfile(options.ssl)
|
|
|
|
: (options.ssl || false);
|
2014-10-23 10:52:21 -04:00
|
|
|
this.multipleStatements = options.multipleStatements || false;
|
2015-01-28 15:33:44 -05:00
|
|
|
this.typeCast = (options.typeCast === undefined)
|
|
|
|
? true
|
|
|
|
: options.typeCast;
|
2014-10-23 10:52:21 -04:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2015-01-28 15:33:44 -05:00
|
|
|
if (this.ssl) {
|
|
|
|
// Default rejectUnauthorized to true
|
|
|
|
this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false;
|
|
|
|
}
|
|
|
|
|
2014-10-23 10:52:21 -04:00
|
|
|
this.maxPacketSize = 0;
|
|
|
|
this.charsetNumber = (options.charset)
|
|
|
|
? ConnectionConfig.getCharsetNumber(options.charset)
|
|
|
|
: options.charsetNumber||Charsets.UTF8_GENERAL_CI;
|
|
|
|
|
|
|
|
this.clientFlags = ConnectionConfig.mergeFlags(ConnectionConfig.getDefaultFlags(options),
|
|
|
|
options.flags || '');
|
|
|
|
}
|
|
|
|
|
|
|
|
ConnectionConfig.mergeFlags = function(default_flags, user_flags) {
|
|
|
|
var flags = 0x0, i;
|
|
|
|
|
|
|
|
user_flags = (user_flags || '').toUpperCase().split(/\s*,+\s*/);
|
|
|
|
|
|
|
|
// add default flags unless "blacklisted"
|
|
|
|
for (i in default_flags) {
|
|
|
|
if (user_flags.indexOf("-" + default_flags[i]) >= 0) continue;
|
|
|
|
|
|
|
|
flags |= ClientConstants[default_flags[i]] || 0x0;
|
|
|
|
}
|
|
|
|
// add user flags unless already already added
|
|
|
|
for (i in user_flags) {
|
|
|
|
if (user_flags[i][0] == "-") continue;
|
|
|
|
if (default_flags.indexOf(user_flags[i]) >= 0) continue;
|
|
|
|
|
|
|
|
flags |= ClientConstants[user_flags[i]] || 0x0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
ConnectionConfig.getDefaultFlags = function(options) {
|
|
|
|
var defaultFlags = [ "LONG_PASSWORD", "FOUND_ROWS", "LONG_FLAG",
|
|
|
|
"CONNECT_WITH_DB", "ODBC", "LOCAL_FILES",
|
|
|
|
"IGNORE_SPACE", "PROTOCOL_41", "IGNORE_SIGPIPE",
|
|
|
|
"TRANSACTIONS", "RESERVED", "SECURE_CONNECTION",
|
|
|
|
"MULTI_RESULTS" ];
|
|
|
|
if (options && options.multipleStatements) {
|
|
|
|
defaultFlags.push("MULTI_STATEMENTS");
|
|
|
|
}
|
|
|
|
|
|
|
|
return defaultFlags;
|
|
|
|
};
|
|
|
|
|
2015-01-28 15:33:44 -05:00
|
|
|
ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) {
|
|
|
|
var num = Charsets[charset.toUpperCase()];
|
|
|
|
|
|
|
|
if (num === undefined) {
|
|
|
|
throw new TypeError('Unknown charset \'' + charset + '\'');
|
|
|
|
}
|
|
|
|
|
|
|
|
return num;
|
|
|
|
};
|
|
|
|
|
|
|
|
ConnectionConfig.getSSLProfile = function getSSLProfile(name) {
|
|
|
|
if (!SSLProfiles) {
|
|
|
|
SSLProfiles = require('./../fixtures/ssl-profiles.json');
|
|
|
|
}
|
|
|
|
|
|
|
|
var ssl = SSLProfiles[name];
|
|
|
|
|
|
|
|
if (ssl === undefined) {
|
|
|
|
throw new TypeError('Unknown SSL profile \'' + name + '\'');
|
|
|
|
}
|
|
|
|
|
|
|
|
return ssl;
|
2014-10-23 10:52:21 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
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[0];
|
|
|
|
options.password = auth[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
};
|