'use strict'; const Queue = require('denque'); const _addPacket = function (msg) { this.lastPackets.push(msg); while (this.lastPackets.size() > 32) this.lastPackets.shift(); }; const _getLastPackets = function () { let output = ''; let packet; while ((packet = this.lastPackets.shift())) { output += '\n' + packet; } return output; }; class ConnectionInformation { constructor() { this.threadId = -1; this.status = null; this.serverVersion = null; this.serverCapabilities = null; } addPacket(msg) {} getLastPackets() { return ''; } enableLogPacket() { this.lastPackets = new Queue(); this.addPacket = _addPacket.bind(this); this.getLastPackets = _getLastPackets.bind(this); } hasMinVersion(major, minor, patch) { if (!this.serverVersion) throw new Error('cannot know if server version until connection is established'); if (!major) throw new Error('a major version must be set'); if (!minor) minor = 0; if (!patch) patch = 0; let ver = this.serverVersion; return ( ver.major > major || (ver.major === major && ver.minor > minor) || (ver.major === major && ver.minor === minor && ver.patch >= patch) ); } isMariaDB() { if (!this.serverVersion) throw new Error('cannot know if server is MariaDB until connection is established'); return this.serverVersion.mariaDb; } /** * Parse raw info to set server major/minor/patch values * @param info */ static parseVersionString(info) { let car; let offset = 0; let type = 0; let val = 0; for (; offset < info.serverVersion.raw.length; offset++) { car = info.serverVersion.raw.charCodeAt(offset); if (car < 48 || car > 57) { switch (type) { case 0: info.serverVersion.major = val; break; case 1: info.serverVersion.minor = val; break; case 2: info.serverVersion.patch = val; return; } type++; val = 0; } else { val = val * 10 + car - 48; } } //serverVersion finished by number like "5.5.57", assign patchVersion if (type === 2) info.serverVersion.patch = val; } } module.exports = ConnectionInformation;