encode method

  1. @override
Uint8List encode()
override

Implementation

@override
Uint8List encode() {
  final buffer = ByteDataWriter(endian: Endian.little);

  // command type
  buffer.writeUint8(0x17);
  // stmt id
  buffer.writeUint32(stmtID, Endian.little);
  // flags
  buffer.writeUint8(0);
  // iteration count (always 1)
  buffer.writeUint32(1, Endian.little);

  // params
  if (params.isNotEmpty) {
    // create null-bitmap
    final bitmapSize = ((params.length + 7) ~/ 8);
    final nullBitmap = Uint8List(bitmapSize);

    // write null values into null bitmap
    for (int paramIndex = 0; paramIndex < params.length; paramIndex++) {
      if (params[paramIndex] == null) {
        final paramByteIndex = paramIndex ~/ 8;
        final paramBitIndex = paramIndex % 8;
        nullBitmap[paramByteIndex] |= (1 << paramBitIndex);
      }
    }
    // write null bitmap
    buffer.write(nullBitmap);

    // write new-param-bound flag
    buffer.writeUint8(1);

    // write not null values

    // write param types
    for (int i = 0; i < params.length; i++) {
      final paramType = paramTypes[i];
      if (paramType == null) {
        // If null, the type is mysqlColumnTypeNull = 0x06
        buffer.writeUint8(mysqlColumnTypeNull);
        buffer.writeUint8(0); // "unsigned" flag or other, usually 0
      } else {
        buffer.writeUint8(paramType.intVal);
        // For example, to indicate "unsigned", could set something. Here, 0 = no flag.
        buffer.writeUint8(0);
      }
    }

    // Write non-null parameter values
    for (int i = 0; i < params.length; i++) {
      final param = params[i];
      final paramType = paramTypes[i];
      if (param != null && paramType != null) {
        _writeParamValue(buffer, param, paramType);
      }
    }
  }

  return buffer.toBytes();
}