jsonlog_marshalling.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // This code was initially generated by ffjson <https://github.com/pquerna/ffjson>
  2. // This code was generated via the following steps:
  3. // $ go get -u github.com/pquerna/ffjson
  4. // $ make BIND_DIR=. shell
  5. // $ ffjson pkg/jsonlog/jsonlog.go
  6. // $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go
  7. //
  8. // It has been modified to improve the performance of time marshalling to JSON
  9. // and to clean it up.
  10. // Should this code need to be regenerated when the JSONLog struct is changed,
  11. // the relevant changes which have been made are:
  12. // import (
  13. // "bytes"
  14. //-
  15. // "unicode/utf8"
  16. //+
  17. //+ "github.com/docker/docker/pkg/timeutils"
  18. // )
  19. //
  20. // func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  21. //@@ -20,13 +16,13 @@ func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  22. // }
  23. // return buf.Bytes(), nil
  24. // }
  25. //+
  26. // func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  27. //- var err error
  28. //- var obj []byte
  29. //- var first bool = true
  30. //- _ = obj
  31. //- _ = err
  32. //- _ = first
  33. //+ var (
  34. //+ err error
  35. //+ timestamp string
  36. //+ first bool = true
  37. //+ )
  38. // buf.WriteString(`{`)
  39. // if len(mj.Log) != 0 {
  40. // if first == true {
  41. //@@ -52,11 +48,11 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  42. // buf.WriteString(`,`)
  43. // }
  44. // buf.WriteString(`"time":`)
  45. //- obj, err = mj.Created.MarshalJSON()
  46. //+ timestamp, err = timeutils.FastMarshalJSON(mj.Created)
  47. // if err != nil {
  48. // return err
  49. // }
  50. //- buf.Write(obj)
  51. //+ buf.WriteString(timestamp)
  52. // buf.WriteString(`}`)
  53. // return nil
  54. // }
  55. // @@ -81,9 +81,10 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  56. // if len(mj.Log) != 0 {
  57. // - if first == true {
  58. // - first = false
  59. // - } else {
  60. // - buf.WriteString(`,`)
  61. // - }
  62. // + first = false
  63. // buf.WriteString(`"log":`)
  64. // ffjsonWriteJSONString(buf, mj.Log)
  65. // }
  66. package jsonlog
  67. import (
  68. "bytes"
  69. "unicode/utf8"
  70. "github.com/docker/docker/pkg/timeutils"
  71. )
  72. // MarshalJSON marshals the JSONLog.
  73. func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  74. var buf bytes.Buffer
  75. buf.Grow(1024)
  76. if err := mj.MarshalJSONBuf(&buf); err != nil {
  77. return nil, err
  78. }
  79. return buf.Bytes(), nil
  80. }
  81. // MarshalJSONBuf marshals the JSONLog and stores the result to a bytes.Buffer.
  82. func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  83. var (
  84. err error
  85. timestamp string
  86. first = true
  87. )
  88. buf.WriteString(`{`)
  89. if len(mj.Log) != 0 {
  90. first = false
  91. buf.WriteString(`"log":`)
  92. ffjsonWriteJSONString(buf, mj.Log)
  93. }
  94. if len(mj.Stream) != 0 {
  95. if first == true {
  96. first = false
  97. } else {
  98. buf.WriteString(`,`)
  99. }
  100. buf.WriteString(`"stream":`)
  101. ffjsonWriteJSONString(buf, mj.Stream)
  102. }
  103. if first == true {
  104. first = false
  105. } else {
  106. buf.WriteString(`,`)
  107. }
  108. buf.WriteString(`"time":`)
  109. timestamp, err = timeutils.FastMarshalJSON(mj.Created)
  110. if err != nil {
  111. return err
  112. }
  113. buf.WriteString(timestamp)
  114. buf.WriteString(`}`)
  115. return nil
  116. }
  117. func ffjsonWriteJSONString(buf *bytes.Buffer, s string) {
  118. const hex = "0123456789abcdef"
  119. buf.WriteByte('"')
  120. start := 0
  121. for i := 0; i < len(s); {
  122. if b := s[i]; b < utf8.RuneSelf {
  123. if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
  124. i++
  125. continue
  126. }
  127. if start < i {
  128. buf.WriteString(s[start:i])
  129. }
  130. switch b {
  131. case '\\', '"':
  132. buf.WriteByte('\\')
  133. buf.WriteByte(b)
  134. case '\n':
  135. buf.WriteByte('\\')
  136. buf.WriteByte('n')
  137. case '\r':
  138. buf.WriteByte('\\')
  139. buf.WriteByte('r')
  140. default:
  141. buf.WriteString(`\u00`)
  142. buf.WriteByte(hex[b>>4])
  143. buf.WriteByte(hex[b&0xF])
  144. }
  145. i++
  146. start = i
  147. continue
  148. }
  149. c, size := utf8.DecodeRuneInString(s[i:])
  150. if c == utf8.RuneError && size == 1 {
  151. if start < i {
  152. buf.WriteString(s[start:i])
  153. }
  154. buf.WriteString(`\ufffd`)
  155. i += size
  156. start = i
  157. continue
  158. }
  159. if c == '\u2028' || c == '\u2029' {
  160. if start < i {
  161. buf.WriteString(s[start:i])
  162. }
  163. buf.WriteString(`\u202`)
  164. buf.WriteByte(hex[c&0xF])
  165. i += size
  166. start = i
  167. continue
  168. }
  169. i += size
  170. }
  171. if start < len(s) {
  172. buf.WriteString(s[start:])
  173. }
  174. buf.WriteByte('"')
  175. }