python: return dictionary without value in case of no blockjob

Currently, when there is no blockjob, dom.blockJobInfo('vda')
still reports error because it doesn't distinguish return value 0 from -1.
libvirt.libvirtError: virDomainGetBlockJobInfo() failed

virDomainGetBlockJobInfo() API return value:
 -1 in case of failure, 0 when nothing found, 1 found.

And use PyDict_SetItemString instead of PyDict_SetItem when key is
of string type. PyDict_SetItemString increments key/value reference
count, so call Py_DECREF() for value. For key, we don't need to
do this, because PyDict_SetItemString will handle it internally.
This commit is contained in:
Guannan Ren 2013-05-17 14:30:10 +08:00
parent 47a01895fb
commit 0f9e67bfad

View File

@ -4534,33 +4534,57 @@ libvirt_virDomainGetBlockJobInfo(PyObject *self ATTRIBUTE_UNUSED,
unsigned int flags;
virDomainBlockJobInfo info;
int c_ret;
PyObject *ret;
PyObject *type = NULL, *bandwidth = NULL, *cur = NULL, *end = NULL;
PyObject *dict;
if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetBlockJobInfo",
&pyobj_domain, &path, &flags))
return NULL;
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
LIBVIRT_BEGIN_ALLOW_THREADS;
if ((dict = PyDict_New()) == NULL)
return NULL;
LIBVIRT_BEGIN_ALLOW_THREADS;
c_ret = virDomainGetBlockJobInfo(domain, path, &info, flags);
LIBVIRT_END_ALLOW_THREADS;
LIBVIRT_END_ALLOW_THREADS;
if (c_ret != 1)
if (c_ret == 0) {
return dict;
} else if (c_ret < 0) {
Py_DECREF(dict);
return VIR_PY_NONE;
}
if ((ret = PyDict_New()) == NULL)
return VIR_PY_NONE;
if ((type = libvirt_intWrap(info.type)) == NULL ||
PyDict_SetItemString(dict, "type", type) < 0)
goto error;
Py_DECREF(type);
PyDict_SetItem(ret, libvirt_constcharPtrWrap("type"),
libvirt_intWrap(info.type));
PyDict_SetItem(ret, libvirt_constcharPtrWrap("bandwidth"),
libvirt_ulongWrap(info.bandwidth));
PyDict_SetItem(ret, libvirt_constcharPtrWrap("cur"),
libvirt_ulonglongWrap(info.cur));
PyDict_SetItem(ret, libvirt_constcharPtrWrap("end"),
libvirt_ulonglongWrap(info.end));
if ((bandwidth = libvirt_ulongWrap(info.bandwidth)) == NULL ||
PyDict_SetItemString(dict, "bandwidth", bandwidth) < 0)
goto error;
Py_DECREF(bandwidth);
return ret;
if ((cur = libvirt_ulonglongWrap(info.cur)) == NULL ||
PyDict_SetItemString(dict, "cur", cur) < 0)
goto error;
Py_DECREF(cur);
if ((end = libvirt_ulonglongWrap(info.end)) == NULL ||
PyDict_SetItemString(dict, "end", end) < 0)
goto error;
Py_DECREF(end);
return dict;
error:
Py_DECREF(dict);
Py_XDECREF(type);
Py_XDECREF(bandwidth);
Py_XDECREF(cur);
Py_XDECREF(end);
return NULL;
}
static PyObject *