UNPKG

plyql

Version:

A SQL-like interface for Plywood

121 lines (120 loc) 4.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var plywood_1 = require("plywood"); var variables_1 = require("./variables"); var mysql_gateway_1 = require("./mysql-gateway"); var plyql_executor_1 = require("./plyql-executor"); function printError(sql, err) { console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'); console.log('Failed to resolve query with Plywood.'); console.log('Query:'); console.log(sql); console.log('If you believe this query should work please create an issue on PlyQL and include this section'); console.log('Issue url: https://github.com/implydata/plyql/issues'); console.log('Message:'); console.log(err.message); console.log('Stack:'); console.log(err.stack); console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'); } function datumToMySQLRow(row, timezone) { var newRow = {}; for (var k in row) { var v = row[k]; if (v && v.start) v = v.start; if (v && v.toISOString) { v = mysql_gateway_1.dateToSQL(v, timezone); } else if (plywood_1.Set.isSet(v) || plywood_1.TimeRange.isTimeRange(v)) { v = v.toString(timezone); } else if (typeof v === 'boolean') { v = Number(v); } newRow[k] = v; } return newRow; } function plyqlMySQLGateway(port, context, timezone, fallbackURI) { mysql_gateway_1.createMySQLGateway(port, function (parameters, conn) { var sql = parameters.sql, connectionId = parameters.connectionId; var myContext = context; var match; if ((/SELECT\s+@@/i).test(sql)) { sql = sql.replace(/@@(?:global\.|session\.)?/g, ''); myContext = { data: variables_1.getVariablesFlatDataset() }; } if (match = sql.match(/USE\s+`/i)) { sql = "SET NAMES 'utf8'"; } if (match = sql.match(/SELECT\s+(CONNECTION_ID\(\s*\))/i)) { var name = match[1]; var row = {}; row[name] = connectionId; conn.writeTextResult([row], [ { catalog: 'def', schema: '', name: 'CONNECTION_ID()', orgName: 'CONNECTION_ID()', table: '', orgTable: '', characterSet: 33, columnLength: 500, columnType: 0x8, flags: 32896, decimals: 0 } ]); return; } var sqlParse; try { sqlParse = plywood_1.Expression.parseSQL(sql); } catch (e) { printError(sql, e); conn.writeError({ code: 1064, message: e.message }); return; } if (!sqlParse.verb) { conn.writeError({ code: 1064, message: "Must have a verb" }); return; } switch (sqlParse.verb) { case 'SET': conn.writeOk(); return; case 'SELECT': plyql_executor_1.executeSQLParse(sqlParse, myContext, timezone) .then(function (dataset) { if (plywood_1.Dataset.isDataset(dataset)) { var flatDataset = dataset.flatten(); var plyColumns = flatDataset.attributes.map(function (c) { return mysql_gateway_1.columnToMySQL(c, sqlParse.table); }); var plyRows = flatDataset.data.map(function (d) { return datumToMySQLRow(d, timezone); }); conn.writeTextResult(plyRows, plyColumns); } else { throw new Error('unexpected result from expression'); } }); return; default: conn.writeError({ code: 1337, message: "Permission to " + sqlParse.verb + " denied" }); return; } }); } exports.plyqlMySQLGateway = plyqlMySQLGateway;