bulk update failing when document has attachments?

162 views Asked by At

I am performing the following operation:

  1. Prepare some documents: docs = [ doc1, doc2, ... ]. The documents have maybe attachments
  2. I POST to _bulk_docs the list of documents
  3. I get an Exception > Problems updating list of documents (length = 1): (500, ('badarg', '58'))

My bulk_docs is (in this case just one):

[   {   '_attachments': {   'image.png': {   'content_type': 'image/png',
                                             'data': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM8AAADkCAIAAACwiOf9AAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nO...'}},
        '_id': '08b8fc66-cd90-47a1-9053-4f6fefabdfe3',
        '_rev': '15-ff3d0e8baa56e5ad2fac4937264fb3f6',
        'docmeta': {   'created': '2013-10-01 14:48:24.311257',
                       'updated': [   '2013-10-01 14:48:24.394157',
                                      '2013-12-11 08:19:47.271812',
                                      '2013-12-11 08:25:05.662546',
                                      '2013-12-11 10:38:56.116145']},
        'org_id': 45345,
        'outputs_id': None,
        'properties': {   'auto-t2s': False,
                          'content_type': 'image/png',
                          'lang': 'es',
                          'name': 'dfasdfasdf',
                          'text': 'erwerwerwrwerwr'},
        'subtype': 'voicemail-st',
        'tags': ['RRR-ccc-dtjkqx'],
        'type': 'recording'}]

This is the detailed exception:

Traceback (most recent call last):
  File "portal_support_ut.py", line 470, in test_UpdateDoc
    self.ps.UpdateDoc(self.org_id, what, doc_id, new_data)
  File "/home/gonvaled/projects/new-wavilon-portal/python_modules/wav/ps/complex_ops.py", line 349, in UpdateDoc
    success, doc = database.UpdateDoc(doc_id, new_data)
  File "/home/gonvaled/projects/new-wavilon-portal/python_modules/wav/cdb/core/updater.py", line 38, in UpdateDoc
    res = self.SaveDoc(doc_id, doc)
  File "/home/gonvaled/projects/new-wavilon-portal/python_modules/wav/cdb/core/saver.py", line 88, in SaveDoc
    else      : self.bulk_append(doc, flush, update_revision)
  File "/home/gonvaled/projects/new-wavilon-portal/python_modules/wav/cdb/core/bulker.py", line 257, in bulk_append
    if force_send or flush or not self.timer.use_timer : self.BulkSend(show_progress=True)
  File "/home/gonvaled/projects/new-wavilon-portal/python_modules/wav/cdb/core/bulker.py", line 144, in BulkSend
    results = self.UpdateDocuments(self.bulk)
  File "/home/gonvaled/projects/new-wavilon-portal/python_modules/wav/cdb/core/bulker.py", line 67, in UpdateDocuments
    results = self.db.update(bulkdocs)
  File "/home/gonvaled/.virtualenvs/python2.7.3-wavilon1/local/lib/python2.7/site-packages/couchdb/client.py", line 764, in update
    _, _, data = self.resource.post_json('_bulk_docs', body=content)
  File "/home/gonvaled/.virtualenvs/python2.7.3-wavilon1/local/lib/python2.7/site-packages/couchdb/http.py", line 527, in post_json
    **params)
  File "/home/gonvaled/.virtualenvs/python2.7.3-wavilon1/local/lib/python2.7/site-packages/couchdb/http.py", line 546, in _request_json
    headers=headers, **params)
  File "/home/gonvaled/.virtualenvs/python2.7.3-wavilon1/local/lib/python2.7/site-packages/couchdb/http.py", line 542, in _request
    credentials=self.credentials)
  File "/home/gonvaled/.virtualenvs/python2.7.3-wavilon1/local/lib/python2.7/site-packages/couchdb/http.py", line 398, in request
    raise ServerError((status, error))
ServerError: (500, ('badarg', '58'))

What does that badarg mean? Is it possible to send attachments when doing _bulk_docs?

2

There are 2 answers

0
blueFast On

The solution is to remove the data:image/png;base64, prefix before sending the attachment to coudhdb.

For a python alternative, see here.

0
Robert Newson On

This was answered in our mailing list, repeating the answer here for completeness.

The data field was malformed in two ways;

'data': 'data:image/png;base64,iVBORw0KGgoAA....'

The 'data:image/png;base64,' prefix is wrong, and the base64 part was malformed (CouchDB obviously needs to decode it to store it).