convertStringValueToProvidedType<T> method

T? convertStringValueToProvidedType<T>(
  1. dynamic value, [
  2. int? columnLength
])

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}",
  );
}