1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #ifndef CEPH_FORMATTER_H
4 #define CEPH_FORMATTER_H
6 #include "include/int_types.h"
7 #include "include/buffer_fwd.h"
18 struct FormatterAttrs
{
19 std::list
< std::pair
<std::string
, std::string
> > attrs
;
21 FormatterAttrs(const char *attr
, ...);
26 static Formatter
*create(const std::string
& type
,
27 const std::string
& default_type
,
28 const std::string
& fallback
);
29 static Formatter
*create(const std::string
& type
,
30 const std::string
& default_type
) {
31 return create(type
, default_type
, "");
33 static Formatter
*create(const std::string
& type
) {
34 return create(type
, "json-pretty", "");
40 virtual void flush(std::ostream
& os
) = 0;
41 void flush(bufferlist
&bl
);
42 virtual void reset() = 0;
44 virtual void set_status(int status
, const char* status_name
) = 0;
45 virtual void output_header() = 0;
46 virtual void output_footer() = 0;
48 virtual void open_array_section(const char *name
) = 0;
49 virtual void open_array_section_in_ns(const char *name
, const char *ns
) = 0;
50 virtual void open_object_section(const char *name
) = 0;
51 virtual void open_object_section_in_ns(const char *name
, const char *ns
) = 0;
52 virtual void close_section() = 0;
53 virtual void dump_unsigned(const char *name
, uint64_t u
) = 0;
54 virtual void dump_int(const char *name
, int64_t s
) = 0;
55 virtual void dump_float(const char *name
, double d
) = 0;
56 virtual void dump_string(const char *name
, const std::string
& s
) = 0;
57 virtual void dump_bool(const char *name
, bool b
)
59 dump_format_unquoted(name
, "%s", (b
? "true" : "false"));
62 void dump_object(const char *name
, const T
& foo
) {
63 open_object_section(name
);
67 virtual std::ostream
& dump_stream(const char *name
) = 0;
68 virtual void dump_format_va(const char *name
, const char *ns
, bool quoted
, const char *fmt
, va_list ap
) = 0;
69 virtual void dump_format(const char *name
, const char *fmt
, ...);
70 virtual void dump_format_ns(const char *name
, const char *ns
, const char *fmt
, ...);
71 virtual void dump_format_unquoted(const char *name
, const char *fmt
, ...);
72 virtual int get_len() const = 0;
73 virtual void write_raw_data(const char *data
) = 0;
75 virtual void open_array_section_with_attrs(const char *name
, const FormatterAttrs
& attrs
)
77 open_array_section(name
);
79 virtual void open_object_section_with_attrs(const char *name
, const FormatterAttrs
& attrs
)
81 open_object_section(name
);
83 virtual void dump_string_with_attrs(const char *name
, const std::string
& s
, const FormatterAttrs
& attrs
)
89 class JSONFormatter
: public Formatter
{
91 explicit JSONFormatter(bool p
= false);
93 void set_status(int status
, const char* status_name
) override
{};
94 void output_header() override
{};
95 void output_footer() override
{};
96 void flush(std::ostream
& os
) override
;
97 using Formatter::flush
; // don't hide Formatter::flush(bufferlist &bl)
98 void reset() override
;
99 void open_array_section(const char *name
) override
;
100 void open_array_section_in_ns(const char *name
, const char *ns
) override
;
101 void open_object_section(const char *name
) override
;
102 void open_object_section_in_ns(const char *name
, const char *ns
) override
;
103 void close_section() override
;
104 void dump_unsigned(const char *name
, uint64_t u
) override
;
105 void dump_int(const char *name
, int64_t u
) override
;
106 void dump_float(const char *name
, double d
) override
;
107 void dump_string(const char *name
, const std::string
& s
) override
;
108 std::ostream
& dump_stream(const char *name
) override
;
109 void dump_format_va(const char *name
, const char *ns
, bool quoted
, const char *fmt
, va_list ap
) override
;
110 int get_len() const override
;
111 void write_raw_data(const char *data
) override
;
115 struct json_formatter_stack_entry_d
{
118 json_formatter_stack_entry_d() : size(0), is_array(false) { }
122 void open_section(const char *name
, bool is_array
);
123 void print_quoted_string(const std::string
& s
);
124 void print_name(const char *name
);
125 void print_comma(json_formatter_stack_entry_d
& entry
);
126 void finish_pending_string();
128 std::stringstream m_ss
, m_pending_string
;
129 std::list
<json_formatter_stack_entry_d
> m_stack
;
130 bool m_is_pending_string
;
133 class XMLFormatter
: public Formatter
{
135 static const char *XML_1_DTD
;
136 XMLFormatter(bool pretty
= false, bool lowercased
= false, bool underscored
= true);
138 void set_status(int status
, const char* status_name
) override
{}
139 void output_header() override
;
140 void output_footer() override
;
142 void flush(std::ostream
& os
) override
;
143 using Formatter::flush
; // don't hide Formatter::flush(bufferlist &bl)
144 void reset() override
;
145 void open_array_section(const char *name
) override
;
146 void open_array_section_in_ns(const char *name
, const char *ns
) override
;
147 void open_object_section(const char *name
) override
;
148 void open_object_section_in_ns(const char *name
, const char *ns
) override
;
149 void close_section() override
;
150 void dump_unsigned(const char *name
, uint64_t u
) override
;
151 void dump_int(const char *name
, int64_t u
) override
;
152 void dump_float(const char *name
, double d
) override
;
153 void dump_string(const char *name
, const std::string
& s
) override
;
154 std::ostream
& dump_stream(const char *name
) override
;
155 void dump_format_va(const char *name
, const char *ns
, bool quoted
, const char *fmt
, va_list ap
) override
;
156 int get_len() const override
;
157 void write_raw_data(const char *data
) override
;
160 void open_array_section_with_attrs(const char *name
, const FormatterAttrs
& attrs
) override
;
161 void open_object_section_with_attrs(const char *name
, const FormatterAttrs
& attrs
) override
;
162 void dump_string_with_attrs(const char *name
, const std::string
& s
, const FormatterAttrs
& attrs
) override
;
165 void open_section_in_ns(const char *name
, const char *ns
, const FormatterAttrs
*attrs
);
166 void finish_pending_string();
168 static std::string
escape_xml_str(const char *str
);
169 void get_attrs_str(const FormatterAttrs
*attrs
, std::string
& attrs_str
);
170 char to_lower_underscore(char c
) const;
172 std::stringstream m_ss
, m_pending_string
;
173 std::deque
<std::string
> m_sections
;
175 const bool m_lowercased
;
176 const bool m_underscored
;
177 std::string m_pending_string_name
;
181 class TableFormatter
: public Formatter
{
183 explicit TableFormatter(bool keyval
= false);
185 void set_status(int status
, const char* status_name
) override
{};
186 void output_header() override
{};
187 void output_footer() override
{};
188 void flush(std::ostream
& os
) override
;
189 using Formatter::flush
; // don't hide Formatter::flush(bufferlist &bl)
190 void reset() override
;
191 void open_array_section(const char *name
) override
;
192 void open_array_section_in_ns(const char *name
, const char *ns
) override
;
193 void open_object_section(const char *name
) override
;
194 void open_object_section_in_ns(const char *name
, const char *ns
) override
;
196 void open_array_section_with_attrs(const char *name
, const FormatterAttrs
& attrs
) override
;
197 void open_object_section_with_attrs(const char *name
, const FormatterAttrs
& attrs
) override
;
199 void close_section() override
;
200 void dump_unsigned(const char *name
, uint64_t u
) override
;
201 void dump_int(const char *name
, int64_t u
) override
;
202 void dump_float(const char *name
, double d
) override
;
203 void dump_string(const char *name
, const std::string
& s
) override
;
204 void dump_format_va(const char *name
, const char *ns
, bool quoted
, const char *fmt
, va_list ap
) override
;
205 void dump_string_with_attrs(const char *name
, const std::string
& s
, const FormatterAttrs
& attrs
) override
;
206 std::ostream
& dump_stream(const char *name
) override
;
208 int get_len() const override
;
209 void write_raw_data(const char *data
) override
;
210 void get_attrs_str(const FormatterAttrs
*attrs
, std::string
& attrs_str
);
213 void open_section_in_ns(const char *name
, const char *ns
, const FormatterAttrs
*attrs
);
214 std::vector
< std::vector
<std::pair
<std::string
, std::string
> > > m_vec
;
215 std::stringstream m_ss
;
216 size_t m_vec_index(const char* name
);
217 std::string
get_section_name(const char* name
);
218 void finish_pending_string();
219 std::string m_pending_name
;
223 std::vector
< std::string
> m_section
;
224 std::map
<std::string
, int> m_section_cnt
;
225 std::vector
<size_t> m_column_size
;
226 std::vector
< std::string
> m_column_name
;