asyncer-io / r2dbc-mysql

Reactive Relational Database Connectivity for MySQL. The official successor to mirromutth/r2dbc-mysql(dev.miku:r2dbc-mysql).
https://r2dbc.io
Apache License 2.0
208 stars 21 forks source link

Implemented relaxed conversion logic for BooleanCodec #290

Open svats0001 opened 1 month ago

svats0001 commented 1 month ago

@jchrys #285

Motivation: To allow boolean values stored as strings in MySQL database such as "true", "false", "1" and "0" to be converted to their corresponding boolean values.

Modification: BooleanCodec: Changed decode method to check if VARCHAR value is a boolean value. Changed doCanDecode to add VARCHAR. BooleanCodecTest: Added decodeString test to ensure boolean values stored as strings are converted into the correct corresponding boolean values.

Result: Boolean values stored as strings can now be converted to their corresponding boolean values. Drawbacks are that there could be a string column containing numeric data with values other than 0 or 1 and the column isn't used for storing boolean values at the same time the codec interprets the 0's and 1's as boolean. Only boolean values "true", "false", "1" and "0" are decoded, other possible types of boolean value strings haven't been included. Also, doCanDecode states that the VARCHAR data type can be decoded but only a small subset of this data type can be decoded and it's not possible to highlight the conditions in the doCanDecode method.

jchrys commented 3 weeks ago

Thanks! To closely align with MySQL Connector/J's behavior, please refer to the BooleanValueFactory logic here. Additionally, avoiding fallback on other types' decoding logic can help minimize complexity If numeric handling is challenging, starting with non-numeric cases could be a good first step.

svats0001 commented 2 days ago

Hi @jchrys , I've altered the method so that it conforms with MySQL Connector/J's behaviour. I'm not sure exactly which type of exception needs to be thrown though (if a new type of exception needs to be created), or if an exception needs to be thrown at all.