jsonConvert handles the conversion from the JSON format into a format that is easier to work with.
(jsonBlock plpgSQL_block)
| 22 | |
| 23 | // jsonConvert handles the conversion from the JSON format into a format that is easier to work with. |
| 24 | func jsonConvert(jsonBlock plpgSQL_block) (Block, error) { |
| 25 | block := Block{ |
| 26 | TriggerNew: jsonBlock.NewVariableNumber, |
| 27 | TriggerOld: jsonBlock.OldVariableNumber, |
| 28 | Label: jsonBlock.Action.StmtBlock.Label, |
| 29 | } |
| 30 | lowestRecordNumber := int32(2147483647) |
| 31 | // We do a first loop to determine the offset for the first record |
| 32 | for _, v := range jsonBlock.Datums { |
| 33 | switch { |
| 34 | case v.Record != nil: |
| 35 | if v.Record.DatumNumber < lowestRecordNumber { |
| 36 | lowestRecordNumber = v.Record.DatumNumber |
| 37 | } |
| 38 | } |
| 39 | } |
| 40 | offset := int32(0) - lowestRecordNumber |
| 41 | // Then we do a second loop that actually adds all of the datums to the block |
| 42 | for _, v := range jsonBlock.Datums { |
| 43 | switch { |
| 44 | case v.Record != nil: |
| 45 | // TODO: support normal record types |
| 46 | datumNumber := v.Record.DatumNumber + offset |
| 47 | if int(datumNumber) >= len(block.Records) { |
| 48 | oldRecords := block.Records |
| 49 | block.Records = make([]Record, datumNumber+1) |
| 50 | copy(block.Records, oldRecords) |
| 51 | } |
| 52 | |
| 53 | if v.Record.DatumNumber > 0 { |
| 54 | block.Records[datumNumber].Name = v.Record.RefName |
| 55 | } |
| 56 | case v.RecordField != nil: |
| 57 | recordParentNumber := v.RecordField.RecordParentNumber + offset |
| 58 | if int(recordParentNumber) >= len(block.Records) { |
| 59 | return Block{}, errors.New("invalid record parent number") |
| 60 | } |
| 61 | block.Records[recordParentNumber].Fields = append( |
| 62 | block.Records[recordParentNumber].Fields, v.RecordField.FieldName) |
| 63 | case v.Row != nil: |
| 64 | case v.Variable != nil: |
| 65 | block.Variables = append(block.Variables, Variable{ |
| 66 | Name: v.Variable.RefName, |
| 67 | Type: strings.ToLower(v.Variable.Type.Type.Name), |
| 68 | IsParameter: v.Variable.LineNumber == 0, |
| 69 | Default: v.Variable.Default.Var.Query, |
| 70 | }) |
| 71 | default: |
| 72 | return Block{}, errors.Errorf("unhandled datum type: %T", v) |
| 73 | } |
| 74 | } |
| 75 | var err error |
| 76 | block.Body, err = jsonConvertStatements(jsonBlock.Action.StmtBlock.Body) |
| 77 | if err != nil { |
| 78 | return Block{}, err |
| 79 | } |
| 80 | return block, nil |
| 81 | } |
no test coverage detected