func (a *Attacker) hit(tr Targeter, tm time.Time) *Result { var ( res = Result{Timestamp: tm} tgt Target err error ) defer func() { res.Latency = time.Since(tm) if err != nil { res.Error = err.Error() } }() if err = tr(&tgt); err != nil { return &res } req, err := tgt.Query() if err != nil { return &res } /* a.cnn, err = sql.Open("mysql", a.dsn) if err != nil { res.Code = 500 res.Error = err.Error() return &res } defer a.cnn.Close() a.cnn.SetMaxIdleConns(a.maxIdleConns) a.cnn.SetMaxOpenConns(a.maxOpenConns) */ //log.Printf("query:%s", req) var r *sql.Rows if a.persistent { r, err = a.cnn.Query(req) } else { var cnn *sql.DB cnn, err = sql.Open("mysql", a.dsn) cnn.SetMaxIdleConns(0) cnn.SetMaxOpenConns(1) cnn.SetConnMaxLifetime(1 * time.Nanosecond) if err != nil { res.Code = 500 res.Error = err.Error() return &res } r, err = cnn.Query(req) } if err != nil { // ignore redirect errors when the user set --redirects=NoFollow if a.redirects == NoFollow && strings.Contains(err.Error(), "stopped after") { err = nil } return &res } defer r.Close() num := 0 for r.Next() { num++ /* var id interface{} if err := r.Scan(&id); err != nil { res.Code = 501 res.Error = err.Error() res.Error = fmt.Sprintf("row scan err:%s: query:%s", err.Error(), req) return &res } */ } //fmt.Fprintf(os.Stderr, "%d,", num) res.BytesIn = 0 res.BytesOut = 0 err = r.Err() if err == nil { if num == 0 { res.Code = 201 } else { res.Code = 200 } } else { res.Code = 500 res.Error = fmt.Sprintf("%s: query:%s", err.Error(), req) } return &res }