2016-10-16 02:59:54 +05:30
|
|
|
const url = require('url');
|
2020-04-23 12:25:16 -04:00
|
|
|
const fs = require('fs');
|
2016-10-16 02:59:54 +05:30
|
|
|
function getDatabaseOptionsFromURI(uri) {
|
|
|
|
|
const databaseOptions = {};
|
|
|
|
|
|
|
|
|
|
const parsedURI = url.parse(uri);
|
|
|
|
|
const queryParams = parseQueryParams(parsedURI.query);
|
|
|
|
|
const authParts = parsedURI.auth ? parsedURI.auth.split(':') : [];
|
|
|
|
|
|
|
|
|
|
databaseOptions.host = parsedURI.hostname || 'localhost';
|
|
|
|
|
databaseOptions.port = parsedURI.port ? parseInt(parsedURI.port) : 5432;
|
|
|
|
|
databaseOptions.database = parsedURI.pathname
|
|
|
|
|
? parsedURI.pathname.substr(1)
|
|
|
|
|
: undefined;
|
|
|
|
|
|
|
|
|
|
databaseOptions.user = authParts.length > 0 ? authParts[0] : '';
|
|
|
|
|
databaseOptions.password = authParts.length > 1 ? authParts[1] : '';
|
|
|
|
|
|
2020-04-23 12:25:16 -04:00
|
|
|
if (queryParams.ssl && queryParams.ssl.toLowerCase() === 'true') {
|
|
|
|
|
databaseOptions.ssl = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
queryParams.ca ||
|
|
|
|
|
queryParams.pfx ||
|
|
|
|
|
queryParams.cert ||
|
|
|
|
|
queryParams.key ||
|
|
|
|
|
queryParams.passphrase ||
|
|
|
|
|
queryParams.rejectUnauthorized ||
|
|
|
|
|
queryParams.secureOptions
|
|
|
|
|
) {
|
|
|
|
|
databaseOptions.ssl = {};
|
|
|
|
|
if (queryParams.ca) {
|
|
|
|
|
databaseOptions.ssl.ca = fs.readFileSync(queryParams.ca).toString();
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.pfx) {
|
|
|
|
|
databaseOptions.ssl.pfx = fs.readFileSync(queryParams.pfx).toString();
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.cert) {
|
|
|
|
|
databaseOptions.ssl.cert = fs.readFileSync(queryParams.cert).toString();
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.key) {
|
|
|
|
|
databaseOptions.ssl.key = fs.readFileSync(queryParams.key).toString();
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.passphrase) {
|
|
|
|
|
databaseOptions.ssl.passphrase = queryParams.passphrase;
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.rejectUnauthorized) {
|
|
|
|
|
databaseOptions.ssl.rejectUnauthorized =
|
|
|
|
|
queryParams.rejectUnauthorized.toLowerCase() === 'true' ? true : false;
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.secureOptions) {
|
|
|
|
|
databaseOptions.ssl.secureOptions = parseInt(queryParams.secureOptions);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-16 02:59:54 +05:30
|
|
|
databaseOptions.binary =
|
2018-09-01 13:58:06 -04:00
|
|
|
queryParams.binary && queryParams.binary.toLowerCase() === 'true'
|
|
|
|
|
? true
|
|
|
|
|
: false;
|
2016-10-16 02:59:54 +05:30
|
|
|
|
|
|
|
|
databaseOptions.client_encoding = queryParams.client_encoding;
|
|
|
|
|
databaseOptions.application_name = queryParams.application_name;
|
2018-09-01 13:58:06 -04:00
|
|
|
databaseOptions.fallback_application_name =
|
|
|
|
|
queryParams.fallback_application_name;
|
2016-10-16 02:59:54 +05:30
|
|
|
|
|
|
|
|
if (queryParams.poolSize) {
|
|
|
|
|
databaseOptions.poolSize = parseInt(queryParams.poolSize) || 10;
|
|
|
|
|
}
|
2020-04-23 12:25:16 -04:00
|
|
|
if (queryParams.max) {
|
|
|
|
|
databaseOptions.max = parseInt(queryParams.max) || 10;
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.query_timeout) {
|
|
|
|
|
databaseOptions.query_timeout = parseInt(queryParams.query_timeout);
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.idleTimeoutMillis) {
|
|
|
|
|
databaseOptions.idleTimeoutMillis = parseInt(queryParams.idleTimeoutMillis);
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.keepAlive) {
|
|
|
|
|
databaseOptions.keepAlive =
|
|
|
|
|
queryParams.keepAlive.toLowerCase() === 'true' ? true : false;
|
|
|
|
|
}
|
2016-10-16 02:59:54 +05:30
|
|
|
|
|
|
|
|
return databaseOptions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function parseQueryParams(queryString) {
|
|
|
|
|
queryString = queryString || '';
|
|
|
|
|
|
2018-09-01 13:58:06 -04:00
|
|
|
return queryString.split('&').reduce((p, c) => {
|
|
|
|
|
const parts = c.split('=');
|
|
|
|
|
p[decodeURIComponent(parts[0])] =
|
|
|
|
|
parts.length > 1 ? decodeURIComponent(parts.slice(1).join('=')) : '';
|
|
|
|
|
return p;
|
|
|
|
|
}, {});
|
2016-10-16 02:59:54 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
parseQueryParams: parseQueryParams,
|
2018-09-01 13:58:06 -04:00
|
|
|
getDatabaseOptionsFromURI: getDatabaseOptionsFromURI,
|
2016-10-16 02:59:54 +05:30
|
|
|
};
|