func pgsqlErrorParser(s *PgsqlStream) { m := s.message for len(s.data[s.parseOffset:]) > 0 { // read field type(byte1) field_type := s.data[s.parseOffset] s.parseOffset += 1 if field_type == 0 { break } // read field value(string) field_value, err := common.ReadString(s.data[s.parseOffset:]) if err != nil { logp.Err("Fail to read the column field") } s.parseOffset += len(field_value) + 1 if field_type == 'M' { m.ErrorInfo = field_value } else if field_type == 'C' { m.ErrorCode = field_value } else if field_type == 'S' { m.ErrorSeverity = field_value } } logp.Debug("pgsqldetailed", "%s %s %s", m.ErrorSeverity, m.ErrorCode, m.ErrorInfo) }
func pgsqlFieldsParser(s *PgsqlStream) { m := s.message // read field count (int16) field_count := int(common.Bytes_Ntohs(s.data[s.parseOffset : s.parseOffset+2])) s.parseOffset += 2 logp.Debug("pgsqldetailed", "Row Description field count=%d", field_count) fields := []string{} fields_format := []byte{} for i := 0; i < field_count; i++ { // read field name (null terminated string) field_name, err := common.ReadString(s.data[s.parseOffset:]) if err != nil { logp.Err("Fail to read the column field") } fields = append(fields, field_name) m.NumberOfFields += 1 s.parseOffset += len(field_name) + 1 // read Table OID (int32) s.parseOffset += 4 // read Column Index (int16) s.parseOffset += 2 // read Type OID (int32) s.parseOffset += 4 // read column length (int16) s.parseOffset += 2 // read type modifier (int32) s.parseOffset += 4 // read format (int16) format := common.Bytes_Ntohs(s.data[s.parseOffset : s.parseOffset+2]) fields_format = append(fields_format, byte(format)) s.parseOffset += 2 logp.Debug("pgsqldetailed", "Field name=%s, format=%d", field_name, format) } m.Fields = fields m.FieldsFormat = fields_format if m.NumberOfFields != field_count { logp.Err("Missing fields from RowDescription. Expected %d. Received %d", field_count, m.NumberOfFields) } }