jsonlog_marshalling.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. // ffjson_WriteJsonString(buf, mj.Log)
  65. // }
  66. package jsonlog
  67. import (
  68. "bytes"
  69. "unicode/utf8"
  70. "github.com/docker/docker/pkg/timeutils"
  71. )
  72. func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  73. var buf bytes.Buffer
  74. buf.Grow(1024)
  75. if err := mj.MarshalJSONBuf(&buf); err != nil {
  76. return nil, err
  77. }
  78. return buf.Bytes(), nil
  79. }
  80. func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  81. var (
  82. err error
  83. timestamp string
  84. first bool = true
  85. )
  86. buf.WriteString(`{`)
  87. if len(mj.Log) != 0 {
  88. first = false
  89. buf.WriteString(`"log":`)
  90. ffjson_WriteJsonString(buf, mj.Log)
  91. }
  92. if len(mj.Stream) != 0 {
  93. if first == true {
  94. first = false
  95. } else {
  96. buf.WriteString(`,`)
  97. }
  98. buf.WriteString(`"stream":`)
  99. ffjson_WriteJsonString(buf, mj.Stream)
  100. }
  101. if first == true {
  102. first = false
  103. } else {
  104. buf.WriteString(`,`)
  105. }
  106. buf.WriteString(`"time":`)
  107. timestamp, err = timeutils.FastMarshalJSON(mj.Created)
  108. if err != nil {
  109. return err
  110. }
  111. buf.WriteString(timestamp)
  112. buf.WriteString(`}`)
  113. return nil
  114. }
  115. func ffjson_WriteJsonString(buf *bytes.Buffer, s string) {
  116. const hex = "0123456789abcdef"
  117. buf.WriteByte('"')
  118. start := 0
  119. for i := 0; i < len(s); {
  120. if b := s[i]; b < utf8.RuneSelf {
  121. if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
  122. i++
  123. continue
  124. }
  125. if start < i {
  126. buf.WriteString(s[start:i])
  127. }
  128. switch b {
  129. case '\\', '"':
  130. buf.WriteByte('\\')
  131. buf.WriteByte(b)
  132. case '\n':
  133. buf.WriteByte('\\')
  134. buf.WriteByte('n')
  135. case '\r':
  136. buf.WriteByte('\\')
  137. buf.WriteByte('r')
  138. default:
  139. buf.WriteString(`\u00`)
  140. buf.WriteByte(hex[b>>4])
  141. buf.WriteByte(hex[b&0xF])
  142. }
  143. i++
  144. start = i
  145. continue
  146. }
  147. c, size := utf8.DecodeRuneInString(s[i:])
  148. if c == utf8.RuneError && size == 1 {
  149. if start < i {
  150. buf.WriteString(s[start:i])
  151. }
  152. buf.WriteString(`\ufffd`)
  153. i += size
  154. start = i
  155. continue
  156. }
  157. if c == '\u2028' || c == '\u2029' {
  158. if start < i {
  159. buf.WriteString(s[start:i])
  160. }
  161. buf.WriteString(`\u202`)
  162. buf.WriteByte(hex[c&0xF])
  163. i += size
  164. start = i
  165. continue
  166. }
  167. i += size
  168. }
  169. if start < len(s) {
  170. buf.WriteString(s[start:])
  171. }
  172. buf.WriteByte('"')
  173. }