convertStringValueToProvidedType<T> method
Converte um valor (normalmente lido do MySQL em formato string ou binário)
para o tipo Dart desejado T
.
value
: valor lido (pode ser uma string ou Uint8List, dependendo da coluna).
columnLength
: (opcional) o tamanho da coluna, usado para decisões de conversão.
Se o valor for nulo, retorna null
.
Se T
for Uint8List
e o valor já for do tipo Uint8List
, retorna-o diretamente.
Se T
for String
ou dynamic
, retorna o valor como está.
Para tipos numéricos, bool ou DateTime, o método tenta converter a string
utilizando as funções parse correspondentes.
Lança MySQLProtocolException se não for possível converter.
Implementation
T? convertStringValueToProvidedType<T>(dynamic value, [int? columnLength]) {
if (value == null) {
return null;
}
// Se T é Uint8List e o valor já é desse tipo, retorna direto.
if (T == Uint8List && value is Uint8List) {
return value as T;
}
// Se T é String ou dynamic, retornamos como está.
if (T == String || T == dynamic) {
return value as T;
}
// Se T é bool e o tipo é TINY(1), convertendo '0' ou '1'.
if (T == bool) {
if (_value == mysqlColumnTypeTiny && columnLength == 1) {
return int.parse(value) > 0 as T;
} else {
throw MySQLProtocolException(
"Cannot convert MySQL type $_value to requested type bool",
);
}
}
// Conversão para int
if (T == int) {
switch (_value) {
case mysqlColumnTypeTiny:
case mysqlColumnTypeShort:
case mysqlColumnTypeLong:
case mysqlColumnTypeLongLong:
case mysqlColumnTypeInt24:
case mysqlColumnTypeYear:
return int.parse(value) as T;
default:
throw MySQLProtocolException(
"Cannot convert MySQL type $_value to requested type int",
);
}
}
// Conversão para double
if (T == double) {
switch (_value) {
case mysqlColumnTypeTiny:
case mysqlColumnTypeShort:
case mysqlColumnTypeLong:
case mysqlColumnTypeLongLong:
case mysqlColumnTypeInt24:
case mysqlColumnTypeFloat:
case mysqlColumnTypeDouble:
return double.parse(value) as T;
default:
throw MySQLProtocolException(
"Cannot convert MySQL type $_value to requested type double",
);
}
}
// Conversão para num
if (T == num) {
switch (_value) {
case mysqlColumnTypeTiny:
case mysqlColumnTypeShort:
case mysqlColumnTypeLong:
case mysqlColumnTypeLongLong:
case mysqlColumnTypeInt24:
case mysqlColumnTypeFloat:
case mysqlColumnTypeDouble:
return num.parse(value) as T;
default:
throw MySQLProtocolException(
"Cannot convert MySQL type $_value to requested type num",
);
}
}
// Conversão para DateTime
if (T == DateTime) {
switch (_value) {
case mysqlColumnTypeDate:
case mysqlColumnTypeDateTime2:
case mysqlColumnTypeDateTime:
case mysqlColumnTypeTimestamp:
case mysqlColumnTypeTimestamp2:
return DateTime.parse(value) as T;
default:
throw MySQLProtocolException(
"Cannot convert MySQL type $_value to requested type DateTime",
);
}
}
throw MySQLProtocolException(
"Cannot convert MySQL type $_value to requested type ${T.runtimeType}",
);
}