mirror of
https://github.com/ceph/ceph
synced 2024-12-24 12:24:19 +00:00
86c851e138
Signed-off-by: Sage Weil <sage@redhat.com>
128 lines
2.8 KiB
C++
128 lines
2.8 KiB
C++
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
|
|
// vim: ts=8 sw=2 smarttab
|
|
/*
|
|
* Ceph - scalable distributed file system
|
|
*
|
|
* Copyright (C) 2015 Red Hat Inc
|
|
*
|
|
* Author: John Spray <john.spray@redhat.com>
|
|
*
|
|
* This is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software
|
|
* Foundation. See file COPYING.
|
|
*
|
|
*/
|
|
|
|
|
|
#include "PyFormatter.h"
|
|
|
|
#define LARGE_SIZE 1024
|
|
|
|
|
|
void PyFormatter::open_array_section(const char *name)
|
|
{
|
|
PyObject *list = PyList_New(0);
|
|
dump_pyobject(name, list);
|
|
stack.push(cursor);
|
|
cursor = list;
|
|
}
|
|
|
|
void PyFormatter::open_object_section(const char *name)
|
|
{
|
|
PyObject *dict = PyDict_New();
|
|
dump_pyobject(name, dict);
|
|
stack.push(cursor);
|
|
cursor = dict;
|
|
}
|
|
|
|
void PyFormatter::dump_unsigned(const char *name, uint64_t u)
|
|
{
|
|
PyObject *p = PyLong_FromLongLong(u);
|
|
assert(p);
|
|
dump_pyobject(name, p);
|
|
}
|
|
|
|
void PyFormatter::dump_int(const char *name, int64_t u)
|
|
{
|
|
PyObject *p = PyLong_FromLongLong(u);
|
|
assert(p);
|
|
dump_pyobject(name, p);
|
|
}
|
|
|
|
void PyFormatter::dump_float(const char *name, double d)
|
|
{
|
|
dump_pyobject(name, PyFloat_FromDouble(d));
|
|
}
|
|
|
|
void PyFormatter::dump_string(const char *name, const std::string& s)
|
|
{
|
|
dump_pyobject(name, PyString_FromString(s.c_str()));
|
|
}
|
|
|
|
void PyFormatter::dump_bool(const char *name, bool b)
|
|
{
|
|
if (b) {
|
|
Py_INCREF(Py_True);
|
|
dump_pyobject(name, Py_True);
|
|
} else {
|
|
Py_INCREF(Py_False);
|
|
dump_pyobject(name, Py_False);
|
|
}
|
|
}
|
|
|
|
std::ostream& PyFormatter::dump_stream(const char *name)
|
|
{
|
|
// Give the caller an ostream, construct a PyString,
|
|
// and remember the association between the two. On flush,
|
|
// we'll read from the ostream into the PyString
|
|
auto ps = std::make_shared<PendingStream>();
|
|
ps->cursor = cursor;
|
|
ps->name = name;
|
|
|
|
pending_streams.push_back(ps);
|
|
|
|
return ps->stream;
|
|
}
|
|
|
|
void PyFormatter::dump_format_va(const char *name, const char *ns, bool quoted, const char *fmt, va_list ap)
|
|
{
|
|
char buf[LARGE_SIZE];
|
|
vsnprintf(buf, LARGE_SIZE, fmt, ap);
|
|
|
|
dump_pyobject(name, PyString_FromString(buf));
|
|
}
|
|
|
|
/**
|
|
* Steals reference to `p`
|
|
*/
|
|
void PyFormatter::dump_pyobject(const char *name, PyObject *p)
|
|
{
|
|
if (PyList_Check(cursor)) {
|
|
PyList_Append(cursor, p);
|
|
Py_DECREF(p);
|
|
} else if (PyDict_Check(cursor)) {
|
|
PyObject *key = PyString_FromString(name);
|
|
PyDict_SetItem(cursor, key, p);
|
|
Py_DECREF(key);
|
|
Py_DECREF(p);
|
|
} else {
|
|
ceph_abort();
|
|
}
|
|
}
|
|
|
|
void PyFormatter::finish_pending_streams()
|
|
{
|
|
for (const auto &i : pending_streams) {
|
|
PyObject *tmp_cur = cursor;
|
|
cursor = i->cursor;
|
|
dump_pyobject(
|
|
i->name.c_str(),
|
|
PyString_FromString(i->stream.str().c_str()));
|
|
cursor = tmp_cur;
|
|
}
|
|
|
|
pending_streams.clear();
|
|
}
|
|
|