@@ -93,37 +93,72 @@ func (r *showResults) Databases() []chronograf.Database {
9393 return res
9494}
9595
96- func (r * showResults ) RetentionPolicies () []chronograf.RetentionPolicy {
97- res := []chronograf.RetentionPolicy {}
96+ func (r * showResults ) RetentionPolicies (logger chronograf. Logger ) []chronograf.RetentionPolicy {
97+ var res []chronograf.RetentionPolicy
9898 for _ , u := range * r {
9999 for _ , s := range u .Series {
100100 for _ , v := range s .Values {
101- if name , ok := v [0 ].(string ); ! ok {
102- continue
103- } else if duration , ok := v [1 ].(string ); ! ok {
104- continue
105- } else if sduration , ok := v [2 ].(string ); ! ok {
106- continue
107- } else if replication , ok := v [3 ].(float64 ); ! ok {
108- continue
109- } else if def , ok := v [4 ].(bool ); ! ok {
110- continue
111- } else {
112- d := chronograf.RetentionPolicy {
113- Name : name ,
114- Duration : duration ,
115- ShardDuration : sduration ,
116- Replication : int32 (replication ),
117- Default : def ,
101+ rp , err := parseRetentionPolicy (v )
102+ if err != nil {
103+ if logger != nil {
104+ types := make ([]string , len (v ))
105+ for i , val := range v {
106+ types [i ] = fmt .Sprintf ("%T" , val )
107+ }
108+ logger .
109+ WithField ("values" , fmt .Sprintf ("%v" , v )).
110+ WithField ("types" , fmt .Sprintf ("%v" , types )).
111+ WithField ("error" , err .Error ()).
112+ Error ("Unsupported retention policy format" )
118113 }
119- res = append ( res , d )
114+ continue
120115 }
116+ res = append (res , rp )
121117 }
122118 }
123119 }
124120 return res
125121}
126122
123+ // parseRetentionPolicy validates and parses a retention policy row
124+ func parseRetentionPolicy (v []interface {}) (chronograf.RetentionPolicy , error ) {
125+ columns := len (v )
126+ if columns < 5 {
127+ return chronograf.RetentionPolicy {}, fmt .Errorf ("insufficient columns: expected at least 5, got %d" , columns )
128+ } else if name , ok := v [0 ].(string ); ! ok {
129+ return chronograf.RetentionPolicy {}, fmt .Errorf ("column 0 (name) is not a string" )
130+ } else if duration , ok := v [1 ].(string ); ! ok {
131+ return chronograf.RetentionPolicy {}, fmt .Errorf ("column 1 (duration) is not a string" )
132+ } else if sduration , ok := v [2 ].(string ); ! ok {
133+ return chronograf.RetentionPolicy {}, fmt .Errorf ("column 2 (shardDuration) is not a string" )
134+ } else if replication , ok := v [3 ].(float64 ); ! ok {
135+ return chronograf.RetentionPolicy {}, fmt .Errorf ("column 3 (replication) is not a float64" )
136+ } else {
137+ var def bool
138+ if columns == 5 {
139+ // 5-column format: [name, duration, shardGroupDuration, replicaN, default]
140+ if def , ok = v [4 ].(bool ); ! ok {
141+ return chronograf.RetentionPolicy {}, fmt .Errorf ("column 4 (default) is not a bool" )
142+ }
143+ } else if columns == 7 {
144+ // 7-column format: [name, duration, shardGroupDuration, replicaN, futureWriteLimit, pastWriteLimit, default]
145+ if def , ok = v [6 ].(bool ); ! ok {
146+ return chronograf.RetentionPolicy {}, fmt .Errorf ("column 6 (default) is not a bool" )
147+ }
148+ } else {
149+ return chronograf.RetentionPolicy {}, fmt .Errorf ("unexpected number of columns: %d" , columns )
150+ }
151+
152+ return chronograf.RetentionPolicy {
153+ Name : name ,
154+ Duration : duration ,
155+ ShardDuration : sduration ,
156+ Replication : int32 (replication ),
157+ Default : def ,
158+ }, nil
159+ }
160+ }
161+
127162// Measurements converts SHOW MEASUREMENTS to chronograf Measurement
128163func (r * showResults ) Measurements () []chronograf.Measurement {
129164 res := []chronograf.Measurement {}
0 commit comments