Blame view

json_utility.go 4.11 KB
7c41a4c3e   Marko Tikvić   added mutex lock ...
1
2
3
  // @TODO: Be more verbose about corrupt config error.
  // Do the same errror checking when doing table reloading.
  // Discard previous tables when doing reload.
64041a2ea   Marko Tikvić   first commit
4
5
6
7
  package restutility
  
  import (
  	"net/http"
8dbe745c3   Marko Tikvić   merged tables uti...
8
9
10
11
12
  	"encoding/json"
  	"errors"
  	"gopkg.in/rana/ora.v3"
  	"io"
  	"io/ioutil"
7c41a4c3e   Marko Tikvić   added mutex lock ...
13
  	"sync"
64041a2ea   Marko Tikvić   first commit
14
  )
7c41a4c3e   Marko Tikvić   added mutex lock ...
15
  var mu = &sync.Mutex{}
4a51e54d7   Marko Tikvić   simplified
16
  var allPayloads []payloadBuff
8dbe745c3   Marko Tikvić   merged tables uti...
17

64041a2ea   Marko Tikvić   first commit
18
19
20
21
22
23
24
25
  type LangMap map[string]map[string]string
  
  type Field struct {
  	Parameter  string `json:"param"`
  	Type       string `json:"type"`
  	Visible    bool   `json:"visible"`
  	Editable   bool   `json:"editable"`
  }
8dbe745c3   Marko Tikvić   merged tables uti...
26
27
28
29
30
31
32
  type CorrelationField struct {
  	Result   string   `json:"result"`
  	Elements []string `json:"elements"`
  	Type     string   `json:"type"`
  }
  
  type Translation struct {
ecec68b18   Marko Tikvić   updated todo list
33
  	Language     string            `json:"language"`
8dbe745c3   Marko Tikvić   merged tables uti...
34
  	FieldsLabels map[string]string `json:"fieldsLabels"`
64041a2ea   Marko Tikvić   first commit
35
  }
437859ae9   Marko Tikvić   hmmm
36
37
  // Field 'Type' is not required in payload.
  // 'payloadBuff' type is only a bridge between ORACLE CLOB and 'Payload' type.
4a51e54d7   Marko Tikvić   simplified
38
  type payloadBuff struct {
8dbe745c3   Marko Tikvić   merged tables uti...
39
  	Type         string             `json:"tableType"`
64041a2ea   Marko Tikvić   first commit
40
41
  	Method	     string             `json:"method"`
  	Params	     map[string]string  `json:"params"`
8dbe745c3   Marko Tikvić   merged tables uti...
42
  	Lang	     []Translation      `json:"lang"`
64041a2ea   Marko Tikvić   first commit
43
  	Fields	     []Field            `json:"fields"`
c430f3af5   Marko Tikvić   fixed camel case ...
44
  	Correlations []CorrelationField `json:"correlationFields"`
64041a2ea   Marko Tikvić   first commit
45
46
47
48
  	IdField      string             `json:"idField"`
  	// Data can only hold slices of any type. It can't be used for itteration
  	Data	     interface{}        `json:"data"`
  }
4a51e54d7   Marko Tikvić   simplified
49
50
51
52
53
54
55
56
57
58
  type Payload struct {
  	Method	     string             `json:"method"`
  	Params	     map[string]string  `json:"params"`
  	Lang	     []Translation      `json:"lang"`
  	Fields	     []Field            `json:"fields"`
  	Correlations []CorrelationField `json:"correlationFields"`
  	IdField      string             `json:"idField"`
  	// Data can only hold slices of any type. It can't be used for itteration
  	Data	     interface{}        `json:"data"`
  }
8dbe745c3   Marko Tikvić   merged tables uti...
59
60
  func NewPayload(r *http.Request, table string) Payload {
  	var pload Payload
64041a2ea   Marko Tikvić   first commit
61

4a51e54d7   Marko Tikvić   simplified
62
  	pload.Method = r.Method + " " + r.URL.Path
90f4ed079   Marko Tikvić   sped up loadTable()
63
64
65
66
67
68
69
70
  
  	if table != "" {
  		pload.Params = make(map[string]string, 0)
  		pload.Lang = loadTranslations(table)
  		pload.Fields = loadFields(table)
  		pload.IdField = loadIdField(table)
  		pload.Correlations = loadCorrelations(table)
  	}
64041a2ea   Marko Tikvić   first commit
71

8dbe745c3   Marko Tikvić   merged tables uti...
72
73
  	return pload
  }
64041a2ea   Marko Tikvić   first commit
74

8dbe745c3   Marko Tikvić   merged tables uti...
75
76
77
  func DeliverPayload(w http.ResponseWriter, payload Payload) {
  	json.NewEncoder(w).Encode(payload)
  	payload.Data = nil
64041a2ea   Marko Tikvić   first commit
78
  }
4a51e54d7   Marko Tikvić   simplified
79
  func loadTranslations(id string) []Translation {
8dbe745c3   Marko Tikvić   merged tables uti...
80
  	translations := make([]Translation, 0)
4a51e54d7   Marko Tikvić   simplified
81
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
82
83
84
85
86
87
88
89
90
  		if pload.Type == id {
  			for _, t := range pload.Lang {
  				//translations[t.Language] = t.FieldsLabels
  				translations = append(translations, Translation{
  					Language: t.Language,
  					FieldsLabels: t.FieldsLabels,
  				})
  			}
  		}
64041a2ea   Marko Tikvić   first commit
91
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
92
93
94
  
  	return translations
  }
4a51e54d7   Marko Tikvić   simplified
95
  func loadFields(id string) []Field {
8dbe745c3   Marko Tikvić   merged tables uti...
96
  	fields := make([]Field, 0)
4a51e54d7   Marko Tikvić   simplified
97
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
98
99
100
101
102
103
104
105
106
  		if pload.Type == id{
  			for _, f := range pload.Fields {
  				fields = append(fields, f)
  			}
  		}
  	}
  
  	return fields
  }
4a51e54d7   Marko Tikvić   simplified
107
108
  func loadIdField(id string) string {
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
109
110
111
112
113
114
  		if pload.Type == id {
  			return pload.IdField
  		}
  	}
  	return ""
  }
4a51e54d7   Marko Tikvić   simplified
115
  func loadCorrelations(id string) []CorrelationField {
8dbe745c3   Marko Tikvić   merged tables uti...
116
  	resp := make([]CorrelationField, 0)
4a51e54d7   Marko Tikvić   simplified
117
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
118
119
120
121
122
123
124
125
126
127
128
  		if pload.Type == id {
  			for _, f := range pload.Correlations {
  				resp = append(resp, f)
  			}
  		}
  	}
  
  	return resp
  }
  
  func InitTables(db *ora.Ses, project string) error {
7d3deb50d   Marko Tikvić   modified list_con...
129
  	jsonbuf, _ := fetchJSON(db, EqualQuotes(project))
7c41a4c3e   Marko Tikvić   added mutex lock ...
130
131
  	mu.Lock()
  	defer mu.Unlock()
8dbe745c3   Marko Tikvić   merged tables uti...
132
133
134
135
  	json.Unmarshal(jsonbuf, &allPayloads)
  	if len(allPayloads) == 0 {
  		return errors.New("tables config is corrupt")
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
136
137
  	return nil
  }
7d3deb50d   Marko Tikvić   modified list_con...
138
  func fetchJSON(db *ora.Ses, project string) ([]byte, error) {
8dbe745c3   Marko Tikvić   merged tables uti...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  	stmt, err := db.Prep(`SELECT
  		JSON_CLOB
  		FROM TABLES_CONFIG
  		WHERE PROJEKAT` + project, ora.S)
  	defer stmt.Close()
  
  	if err != nil {
  		return nil, err
  	}
  
  	rset, err := stmt.Qry()
  	if err != nil {
  		return nil, err
  	}
  
  	bytes := make([]byte, 0)
  	if rset.Next() {
  		lob := rset.Row[0].(io.Reader)
  		bytes, err = ioutil.ReadAll(lob)
  		if err != nil {
7d3deb50d   Marko Tikvić   modified list_con...
159
  			// Ignore for now, it's some weird streaming read/write LOB error.
4a51e54d7   Marko Tikvić   simplified
160
  			// TODO: Find a fix for this.
4a51e54d7   Marko Tikvić   simplified
161
  			//return nil, err
8dbe745c3   Marko Tikvić   merged tables uti...
162
  		}
64041a2ea   Marko Tikvić   first commit
163
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
164
  	return bytes, nil
64041a2ea   Marko Tikvić   first commit
165
  }