@@ -4694,19 +4694,13 @@ func (cmd *ClientInfoCmd) Result() (*ClientInfo, error) {
4694
4694
return cmd .val , cmd .err
4695
4695
}
4696
4696
4697
- // fmt.Sscanf() cannot handle null values
4698
- func (cmd * ClientInfoCmd ) from (res rueidis.RedisResult ) {
4699
- txt , err := res .ToString ()
4700
- if err != nil {
4701
- cmd .SetErr (err )
4702
- return
4703
- }
4697
+ func stringToClientInfo (txt string ) (* ClientInfo , error ) {
4704
4698
info := & ClientInfo {}
4699
+ var err error
4705
4700
for _ , s := range strings .Split (strings .TrimPrefix (strings .TrimSpace (txt ), "txt:" ), " " ) {
4706
4701
kv := strings .Split (s , "=" )
4707
4702
if len (kv ) != 2 {
4708
- cmd .SetErr (fmt .Errorf ("redis: unexpected client info data (%s)" , s ))
4709
- return
4703
+ return nil , fmt .Errorf ("redis: unexpected client info data (%s)" , s )
4710
4704
}
4711
4705
key , val := kv [0 ], kv [1 ]
4712
4706
@@ -4773,8 +4767,7 @@ func (cmd *ClientInfoCmd) from(res rueidis.RedisResult) {
4773
4767
case 'T' :
4774
4768
info .Flags |= ClientNoTouch
4775
4769
default :
4776
- cmd .SetErr (fmt .Errorf ("redis: unexpected client info flags(%s)" , string (val [i ])))
4777
- return
4770
+ return nil , fmt .Errorf ("redis: unexpected client info flags(%s)" , string (val [i ]))
4778
4771
}
4779
4772
}
4780
4773
case "db" :
@@ -4825,13 +4818,105 @@ func (cmd *ClientInfoCmd) from(res rueidis.RedisResult) {
4825
4818
info .LibVer = val
4826
4819
}
4827
4820
4821
+ if err != nil {
4822
+ return nil , err
4823
+ }
4824
+ }
4825
+ return info , nil
4826
+ }
4827
+
4828
+ // fmt.Sscanf() cannot handle null values
4829
+ func (cmd * ClientInfoCmd ) from (res rueidis.RedisResult ) {
4830
+ txt , err := res .ToString ()
4831
+ if err != nil {
4832
+ cmd .SetErr (err )
4833
+ return
4834
+ }
4835
+ info , err := stringToClientInfo (txt )
4836
+ if err != nil {
4837
+ cmd .SetErr (err )
4838
+ return
4839
+ }
4840
+
4841
+ cmd .SetVal (info )
4842
+ }
4843
+
4844
+ type ACLLogEntry struct {
4845
+ Count int64
4846
+ Reason string
4847
+ Context string
4848
+ Object string
4849
+ Username string
4850
+ AgeSeconds float64
4851
+ ClientInfo * ClientInfo
4852
+ EntryID int64
4853
+ TimestampCreated int64
4854
+ TimestampLastUpdated int64
4855
+ }
4856
+
4857
+ type ACLLogCmd struct {
4858
+ baseCmd [[]* ACLLogEntry ]
4859
+ }
4860
+
4861
+ func (cmd * ACLLogCmd ) from (res rueidis.RedisResult ) {
4862
+ arr , err := res .ToArray ()
4863
+ if err != nil {
4864
+ cmd .SetErr (err )
4865
+ return
4866
+ }
4867
+
4868
+ logEntries := make ([]* ACLLogEntry , 0 , len (arr ))
4869
+ for _ , msg := range arr {
4870
+ log , err := msg .AsMap ()
4871
+ if err != nil {
4872
+ cmd .SetErr (err )
4873
+ return
4874
+ }
4875
+ entry := ACLLogEntry {}
4876
+
4877
+ for key , attr := range log {
4878
+ switch key {
4879
+ case "count" :
4880
+ entry .Count , err = attr .AsInt64 ()
4881
+ case "reason" :
4882
+ entry .Reason , err = attr .ToString ()
4883
+ case "context" :
4884
+ entry .Context , err = attr .ToString ()
4885
+ case "object" :
4886
+ entry .Object , err = attr .ToString ()
4887
+ case "username" :
4888
+ entry .Username , err = attr .ToString ()
4889
+ case "age-seconds" :
4890
+ entry .AgeSeconds , err = attr .AsFloat64 ()
4891
+ case "client-info" :
4892
+ txt , txtErr := attr .ToString ()
4893
+ if txtErr == nil {
4894
+ entry .ClientInfo , err = stringToClientInfo (txt )
4895
+ } else {
4896
+ err = txtErr
4897
+ }
4898
+ case "entry-id" :
4899
+ entry .EntryID , err = attr .AsInt64 ()
4900
+ case "timestamp-created" :
4901
+ entry .TimestampCreated , err = attr .AsInt64 ()
4902
+ case "timestamp-last-updated" :
4903
+ entry .TimestampLastUpdated , err = attr .AsInt64 ()
4904
+ }
4905
+ }
4906
+
4828
4907
if err != nil {
4829
4908
cmd .SetErr (err )
4830
4909
return
4831
4910
}
4911
+ logEntries = append (logEntries , & entry )
4832
4912
}
4913
+ cmd .SetVal (logEntries )
4914
+ }
4833
4915
4834
- cmd .SetVal (info )
4916
+ func newACLLogCmd (res rueidis.RedisResult ) * ACLLogCmd {
4917
+ cmd := & ACLLogCmd {}
4918
+ cmd .from (res )
4919
+ return cmd
4835
4920
}
4836
4921
4837
4922
// ModuleLoadexConfig struct is used to specify the arguments for the MODULE LOADEX command of redis.
0 commit comments