command.go 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027
  1. package redis
  2. import (
  3. "fmt"
  4. "net"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/go-redis/redis/internal"
  9. "github.com/go-redis/redis/internal/proto"
  10. "github.com/go-redis/redis/internal/util"
  11. )
  12. type Cmder interface {
  13. Name() string
  14. Args() []interface{}
  15. stringArg(int) string
  16. readTimeout() *time.Duration
  17. readReply(rd *proto.Reader) error
  18. SetErr(error)
  19. Err() error
  20. }
  21. func setCmdsErr(cmds []Cmder, e error) {
  22. for _, cmd := range cmds {
  23. if cmd.Err() == nil {
  24. cmd.SetErr(e)
  25. }
  26. }
  27. }
  28. func cmdsFirstErr(cmds []Cmder) error {
  29. for _, cmd := range cmds {
  30. if err := cmd.Err(); err != nil {
  31. return err
  32. }
  33. }
  34. return nil
  35. }
  36. func writeCmd(wr *proto.Writer, cmds ...Cmder) error {
  37. for _, cmd := range cmds {
  38. err := wr.WriteArgs(cmd.Args())
  39. if err != nil {
  40. return err
  41. }
  42. }
  43. return nil
  44. }
  45. func cmdString(cmd Cmder, val interface{}) string {
  46. ss := make([]string, 0, len(cmd.Args()))
  47. for _, arg := range cmd.Args() {
  48. ss = append(ss, fmt.Sprint(arg))
  49. }
  50. s := strings.Join(ss, " ")
  51. if err := cmd.Err(); err != nil {
  52. return s + ": " + err.Error()
  53. }
  54. if val != nil {
  55. switch vv := val.(type) {
  56. case []byte:
  57. return s + ": " + string(vv)
  58. default:
  59. return s + ": " + fmt.Sprint(val)
  60. }
  61. }
  62. return s
  63. }
  64. func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int {
  65. switch cmd.Name() {
  66. case "eval", "evalsha":
  67. if cmd.stringArg(2) != "0" {
  68. return 3
  69. }
  70. return 0
  71. case "publish":
  72. return 1
  73. }
  74. if info == nil {
  75. return 0
  76. }
  77. return int(info.FirstKeyPos)
  78. }
  79. //------------------------------------------------------------------------------
  80. type baseCmd struct {
  81. args []interface{}
  82. err error
  83. _readTimeout *time.Duration
  84. }
  85. var _ Cmder = (*Cmd)(nil)
  86. func (cmd *baseCmd) Name() string {
  87. if len(cmd.args) == 0 {
  88. return ""
  89. }
  90. // Cmd name must be lower cased.
  91. return internal.ToLower(cmd.stringArg(0))
  92. }
  93. func (cmd *baseCmd) Args() []interface{} {
  94. return cmd.args
  95. }
  96. func (cmd *baseCmd) stringArg(pos int) string {
  97. if pos < 0 || pos >= len(cmd.args) {
  98. return ""
  99. }
  100. s, _ := cmd.args[pos].(string)
  101. return s
  102. }
  103. func (cmd *baseCmd) SetErr(e error) {
  104. cmd.err = e
  105. }
  106. func (cmd *baseCmd) Err() error {
  107. return cmd.err
  108. }
  109. func (cmd *baseCmd) readTimeout() *time.Duration {
  110. return cmd._readTimeout
  111. }
  112. func (cmd *baseCmd) setReadTimeout(d time.Duration) {
  113. cmd._readTimeout = &d
  114. }
  115. //------------------------------------------------------------------------------
  116. type Cmd struct {
  117. baseCmd
  118. val interface{}
  119. }
  120. func NewCmd(args ...interface{}) *Cmd {
  121. return &Cmd{
  122. baseCmd: baseCmd{args: args},
  123. }
  124. }
  125. func (cmd *Cmd) Val() interface{} {
  126. return cmd.val
  127. }
  128. func (cmd *Cmd) Result() (interface{}, error) {
  129. return cmd.val, cmd.err
  130. }
  131. func (cmd *Cmd) String() (string, error) {
  132. if cmd.err != nil {
  133. return "", cmd.err
  134. }
  135. switch val := cmd.val.(type) {
  136. case string:
  137. return val, nil
  138. default:
  139. err := fmt.Errorf("redis: unexpected type=%T for String", val)
  140. return "", err
  141. }
  142. }
  143. func (cmd *Cmd) Int() (int, error) {
  144. if cmd.err != nil {
  145. return 0, cmd.err
  146. }
  147. switch val := cmd.val.(type) {
  148. case int64:
  149. return int(val), nil
  150. case string:
  151. return strconv.Atoi(val)
  152. default:
  153. err := fmt.Errorf("redis: unexpected type=%T for Int", val)
  154. return 0, err
  155. }
  156. }
  157. func (cmd *Cmd) Int64() (int64, error) {
  158. if cmd.err != nil {
  159. return 0, cmd.err
  160. }
  161. switch val := cmd.val.(type) {
  162. case int64:
  163. return val, nil
  164. case string:
  165. return strconv.ParseInt(val, 10, 64)
  166. default:
  167. err := fmt.Errorf("redis: unexpected type=%T for Int64", val)
  168. return 0, err
  169. }
  170. }
  171. func (cmd *Cmd) Uint64() (uint64, error) {
  172. if cmd.err != nil {
  173. return 0, cmd.err
  174. }
  175. switch val := cmd.val.(type) {
  176. case int64:
  177. return uint64(val), nil
  178. case string:
  179. return strconv.ParseUint(val, 10, 64)
  180. default:
  181. err := fmt.Errorf("redis: unexpected type=%T for Uint64", val)
  182. return 0, err
  183. }
  184. }
  185. func (cmd *Cmd) Float32() (float32, error) {
  186. if cmd.err != nil {
  187. return 0, cmd.err
  188. }
  189. switch val := cmd.val.(type) {
  190. case int64:
  191. return float32(val), nil
  192. case string:
  193. f, err := strconv.ParseFloat(val, 32)
  194. if err != nil {
  195. return 0, err
  196. }
  197. return float32(f), nil
  198. default:
  199. err := fmt.Errorf("redis: unexpected type=%T for Float32", val)
  200. return 0, err
  201. }
  202. }
  203. func (cmd *Cmd) Float64() (float64, error) {
  204. if cmd.err != nil {
  205. return 0, cmd.err
  206. }
  207. switch val := cmd.val.(type) {
  208. case int64:
  209. return float64(val), nil
  210. case string:
  211. return strconv.ParseFloat(val, 64)
  212. default:
  213. err := fmt.Errorf("redis: unexpected type=%T for Float64", val)
  214. return 0, err
  215. }
  216. }
  217. func (cmd *Cmd) Bool() (bool, error) {
  218. if cmd.err != nil {
  219. return false, cmd.err
  220. }
  221. switch val := cmd.val.(type) {
  222. case int64:
  223. return val != 0, nil
  224. case string:
  225. return strconv.ParseBool(val)
  226. default:
  227. err := fmt.Errorf("redis: unexpected type=%T for Bool", val)
  228. return false, err
  229. }
  230. }
  231. func (cmd *Cmd) readReply(rd *proto.Reader) error {
  232. cmd.val, cmd.err = rd.ReadReply(sliceParser)
  233. return cmd.err
  234. }
  235. // Implements proto.MultiBulkParse
  236. func sliceParser(rd *proto.Reader, n int64) (interface{}, error) {
  237. vals := make([]interface{}, n)
  238. for i := 0; i < len(vals); i++ {
  239. v, err := rd.ReadReply(sliceParser)
  240. if err != nil {
  241. if err == Nil {
  242. vals[i] = nil
  243. continue
  244. }
  245. if err, ok := err.(proto.RedisError); ok {
  246. vals[i] = err
  247. continue
  248. }
  249. return nil, err
  250. }
  251. vals[i] = v
  252. }
  253. return vals, nil
  254. }
  255. //------------------------------------------------------------------------------
  256. type SliceCmd struct {
  257. baseCmd
  258. val []interface{}
  259. }
  260. var _ Cmder = (*SliceCmd)(nil)
  261. func NewSliceCmd(args ...interface{}) *SliceCmd {
  262. return &SliceCmd{
  263. baseCmd: baseCmd{args: args},
  264. }
  265. }
  266. func (cmd *SliceCmd) Val() []interface{} {
  267. return cmd.val
  268. }
  269. func (cmd *SliceCmd) Result() ([]interface{}, error) {
  270. return cmd.val, cmd.err
  271. }
  272. func (cmd *SliceCmd) String() string {
  273. return cmdString(cmd, cmd.val)
  274. }
  275. func (cmd *SliceCmd) readReply(rd *proto.Reader) error {
  276. var v interface{}
  277. v, cmd.err = rd.ReadArrayReply(sliceParser)
  278. if cmd.err != nil {
  279. return cmd.err
  280. }
  281. cmd.val = v.([]interface{})
  282. return nil
  283. }
  284. //------------------------------------------------------------------------------
  285. type StatusCmd struct {
  286. baseCmd
  287. val string
  288. }
  289. var _ Cmder = (*StatusCmd)(nil)
  290. func NewStatusCmd(args ...interface{}) *StatusCmd {
  291. return &StatusCmd{
  292. baseCmd: baseCmd{args: args},
  293. }
  294. }
  295. func (cmd *StatusCmd) Val() string {
  296. return cmd.val
  297. }
  298. func (cmd *StatusCmd) Result() (string, error) {
  299. return cmd.val, cmd.err
  300. }
  301. func (cmd *StatusCmd) String() string {
  302. return cmdString(cmd, cmd.val)
  303. }
  304. func (cmd *StatusCmd) readReply(rd *proto.Reader) error {
  305. cmd.val, cmd.err = rd.ReadString()
  306. return cmd.err
  307. }
  308. //------------------------------------------------------------------------------
  309. type IntCmd struct {
  310. baseCmd
  311. val int64
  312. }
  313. var _ Cmder = (*IntCmd)(nil)
  314. func NewIntCmd(args ...interface{}) *IntCmd {
  315. return &IntCmd{
  316. baseCmd: baseCmd{args: args},
  317. }
  318. }
  319. func (cmd *IntCmd) Val() int64 {
  320. return cmd.val
  321. }
  322. func (cmd *IntCmd) Result() (int64, error) {
  323. return cmd.val, cmd.err
  324. }
  325. func (cmd *IntCmd) Uint64() (uint64, error) {
  326. return uint64(cmd.val), cmd.err
  327. }
  328. func (cmd *IntCmd) String() string {
  329. return cmdString(cmd, cmd.val)
  330. }
  331. func (cmd *IntCmd) readReply(rd *proto.Reader) error {
  332. cmd.val, cmd.err = rd.ReadIntReply()
  333. return cmd.err
  334. }
  335. //------------------------------------------------------------------------------
  336. type IntSliceCmd struct {
  337. baseCmd
  338. val []int64
  339. }
  340. var _ Cmder = (*IntSliceCmd)(nil)
  341. func NewIntSliceCmd(args ...interface{}) *IntSliceCmd {
  342. return &IntSliceCmd{
  343. baseCmd: baseCmd{args: args},
  344. }
  345. }
  346. func (cmd *IntSliceCmd) Val() []int64 {
  347. return cmd.val
  348. }
  349. func (cmd *IntSliceCmd) Result() ([]int64, error) {
  350. return cmd.val, cmd.err
  351. }
  352. func (cmd *IntSliceCmd) String() string {
  353. return cmdString(cmd, cmd.val)
  354. }
  355. func (cmd *IntSliceCmd) readReply(rd *proto.Reader) error {
  356. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  357. cmd.val = make([]int64, n)
  358. for i := 0; i < len(cmd.val); i++ {
  359. num, err := rd.ReadIntReply()
  360. if err != nil {
  361. return nil, err
  362. }
  363. cmd.val[i] = num
  364. }
  365. return nil, nil
  366. })
  367. return cmd.err
  368. }
  369. //------------------------------------------------------------------------------
  370. type DurationCmd struct {
  371. baseCmd
  372. val time.Duration
  373. precision time.Duration
  374. }
  375. var _ Cmder = (*DurationCmd)(nil)
  376. func NewDurationCmd(precision time.Duration, args ...interface{}) *DurationCmd {
  377. return &DurationCmd{
  378. baseCmd: baseCmd{args: args},
  379. precision: precision,
  380. }
  381. }
  382. func (cmd *DurationCmd) Val() time.Duration {
  383. return cmd.val
  384. }
  385. func (cmd *DurationCmd) Result() (time.Duration, error) {
  386. return cmd.val, cmd.err
  387. }
  388. func (cmd *DurationCmd) String() string {
  389. return cmdString(cmd, cmd.val)
  390. }
  391. func (cmd *DurationCmd) readReply(rd *proto.Reader) error {
  392. var n int64
  393. n, cmd.err = rd.ReadIntReply()
  394. if cmd.err != nil {
  395. return cmd.err
  396. }
  397. switch n {
  398. // -2 if the key does not exist
  399. // -1 if the key exists but has no associated expire
  400. case -2, -1:
  401. cmd.val = time.Duration(n)
  402. default:
  403. cmd.val = time.Duration(n) * cmd.precision
  404. }
  405. return nil
  406. }
  407. //------------------------------------------------------------------------------
  408. type TimeCmd struct {
  409. baseCmd
  410. val time.Time
  411. }
  412. var _ Cmder = (*TimeCmd)(nil)
  413. func NewTimeCmd(args ...interface{}) *TimeCmd {
  414. return &TimeCmd{
  415. baseCmd: baseCmd{args: args},
  416. }
  417. }
  418. func (cmd *TimeCmd) Val() time.Time {
  419. return cmd.val
  420. }
  421. func (cmd *TimeCmd) Result() (time.Time, error) {
  422. return cmd.val, cmd.err
  423. }
  424. func (cmd *TimeCmd) String() string {
  425. return cmdString(cmd, cmd.val)
  426. }
  427. func (cmd *TimeCmd) readReply(rd *proto.Reader) error {
  428. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  429. if n != 2 {
  430. return nil, fmt.Errorf("got %d elements, expected 2", n)
  431. }
  432. sec, err := rd.ReadInt()
  433. if err != nil {
  434. return nil, err
  435. }
  436. microsec, err := rd.ReadInt()
  437. if err != nil {
  438. return nil, err
  439. }
  440. cmd.val = time.Unix(sec, microsec*1000)
  441. return nil, nil
  442. })
  443. return cmd.err
  444. }
  445. //------------------------------------------------------------------------------
  446. type BoolCmd struct {
  447. baseCmd
  448. val bool
  449. }
  450. var _ Cmder = (*BoolCmd)(nil)
  451. func NewBoolCmd(args ...interface{}) *BoolCmd {
  452. return &BoolCmd{
  453. baseCmd: baseCmd{args: args},
  454. }
  455. }
  456. func (cmd *BoolCmd) Val() bool {
  457. return cmd.val
  458. }
  459. func (cmd *BoolCmd) Result() (bool, error) {
  460. return cmd.val, cmd.err
  461. }
  462. func (cmd *BoolCmd) String() string {
  463. return cmdString(cmd, cmd.val)
  464. }
  465. func (cmd *BoolCmd) readReply(rd *proto.Reader) error {
  466. var v interface{}
  467. v, cmd.err = rd.ReadReply(nil)
  468. // `SET key value NX` returns nil when key already exists. But
  469. // `SETNX key value` returns bool (0/1). So convert nil to bool.
  470. if cmd.err == Nil {
  471. cmd.val = false
  472. cmd.err = nil
  473. return nil
  474. }
  475. if cmd.err != nil {
  476. return cmd.err
  477. }
  478. switch v := v.(type) {
  479. case int64:
  480. cmd.val = v == 1
  481. return nil
  482. case string:
  483. cmd.val = v == "OK"
  484. return nil
  485. default:
  486. cmd.err = fmt.Errorf("got %T, wanted int64 or string", v)
  487. return cmd.err
  488. }
  489. }
  490. //------------------------------------------------------------------------------
  491. type StringCmd struct {
  492. baseCmd
  493. val string
  494. }
  495. var _ Cmder = (*StringCmd)(nil)
  496. func NewStringCmd(args ...interface{}) *StringCmd {
  497. return &StringCmd{
  498. baseCmd: baseCmd{args: args},
  499. }
  500. }
  501. func (cmd *StringCmd) Val() string {
  502. return cmd.val
  503. }
  504. func (cmd *StringCmd) Result() (string, error) {
  505. return cmd.Val(), cmd.err
  506. }
  507. func (cmd *StringCmd) Bytes() ([]byte, error) {
  508. return util.StringToBytes(cmd.val), cmd.err
  509. }
  510. func (cmd *StringCmd) Int() (int, error) {
  511. if cmd.err != nil {
  512. return 0, cmd.err
  513. }
  514. return strconv.Atoi(cmd.Val())
  515. }
  516. func (cmd *StringCmd) Int64() (int64, error) {
  517. if cmd.err != nil {
  518. return 0, cmd.err
  519. }
  520. return strconv.ParseInt(cmd.Val(), 10, 64)
  521. }
  522. func (cmd *StringCmd) Uint64() (uint64, error) {
  523. if cmd.err != nil {
  524. return 0, cmd.err
  525. }
  526. return strconv.ParseUint(cmd.Val(), 10, 64)
  527. }
  528. func (cmd *StringCmd) Float32() (float32, error) {
  529. if cmd.err != nil {
  530. return 0, cmd.err
  531. }
  532. f, err := strconv.ParseFloat(cmd.Val(), 32)
  533. if err != nil {
  534. return 0, err
  535. }
  536. return float32(f), nil
  537. }
  538. func (cmd *StringCmd) Float64() (float64, error) {
  539. if cmd.err != nil {
  540. return 0, cmd.err
  541. }
  542. return strconv.ParseFloat(cmd.Val(), 64)
  543. }
  544. func (cmd *StringCmd) Time() (time.Time, error) {
  545. if cmd.err != nil {
  546. return time.Time{}, cmd.err
  547. }
  548. return time.Parse(time.RFC3339, cmd.Val())
  549. }
  550. func (cmd *StringCmd) Scan(val interface{}) error {
  551. if cmd.err != nil {
  552. return cmd.err
  553. }
  554. return proto.Scan([]byte(cmd.val), val)
  555. }
  556. func (cmd *StringCmd) String() string {
  557. return cmdString(cmd, cmd.val)
  558. }
  559. func (cmd *StringCmd) readReply(rd *proto.Reader) error {
  560. cmd.val, cmd.err = rd.ReadString()
  561. return cmd.err
  562. }
  563. //------------------------------------------------------------------------------
  564. type FloatCmd struct {
  565. baseCmd
  566. val float64
  567. }
  568. var _ Cmder = (*FloatCmd)(nil)
  569. func NewFloatCmd(args ...interface{}) *FloatCmd {
  570. return &FloatCmd{
  571. baseCmd: baseCmd{args: args},
  572. }
  573. }
  574. func (cmd *FloatCmd) Val() float64 {
  575. return cmd.val
  576. }
  577. func (cmd *FloatCmd) Result() (float64, error) {
  578. return cmd.Val(), cmd.Err()
  579. }
  580. func (cmd *FloatCmd) String() string {
  581. return cmdString(cmd, cmd.val)
  582. }
  583. func (cmd *FloatCmd) readReply(rd *proto.Reader) error {
  584. cmd.val, cmd.err = rd.ReadFloatReply()
  585. return cmd.err
  586. }
  587. //------------------------------------------------------------------------------
  588. type StringSliceCmd struct {
  589. baseCmd
  590. val []string
  591. }
  592. var _ Cmder = (*StringSliceCmd)(nil)
  593. func NewStringSliceCmd(args ...interface{}) *StringSliceCmd {
  594. return &StringSliceCmd{
  595. baseCmd: baseCmd{args: args},
  596. }
  597. }
  598. func (cmd *StringSliceCmd) Val() []string {
  599. return cmd.val
  600. }
  601. func (cmd *StringSliceCmd) Result() ([]string, error) {
  602. return cmd.Val(), cmd.Err()
  603. }
  604. func (cmd *StringSliceCmd) String() string {
  605. return cmdString(cmd, cmd.val)
  606. }
  607. func (cmd *StringSliceCmd) ScanSlice(container interface{}) error {
  608. return proto.ScanSlice(cmd.Val(), container)
  609. }
  610. func (cmd *StringSliceCmd) readReply(rd *proto.Reader) error {
  611. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  612. cmd.val = make([]string, n)
  613. for i := 0; i < len(cmd.val); i++ {
  614. switch s, err := rd.ReadString(); {
  615. case err == Nil:
  616. cmd.val[i] = ""
  617. case err != nil:
  618. return nil, err
  619. default:
  620. cmd.val[i] = s
  621. }
  622. }
  623. return nil, nil
  624. })
  625. return cmd.err
  626. }
  627. //------------------------------------------------------------------------------
  628. type BoolSliceCmd struct {
  629. baseCmd
  630. val []bool
  631. }
  632. var _ Cmder = (*BoolSliceCmd)(nil)
  633. func NewBoolSliceCmd(args ...interface{}) *BoolSliceCmd {
  634. return &BoolSliceCmd{
  635. baseCmd: baseCmd{args: args},
  636. }
  637. }
  638. func (cmd *BoolSliceCmd) Val() []bool {
  639. return cmd.val
  640. }
  641. func (cmd *BoolSliceCmd) Result() ([]bool, error) {
  642. return cmd.val, cmd.err
  643. }
  644. func (cmd *BoolSliceCmd) String() string {
  645. return cmdString(cmd, cmd.val)
  646. }
  647. func (cmd *BoolSliceCmd) readReply(rd *proto.Reader) error {
  648. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  649. cmd.val = make([]bool, n)
  650. for i := 0; i < len(cmd.val); i++ {
  651. n, err := rd.ReadIntReply()
  652. if err != nil {
  653. return nil, err
  654. }
  655. cmd.val[i] = n == 1
  656. }
  657. return nil, nil
  658. })
  659. return cmd.err
  660. }
  661. //------------------------------------------------------------------------------
  662. type StringStringMapCmd struct {
  663. baseCmd
  664. val map[string]string
  665. }
  666. var _ Cmder = (*StringStringMapCmd)(nil)
  667. func NewStringStringMapCmd(args ...interface{}) *StringStringMapCmd {
  668. return &StringStringMapCmd{
  669. baseCmd: baseCmd{args: args},
  670. }
  671. }
  672. func (cmd *StringStringMapCmd) Val() map[string]string {
  673. return cmd.val
  674. }
  675. func (cmd *StringStringMapCmd) Result() (map[string]string, error) {
  676. return cmd.val, cmd.err
  677. }
  678. func (cmd *StringStringMapCmd) String() string {
  679. return cmdString(cmd, cmd.val)
  680. }
  681. func (cmd *StringStringMapCmd) readReply(rd *proto.Reader) error {
  682. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  683. cmd.val = make(map[string]string, n/2)
  684. for i := int64(0); i < n; i += 2 {
  685. key, err := rd.ReadString()
  686. if err != nil {
  687. return nil, err
  688. }
  689. value, err := rd.ReadString()
  690. if err != nil {
  691. return nil, err
  692. }
  693. cmd.val[key] = value
  694. }
  695. return nil, nil
  696. })
  697. return cmd.err
  698. }
  699. //------------------------------------------------------------------------------
  700. type StringIntMapCmd struct {
  701. baseCmd
  702. val map[string]int64
  703. }
  704. var _ Cmder = (*StringIntMapCmd)(nil)
  705. func NewStringIntMapCmd(args ...interface{}) *StringIntMapCmd {
  706. return &StringIntMapCmd{
  707. baseCmd: baseCmd{args: args},
  708. }
  709. }
  710. func (cmd *StringIntMapCmd) Val() map[string]int64 {
  711. return cmd.val
  712. }
  713. func (cmd *StringIntMapCmd) Result() (map[string]int64, error) {
  714. return cmd.val, cmd.err
  715. }
  716. func (cmd *StringIntMapCmd) String() string {
  717. return cmdString(cmd, cmd.val)
  718. }
  719. func (cmd *StringIntMapCmd) readReply(rd *proto.Reader) error {
  720. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  721. cmd.val = make(map[string]int64, n/2)
  722. for i := int64(0); i < n; i += 2 {
  723. key, err := rd.ReadString()
  724. if err != nil {
  725. return nil, err
  726. }
  727. n, err := rd.ReadIntReply()
  728. if err != nil {
  729. return nil, err
  730. }
  731. cmd.val[key] = n
  732. }
  733. return nil, nil
  734. })
  735. return cmd.err
  736. }
  737. //------------------------------------------------------------------------------
  738. type StringStructMapCmd struct {
  739. baseCmd
  740. val map[string]struct{}
  741. }
  742. var _ Cmder = (*StringStructMapCmd)(nil)
  743. func NewStringStructMapCmd(args ...interface{}) *StringStructMapCmd {
  744. return &StringStructMapCmd{
  745. baseCmd: baseCmd{args: args},
  746. }
  747. }
  748. func (cmd *StringStructMapCmd) Val() map[string]struct{} {
  749. return cmd.val
  750. }
  751. func (cmd *StringStructMapCmd) Result() (map[string]struct{}, error) {
  752. return cmd.val, cmd.err
  753. }
  754. func (cmd *StringStructMapCmd) String() string {
  755. return cmdString(cmd, cmd.val)
  756. }
  757. func (cmd *StringStructMapCmd) readReply(rd *proto.Reader) error {
  758. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  759. cmd.val = make(map[string]struct{}, n)
  760. for i := int64(0); i < n; i++ {
  761. key, err := rd.ReadString()
  762. if err != nil {
  763. return nil, err
  764. }
  765. cmd.val[key] = struct{}{}
  766. }
  767. return nil, nil
  768. })
  769. return cmd.err
  770. }
  771. //------------------------------------------------------------------------------
  772. type XMessage struct {
  773. ID string
  774. Values map[string]interface{}
  775. }
  776. type XMessageSliceCmd struct {
  777. baseCmd
  778. val []XMessage
  779. }
  780. var _ Cmder = (*XMessageSliceCmd)(nil)
  781. func NewXMessageSliceCmd(args ...interface{}) *XMessageSliceCmd {
  782. return &XMessageSliceCmd{
  783. baseCmd: baseCmd{args: args},
  784. }
  785. }
  786. func (cmd *XMessageSliceCmd) Val() []XMessage {
  787. return cmd.val
  788. }
  789. func (cmd *XMessageSliceCmd) Result() ([]XMessage, error) {
  790. return cmd.val, cmd.err
  791. }
  792. func (cmd *XMessageSliceCmd) String() string {
  793. return cmdString(cmd, cmd.val)
  794. }
  795. func (cmd *XMessageSliceCmd) readReply(rd *proto.Reader) error {
  796. var v interface{}
  797. v, cmd.err = rd.ReadArrayReply(xMessageSliceParser)
  798. if cmd.err != nil {
  799. return cmd.err
  800. }
  801. cmd.val = v.([]XMessage)
  802. return nil
  803. }
  804. // Implements proto.MultiBulkParse
  805. func xMessageSliceParser(rd *proto.Reader, n int64) (interface{}, error) {
  806. msgs := make([]XMessage, n)
  807. for i := 0; i < len(msgs); i++ {
  808. i := i
  809. _, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  810. id, err := rd.ReadString()
  811. if err != nil {
  812. return nil, err
  813. }
  814. var values map[string]interface{}
  815. v, err := rd.ReadArrayReply(stringInterfaceMapParser)
  816. if err != nil {
  817. if err != proto.Nil {
  818. return nil, err
  819. }
  820. } else {
  821. values = v.(map[string]interface{})
  822. }
  823. msgs[i] = XMessage{
  824. ID: id,
  825. Values: values,
  826. }
  827. return nil, nil
  828. })
  829. if err != nil {
  830. return nil, err
  831. }
  832. }
  833. return msgs, nil
  834. }
  835. // Implements proto.MultiBulkParse
  836. func stringInterfaceMapParser(rd *proto.Reader, n int64) (interface{}, error) {
  837. m := make(map[string]interface{}, n/2)
  838. for i := int64(0); i < n; i += 2 {
  839. key, err := rd.ReadString()
  840. if err != nil {
  841. return nil, err
  842. }
  843. value, err := rd.ReadString()
  844. if err != nil {
  845. return nil, err
  846. }
  847. m[key] = value
  848. }
  849. return m, nil
  850. }
  851. //------------------------------------------------------------------------------
  852. type XStream struct {
  853. Stream string
  854. Messages []XMessage
  855. }
  856. type XStreamSliceCmd struct {
  857. baseCmd
  858. val []XStream
  859. }
  860. var _ Cmder = (*XStreamSliceCmd)(nil)
  861. func NewXStreamSliceCmd(args ...interface{}) *XStreamSliceCmd {
  862. return &XStreamSliceCmd{
  863. baseCmd: baseCmd{args: args},
  864. }
  865. }
  866. func (cmd *XStreamSliceCmd) Val() []XStream {
  867. return cmd.val
  868. }
  869. func (cmd *XStreamSliceCmd) Result() ([]XStream, error) {
  870. return cmd.val, cmd.err
  871. }
  872. func (cmd *XStreamSliceCmd) String() string {
  873. return cmdString(cmd, cmd.val)
  874. }
  875. func (cmd *XStreamSliceCmd) readReply(rd *proto.Reader) error {
  876. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  877. cmd.val = make([]XStream, n)
  878. for i := 0; i < len(cmd.val); i++ {
  879. i := i
  880. _, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  881. if n != 2 {
  882. return nil, fmt.Errorf("got %d, wanted 2", n)
  883. }
  884. stream, err := rd.ReadString()
  885. if err != nil {
  886. return nil, err
  887. }
  888. v, err := rd.ReadArrayReply(xMessageSliceParser)
  889. if err != nil {
  890. return nil, err
  891. }
  892. cmd.val[i] = XStream{
  893. Stream: stream,
  894. Messages: v.([]XMessage),
  895. }
  896. return nil, nil
  897. })
  898. if err != nil {
  899. return nil, err
  900. }
  901. }
  902. return nil, nil
  903. })
  904. return cmd.err
  905. }
  906. //------------------------------------------------------------------------------
  907. type XPending struct {
  908. Count int64
  909. Lower string
  910. Higher string
  911. Consumers map[string]int64
  912. }
  913. type XPendingCmd struct {
  914. baseCmd
  915. val *XPending
  916. }
  917. var _ Cmder = (*XPendingCmd)(nil)
  918. func NewXPendingCmd(args ...interface{}) *XPendingCmd {
  919. return &XPendingCmd{
  920. baseCmd: baseCmd{args: args},
  921. }
  922. }
  923. func (cmd *XPendingCmd) Val() *XPending {
  924. return cmd.val
  925. }
  926. func (cmd *XPendingCmd) Result() (*XPending, error) {
  927. return cmd.val, cmd.err
  928. }
  929. func (cmd *XPendingCmd) String() string {
  930. return cmdString(cmd, cmd.val)
  931. }
  932. func (cmd *XPendingCmd) readReply(rd *proto.Reader) error {
  933. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  934. if n != 4 {
  935. return nil, fmt.Errorf("got %d, wanted 4", n)
  936. }
  937. count, err := rd.ReadIntReply()
  938. if err != nil {
  939. return nil, err
  940. }
  941. lower, err := rd.ReadString()
  942. if err != nil && err != Nil {
  943. return nil, err
  944. }
  945. higher, err := rd.ReadString()
  946. if err != nil && err != Nil {
  947. return nil, err
  948. }
  949. cmd.val = &XPending{
  950. Count: count,
  951. Lower: lower,
  952. Higher: higher,
  953. }
  954. _, err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  955. for i := int64(0); i < n; i++ {
  956. _, err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  957. if n != 2 {
  958. return nil, fmt.Errorf("got %d, wanted 2", n)
  959. }
  960. consumerName, err := rd.ReadString()
  961. if err != nil {
  962. return nil, err
  963. }
  964. consumerPending, err := rd.ReadInt()
  965. if err != nil {
  966. return nil, err
  967. }
  968. if cmd.val.Consumers == nil {
  969. cmd.val.Consumers = make(map[string]int64)
  970. }
  971. cmd.val.Consumers[consumerName] = consumerPending
  972. return nil, nil
  973. })
  974. if err != nil {
  975. return nil, err
  976. }
  977. }
  978. return nil, nil
  979. })
  980. if err != nil && err != Nil {
  981. return nil, err
  982. }
  983. return nil, nil
  984. })
  985. return cmd.err
  986. }
  987. //------------------------------------------------------------------------------
  988. type XPendingExt struct {
  989. ID string
  990. Consumer string
  991. Idle time.Duration
  992. RetryCount int64
  993. }
  994. type XPendingExtCmd struct {
  995. baseCmd
  996. val []XPendingExt
  997. }
  998. var _ Cmder = (*XPendingExtCmd)(nil)
  999. func NewXPendingExtCmd(args ...interface{}) *XPendingExtCmd {
  1000. return &XPendingExtCmd{
  1001. baseCmd: baseCmd{args: args},
  1002. }
  1003. }
  1004. func (cmd *XPendingExtCmd) Val() []XPendingExt {
  1005. return cmd.val
  1006. }
  1007. func (cmd *XPendingExtCmd) Result() ([]XPendingExt, error) {
  1008. return cmd.val, cmd.err
  1009. }
  1010. func (cmd *XPendingExtCmd) String() string {
  1011. return cmdString(cmd, cmd.val)
  1012. }
  1013. func (cmd *XPendingExtCmd) readReply(rd *proto.Reader) error {
  1014. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1015. cmd.val = make([]XPendingExt, 0, n)
  1016. for i := int64(0); i < n; i++ {
  1017. _, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1018. if n != 4 {
  1019. return nil, fmt.Errorf("got %d, wanted 4", n)
  1020. }
  1021. id, err := rd.ReadString()
  1022. if err != nil {
  1023. return nil, err
  1024. }
  1025. consumer, err := rd.ReadString()
  1026. if err != nil && err != Nil {
  1027. return nil, err
  1028. }
  1029. idle, err := rd.ReadIntReply()
  1030. if err != nil && err != Nil {
  1031. return nil, err
  1032. }
  1033. retryCount, err := rd.ReadIntReply()
  1034. if err != nil && err != Nil {
  1035. return nil, err
  1036. }
  1037. cmd.val = append(cmd.val, XPendingExt{
  1038. ID: id,
  1039. Consumer: consumer,
  1040. Idle: time.Duration(idle) * time.Millisecond,
  1041. RetryCount: retryCount,
  1042. })
  1043. return nil, nil
  1044. })
  1045. if err != nil {
  1046. return nil, err
  1047. }
  1048. }
  1049. return nil, nil
  1050. })
  1051. return cmd.err
  1052. }
  1053. //------------------------------------------------------------------------------
  1054. type XInfoGroupsCmd struct {
  1055. baseCmd
  1056. val []XInfoGroups
  1057. }
  1058. type XInfoGroups struct {
  1059. Name string
  1060. Consumers int64
  1061. Pending int64
  1062. LastDeliveredID string
  1063. }
  1064. var _ Cmder = (*XInfoGroupsCmd)(nil)
  1065. func NewXInfoGroupsCmd(stream string) *XInfoGroupsCmd {
  1066. return &XInfoGroupsCmd{
  1067. baseCmd: baseCmd{args: []interface{}{"xinfo", "groups", stream}},
  1068. }
  1069. }
  1070. func (cmd *XInfoGroupsCmd) Val() []XInfoGroups {
  1071. return cmd.val
  1072. }
  1073. func (cmd *XInfoGroupsCmd) Result() ([]XInfoGroups, error) {
  1074. return cmd.val, cmd.err
  1075. }
  1076. func (cmd *XInfoGroupsCmd) String() string {
  1077. return cmdString(cmd, cmd.val)
  1078. }
  1079. func (cmd *XInfoGroupsCmd) readReply(rd *proto.Reader) error {
  1080. _, cmd.err = rd.ReadArrayReply(
  1081. func(rd *proto.Reader, n int64) (interface{}, error) {
  1082. for i := int64(0); i < n; i++ {
  1083. v, err := rd.ReadReply(xGroupInfoParser)
  1084. if err != nil {
  1085. return nil, err
  1086. }
  1087. cmd.val = append(cmd.val, v.(XInfoGroups))
  1088. }
  1089. return nil, nil
  1090. })
  1091. return nil
  1092. }
  1093. func xGroupInfoParser(rd *proto.Reader, n int64) (interface{}, error) {
  1094. if n != 8 {
  1095. return nil, fmt.Errorf("redis: got %d elements in XINFO GROUPS reply,"+
  1096. "wanted 8", n)
  1097. }
  1098. var (
  1099. err error
  1100. grp XInfoGroups
  1101. key string
  1102. val string
  1103. )
  1104. for i := 0; i < 4; i++ {
  1105. key, err = rd.ReadString()
  1106. if err != nil {
  1107. return nil, err
  1108. }
  1109. val, err = rd.ReadString()
  1110. if err != nil {
  1111. return nil, err
  1112. }
  1113. switch key {
  1114. case "name":
  1115. grp.Name = val
  1116. case "consumers":
  1117. grp.Consumers, err = strconv.ParseInt(val, 0, 64)
  1118. case "pending":
  1119. grp.Pending, err = strconv.ParseInt(val, 0, 64)
  1120. case "last-delivered-id":
  1121. grp.LastDeliveredID = val
  1122. default:
  1123. return nil, fmt.Errorf("redis: unexpected content %s "+
  1124. "in XINFO GROUPS reply", key)
  1125. }
  1126. if err != nil {
  1127. return nil, err
  1128. }
  1129. }
  1130. return grp, err
  1131. }
  1132. //------------------------------------------------------------------------------
  1133. type ZSliceCmd struct {
  1134. baseCmd
  1135. val []Z
  1136. }
  1137. var _ Cmder = (*ZSliceCmd)(nil)
  1138. func NewZSliceCmd(args ...interface{}) *ZSliceCmd {
  1139. return &ZSliceCmd{
  1140. baseCmd: baseCmd{args: args},
  1141. }
  1142. }
  1143. func (cmd *ZSliceCmd) Val() []Z {
  1144. return cmd.val
  1145. }
  1146. func (cmd *ZSliceCmd) Result() ([]Z, error) {
  1147. return cmd.val, cmd.err
  1148. }
  1149. func (cmd *ZSliceCmd) String() string {
  1150. return cmdString(cmd, cmd.val)
  1151. }
  1152. func (cmd *ZSliceCmd) readReply(rd *proto.Reader) error {
  1153. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1154. cmd.val = make([]Z, n/2)
  1155. for i := 0; i < len(cmd.val); i++ {
  1156. member, err := rd.ReadString()
  1157. if err != nil {
  1158. return nil, err
  1159. }
  1160. score, err := rd.ReadFloatReply()
  1161. if err != nil {
  1162. return nil, err
  1163. }
  1164. cmd.val[i] = Z{
  1165. Member: member,
  1166. Score: score,
  1167. }
  1168. }
  1169. return nil, nil
  1170. })
  1171. return cmd.err
  1172. }
  1173. //------------------------------------------------------------------------------
  1174. type ZWithKeyCmd struct {
  1175. baseCmd
  1176. val *ZWithKey
  1177. }
  1178. var _ Cmder = (*ZWithKeyCmd)(nil)
  1179. func NewZWithKeyCmd(args ...interface{}) *ZWithKeyCmd {
  1180. return &ZWithKeyCmd{
  1181. baseCmd: baseCmd{args: args},
  1182. }
  1183. }
  1184. func (cmd *ZWithKeyCmd) Val() *ZWithKey {
  1185. return cmd.val
  1186. }
  1187. func (cmd *ZWithKeyCmd) Result() (*ZWithKey, error) {
  1188. return cmd.Val(), cmd.Err()
  1189. }
  1190. func (cmd *ZWithKeyCmd) String() string {
  1191. return cmdString(cmd, cmd.val)
  1192. }
  1193. func (cmd *ZWithKeyCmd) readReply(rd *proto.Reader) error {
  1194. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1195. if n != 3 {
  1196. return nil, fmt.Errorf("got %d elements, expected 3", n)
  1197. }
  1198. cmd.val = &ZWithKey{}
  1199. var err error
  1200. cmd.val.Key, err = rd.ReadString()
  1201. if err != nil {
  1202. return nil, err
  1203. }
  1204. cmd.val.Member, err = rd.ReadString()
  1205. if err != nil {
  1206. return nil, err
  1207. }
  1208. cmd.val.Score, err = rd.ReadFloatReply()
  1209. if err != nil {
  1210. return nil, err
  1211. }
  1212. return nil, nil
  1213. })
  1214. return cmd.err
  1215. }
  1216. //------------------------------------------------------------------------------
  1217. type ScanCmd struct {
  1218. baseCmd
  1219. page []string
  1220. cursor uint64
  1221. process func(cmd Cmder) error
  1222. }
  1223. var _ Cmder = (*ScanCmd)(nil)
  1224. func NewScanCmd(process func(cmd Cmder) error, args ...interface{}) *ScanCmd {
  1225. return &ScanCmd{
  1226. baseCmd: baseCmd{args: args},
  1227. process: process,
  1228. }
  1229. }
  1230. func (cmd *ScanCmd) Val() (keys []string, cursor uint64) {
  1231. return cmd.page, cmd.cursor
  1232. }
  1233. func (cmd *ScanCmd) Result() (keys []string, cursor uint64, err error) {
  1234. return cmd.page, cmd.cursor, cmd.err
  1235. }
  1236. func (cmd *ScanCmd) String() string {
  1237. return cmdString(cmd, cmd.page)
  1238. }
  1239. func (cmd *ScanCmd) readReply(rd *proto.Reader) error {
  1240. cmd.page, cmd.cursor, cmd.err = rd.ReadScanReply()
  1241. return cmd.err
  1242. }
  1243. // Iterator creates a new ScanIterator.
  1244. func (cmd *ScanCmd) Iterator() *ScanIterator {
  1245. return &ScanIterator{
  1246. cmd: cmd,
  1247. }
  1248. }
  1249. //------------------------------------------------------------------------------
  1250. type ClusterNode struct {
  1251. ID string
  1252. Addr string
  1253. }
  1254. type ClusterSlot struct {
  1255. Start int
  1256. End int
  1257. Nodes []ClusterNode
  1258. }
  1259. type ClusterSlotsCmd struct {
  1260. baseCmd
  1261. val []ClusterSlot
  1262. }
  1263. var _ Cmder = (*ClusterSlotsCmd)(nil)
  1264. func NewClusterSlotsCmd(args ...interface{}) *ClusterSlotsCmd {
  1265. return &ClusterSlotsCmd{
  1266. baseCmd: baseCmd{args: args},
  1267. }
  1268. }
  1269. func (cmd *ClusterSlotsCmd) Val() []ClusterSlot {
  1270. return cmd.val
  1271. }
  1272. func (cmd *ClusterSlotsCmd) Result() ([]ClusterSlot, error) {
  1273. return cmd.Val(), cmd.Err()
  1274. }
  1275. func (cmd *ClusterSlotsCmd) String() string {
  1276. return cmdString(cmd, cmd.val)
  1277. }
  1278. func (cmd *ClusterSlotsCmd) readReply(rd *proto.Reader) error {
  1279. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1280. cmd.val = make([]ClusterSlot, n)
  1281. for i := 0; i < len(cmd.val); i++ {
  1282. n, err := rd.ReadArrayLen()
  1283. if err != nil {
  1284. return nil, err
  1285. }
  1286. if n < 2 {
  1287. err := fmt.Errorf("redis: got %d elements in cluster info, expected at least 2", n)
  1288. return nil, err
  1289. }
  1290. start, err := rd.ReadIntReply()
  1291. if err != nil {
  1292. return nil, err
  1293. }
  1294. end, err := rd.ReadIntReply()
  1295. if err != nil {
  1296. return nil, err
  1297. }
  1298. nodes := make([]ClusterNode, n-2)
  1299. for j := 0; j < len(nodes); j++ {
  1300. n, err := rd.ReadArrayLen()
  1301. if err != nil {
  1302. return nil, err
  1303. }
  1304. if n != 2 && n != 3 {
  1305. err := fmt.Errorf("got %d elements in cluster info address, expected 2 or 3", n)
  1306. return nil, err
  1307. }
  1308. ip, err := rd.ReadString()
  1309. if err != nil {
  1310. return nil, err
  1311. }
  1312. port, err := rd.ReadString()
  1313. if err != nil {
  1314. return nil, err
  1315. }
  1316. nodes[j].Addr = net.JoinHostPort(ip, port)
  1317. if n == 3 {
  1318. id, err := rd.ReadString()
  1319. if err != nil {
  1320. return nil, err
  1321. }
  1322. nodes[j].ID = id
  1323. }
  1324. }
  1325. cmd.val[i] = ClusterSlot{
  1326. Start: int(start),
  1327. End: int(end),
  1328. Nodes: nodes,
  1329. }
  1330. }
  1331. return nil, nil
  1332. })
  1333. return cmd.err
  1334. }
  1335. //------------------------------------------------------------------------------
  1336. // GeoLocation is used with GeoAdd to add geospatial location.
  1337. type GeoLocation struct {
  1338. Name string
  1339. Longitude, Latitude, Dist float64
  1340. GeoHash int64
  1341. }
  1342. // GeoRadiusQuery is used with GeoRadius to query geospatial index.
  1343. type GeoRadiusQuery struct {
  1344. Radius float64
  1345. // Can be m, km, ft, or mi. Default is km.
  1346. Unit string
  1347. WithCoord bool
  1348. WithDist bool
  1349. WithGeoHash bool
  1350. Count int
  1351. // Can be ASC or DESC. Default is no sort order.
  1352. Sort string
  1353. Store string
  1354. StoreDist string
  1355. }
  1356. type GeoLocationCmd struct {
  1357. baseCmd
  1358. q *GeoRadiusQuery
  1359. locations []GeoLocation
  1360. }
  1361. var _ Cmder = (*GeoLocationCmd)(nil)
  1362. func NewGeoLocationCmd(q *GeoRadiusQuery, args ...interface{}) *GeoLocationCmd {
  1363. return &GeoLocationCmd{
  1364. baseCmd: baseCmd{args: geoLocationArgs(q, args...)},
  1365. q: q,
  1366. }
  1367. }
  1368. func geoLocationArgs(q *GeoRadiusQuery, args ...interface{}) []interface{} {
  1369. args = append(args, q.Radius)
  1370. if q.Unit != "" {
  1371. args = append(args, q.Unit)
  1372. } else {
  1373. args = append(args, "km")
  1374. }
  1375. if q.WithCoord {
  1376. args = append(args, "withcoord")
  1377. }
  1378. if q.WithDist {
  1379. args = append(args, "withdist")
  1380. }
  1381. if q.WithGeoHash {
  1382. args = append(args, "withhash")
  1383. }
  1384. if q.Count > 0 {
  1385. args = append(args, "count", q.Count)
  1386. }
  1387. if q.Sort != "" {
  1388. args = append(args, q.Sort)
  1389. }
  1390. if q.Store != "" {
  1391. args = append(args, "store")
  1392. args = append(args, q.Store)
  1393. }
  1394. if q.StoreDist != "" {
  1395. args = append(args, "storedist")
  1396. args = append(args, q.StoreDist)
  1397. }
  1398. return args
  1399. }
  1400. func (cmd *GeoLocationCmd) Val() []GeoLocation {
  1401. return cmd.locations
  1402. }
  1403. func (cmd *GeoLocationCmd) Result() ([]GeoLocation, error) {
  1404. return cmd.locations, cmd.err
  1405. }
  1406. func (cmd *GeoLocationCmd) String() string {
  1407. return cmdString(cmd, cmd.locations)
  1408. }
  1409. func (cmd *GeoLocationCmd) readReply(rd *proto.Reader) error {
  1410. var v interface{}
  1411. v, cmd.err = rd.ReadArrayReply(newGeoLocationSliceParser(cmd.q))
  1412. if cmd.err != nil {
  1413. return cmd.err
  1414. }
  1415. cmd.locations = v.([]GeoLocation)
  1416. return nil
  1417. }
  1418. func newGeoLocationSliceParser(q *GeoRadiusQuery) proto.MultiBulkParse {
  1419. return func(rd *proto.Reader, n int64) (interface{}, error) {
  1420. locs := make([]GeoLocation, 0, n)
  1421. for i := int64(0); i < n; i++ {
  1422. v, err := rd.ReadReply(newGeoLocationParser(q))
  1423. if err != nil {
  1424. return nil, err
  1425. }
  1426. switch vv := v.(type) {
  1427. case string:
  1428. locs = append(locs, GeoLocation{
  1429. Name: vv,
  1430. })
  1431. case *GeoLocation:
  1432. //TODO: avoid copying
  1433. locs = append(locs, *vv)
  1434. default:
  1435. return nil, fmt.Errorf("got %T, expected string or *GeoLocation", v)
  1436. }
  1437. }
  1438. return locs, nil
  1439. }
  1440. }
  1441. func newGeoLocationParser(q *GeoRadiusQuery) proto.MultiBulkParse {
  1442. return func(rd *proto.Reader, n int64) (interface{}, error) {
  1443. var loc GeoLocation
  1444. var err error
  1445. loc.Name, err = rd.ReadString()
  1446. if err != nil {
  1447. return nil, err
  1448. }
  1449. if q.WithDist {
  1450. loc.Dist, err = rd.ReadFloatReply()
  1451. if err != nil {
  1452. return nil, err
  1453. }
  1454. }
  1455. if q.WithGeoHash {
  1456. loc.GeoHash, err = rd.ReadIntReply()
  1457. if err != nil {
  1458. return nil, err
  1459. }
  1460. }
  1461. if q.WithCoord {
  1462. n, err := rd.ReadArrayLen()
  1463. if err != nil {
  1464. return nil, err
  1465. }
  1466. if n != 2 {
  1467. return nil, fmt.Errorf("got %d coordinates, expected 2", n)
  1468. }
  1469. loc.Longitude, err = rd.ReadFloatReply()
  1470. if err != nil {
  1471. return nil, err
  1472. }
  1473. loc.Latitude, err = rd.ReadFloatReply()
  1474. if err != nil {
  1475. return nil, err
  1476. }
  1477. }
  1478. return &loc, nil
  1479. }
  1480. }
  1481. //------------------------------------------------------------------------------
  1482. type GeoPos struct {
  1483. Longitude, Latitude float64
  1484. }
  1485. type GeoPosCmd struct {
  1486. baseCmd
  1487. val []*GeoPos
  1488. }
  1489. var _ Cmder = (*GeoPosCmd)(nil)
  1490. func NewGeoPosCmd(args ...interface{}) *GeoPosCmd {
  1491. return &GeoPosCmd{
  1492. baseCmd: baseCmd{args: args},
  1493. }
  1494. }
  1495. func (cmd *GeoPosCmd) Val() []*GeoPos {
  1496. return cmd.val
  1497. }
  1498. func (cmd *GeoPosCmd) Result() ([]*GeoPos, error) {
  1499. return cmd.Val(), cmd.Err()
  1500. }
  1501. func (cmd *GeoPosCmd) String() string {
  1502. return cmdString(cmd, cmd.val)
  1503. }
  1504. func (cmd *GeoPosCmd) readReply(rd *proto.Reader) error {
  1505. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1506. cmd.val = make([]*GeoPos, n)
  1507. for i := 0; i < len(cmd.val); i++ {
  1508. i := i
  1509. _, err := rd.ReadReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1510. longitude, err := rd.ReadFloatReply()
  1511. if err != nil {
  1512. return nil, err
  1513. }
  1514. latitude, err := rd.ReadFloatReply()
  1515. if err != nil {
  1516. return nil, err
  1517. }
  1518. cmd.val[i] = &GeoPos{
  1519. Longitude: longitude,
  1520. Latitude: latitude,
  1521. }
  1522. return nil, nil
  1523. })
  1524. if err != nil {
  1525. if err == Nil {
  1526. cmd.val[i] = nil
  1527. continue
  1528. }
  1529. return nil, err
  1530. }
  1531. }
  1532. return nil, nil
  1533. })
  1534. return cmd.err
  1535. }
  1536. //------------------------------------------------------------------------------
  1537. type CommandInfo struct {
  1538. Name string
  1539. Arity int8
  1540. Flags []string
  1541. FirstKeyPos int8
  1542. LastKeyPos int8
  1543. StepCount int8
  1544. ReadOnly bool
  1545. }
  1546. type CommandsInfoCmd struct {
  1547. baseCmd
  1548. val map[string]*CommandInfo
  1549. }
  1550. var _ Cmder = (*CommandsInfoCmd)(nil)
  1551. func NewCommandsInfoCmd(args ...interface{}) *CommandsInfoCmd {
  1552. return &CommandsInfoCmd{
  1553. baseCmd: baseCmd{args: args},
  1554. }
  1555. }
  1556. func (cmd *CommandsInfoCmd) Val() map[string]*CommandInfo {
  1557. return cmd.val
  1558. }
  1559. func (cmd *CommandsInfoCmd) Result() (map[string]*CommandInfo, error) {
  1560. return cmd.Val(), cmd.Err()
  1561. }
  1562. func (cmd *CommandsInfoCmd) String() string {
  1563. return cmdString(cmd, cmd.val)
  1564. }
  1565. func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
  1566. _, cmd.err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1567. cmd.val = make(map[string]*CommandInfo, n)
  1568. for i := int64(0); i < n; i++ {
  1569. v, err := rd.ReadReply(commandInfoParser)
  1570. if err != nil {
  1571. return nil, err
  1572. }
  1573. vv := v.(*CommandInfo)
  1574. cmd.val[vv.Name] = vv
  1575. }
  1576. return nil, nil
  1577. })
  1578. return cmd.err
  1579. }
  1580. func commandInfoParser(rd *proto.Reader, n int64) (interface{}, error) {
  1581. if n != 6 {
  1582. return nil, fmt.Errorf("redis: got %d elements in COMMAND reply, wanted 6", n)
  1583. }
  1584. var cmd CommandInfo
  1585. var err error
  1586. cmd.Name, err = rd.ReadString()
  1587. if err != nil {
  1588. return nil, err
  1589. }
  1590. arity, err := rd.ReadIntReply()
  1591. if err != nil {
  1592. return nil, err
  1593. }
  1594. cmd.Arity = int8(arity)
  1595. _, err = rd.ReadReply(func(rd *proto.Reader, n int64) (interface{}, error) {
  1596. cmd.Flags = make([]string, n)
  1597. for i := 0; i < len(cmd.Flags); i++ {
  1598. switch s, err := rd.ReadString(); {
  1599. case err == Nil:
  1600. cmd.Flags[i] = ""
  1601. case err != nil:
  1602. return nil, err
  1603. default:
  1604. cmd.Flags[i] = s
  1605. }
  1606. }
  1607. return nil, nil
  1608. })
  1609. if err != nil {
  1610. return nil, err
  1611. }
  1612. firstKeyPos, err := rd.ReadIntReply()
  1613. if err != nil {
  1614. return nil, err
  1615. }
  1616. cmd.FirstKeyPos = int8(firstKeyPos)
  1617. lastKeyPos, err := rd.ReadIntReply()
  1618. if err != nil {
  1619. return nil, err
  1620. }
  1621. cmd.LastKeyPos = int8(lastKeyPos)
  1622. stepCount, err := rd.ReadIntReply()
  1623. if err != nil {
  1624. return nil, err
  1625. }
  1626. cmd.StepCount = int8(stepCount)
  1627. for _, flag := range cmd.Flags {
  1628. if flag == "readonly" {
  1629. cmd.ReadOnly = true
  1630. break
  1631. }
  1632. }
  1633. return &cmd, nil
  1634. }
  1635. //------------------------------------------------------------------------------
  1636. type cmdsInfoCache struct {
  1637. fn func() (map[string]*CommandInfo, error)
  1638. once internal.Once
  1639. cmds map[string]*CommandInfo
  1640. }
  1641. func newCmdsInfoCache(fn func() (map[string]*CommandInfo, error)) *cmdsInfoCache {
  1642. return &cmdsInfoCache{
  1643. fn: fn,
  1644. }
  1645. }
  1646. func (c *cmdsInfoCache) Get() (map[string]*CommandInfo, error) {
  1647. err := c.once.Do(func() error {
  1648. cmds, err := c.fn()
  1649. if err != nil {
  1650. return err
  1651. }
  1652. // Extensions have cmd names in upper case. Convert them to lower case.
  1653. for k, v := range cmds {
  1654. lower := internal.ToLower(k)
  1655. if lower != k {
  1656. cmds[lower] = v
  1657. }
  1658. }
  1659. c.cmds = cmds
  1660. return nil
  1661. })
  1662. return c.cmds, err
  1663. }