plyql
Version:
A SQL-like interface for Plywood
124 lines (123 loc) • 4.43 kB
JavaScript
;
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;