MCPcopy Create free account
hub / github.com/dolthub/doltgresql / jsonConvert

Function jsonConvert

server/plpgsql/json_convert.go:24–81  ·  view source on GitHub ↗

jsonConvert handles the conversion from the JSON format into a format that is easier to work with.

(jsonBlock plpgSQL_block)

Source from the content-addressed store, hash-verified

22
23// jsonConvert handles the conversion from the JSON format into a format that is easier to work with.
24func 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}

Callers 1

ParseFunction · 0.85

Calls 2

jsonConvertStatementsFunction · 0.85
ErrorfMethod · 0.65

Tested by

no test coverage detected