func executeLine(tx *sql.Tx, txnLine string) error { if tidb.IsQuery(txnLine) { rows, err := tx.Query(txnLine) if err != nil { return errors.Trace(err) } defer rows.Close() cols, err := rows.Columns() if err != nil { return errors.Trace(err) } values := make([][]byte, len(cols)) scanArgs := make([]interface{}, len(values)) for i := range values { scanArgs[i] = &values[i] } var datas [][]string for rows.Next() { err := rows.Scan(scanArgs...) if err != nil { return errors.Trace(err) } data := make([]string, len(cols)) for i, value := range values { if value == nil { data[i] = "NULL" } else { data[i] = string(value) } } datas = append(datas, data) } // For `cols` and `datas[i]` always has the same length, // no need to check return validity. result, _ := printer.GetPrintResult(cols, datas) fmt.Printf("%s", result) if err := rows.Err(); err != nil { return errors.Trace(err) } } else { // TODO: rows affected and last insert id _, err := tx.Exec(txnLine) if err != nil { return errors.Trace(err) } } return nil }
func executeLine(tx *sql.Tx, txnLine string) error { start := time.Now() if tidb.IsQuery(txnLine) { rows, err := tx.Query(txnLine) elapsed := time.Since(start).Seconds() if err != nil { return errors.Trace(err) } defer rows.Close() cols, err := rows.Columns() if err != nil { return errors.Trace(err) } values := make([][]byte, len(cols)) scanArgs := make([]interface{}, len(values)) for i := range values { scanArgs[i] = &values[i] } var datas [][]string for rows.Next() { err := rows.Scan(scanArgs...) if err != nil { return errors.Trace(err) } data := make([]string, len(cols)) for i, value := range values { if value == nil { data[i] = "NULL" } else { data[i] = string(value) } } datas = append(datas, data) } // For `cols` and `datas[i]` always has the same length, // no need to check return validity. result, _ := printer.GetPrintResult(cols, datas) fmt.Printf("%s", result) switch len(datas) { case 0: fmt.Printf("Empty set") case 1: fmt.Printf("1 row in set") default: fmt.Printf("%v rows in set", len(datas)) } fmt.Printf(" (%.2f sec)\n", elapsed) if err := rows.Err(); err != nil { return errors.Trace(err) } } else { // TODO: last insert id res, err := tx.Exec(txnLine) elapsed := time.Since(start).Seconds() if err != nil { return errors.Trace(err) } cnt, err := res.RowsAffected() if err != nil { return errors.Trace(err) } switch cnt { case 0, 1: fmt.Printf("Query OK, %d row affected", cnt) default: fmt.Printf("Query OK, %d rows affected", cnt) } fmt.Printf(" (%.2f sec)\n", elapsed) } return nil }