@starbemtech/star-db-query-builder
Version:
A query builder to be used with mysql or postgres
95 lines • 3.78 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPgClient = void 0;
const promise_retry_1 = __importDefault(require("promise-retry"));
const monitor_1 = require("../monitor/monitor");
const transientErrorCodes = new Set(['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED']);
function isTransientError(error) {
return error && error.code && transientErrorCodes.has(error.code);
}
async function ensureUnaccentExtension(pool) {
try {
const checkResult = await pool.query(`
SELECT 1 FROM pg_extension WHERE extname = 'unaccent'
`);
if (checkResult.rows.length === 0) {
await pool.query('CREATE EXTENSION IF NOT EXISTS unaccent');
monitor_1.monitor.emit(monitor_1.MonitorEvents.CONNECTION_CREATED, {
clientType: 'pg',
extension: 'unaccent',
status: 'installed',
});
console.info('@starbemtech/star-db-query-builder: Extensão unaccent instalada com sucesso.');
}
}
catch (error) {
monitor_1.monitor.emit(monitor_1.MonitorEvents.QUERY_ERROR, {
clientType: 'pg',
action: 'install_unaccent',
error,
});
throw new Error(`@starbemtech/star-db-query-builder: Não foi possível instalar a extensão unaccent:
${error}`);
}
}
const createPgClient = async (pool, retryOptions, poolConfig) => {
await ensureUnaccentExtension(pool);
monitor_1.monitor.emit(monitor_1.MonitorEvents.CONNECTION_CREATED, {
clientType: 'pg',
poolOptions: poolConfig,
});
return {
clientType: 'pg',
query: async (sql, params) => {
return (0, promise_retry_1.default)(async (retry, attempt) => {
const startTime = Date.now();
try {
monitor_1.monitor.emit(monitor_1.MonitorEvents.QUERY_START, {
clientType: 'pg',
sql,
params,
attempt,
});
const { rows } = await pool.query(sql, params);
const elapsedTime = Date.now() - startTime;
monitor_1.monitor.emit(monitor_1.MonitorEvents.QUERY_END, {
clientType: 'pg',
sql,
params,
attempt,
elapsedTime,
});
return rows;
}
catch (error) {
const elapsedTime = Date.now() - startTime;
monitor_1.monitor.emit(monitor_1.MonitorEvents.QUERY_ERROR, {
clientType: 'pg',
sql,
params,
attempt,
elapsedTime,
error,
});
if (isTransientError(error)) {
console.warn(`Postgres query attempt ${attempt} failed, retrying...`, error);
monitor_1.monitor.emit(monitor_1.MonitorEvents.RETRY_ATTEMPT, {
clientType: 'pg',
sql,
params,
attempt,
error,
});
return retry(error);
}
throw error;
}
}, retryOptions);
},
};
};
exports.createPgClient = createPgClient;
//# sourceMappingURL=pgClient.js.map