func (c *ClientConn) executeInNode(conn *backend.BackendConn, sql string, args []interface{}) ([]*mysql.Result, error) { var state string startTime := time.Now().UnixNano() r, err := conn.Execute(sql, args...) if err != nil { state = "ERROR" } else { state = "OK" } execTime := float64(time.Now().UnixNano()-startTime) / float64(time.Millisecond) if strings.ToLower(c.proxy.logSql[c.proxy.logSqlIndex]) != golog.LogSqlOff && execTime > float64(c.proxy.slowLogTime[c.proxy.slowLogTimeIndex]) { c.proxy.counter.IncrSlowLogTotal() golog.OutputSql(state, "%.1fms - %s->%s:%s", execTime, c.c.RemoteAddr(), conn.GetAddr(), sql, ) } if err != nil { return nil, err } return []*mysql.Result{r}, err }
func (c *ClientConn) handleUseDB(dbName string) error { var co *backend.BackendConn var err error if len(dbName) == 0 { return fmt.Errorf("must have database, the length of dbName is zero") } if c.schema == nil { return mysql.NewDefaultError(mysql.ER_NO_DB_ERROR) } nodeName := c.schema.rule.DefaultRule.Nodes[0] n := c.proxy.GetNode(nodeName) //get the connection from slave preferentially co, err = n.GetSlaveConn() if err != nil { co, err = n.GetMasterConn() } defer c.closeConn(co, false) if err != nil { return err } if err = co.UseDB(dbName); err != nil { return err } c.db = dbName return c.writeOK(nil) }
func (c *ClientConn) closeConn(conn *backend.BackendConn, rollback bool) { if c.isInTransaction() { return } if rollback { conn.Rollback() } conn.Close() }
func (c *ClientConn) executeInNode(conn *backend.BackendConn, sql string, args []interface{}) ([]*mysql.Result, error) { var state string r, err := conn.Execute(sql, args...) if err != nil { state = "ERROR" } else { state = "INFO" } if strings.ToLower(c.proxy.cfg.LogSql) != golog.LogSqlOff { golog.OutputSql(state, "%s->%s:%s", c.c.RemoteAddr(), conn.GetAddr(), sql, ) } if err != nil { return nil, err } return []*mysql.Result{r}, err }