Ejemplo n.º 1
0
static PyObject *
cbson_as_json (PyObject *self,
               PyObject *args)
{
   const bson_uint8_t *buffer;
   bson_uint32_t buffer_length;
   bson_reader_t reader;
   const bson_t *b;
   PyObject *ret = NULL;
   size_t len = 0;
   char *str;

   if (!PyArg_ParseTuple(args, "s#", &buffer, &buffer_length)) {
      return NULL;
   }

   bson_reader_init_from_data(&reader, buffer, buffer_length);
   b = bson_reader_read(&reader, NULL);
   bson_reader_destroy(&reader);

   if (b) {
      str = bson_as_json(b, &len);
      ret = PyUnicode_DecodeUTF8(str, len, "strict");
      bson_free(str);
   } else {
      PyErr_SetString(PyExc_ValueError, "Failed to parse BSON document.");
   }

   return ret;
}
Ejemplo n.º 2
0
static PyObject *
cbson_loads (PyObject *self,
             PyObject *args)
{
   const bson_uint8_t *buffer;
   bson_uint32_t buffer_length;
   bson_reader_t reader;
   bson_iter_t iter;
   const bson_t *b;
   bson_bool_t eof = FALSE;
   PyObject *ret = NULL;
   PyObject *dict;

   if (!PyArg_ParseTuple(args, "s#", &buffer, &buffer_length)) {
      return NULL;
   }

   ret = PyList_New(0);

   bson_reader_init_from_data(&reader, buffer, buffer_length);

   if (!(b = bson_reader_read(&reader, &eof))) {
      PyErr_SetString(PyExc_ValueError, "Failed to parse buffer.");
      goto failure;
   }

   do {
      if (!bson_iter_init(&iter, b)) {
         bson_reader_destroy(&reader);
         goto failure;
      }
      dict = PyDict_New();
      bson_iter_visit_all(&iter, &gLoadsVisitors, &dict);
      if (dict) {
         PyList_Append(ret, dict);
         Py_DECREF(dict);
      }
   } while ((b = bson_reader_read(&reader, &eof)));

   bson_reader_destroy(&reader);

   if (!eof) {
      PyErr_SetString(PyExc_ValueError, "Buffer contained invalid BSON.");
      goto failure;
   }

   return ret;

failure:
   Py_XDECREF(ret);
   return NULL;
}
Ejemplo n.º 3
0
static void
test_reader_from_data_overflow (void)
{
   bson_reader_t reader;
   bson_uint8_t *buffer;
   const bson_t *b;
   bson_uint32_t i;
   bson_bool_t eof = FALSE;

   buffer = bson_malloc0(4096);
   for (i = 0; i < 4095; i += 5) {
      buffer[i] = 5;
   }

   buffer[4095] = 5;

   bson_reader_init_from_data(&reader, buffer, 4096);

   for (i = 0; (b = bson_reader_read(&reader, &eof)); i++) {
      const bson_uint8_t *buf = bson_get_data(b);
      assert(b->len == 5);
      assert(buf[0] == 5);
      assert(buf[1] == 0);
      assert(buf[2] == 0);
      assert(buf[3] == 0);
      assert(buf[4] == 0);
      eof = FALSE;
   }

   assert(i == (4095/5));

   assert_cmpint(eof, ==, FALSE);

   bson_free(buffer);

   bson_reader_destroy(&reader);
}