tryParseLogicalReplicationMessage function

LogicalReplicationMessage? tryParseLogicalReplicationMessage(
  1. PgByteDataReader reader,
  2. int length
)

Tries to check if the bytesList is a LogicalReplicationMessage. If so, LogicalReplicationMessage is returned, otherwise null is returned.

Implementation

LogicalReplicationMessage? tryParseLogicalReplicationMessage(
    PgByteDataReader reader, int length) {
  // the first byte is the msg type
  final firstByte = reader.readUint8();
  final msgType = LogicalReplicationMessageTypes.fromByte(firstByte);
  switch (msgType) {
    case LogicalReplicationMessageTypes.Begin:
      return BeginMessage._parse(reader);

    case LogicalReplicationMessageTypes.Commit:
      return CommitMessage._parse(reader);

    case LogicalReplicationMessageTypes.Origin:
      return OriginMessage._parse(reader);

    case LogicalReplicationMessageTypes.Relation:
      return RelationMessage._parse(reader);

    case LogicalReplicationMessageTypes.Type:
      return TypeMessage._parse(reader);

    case LogicalReplicationMessageTypes.Insert:
      return InsertMessage._parse(reader);

    case LogicalReplicationMessageTypes.Update:
      return UpdateMessage._parse(reader);

    case LogicalReplicationMessageTypes.Delete:
      return DeleteMessage._parse(reader);

    case LogicalReplicationMessageTypes.Truncate:
      return TruncateMessage._parse(reader);

    case LogicalReplicationMessageTypes.Unsupported:
      // wal2json messages starts with `{` as the first byte
      if (firstByte == '{'.codeUnits.single) {
        // note this needs the full set of bytes unlike other cases
        final bb = BytesBuffer();
        bb.addByte(firstByte);
        bb.add(reader.read(length - 1));
        try {
          return JsonMessage(reader.encoding.decode(bb.toBytes()));
        } catch (_) {
          // ignore
        }
      }
      return null;
  }
}