client.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. // Copyright 2013-2014 Fuzamei tech Ltd. All rights reserved.
  2. package client
  3. // 本文件为简化客户端的实现, 对Server服务调用进行封装
  4. import (
  5. "bytes"
  6. "encoding/binary"
  7. "errors"
  8. "io"
  9. "log"
  10. )
  11. var ErrNoFile = errors.New("no file")
  12. type decoder interface {
  13. Decode(v interface{}) error
  14. }
  15. type encoder interface {
  16. Encode(v interface{}) error
  17. }
  18. type DlInfo struct {
  19. Fname string
  20. Reply *HistoryReply
  21. }
  22. func unzip(b []byte) ([]Candle, error) {
  23. r := bytes.NewBuffer(b)
  24. return UnzipC(r)
  25. }
  26. func unzipTicks(b []byte) ([]Tick, error) {
  27. r := bytes.NewBuffer(b)
  28. return UnzipT(r)
  29. }
  30. type HistoryResponse struct {
  31. clientsimple *ClientSimple
  32. timelist []string
  33. insId string
  34. period int
  35. n int
  36. ts int64
  37. db bool
  38. buf *bytes.Buffer
  39. fileIndex int
  40. readN int
  41. }
  42. func (hresp *HistoryResponse) Read(p []byte) (n int, err error) {
  43. n, err = hresp.buf.Read(p)
  44. if err == io.EOF {
  45. if (hresp.n < 0 && hresp.readN >= (-hresp.n)) ||
  46. (hresp.n > 0 && hresp.readN >= hresp.n) {
  47. return n, err //数据读完结束.,
  48. }
  49. fname, err := hresp.nextFile()
  50. if err == ErrNoFile {
  51. return 0, io.EOF
  52. }
  53. if err != nil {
  54. return 0, err
  55. }
  56. //log.Println("debug", fname, err)
  57. if hresp.period == TK {
  58. ticks, err := ReadTickFile(fname)
  59. if err != nil {
  60. return 0, err
  61. }
  62. if len(ticks) > 0 {
  63. if hresp.n < 0 && ticks[0].Timestamp > hresp.ts {
  64. return 0, nil //没有符合要求的数据,跳过这个文件
  65. }
  66. if hresp.n > 0 && ticks[len(ticks)-1].Timestamp < hresp.ts {
  67. return 0, nil //没有符合要求的数据,跳过这个文件
  68. }
  69. }
  70. if hresp.n > 0 {
  71. for _, tick := range ticks {
  72. if tick.Timestamp >= hresp.ts {
  73. if hresp.readN >= hresp.n {
  74. break
  75. }
  76. binary.Write(hresp.buf, binary.LittleEndian, &tick)
  77. hresp.readN++
  78. }
  79. }
  80. }
  81. if hresp.n < 0 {
  82. for j := len(ticks) - 1; j >= 0; j-- {
  83. if ticks[j].Timestamp <= hresp.ts {
  84. if hresp.readN >= (-hresp.n) {
  85. break
  86. }
  87. binary.Write(hresp.buf, binary.LittleEndian, &ticks[j])
  88. hresp.readN++
  89. }
  90. }
  91. }
  92. } else {
  93. candles, err := ReadCandleFile(fname)
  94. if err != nil {
  95. return 0, err
  96. }
  97. if len(candles) > 0 {
  98. if hresp.n < 0 && candles[0].Timestamp > hresp.ts {
  99. log.Println("debug no data", fname)
  100. return 0, nil //没有符合要求的数据,跳过这个文件
  101. }
  102. if hresp.n > 0 && candles[len(candles)-1].Timestamp < hresp.ts {
  103. log.Println("debug no data", fname)
  104. return 0, nil //没有符合要求的数据,跳过这个文件
  105. }
  106. }
  107. if hresp.n > 0 {
  108. for _, candle := range candles {
  109. if candle.Timestamp >= hresp.ts {
  110. if hresp.readN >= hresp.n {
  111. break
  112. }
  113. binary.Write(hresp.buf, binary.LittleEndian, &candle)
  114. hresp.readN++
  115. }
  116. }
  117. }
  118. if hresp.n < 0 {
  119. for j := len(candles) - 1; j >= 0; j-- {
  120. if candles[j].Timestamp <= hresp.ts {
  121. if hresp.readN >= (-hresp.n) {
  122. break
  123. }
  124. binary.Write(hresp.buf, binary.LittleEndian, &candles[j])
  125. hresp.readN++
  126. }
  127. }
  128. }
  129. }
  130. return hresp.buf.Read(p)
  131. }
  132. return n, err
  133. }
  134. func (hresp *HistoryResponse) nextFile() (string, error) {
  135. if hresp.n == 0 {
  136. return "", ErrNoFile
  137. }
  138. if hresp.n < 0 {
  139. for i := hresp.fileIndex; i >= 0; i-- {
  140. var fname string
  141. var err error
  142. fname, err = hresp.clientsimple.downloadOne(hresp.insId, hresp.timelist[i], hresp.period)
  143. if err == nil {
  144. hresp.fileIndex = i - 1
  145. return fname, nil
  146. } else {
  147. return "", err
  148. }
  149. }
  150. }
  151. if hresp.n > 0 {
  152. for i := hresp.fileIndex; i < len(hresp.timelist); i++ {
  153. var fname string
  154. var err error
  155. fname, err = hresp.clientsimple.downloadOne(hresp.insId, hresp.timelist[i], hresp.period)
  156. if err == nil {
  157. hresp.fileIndex = i + 1
  158. return fname, nil
  159. } else {
  160. return "", err
  161. }
  162. }
  163. }
  164. return "", ErrNoFile
  165. }
  166. func (hresp *HistoryResponse) Close() error {
  167. return nil
  168. }
  169. type HistoryResponseEx struct {
  170. clientsimple *ClientSimple
  171. timelist []string
  172. insId string
  173. period int
  174. st int64
  175. et int64
  176. db bool
  177. fileIndex int
  178. readTime int64
  179. buf *bytes.Buffer
  180. }
  181. func (hresp *HistoryResponseEx) Read(p []byte) (n int, err error) {
  182. n, err = hresp.buf.Read(p)
  183. if err == io.EOF {
  184. if hresp.readTime >= hresp.et {
  185. return n, err //数据读完结束.,
  186. }
  187. fname, err := hresp.nextFile()
  188. if err == ErrNoFile {
  189. return 0, io.EOF
  190. }
  191. if err != nil {
  192. log.Println("debug", err)
  193. return 0, err
  194. }
  195. log.Println("debug", fname)
  196. if hresp.period == TK {
  197. ticks, err := ReadTickFile(fname)
  198. if err != nil {
  199. return 0, err
  200. }
  201. if len(ticks) > 0 {
  202. if ticks[len(ticks)-1].Timestamp < hresp.st {
  203. return 0, nil //没有符合要求的数据,跳过这个文件
  204. }
  205. }
  206. for _, tick := range ticks {
  207. if tick.Timestamp >= hresp.st {
  208. if tick.Timestamp <= hresp.et {
  209. binary.Write(hresp.buf, binary.LittleEndian, &tick)
  210. hresp.readTime = tick.Timestamp
  211. } else {
  212. break
  213. }
  214. }
  215. }
  216. } else {
  217. candles, err := ReadCandleFile(fname)
  218. if err != nil {
  219. return 0, err
  220. }
  221. if len(candles) > 0 {
  222. if candles[len(candles)-1].Timestamp < hresp.st {
  223. log.Println("debug no data", fname)
  224. return 0, nil //没有符合要求的数据,跳过这个文件
  225. }
  226. }
  227. for _, candle := range candles {
  228. if candle.Timestamp >= hresp.st {
  229. if candle.Timestamp <= hresp.et {
  230. binary.Write(hresp.buf, binary.LittleEndian, &candle)
  231. hresp.readTime = candle.Timestamp
  232. } else {
  233. break
  234. }
  235. }
  236. }
  237. }
  238. return hresp.buf.Read(p)
  239. }
  240. return n, err
  241. }
  242. func (hresp *HistoryResponseEx) nextFile() (string, error) {
  243. for i := hresp.fileIndex; i < len(hresp.timelist); i++ {
  244. var fname string
  245. var err error
  246. fname, err = hresp.clientsimple.downloadOne(hresp.insId, hresp.timelist[i], hresp.period)
  247. if err == nil {
  248. hresp.fileIndex = i + 1
  249. return fname, nil
  250. } else {
  251. return "", err
  252. }
  253. }
  254. return "", ErrNoFile
  255. }
  256. func (hresp *HistoryResponseEx) Close() error {
  257. return nil
  258. }