UNPKG

sqlpad

Version:

Web app. Write SQL and visualize the results. Supports Postgres, MySQL, SQL Server, Crate, Vertica and SAP HANA.

65 lines (58 loc) 1.8 kB
const fetch = require('node-fetch'); const NEXT_URI_TIMEOUT = 100; module.exports = { send }; // Util - setTimeout as a promise function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // Get Presto headers from config function getHeaders(config) { const headers = { 'X-Presto-User': config.user }; if (config.catalog) { headers['X-Presto-Catalog'] = config.catalog; } if (config.schema) { headers['X-Presto-Schema'] = config.schema; } return headers; } // Given config and query, returns promise with the results function send(config, query) { if (!config.url) { return Promise.reject(new Error('config.url is required')); } const results = { data: [] }; return fetch(`${config.url}/v1/statement`, { method: 'POST', body: query, headers: getHeaders(config) }) .then(response => response.json()) .then(statement => handleStatementAndGetMore(results, statement, config)); } function updateResults(results, statement) { if (statement.data && statement.data.length) { results.data = results.data.concat(statement.data); } if (statement.columns) { results.columns = statement.columns; } return results; } function handleStatementAndGetMore(results, statement, config) { if (statement.error) { // A lot of other error data available, // but error.message contains the detail on syntax issue return Promise.reject(statement.error.message); } results = updateResults(results, statement); if (!statement.nextUri) { return Promise.resolve(results); } return wait(NEXT_URI_TIMEOUT) .then(() => fetch(statement.nextUri, { headers: getHeaders(config) })) .then(response => response.json()) .then(statement => handleStatementAndGetMore(results, statement, config)); }