jsonlog_marshalling.go 3.9 KB

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