blob: d045a4d0a677879a852ab3be814b520b36faefa0 [file] [log] [blame]
Tang Cheng58d3a102019-10-09 13:49:49 +08001package wsclient
Tang Cheng641ea0a2015-07-22 11:57:45 +08002
3import (
4 "encoding/json"
5 "errors"
6 "fmt"
7 // "reflect"
8 "strconv"
9)
10
Tang Chenge29065c2016-07-14 12:29:42 +080011// MessageWriter writer
Tang Cheng641ea0a2015-07-22 11:57:45 +080012type MessageWriter struct {
Tang Cheng78513ea2015-10-28 14:32:02 +080013 FuncNo int `json:"funcno"`
Tang Cheng641ea0a2015-07-22 11:57:45 +080014 Attributes map[string]interface{}
15 ColumnNames []string
16 ColumnDescs []string
17 RowData []map[string]interface{}
18 Row map[string]interface{}
19}
20
Tang Chenge29065c2016-07-14 12:29:42 +080021// NewMessageReader reader
Tang Cheng641ea0a2015-07-22 11:57:45 +080022func NewMessageWriter(funcno int) *MessageWriter {
23 return &MessageWriter{
24 FuncNo: funcno,
25 Attributes: make(map[string]interface{}),
26 ColumnNames: make([]string, 0),
27 ColumnDescs: make([]string, 0),
28 RowData: make([]map[string]interface{}, 0)}
29}
Tang Chenge29065c2016-07-14 12:29:42 +080030
31// SetAttr set attribute
Tang Cheng641ea0a2015-07-22 11:57:45 +080032func (m *MessageWriter) SetAttr(name string, value interface{}) {
33 m.Attributes[name] = value
34}
Tang Chenge29065c2016-07-14 12:29:42 +080035
36// AddCol add column data
Tang Cheng641ea0a2015-07-22 11:57:45 +080037func (m *MessageWriter) AddCol(name string, value interface{}) {
38 if m.Row == nil {
39 m.Row = make(map[string]interface{})
40 }
41 m.Row[name] = value
42}
43
Tang Chenge29065c2016-07-14 12:29:42 +080044func isContains(k string, slice []string) bool {
Tang Cheng641ea0a2015-07-22 11:57:45 +080045 for _, v := range slice {
46 if k == v {
47 return true
48 }
49 }
50 return false
51}
52
Tang Chenge29065c2016-07-14 12:29:42 +080053// AddRow add row
Tang Cheng641ea0a2015-07-22 11:57:45 +080054func (m *MessageWriter) AddRow() {
55 if m.Row == nil {
56 return
57 }
58 // data := make([]interface{}, 0)
59 // if len(m.ColumnNames) == 0 {
60 // for k, v := range m.Row {
61 // m.ColumnNames = append(m.ColumnNames, k)
62 // data = append(data, v)
63 // }
64 // } else {
65 // for _, n := range m.ColumnNames {
66 // if v, ok := m.Row[n]; !ok {
67 // data = append(data, nil)
68 // } else {
69 // data = append(data, v)
70 // }
71 // }
72 // for k, v := range m.Row {
73 // if !is_contains(k, m.ColumnNames) {
74 // m.ColumnNames = append(m.ColumnNames, k)
75 // data = append(data, v)
76 // }
77 // }
78 // }
79 // m.RowData = append(m.RowData, data)
80 m.RowData = append(m.RowData, m.Row)
81 m.Row = nil
82}
83
Tang Chenge29065c2016-07-14 12:29:42 +080084func (m *MessageWriter) serializeRowData() {
Tang Cheng641ea0a2015-07-22 11:57:45 +080085 m.ColumnNames = make([]string, 0)
86 for _, row := range m.RowData {
87 for k, _ := range row {
Tang Chenge29065c2016-07-14 12:29:42 +080088 if !isContains(k, m.ColumnNames) {
Tang Cheng641ea0a2015-07-22 11:57:45 +080089 m.ColumnNames = append(m.ColumnNames, k)
90 }
91 }
92 }
93 rows := make([][]interface{}, 0)
94 for _, row := range m.RowData {
95 data := make([]interface{}, 0)
96 for _, k := range m.ColumnNames {
97 if v, ok := row[k]; !ok {
98 data = append(data, nil)
99 } else {
100 data = append(data, v)
101 }
102 }
103 rows = append(rows, data)
104 }
105 m.Attributes["rowdata"] = rows
106 m.Attributes["rowcnt"] = len(rows)
107}
108
Tang Chenge29065c2016-07-14 12:29:42 +0800109// Serialize εΊεˆ—εŒ–
Tang Cheng641ea0a2015-07-22 11:57:45 +0800110func (m *MessageWriter) Serialize() string {
111 m.Attributes["funcno"] = m.FuncNo
Tang Chenge29065c2016-07-14 12:29:42 +0800112 m.serializeRowData()
Tang Chengf16121a2015-07-27 13:46:14 +0800113 m.Attributes["colname"] = m.ColumnNames
114 m.Attributes["coldesc"] = m.ColumnNames
Tang Cheng641ea0a2015-07-22 11:57:45 +0800115 m.Attributes["colcnt"] = len(m.ColumnNames)
116 r, _ := json.Marshal(m.Attributes)
117 return string(r)
118}
119
120//////////////////////////////////////////////////////////////////////
Tang Chenge29065c2016-07-14 12:29:42 +0800121
122// MessageReader message reader
Tang Cheng641ea0a2015-07-22 11:57:45 +0800123type MessageReader struct {
124 FuncNo int
125 RetCode int
126 RetMsg string
127 DBMsg string
128 ErrName string
129 ColumnNames []string
130 ColumnDescs []string
131 Attributes map[string]interface{}
132 RowData []map[string]interface{}
133 RowIndex int
134}
135
Tang Chenge29065c2016-07-14 12:29:42 +0800136func getValueAsInt(value interface{}) int {
Tang Cheng641ea0a2015-07-22 11:57:45 +0800137 // vtype := reflect.TypeOf(value)
138 switch value.(type) {
139 case int:
140 return value.(int)
141 case float64:
142 return int(value.(float64))
143 case string:
144 i, _ := strconv.Atoi(value.(string))
145 return i
146 default:
147 panic("Error")
148 }
149}
150
Tang Chenge29065c2016-07-14 12:29:42 +0800151func getColumnNames(data interface{}) (result []string) {
Tang Cheng641ea0a2015-07-22 11:57:45 +0800152 if data == nil {
153 return nil
154 }
155 names := data.([]interface{})
156 result = make([]string, 0)
157 for _, v := range names {
158 result = append(result, v.(string))
159 }
160 return
161}
162
Tang Chenge29065c2016-07-14 12:29:42 +0800163func convertToInt(value interface{}) int {
Tang Cheng641ea0a2015-07-22 11:57:45 +0800164 if value == nil {
165 return 0
166 }
167 switch value.(type) {
168 case int:
169 return value.(int)
170 case float64:
171 return int(value.(float64))
172 case string:
173 i, _ := strconv.Atoi(value.(string))
174 return i
175 default:
176 return 0
177 }
178}
179
Tang Chenge29065c2016-07-14 12:29:42 +0800180func convertToString(value interface{}) string {
Tang Cheng641ea0a2015-07-22 11:57:45 +0800181 if value == nil {
182 return ""
183 }
184 return fmt.Sprintf("%v", value)
185}
186
Tang Chenge29065c2016-07-14 12:29:42 +0800187// NewMessageReader new MessageReader
Tang Cheng641ea0a2015-07-22 11:57:45 +0800188func NewMessageReader(data []byte) *MessageReader {
189 var s interface{}
190 err := json.Unmarshal(data, &s)
191 if err != nil {
192 return nil
193 }
194 obj := s.(map[string]interface{})
195
196 m := &MessageReader{Attributes: make(map[string]interface{}),
197 RowData: make([]map[string]interface{}, 0)}
Tang Chenge29065c2016-07-14 12:29:42 +0800198 m.FuncNo = convertToInt(obj["funcno"])
199 m.RetCode = convertToInt(obj["retcode"])
200 m.RetMsg = convertToString(obj["retmsg"])
201 m.DBMsg = convertToString(obj["dbmsg"])
202 m.ErrName = convertToString(obj["errname"])
Tang Cheng641ea0a2015-07-22 11:57:45 +0800203
Tang Chenge29065c2016-07-14 12:29:42 +0800204 m.ColumnNames = getColumnNames(obj["colname"])
205 m.ColumnDescs = getColumnNames(obj["coldesc"])
Tang Cheng641ea0a2015-07-22 11:57:45 +0800206
207 if rowdata, err := obj["rowdata"]; err {
208 if rowdata != nil {
209 for _, raw := range rowdata.([]interface{}) {
210 row := raw.([]interface{})
211 data := make(map[string]interface{})
212 for idx, v := range row {
213 data[m.ColumnNames[idx]] = v
214 }
215 m.RowData = append(m.RowData, data)
216 }
217 }
218 }
219 reverseKey := map[string]bool{
Tang Chengf16121a2015-07-27 13:46:14 +0800220 "funcno": true,
221 "colname": true,
222 "coldesc": true,
223 "rowcnt": true,
224 "colcnt": true,
225 "rowdata": true,
226 "retcode": true,
227 "retmsg": true,
228 "dbmsg": true,
229 "errname": true}
Tang Cheng641ea0a2015-07-22 11:57:45 +0800230
231 for k, v := range obj {
232 if _, ok := reverseKey[k]; ok {
233 continue
234 }
235 m.Attributes[k] = v
236 }
237 return m
238}
239
Tang Chenge29065c2016-07-14 12:29:42 +0800240// RowCount row count
Tang Cheng641ea0a2015-07-22 11:57:45 +0800241func (m *MessageReader) RowCount() int {
242 return len(m.RowData)
243}
244
Tang Chenge29065c2016-07-14 12:29:42 +0800245// HasMore has more row
Tang Cheng641ea0a2015-07-22 11:57:45 +0800246func (m *MessageReader) HasMore() bool {
247 return m.RowIndex < m.RowCount()
248}
249
Tang Chenge29065c2016-07-14 12:29:42 +0800250// NextRow next row
Tang Cheng641ea0a2015-07-22 11:57:45 +0800251func (m *MessageReader) NextRow() error {
252 m.RowIndex++
253 if m.RowIndex > m.RowCount() {
254 return errors.New("Eof of row")
255 }
256 return nil
257}
258
Tang Chenge29065c2016-07-14 12:29:42 +0800259// GetCol get column
Tang Cheng641ea0a2015-07-22 11:57:45 +0800260func (m *MessageReader) GetCol(name string) interface{} {
261 idx := m.RowIndex - 1
Tang Chenge29065c2016-07-14 12:29:42 +0800262 v, ok := m.RowData[idx][name]
263 if !ok {
Tang Cheng641ea0a2015-07-22 11:57:45 +0800264 return nil
Tang Cheng641ea0a2015-07-22 11:57:45 +0800265 }
Tang Chenge29065c2016-07-14 12:29:42 +0800266 return v
Tang Cheng641ea0a2015-07-22 11:57:45 +0800267}
268
Tang Chenge29065c2016-07-14 12:29:42 +0800269// GetColAsInt get column data as int
Tang Cheng641ea0a2015-07-22 11:57:45 +0800270func (m *MessageReader) GetColAsInt(name string) int {
271 v := m.GetCol(name)
272 switch v.(type) {
273 case float32:
274 return int(v.(float32))
275 case float64:
276 return int(v.(float64))
277 case int:
278 return v.(int)
279 case string:
280 i, _ := strconv.Atoi(v.(string))
281 return i
282 default:
283 return 0
284 }
285}
286
Tang Chenge29065c2016-07-14 12:29:42 +0800287// GetColAsString get column data as string
Tang Cheng641ea0a2015-07-22 11:57:45 +0800288func (m *MessageReader) GetColAsString(name string) string {
289 v := m.GetCol(name)
290 return fmt.Sprintf("%v", v)
291}
292
Tang Chenge29065c2016-07-14 12:29:42 +0800293// GetColAsDouble get column data as double
Tang Cheng641ea0a2015-07-22 11:57:45 +0800294func (m *MessageReader) GetColAsDouble(name string) float64 {
295 v := m.GetCol(name)
296 switch v.(type) {
297 case float32:
298 return float64(v.(float32))
299 case float64:
300 return v.(float64)
301 case int:
302 return float64(v.(int))
303 case string:
304 i, _ := strconv.ParseFloat(v.(string), 64)
305 return i
306 default:
307 return 0
308 }
309}
310
Tang Chenge29065c2016-07-14 12:29:42 +0800311// GetAttr get attribute value
Tang Cheng641ea0a2015-07-22 11:57:45 +0800312func (m *MessageReader) GetAttr(name string) interface{} {
Tang Chenge29065c2016-07-14 12:29:42 +0800313 v, ok := m.Attributes[name]
314 if !ok {
Tang Cheng641ea0a2015-07-22 11:57:45 +0800315 return nil
Tang Cheng641ea0a2015-07-22 11:57:45 +0800316 }
Tang Chenge29065c2016-07-14 12:29:42 +0800317 return v
Tang Cheng641ea0a2015-07-22 11:57:45 +0800318}