UNPKG

plyql

Version:

A SQL-like interface for Plywood

124 lines (123 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var moment = require("moment-timezone"); var mysql = require("vogievetsky-mysql2"); var TYPES = require('vogievetsky-mysql2/lib/constants/types'); var CHARSETS = require('vogievetsky-mysql2/lib/constants/charsets'); var CLIENT = require('vogievetsky-mysql2/lib/constants/client'); var capabilityFlags = 0 | CLIENT['LONG_PASSWORD'] | CLIENT['FOUND_ROWS'] | CLIENT['LONG_FLAG'] | CLIENT['CONNECT_WITH_DB'] | CLIENT['NO_SCHEMA'] | CLIENT['ODBC'] | CLIENT['LOCAL_FILES'] | CLIENT['IGNORE_SPACE'] | CLIENT['PROTOCOL_41'] | CLIENT['INTERACTIVE'] | CLIENT['IGNORE_SIGPIPE'] | CLIENT['TRANSACTIONS'] | CLIENT['RESERVED'] | CLIENT['SECURE_CONNECTION'] | CLIENT['PLUGIN_AUTH'] | CLIENT['SSL_VERIFY_SERVER_CERT']; function dateToSQL(d, timezone) { return moment.tz(d, timezone.toString()).format('YYYY-MM-DD HH:mm:ss'); } exports.dateToSQL = dateToSQL; function plywoodTypeToMySQL(type) { switch (type) { case 'NULL': return TYPES['VAR_STRING']; case 'BOOLEAN': return TYPES['TINY']; case 'STRING': case 'SET/STRING': return TYPES['VAR_STRING']; case 'NUMBER': return TYPES['DOUBLE']; case 'NUMBER_RANGE': return TYPES['DOUBLE']; case 'TIME': return TYPES['TIMESTAMP']; case 'TIME_RANGE': return TYPES['TIMESTAMP']; default: throw new Error("unsupported type " + type); } } exports.plywoodTypeToMySQL = plywoodTypeToMySQL; function columnToMySQL(column, table) { table = table || ''; return { catalog: 'def', schema: '', name: column.name, orgName: column.name, table: table, orgTable: table, characterSet: CHARSETS['UTF8MB4_UNICODE_CI'], columnLength: 500, columnType: plywoodTypeToMySQL(column.type), flags: 32896, decimals: 0 }; } exports.columnToMySQL = columnToMySQL; function createMySQLGateway(port, queryProcessor) { var server = mysql.createServer(); server.listen(port); console.log("MySQL Gateway listening on port: " + port); console.log("you can connect to it using `mysql --host=127.0.0.1 --port=" + port + "`"); var connectionId = 0; server.on('connection', function (conn) { connectionId++; console.log("New connection " + connectionId); conn.serverHandshake({ protocolVersion: 10, serverVersion: '5.7.11', connectionId: connectionId, statusFlags: 2, characterSet: CHARSETS['UTF8MB4_UNICODE_CI'], capabilityFlags: capabilityFlags }); conn.on('query', function (sql) { console.log("[" + connectionId + "] Got SQL: " + sql); queryProcessor({ sql: sql, connectionId: connectionId }, conn); }); conn.on('error', function (err) { console.log("[" + connectionId + "] Error: " + err.message); }); }); } exports.createMySQLGateway = createMySQLGateway; function fallbackMySQLFactory(connectionUri) { var remote = mysql.createConnection(connectionUri); remote.query('select 1 as one', function (err, res) { if (err) { console.log('Connection to real MySQL fail'); process.exit(1); } else { console.log('Connection to real MySQL success'); } }); return function (sql, conn) { remote.query(sql, function (err, rows, columns) { if (err) { console.log('GOT ERROR', err.code, err.message); conn.writeError({ code: 1149, message: 'Bad query' }); return; } if (!Array.isArray(rows)) { console.log('other result', rows); conn.writeOk(rows); return; } console.log('columns', columns.map(function (d) { return d.name + "(" + d.columnType + ")"; })); console.log('columns', columns); var n = Math.min(5, rows.length); for (var i = 0; i < n; i++) { console.log(rows[i]); } if (n < rows.length) { console.log('... ' + String(rows.length - n)); } conn.writeTextResult(rows, columns); }); }; } exports.fallbackMySQLFactory = fallbackMySQLFactory;