2013-06-14 3 views
1

저는 couchbase에 C 구조체를 저장하고 있습니다. 그래서이 구조체를 나중에 읽고 다시 처리 할 수 ​​있도록하고 있습니다. 1 단계를 피하고 있습니다.) C 구조 -> JSON 저장할 때 및 2) 검색하는 동안 JSON -> C 구조체.Couchbase REST API는 NON-JSON 데이터 (바이너리 데이터)를 지원합니까?

이것은 lcb_get() 및 lcb_set()을 사용할 때 잘 작동합니다. 하지만 REST 모델 및 lcb_make_http_request() 호출을 사용하여 뷰에 조회를 수행하기위한 요구 사항이 필요합니다.

그래서 어떻게 lcb_make_http_request()가 16 진수 데이터이며 null 사이에있을 수 있습니다 내 비 JSON C 구조를 처리합니다 궁금 해서요. lcb_make_http_request()를 호출 한 후 HTTP 응답으로 얻은 데이터로 C 구조체를 추출하여 채울 수 있습니까?

+0

Couchbase가 문서에 JSON 또는 바이너리 데이터를 저장할 수 있으므로 데이터를 올바르게 전달하면 제대로 작동합니다. 비록 문서의 방법으로는별로 보이지는 않지만. Base64 인코딩이 효과적 일 것입니다. – WiredPrairie

답변

3

WiredPrairie said in his comment으로하면 JSON을 사용하지 않아도되고 C 구조체를 저장할 수 있지만 이렇게하면 byte orderfield alignment을 기억하십시오.

서버에서 데이터가 JSON 형식이 아님을 감지하면 base64를 사용하여 인코딩하고 meta.type"json"으로 설정하여 문서 기능을 제공합니다.

HTTP 스트림에서 값을 가져 오려면 값으로 전체 문서를 내보낼 수 있습니다. 이 간단한지도 기능의 경우 :

function (doc, meta) { 
    if (meta.type == "base64") { 
    emit(meta.id); 
    } 
} 

이 같은 응답 (나는 명확성을 위해 그것을 포맷 한)를 얻을 것이다 :

{ 
    "total_rows": 1, 
    "rows": [ 
     { 
      "id": "foo", 
      "key": "foo", 
      "value": "4KwuAgAAAAA=" 
     } 
    ] 
} 
그것은 당신이 몇 가지 JSON 파서를 사용해야한다는 것을 의미합니까

결과에서 "value" 속성을 추출하고 디코드하면 정확하게 동일한 바이트 스트림을 얻게되고 SET 명령으로 전송하게됩니다.

+0

또한 이진 데이터를 분석하기위한 예제 맵 함수가있는 작은 blogpost를 작성했습니다. http://avsej.net/2013/analyzing-binary-data-in-couchbase/ – avsej

관련 문제