jsonlog_marshalling.go 3.9 KB

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