void JSONRowOutputStream::writePrefix() { writeCString("{\n", *ostr); writeCString("\t\"meta\":\n", *ostr); writeCString("\t[\n", *ostr); for (size_t i = 0; i < fields.size(); ++i) { writeCString("\t\t{\n", *ostr); writeCString("\t\t\t\"name\": ", *ostr); writeString(fields[i].name, *ostr); writeCString(",\n", *ostr); writeCString("\t\t\t\"type\": ", *ostr); writeJSONString(fields[i].type->getName(), *ostr); writeChar('\n', *ostr); writeCString("\t\t}", *ostr); if (i + 1 < fields.size()) writeChar(',', *ostr); writeChar('\n', *ostr); } writeCString("\t],\n", *ostr); writeChar('\n', *ostr); writeCString("\t\"data\":\n", *ostr); writeCString("\t[\n", *ostr); }
JSONRowOutputStream::JSONRowOutputStream(WriteBuffer & ostr_, const Block & sample_, bool write_statistics_, bool force_quoting_64bit_integers_) : dst_ostr(ostr_), write_statistics(write_statistics_), force_quoting_64bit_integers(force_quoting_64bit_integers_) { NamesAndTypesList columns(sample_.getColumnsList()); fields.assign(columns.begin(), columns.end()); bool have_non_numeric_columns = false; for (size_t i = 0; i < sample_.columns(); ++i) { if (!sample_.getByPosition(i).type->isNumeric()) have_non_numeric_columns = true; String field_name_quoted; { WriteBufferFromString out(field_name_quoted); writeJSONString(fields[i].name, out); } fields[i].name = field_name_quoted; } if (have_non_numeric_columns) { validating_ostr = std::make_unique<WriteBufferValidUTF8>(dst_ostr); ostr = validating_ostr.get(); } else ostr = &dst_ostr; }
void JSONRowOutputStream::writeTotals() { if (totals) { writeCString(",\n", *ostr); writeChar('\n', *ostr); writeCString("\t\"totals\":\n", *ostr); writeCString("\t{\n", *ostr); size_t totals_columns = totals.columns(); for (size_t i = 0; i < totals_columns; ++i) { const ColumnWithTypeAndName & column = totals.safeGetByPosition(i); if (i != 0) writeCString(",\n", *ostr); writeCString("\t\t", *ostr); writeJSONString(column.name, *ostr); writeCString(": ", *ostr); column.type->serializeTextJSON(*column.column.get(), 0, *ostr, force_quoting_64bit_integers); } writeChar('\n', *ostr); writeCString("\t}", *ostr); } }
JSONEachRowRowOutputStream::JSONEachRowRowOutputStream(WriteBuffer & ostr_, const Block & sample) : ostr(ostr_) { size_t columns = sample.columns(); fields.resize(columns); for (size_t i = 0; i < columns; ++i) { WriteBufferFromString out(fields[i]); writeJSONString(sample.unsafeGetByPosition(i).name, out); } }
JSONEachRowRowOutputStream::JSONEachRowRowOutputStream(WriteBuffer & ostr_, const Block & sample, bool force_quoting_64bit_integers_) : ostr(ostr_), force_quoting_64bit_integers(force_quoting_64bit_integers_) { size_t columns = sample.columns(); fields.resize(columns); for (size_t i = 0; i < columns; ++i) { WriteBufferFromString out(fields[i]); writeJSONString(sample.getByPosition(i).name, out); } }
void FileChecker::save() const { { WriteBufferFromFile out(tmp_files_info_path); /// Столь сложная структура JSON-а - для совместимости со старым форматом. writeCString("{\"yandex\":{", out); for (auto it = map.begin(); it != map.end(); ++it) { if (it != map.begin()) writeString(",", out); /// escapeForFileName на самом деле не нужен. Но он оставлен для совместимости со старым кодом. writeJSONString(escapeForFileName(it->first), out); writeString(":{\"size\":\"", out); writeIntText(it->second, out); writeString("\"}", out); } writeCString("}}", out); out.next(); } Poco::File current_file(files_info_path); if (current_file.exists()) { std::string old_file_name = files_info_path + ".old"; current_file.renameTo(old_file_name); Poco::File(tmp_files_info_path).renameTo(files_info_path); Poco::File(old_file_name).remove(); } else Poco::File(tmp_files_info_path).renameTo(files_info_path); }
static void writeExtremesElement(const char * title, const Block & extremes, size_t row_num, WriteBuffer & ostr, bool force_quoting_64bit_integers) { writeCString("\t\t\"", ostr); writeCString(title, ostr); writeCString("\":\n", ostr); writeCString("\t\t{\n", ostr); size_t extremes_columns = extremes.columns(); for (size_t i = 0; i < extremes_columns; ++i) { const ColumnWithTypeAndName & column = extremes.safeGetByPosition(i); if (i != 0) writeCString(",\n", ostr); writeCString("\t\t\t", ostr); writeJSONString(column.name, ostr); writeCString(": ", ostr); column.type->serializeTextJSON(*column.column.get(), row_num, ostr, force_quoting_64bit_integers); } writeChar('\n', ostr); writeCString("\t\t}", ostr); }
void DataTypeAggregateFunction::serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr) const { writeJSONString(serializeToString(function, column, row_num), ostr); }
void DataTypeEnum<Type>::serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, bool) const { writeJSONString(getNameForValue(static_cast<const ColumnType &>(column).getData()[row_num]), ostr); }
void DataTypeFixedString::serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr) const { const char * pos = reinterpret_cast<const char *>(&static_cast<const ColumnFixedString &>(column).getChars()[n * row_num]); writeJSONString(pos, pos + n, ostr); }