| 161 | } |
| 162 | |
| 163 | func EncodeOk(_ context.Context, packet *mysql.OKPacket, capabilities uint32) ([]byte, error) { |
| 164 | buf := new(bytes.Buffer) |
| 165 | |
| 166 | // Write Header |
| 167 | if err := buf.WriteByte(packet.Header); err != nil { |
| 168 | return nil, fmt.Errorf("failed to write Header: %w", err) |
| 169 | } |
| 170 | |
| 171 | // Write Affected Rows |
| 172 | if err := utils.WriteLengthEncodedInteger(buf, packet.AffectedRows); err != nil { |
| 173 | return nil, fmt.Errorf("failed to write AffectedRows for OK packet: %w", err) |
| 174 | } |
| 175 | |
| 176 | // Write Last Insert ID |
| 177 | if err := utils.WriteLengthEncodedInteger(buf, packet.LastInsertID); err != nil { |
| 178 | return nil, fmt.Errorf("failed to write LastInsertID for OK packet: %w", err) |
| 179 | } |
| 180 | |
| 181 | // Write Status Flags and Warnings |
| 182 | if capabilities&uint32(mysql.CLIENT_PROTOCOL_41) > 0 { |
| 183 | if err := binary.Write(buf, binary.LittleEndian, packet.StatusFlags); err != nil { |
| 184 | return nil, fmt.Errorf("failed to write StatusFlags for OK packet: %w", err) |
| 185 | } |
| 186 | if err := binary.Write(buf, binary.LittleEndian, packet.Warnings); err != nil { |
| 187 | return nil, fmt.Errorf("failed to write Warnings for OK packet: %w", err) |
| 188 | } |
| 189 | } else if capabilities&uint32(mysql.CLIENT_TRANSACTIONS) > 0 { |
| 190 | if err := binary.Write(buf, binary.LittleEndian, packet.StatusFlags); err != nil { |
| 191 | return nil, fmt.Errorf("failed to write StatusFlags for OK packet: %w", err) |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | // Write Info |
| 196 | if packet.Info != "" { |
| 197 | if _, err := buf.WriteString(packet.Info); err != nil { |
| 198 | return nil, fmt.Errorf("failed to write Info for OK packet: %w", err) |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | return buf.Bytes(), nil |
| 203 | } |