summaryrefslogtreecommitdiff
path: root/src/c
diff options
context:
space:
mode:
authorKevin Greenan <kmgreen2@gmail.com>2015-02-03 21:46:19 -0800
committerKevin Greenan <kmgreen2@gmail.com>2015-02-03 21:46:19 -0800
commit3b36b99799d4d7bb7e43490dacf4a57b0528730b (patch)
tree38327d250394cfd1e23c60bccefe43409e9cb5b6 /src/c
parenteeaed85c34809eff697ac0f393adff36d1b186ef (diff)
downloadpyeclib-3b36b99799d4d7bb7e43490dacf4a57b0528730b.tar.gz
Changed the API for check_metadata to return more structured success and error
information.
Diffstat (limited to 'src/c')
-rw-r--r--src/c/pyeclib_c/pyeclib_c.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/c/pyeclib_c/pyeclib_c.c b/src/c/pyeclib_c/pyeclib_c.c
index 06490ba..e0f6cc6 100644
--- a/src/c/pyeclib_c/pyeclib_c.c
+++ b/src/c/pyeclib_c/pyeclib_c.c
@@ -907,8 +907,9 @@ pyeclib_c_get_metadata(PyObject *self, PyObject *args)
*
* @param pyeclib_obj_handle
* @param fragment_metadata_list list of fragment metadata headers
- * @return -1 if there were no errors, or the index of the first problem checksum
- * NULL if the metadata could not be checked (e.g. invalid parameters)
+ * @return dictionary containing 'status', 'reason' and 'bad_fragments', depending
+ * on the status
+ * NULL if the metadata could not be checked by the liberasurecode
*/
static PyObject*
pyeclib_c_check_metadata(PyObject *self, PyObject *args)
@@ -925,6 +926,7 @@ pyeclib_c_check_metadata(PyObject *self, PyObject *args)
PyObject *ret_obj = NULL; /* python long to return */
int i = 0; /* a counter */
+
/* Obtain and validate the method parameters */
if (!PyArg_ParseTuple(args, "OO", &pyeclib_obj_handle, &fragment_metadata_list)) {
PyErr_SetString(PyECLibError, "Invalid arguments passed to pyeclib.encode");
@@ -960,22 +962,26 @@ pyeclib_c_check_metadata(PyObject *self, PyObject *args)
ret = liberasurecode_verify_stripe_metadata(pyeclib_handle->ec_desc, c_fragment_metadata_list,
num_fragments);
+ ret_obj = PyDict_New();
if (ret == 0) {
- ret = -1;
+ PyDict_SetItemString(ret_obj, "status", PyLong_FromLong((long)0));
} else if (ret == -EINVALIDPARAMS) {
+ PyDict_SetItemString(ret_obj, "status", PyLong_FromLong((long)-EINVALIDPARAMS));
+ PyDict_SetItemString(ret_obj, "reason", PyString_FromString("Invalid parameters"));
goto error;
} else if (ret == -EBADCHKSUM) {
+ PyDict_SetItemString(ret_obj, "status", PyLong_FromLong((long)-EINVALIDPARAMS));
+ PyDict_SetItemString(ret_obj, "reason", PyString_FromString("Bad checksum"));
+ PyObject *bad_chksums = PyList_New(0);
for (i = 0; i < num_fragments; i++) {
c_fragment_metadata = (fragment_metadata_t*)c_fragment_metadata_list[i];
if (c_fragment_metadata->chksum_mismatch == 1) {
- ret = c_fragment_metadata->idx;
- break;
+ PyList_Append(bad_chksums, PyLong_FromLong((long)c_fragment_metadata->idx));
}
}
+ PyDict_SetItemString(ret_obj, "bad_fragments", bad_chksums);
}
- ret_obj = PyLong_FromLong((long)ret);
-
goto exit;
error: