Code coverage report for thinkjs/lib/Lib/Driver/Socket/MysqlSocket.js

Statements: 100% (47 / 47)      Branches: 94.44% (17 / 18)      Functions: 100% (12 / 12)      Lines: 100% (47 / 47)      Ignored: none     

All files » thinkjs/lib/Lib/Driver/Socket/ » MysqlSocket.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105            2 2   2   18 18 18 18             18 1   17 17   17           17   17   16 1 1   15       17 1     17 1     17   17 5   17 17               10 10   10 10 10 10 10   6 4 4 4 1   3     2   4 4   10               9 8 8        
/**
 * mysql socket
 * @return {[type]} [description]
 */
 
//暂时使用mysql库
var mysql = require('mysql');
module.exports = Class(function(){
  'use strict';
  return {
    init: function(config){
      this.handle = null;
      this.config = config;
      this.deferred = null;
      this.tryTimes = 0;
    },
    /**
     * 建立数据库连接
     * @return {[type]} [description]
     */
    connect: function(){
      if (this.handle) {
        return this.deferred.promise;
      }
      var self = this;
      var deferred = getDefer();
      //创建连接
      var config = extend({
        host: '127.0.0.1',
        port: 3306,
        user: 'root',
        password: ''
      }, this.config);
      var connection = mysql.createConnection(config);
      //连接
      connection.connect(function(err){
        //连接失败
        if (err) {
          deferred.reject(err);
          self.close();
        }else{
          deferred.resolve();
        }
      });
      //错误时关闭当前连接
      connection.on('error', function(){
        self.close();
      });
      //PROTOCOL_CONNECTION_LOST
      connection.on('end', function(){
        self.close();
      })
      //连接句柄
      this.handle = connection;
      //把上一次的promise reject
      if (this.deferred) {
        this.deferred.reject(new Error('connection closed'));
      }
      this.deferred = deferred;
      return this.deferred.promise;
    },
    /**
     * 查询sql语句,返回一个promise
     * @param  {[type]} sql [description]
     * @return {[type]}     [description]
     */
    query: function(sql){
      Eif (C('db_log_sql')) {
        console.log('sql: ' + sql);
      }
      var self = this;
      return this.connect().then(function(){
        var deferred = getDefer();
        self.handle.query(sql, function(err, rows){
          if (err) {
            //当数据量非常大时,可能会出现连接丢失,这里进行重连
            if (err.code === 'PROTOCOL_CONNECTION_LOST' && self.tryTimes < 3) {
              self.tryTimes++;
              self.close();
              return self.query(sql).then(function(data){
                deferred.resolve(data);
              }).catch(function(err){
                deferred.reject(err);
              })
            }
            return deferred.reject(err);
          }
          self.tryTimes = 0;
          return deferred.resolve(rows || []);
        });
        return deferred.promise;
      });
    },
    /**
     * 关闭连接
     * @return {[type]} [description]
     */
    close: function(){
      if (this.handle) {
        this.handle.destroy();
        this.handle = null;
      }
    }
  };
});