55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const EventEmitter = require('events').EventEmitter;
 | |
| const Timers = require('timers');
 | |
| 
 | |
| class Command extends EventEmitter {
 | |
|   constructor() {
 | |
|     super();
 | |
|     this.next = null;
 | |
|   }
 | |
| 
 | |
|   // slow. debug only
 | |
|   stateName() {
 | |
|     const state = this.next;
 | |
|     for (const i in this) {
 | |
|       if (this[i] === state && i !== 'next') {
 | |
|         return i;
 | |
|       }
 | |
|     }
 | |
|     return 'unknown name';
 | |
|   }
 | |
| 
 | |
|   execute(packet, connection) {
 | |
|     if (!this.next) {
 | |
|       this.next = this.start;
 | |
|       connection._resetSequenceId();
 | |
|     }
 | |
|     if (packet && packet.isError()) {
 | |
|       const err = packet.asError(connection.clientEncoding);
 | |
|       err.sql = this.sql || this.query;
 | |
|       if (this.queryTimeout) {
 | |
|         Timers.clearTimeout(this.queryTimeout);
 | |
|         this.queryTimeout = null;
 | |
|       }
 | |
|       if (this.onResult) {
 | |
|         this.onResult(err);
 | |
|         this.emit('end');
 | |
|       } else {
 | |
|         this.emit('error', err);
 | |
|         this.emit('end');
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
|     // TODO: don't return anything from execute, it's ugly and error-prone. Listen for 'end' event in connection
 | |
|     this.next = this.next(packet, connection);
 | |
|     if (this.next) {
 | |
|       return false;
 | |
|     }
 | |
|     this.emit('end');
 | |
|     return true;
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = Command;
 |