readField method
Implementation
@override
Object? readField(Field field, Buffer buffer) {
switch (field.type) {
case FIELD_TYPE_BLOB:
log.fine('BLOB');
var len = buffer.readLengthCodedBinary();
if (len == null) {
return Blob.fromBytes([]);
}
var value = Blob.fromBytes(buffer.readList(len));
log.fine('Value: $value');
return value;
case FIELD_TYPE_TINY:
log.fine('TINY');
var value = buffer.readByte();
log.fine('Value: $value');
return value;
case FIELD_TYPE_SHORT:
log.fine('SHORT');
var value = buffer.readInt16();
log.fine('Value: $value');
return value;
case FIELD_TYPE_INT24:
log.fine('INT24');
var value = buffer.readInt32();
log.fine('Value: $value');
return value;
case FIELD_TYPE_LONG:
log.fine('LONG');
var value = buffer.readInt32();
log.fine('Value: $value');
return value;
case FIELD_TYPE_LONGLONG:
log.fine('LONGLONG');
var value = buffer.readInt64();
log.fine('Value: $value');
return value;
case FIELD_TYPE_NEWDECIMAL:
log.fine('NEWDECIMAL');
var len = buffer.readByte();
var num = buffer.readString(len);
var value = double.parse(num);
log.fine('Value: $value');
return value;
case FIELD_TYPE_FLOAT:
log.fine('FLOAT');
var value = buffer.readFloat();
log.fine('Value: $value');
return value;
case FIELD_TYPE_DOUBLE:
log.fine('DOUBLE');
var value = buffer.readDouble();
log.fine('Value: $value');
return value;
case FIELD_TYPE_BIT:
log.fine('BIT');
var len = buffer.readByte();
var list = buffer.readList(len);
var value = 0;
for (var num in list) {
value = (value << 8) + num;
}
log.fine('Value: $value');
return value;
case FIELD_TYPE_DATETIME:
case FIELD_TYPE_DATE:
case FIELD_TYPE_TIMESTAMP:
log.fine('DATE/DATETIME');
var len = buffer.readByte();
var date = buffer.readList(len);
var year = 0;
var month = 0;
var day = 0;
var hours = 0;
var minutes = 0;
var seconds = 0;
var billionths = 0;
if (date.isNotEmpty) {
year = date[0] + (date[1] << 0x08);
month = date[2];
day = date[3];
if (date.length > 4) {
hours = date[4];
minutes = date[5];
seconds = date[6];
if (date.length > 7) {
billionths = date[7] +
(date[8] << 0x08) +
(date[9] << 0x10) +
(date[10] << 0x18);
}
}
}
var value = DateTime.utc(
year, month, day, hours, minutes, seconds, billionths ~/ 1000000);
log.fine('Value: $value');
return value;
case FIELD_TYPE_TIME:
log.fine('TIME');
var len = buffer.readByte();
var time = buffer.readList(len);
var sign = 1;
var days = 0;
var hours = 0;
var minutes = 0;
var seconds = 0;
var billionths = 0;
log.fine('time: $time');
if (time.isNotEmpty) {
sign = time[0] == 1 ? -1 : 1;
days = time[1] +
(time[2] << 0x08) +
(time[3] << 0x10) +
(time[4] << 0x18);
hours = time[5];
minutes = time[6];
seconds = time[7];
if (time.length > 8) {
billionths = time[8] +
(time[9] << 0x08) +
(time[10] << 0x10) +
(time[11] << 0x18);
}
}
var value = Duration(
days: days * sign,
hours: hours * sign,
minutes: minutes * sign,
seconds: seconds * sign,
milliseconds: (billionths ~/ 1000000) * sign);
return value;
case FIELD_TYPE_YEAR:
log.fine('YEAR');
var value = buffer.readInt16();
log.fine('Value: $value');
return value;
case FIELD_TYPE_STRING:
log.fine('STRING');
var value = buffer.readLengthCodedString();
log.fine('Value: $value');
return value;
case FIELD_TYPE_VAR_STRING:
log.fine('STRING');
var value = buffer.readLengthCodedString();
log.fine('Value: $value');
return value;
case FIELD_TYPE_GEOMETRY:
log.fine('GEOMETRY - not implemented');
var len = buffer.readByte();
//TODO
var value = buffer.readList(len);
return value;
case FIELD_TYPE_JSON:
log.fine('Field type ${field.type}');
var value = buffer.readLengthCodedString();
log.fine('Value: $value');
return value;
case FIELD_TYPE_NEWDATE:
case FIELD_TYPE_DECIMAL:
//TODO pre 5.0.3 will return old decimal values
case FIELD_TYPE_SET:
case FIELD_TYPE_ENUM:
case FIELD_TYPE_TINY_BLOB:
case FIELD_TYPE_MEDIUM_BLOB:
case FIELD_TYPE_LONG_BLOB:
case FIELD_TYPE_VARCHAR:
//Are there any other types a mysql server can return?
log.fine('Field type not implemented yet ${field.type}');
log.fine(buffer.readList(8).toString());
break;
default:
log.fine('Unsupported field type ${field.type}');
break;
}
return null;
}