| 1606 | |
| 1607 | |
| 1608 | static int |
| 1609 | read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths) |
| 1610 | { |
| 1611 | uint field; |
| 1612 | ulong pkt_len,len; |
| 1613 | uchar *pos, *prev_pos, *end_pos; |
| 1614 | NET *net= &mysql->net; |
| 1615 | |
| 1616 | if ((pkt_len=cli_safe_read(mysql)) == packet_error) |
| 1617 | return -1; |
| 1618 | if (pkt_len <= 8 && net->read_pos[0] == 254) |
| 1619 | { |
| 1620 | if (pkt_len > 1) /* MySQL 4.1 protocol */ |
| 1621 | { |
| 1622 | mysql->warning_count= uint2korr(net->read_pos+1); |
| 1623 | mysql->server_status= uint2korr(net->read_pos+3); |
| 1624 | } |
| 1625 | return 1; /* End of data */ |
| 1626 | } |
| 1627 | prev_pos= 0; /* allowed to write at packet[-1] */ |
| 1628 | pos=net->read_pos; |
| 1629 | end_pos=pos+pkt_len; |
| 1630 | for (field=0 ; field < fields ; field++) |
| 1631 | { |
| 1632 | if ((len=(ulong) net_field_length(&pos)) == NULL_LENGTH) |
| 1633 | { /* null field */ |
| 1634 | row[field] = 0; |
| 1635 | *lengths++=0; |
| 1636 | } |
| 1637 | else |
| 1638 | { |
| 1639 | if (len > (ulong) (end_pos - pos)) |
| 1640 | { |
| 1641 | set_mysql_error(mysql, CR_UNKNOWN_ERROR, unknown_sqlstate); |
| 1642 | return -1; |
| 1643 | } |
| 1644 | row[field] = (char*) pos; |
| 1645 | pos+=len; |
| 1646 | *lengths++=len; |
| 1647 | } |
| 1648 | if (prev_pos) |
| 1649 | *prev_pos=0; /* Terminate prev field */ |
| 1650 | prev_pos=pos; |
| 1651 | } |
| 1652 | row[field]=(char*) prev_pos+1; /* End of last field */ |
| 1653 | *prev_pos=0; /* Terminate last field */ |
| 1654 | return 0; |
| 1655 | } |
| 1656 | |
| 1657 | |
| 1658 | /**************************************************************************** |
no test coverage detected