{"id":1790,"date":"2014-12-16T18:21:16","date_gmt":"2014-12-16T18:21:15","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1790"},"modified":"2023-06-28T01:17:48","modified_gmt":"2023-06-28T08:17:48","slug":"so-how-do-i-use-libcouchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/so-how-do-i-use-libcouchbase\/","title":{"rendered":"Ent\u00e3o, como fa\u00e7o para usar essa libcouchbase?"},"content":{"rendered":"<p>Alguns de voc\u00eas devem ter notado que lan\u00e7amos o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/download\/\">Couchbase 1.8 hoje cedo<\/a>e um novo conjunto de clientes inteligentes para v\u00e1rios idiomas. Para mim, pessoalmente, isso \u00e9 um marco, porque <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/develop\/c\/current\/\">libcouchbase<\/a> agora \u00e9 um cliente compat\u00edvel com a linguagem C.<\/p>\n<p>Ent\u00e3o, por que me preocupo com isso? Bem, a libcouchbase come\u00e7ou a partir de minha necessidade de testar facilmente v\u00e1rios componentes do servidor. Como fiz a maior parte do meu desenvolvimento nos componentes do servidor implementados em C, fazia sentido usar C para meus testes.<\/p>\n<p>Recebi algumas perguntas sobre como a libcouchbase funciona em um contexto multithread, portanto, devo come\u00e7ar esclarecendo o seguinte: a libcouchbase n\u00e3o usa <b>qualquer<\/b> O libcouchbase \u00e9 uma forma de bloqueio para proteger suas estruturas de dados internas, mas isso n\u00e3o significa que voc\u00ea n\u00e3o possa usar o libcouchbase em um programa multithread. Tudo o que isso significa \u00e9 que voc\u00ea, como usu\u00e1rio cliente, deve usar o bloqueio para se proteger do acesso \u00e0 inst\u00e2ncia do libcouchbase de v\u00e1rios threads ao mesmo tempo, ou simplesmente deixar que cada thread opere em sua pr\u00f3pria inst\u00e2ncia do libcouchbase. Uma maneira f\u00e1cil de resolver isso \u00e9 ter um \"pool\" de inst\u00e2ncias do libcouchbase para o qual cada thread pop e push sua inst\u00e2ncia sempre que precisar acessar um servidor Couchbase. O acesso a esse pool deve ser protegido com um bloqueio (mas acho que voc\u00ea j\u00e1 descobriu isso ;-)<\/p>\n<p>Nesta postagem do blog, criarei um programa de demonstra\u00e7\u00e3o que voc\u00ea pode usar para fazer upload de documentos JSON em um servidor Couchbase. Voc\u00ea encontrar\u00e1 o c\u00f3digo-fonte completo dispon\u00edvel em <a href=\"https:\/\/github.com\/trondn\/vacuum\">https:\/\/github.com\/trondn\/vacuum<\/a> se voc\u00ea quiser experimentar o exemplo.<\/p>\n<p>A ideia desse programa \u00e9 \"monitorar\" um diret\u00f3rio e fazer upload de todos os arquivos que aparecem nele para um cluster do Couchbase. Tenho certeza de que a maioria de voc\u00eas come\u00e7ou a pensar: \"Como podemos fazer isso de forma port\u00e1til?\". Essa n\u00e3o \u00e9 uma tarefa f\u00e1cil, portanto, nem vou tentar fazer isso. Vou tentar escrev\u00ea-lo em um <u>semi-port\u00e1til<\/u>\u00a0de modo que n\u00e3o seja t\u00e3o dif\u00edcil implement\u00e1-lo em outras plataformas. Isso significa que estou usando as seguintes limita\u00e7\u00f5es:<\/p>\n<ul class=\"bullet\">\n<li>Estou usando <span style=\"font-family: 'Courier New', Courier, monospace\">abrir<\/span> e <span style=\"font-family: 'Courier New', Courier, monospace\">readdir<\/span> para percorrer o diret\u00f3rio. Isso pode ser facilmente reimplementado com <span style=\"font-family: 'Courier New', Courier, monospace\">FindFirst<\/span> e <span style=\"font-family: 'Courier New', Courier, monospace\">LocalizarPr\u00f3ximo<\/span> no Microsoft Windows.<\/li>\n<li>Monitorar o diret\u00f3rio significa que vou fazer uma varredura no diret\u00f3rio e, em seguida, aguardar um determinado n\u00famero de segundos antes de executar outra varredura. Sei que algumas plataformas oferecem suporte \u00e0 assinatura de altera\u00e7\u00f5es no sistema de arquivos, mas n\u00e3o vou gastar tempo com isso (pelo menos n\u00e3o agora ;-)).<\/li>\n<li>Para evitar o bloqueio de arquivos ou o acesso ao arquivo enquanto outros est\u00e3o gravando o arquivo, os clientes devem gravar o arquivo no diret\u00f3rio com um \"ponto\" inicial no nome do arquivo e, em seguida, renomear o arquivo quando terminarem. O programa ignora todos os arquivos que come\u00e7am com um ponto.<\/li>\n<\/ul>\n<p>Ent\u00e3o, vamos pular para o c\u00f3digo. O primeiro trecho de c\u00f3digo que pode ser interessante de examinar \u00e9 aquele em que criamos a inst\u00e2ncia da libcouchbase em main():<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0 instance = libcouchbase_create(host, user, passwd, bucket, NULL);<br \/>\nSe (inst\u00e2ncia == NULL) {<br \/>\nfprintf(stderr, \"Failed to create couchbase instancen\");<br \/>\nexit(EXIT_FAILURE);<br \/>\n}<\/div>\n<\/div>\n<p>O trecho de c\u00f3digo acima cria a inst\u00e2ncia da libcouchbase. N\u00e3o h\u00e1 como usar uma estrutura est\u00e1tica para isso, pois isso dificultar\u00e1 muito a manuten\u00e7\u00e3o da compatibilidade bin\u00e1ria. Gosto de poder corrigir bugs na biblioteca e lan\u00e7ar novas vers\u00f5es que voc\u00ea possa usar sem precisar recompilar seu programa, e, ao ocultar as estruturas de dados internas dos clientes, fica mais f\u00e1cil garantir que o cliente n\u00e3o dependa do tamanho delas. O primeiro par\u00e2metro para\u00a0<span style=\"font-family: 'Courier New', Courier, monospace\">libcouchbase_create<\/span> \u00e9 o nome (e a porta) da porta REST do servidor couchbase (padr\u00e3o: localhost:8091). O segundo e o terceiro par\u00e2metros s\u00e3o as credenciais que voc\u00ea gostaria de usar para se conectar \u00e0 porta REST para obter as informa\u00e7\u00f5es do pool (o padr\u00e3o \u00e9 n\u00e3o autenticar). O quarto par\u00e2metro \u00e9 o bucket ao qual voc\u00ea gostaria de se conectar e, se n\u00e3o especificar um bucket, voc\u00ea acabar\u00e1 no \"bucket padr\u00e3o\". O quinto argumento \u00e9 um objeto especial que voc\u00ea pode querer usar se for utilizar recursos \"avan\u00e7ados\" da libcouchbase. A maioria dos usu\u00e1rios provavelmente usar\u00e1 apenas os padr\u00f5es e passar\u00e1 NULL aqui.<\/p>\n<p>A pr\u00f3xima coisa que precisamos fazer \u00e9 configurar alguns manipuladores de retorno de chamada para podermos descobrir o que acontece. No exemplo, usaremos apenas uma opera\u00e7\u00e3o (para carregar dados no cache), portanto, precisaremos configurar um manipulador para capturar o resultado das opera\u00e7\u00f5es de armazenamento. Infelizmente, tamb\u00e9m podemos encontrar problemas, portanto, precisamos configurar um manipulador de erros (voltaremos ao trabalho daqui a pouco).<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0 libcouchbase_set_storage_callback(instance, storage_callback);<br \/>\nlibcouchbase_set_error_callback(instance, error_callback);<\/div>\n<\/div>\n<p>Agora que criamos e inicializamos a inst\u00e2ncia, precisamos tentar nos conectar ao cluster do Couchbase:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0 libcouchbase_error_t ret = libcouchbase_connect(instance);<br \/>\nse (ret != LIBCOUCHBASE_SUCCESS) {<br \/>\nfprintf(stderr, \"Falha na conex\u00e3o: %sn\",<br \/>\nlibcouchbase_strerror(instance, ret));<br \/>\nexit(EXIT_FAILURE);<br \/>\n}<\/div>\n<\/div>\n<p>Devido ao fato de a libcouchbase ser totalmente ass\u00edncrona, tudo o que aconteceu acima foi que iniciamos a conex\u00e3o. Isso significa que precisamos <b>esperar<\/b> para que o servidor seja conectado ao cluster do Couchbase e se conecte ao bucket correto. Se o nosso programa tivesse que fazer outras coisas, agora seria o momento de faz\u00ea-lo, mas como n\u00e3o temos nenhuma outra inicializa\u00e7\u00e3o a fazer, podemos simplesmente esperar que ele seja conclu\u00eddo:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0 libcouchbase_wait(instance);<\/div>\n<\/div>\n<p>Um dos recursos \"legais\" que temos na libcouchbase \u00e9 que ela fornece uma interface de estat\u00edsticas internas, portanto, podemos dizer a ela para coletar informa\u00e7\u00f5es de tempo das opera\u00e7\u00f5es com o seguinte trecho:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\n<p>\u00a0 \u00a0Se ((ret = libcouchbase_enable_timings(instance) != LIBCOUCHBASE_SUCCESS)) {<br \/>\nfprintf(stderr, \"Failed to enable timings: %sn\",<br \/>\nlibcouchbase_strerror(instance, ret));<br \/>\n}<\/p>\n<p>Nosso programa agora est\u00e1 totalmente inicializado e podemos entrar no loop principal, que se parece bastante com isso:<\/p>\n<\/div>\n<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0while (forever)<br \/>\n{<br \/>\nprocess_files();<br \/>\nsleep(nsec);<br \/>\n}<\/div>\n<\/div>\n<p>Ent\u00e3o, como o nosso <span style=\"font-family: 'Courier New', Courier, monospace\">process_files()<\/span> como \u00e9? N\u00e3o vou deixar o exemplo muito grande colando-o todo, mas a primeira parte parece:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0Se (de-&gt;d_name[0] == '.') {<br \/>\nSe (strcmp(de-&gt;d_name, \".dump_stats\") == 0) {<br \/>\nfprintf(stdout, \"Dumping stats:n\");<br \/>\nlibcouchbase_get_timings(instance, stdout, timings_callback);<br \/>\nfprintf(stdout, \"--n\");<br \/>\nremove(de-&gt;d_name);&lt;<br \/>\n}<br \/>\ncontinuar;<br \/>\n}<\/div>\n<\/div>\n<p>Como voc\u00ea pode ver no trecho de c\u00f3digo acima, ignoraremos todos os arquivos que come\u00e7am com '<span style=\"font-family: 'Courier New', Courier, monospace\">.<\/span>', exceto pelo arquivo chamado \"<span style=\"font-family: 'Courier New', Courier, monospace\">.dump_stats<\/span>\". Sempre que vemos esse arquivo, despejamos os tempos das estat\u00edsticas internas usando o comando\u00a0<span style=\"font-family: 'Courier New', Courier, monospace\">timings_callback<\/span> (Voltarei a esse assunto mais tarde).<\/p>\n<p>A pr\u00f3xima coisa que faremos \u00e9 tentar ler o arquivo na mem\u00f3ria e decodificar seu JSON antes de tentarmos obter o \"<span style=\"font-family: 'Courier New', Courier, monospace\">_id<\/span>\" para usar como chave. Se tudo isso for bem-sucedido, tentaremos armazenar os dados no Coucbase com:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0 \u00a0 int error = 0;<br \/>\nret = libcouchbase_store(instance, &amp;error, LIBCOUCHBASE_SET,<br \/>\nid-&gt;valuestring, strlen(id-&gt;valuestring),<br \/>\nptr, size, 0, 0, 0);<br \/>\nse (ret == LIBCOUCHBASE_SUCCESS) {<br \/>\nlibcouchbase_wait(instance);<br \/>\n} else {<br \/>\nerro = 1;<br \/>\n}<\/div>\n<\/div>\n<p>A parte do &amp;error aqui \u00e9 bastante interessante. \u00c9 um \"cookie\" passado para o retorno de chamada, para que eu possa saber se encontrei um problema ou n\u00e3o. Voc\u00ea ver\u00e1 como estou usando isso quando discutir a fun\u00e7\u00e3o <span style=\"font-family: 'Courier New', Courier, monospace\">retorno de armazenamento<\/span>\u00a0abaixo.<\/p>\n<p>Essa \u00e9 basicamente toda a l\u00f3gica importante do exemplo. Prometi que voltaria a falar sobre os diferentes retornos de chamada, portanto, vamos come\u00e7ar examinando o retorno de chamada de erro:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0static void error_callback(libcouchbase_t instance,<br \/>\nErro da libcouchbase_error_t,<br \/>\nconst char *errinfo)<br \/>\n{<br \/>\n\/* Ignorar tempos limite... *\/<br \/>\nse (erro != LIBCOUCHBASE_ETIMEDOUT) {<br \/>\nfprintf(stderr, \"rFATAL ERROR: %sn\",<br \/>\nlibcouchbase_strerror(instance, error));<br \/>\nSe (errinfo &amp;&amp; strlen(errinfo) != 0) {<br \/>\nfprintf(stderr, \"t \"%s \"n\", errinfo);<br \/>\n}<br \/>\nexit(EXIT_FAILURE);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<p>Como voc\u00ea pode ver no snippet acima, a libcouchbase chamar\u00e1 a fun\u00e7\u00e3o\u00a0<span style=\"font-family: 'Courier New', Courier, monospace\">retorno_de_erro<\/span> sempre que ocorrer um tempo limite, mas queremos apenas tentar novamente a opera\u00e7\u00e3o. Se encontrarmos um erro real, imprimiremos uma mensagem de erro e encerraremos o programa.<\/p>\n<p>O pr\u00f3ximo retorno de chamada que usamos \u00e9 o <span style=\"font-family: 'Courier New', Courier, monospace\">retorno de armazenamento<\/span>. Ela \u00e9 chamada quando a opera\u00e7\u00e3o de armazenamento \u00e9 conclu\u00edda, portanto, \u00e9 o lugar certo para descobrirmos se ocorreu algum erro durante o armazenamento dos dados. Nosso retorno de chamada tem a seguinte apar\u00eancia:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0static void storage_callback(libcouchbase_t instance,<br \/>\nconst void *cookie,<br \/>\nlibcouchbase_storage_t operation,<br \/>\nlibcouchbase_error_t err,<br \/>\nconst void *key, size_t nkey,<br \/>\nuint64_t cas)<br \/>\n{<br \/>\nint *error = (void*)cookie;<br \/>\nse (err == LIBCOUCHBASE_SUCCESS) {<br \/>\n*erro = 0;<br \/>\n} else {<br \/>\n*Erro = 1;<br \/>\nfprintf(stderr, \"Falha ao armazenar \"\");<br \/>\nfwrite(key, 1, nkey, stderr);<br \/>\nfprintf(stderr, \"\": %sn\",<br \/>\nlibcouchbase_strerror(instance, err));<br \/>\nfflush(stderr);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<p>Como voc\u00ea pode ver, estamos armazenando o resultado da opera\u00e7\u00e3o no n\u00famero inteiro passado como cookie. O leitor atento pode perceber que tamb\u00e9m poder\u00edamos desvincular o arquivo e remover a mem\u00f3ria da chamada de retorno (se, em vez disso, tiv\u00e9ssemos fornecido essas informa\u00e7\u00f5es como cookie ;))<\/p>\n<p>A \u00faltima chamada de retorno a ser abordada \u00e9 a chamada de retorno de tempo que estamos usando para descarregar as estat\u00edsticas de tempo.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\n<p>\u00a0 \u00a0static void timings_callback(libcouchbase_t instance, const void *cookie,<br \/>\nlibcouchbase_timeunit_t timeunit,<br \/>\nuint32_t min, uint32_t max,<br \/>\nuint32_t total, uint32_t maxtotal)<br \/>\n{<br \/>\nchar buffer[1024];<br \/>\nint offset = sprintf(buffer, \"[%3u - %3u]\", min, max);<br \/>\nswitch (timeunit) {<br \/>\ncase LIBCOUCHBASE_TIMEUNIT_NSEC:<br \/>\noffset += sprintf(buffer + offset, \"ns\");<br \/>\npausa;<br \/>\ncase LIBCOUCHBASE_TIMEUNIT_USEC:<br \/>\noffset += sprintf(buffer + offset, \"us\");<br \/>\npausa;<br \/>\ncase LIBCOUCHBASE_TIMEUNIT_MSEC:<br \/>\noffset += sprintf(buffer + offset, \"ms\");<br \/>\npausa;<br \/>\ncase LIBCOUCHBASE_TIMEUNIT_SEC:<br \/>\noffset += sprintf(buffer + offset, \"s\");<br \/>\npausa;<br \/>\npadr\u00e3o:<br \/>\n;<br \/>\n}<\/p>\n<p>int num = (float)40.0 * (float)total \/ (float)maxtotal;<br \/>\noffset += sprintf(buffer + offset, \" |\");<br \/>\nfor (int ii = 0; ii &lt; num; ++ii) {<br \/>\noffset += sprintf(buffer + offset, \"#\");<br \/>\n}<\/p>\n<p>offset += sprintf(buffer + offset, \" - %un\", total);<br \/>\nfputs(buffer, (FILE*)cookie);<br \/>\n}<\/p>\n<\/div>\n<\/div>\n<p>Quando voc\u00ea solicita os tempos da libcouchbase, ela informa todas as m\u00e9tricas de tempo coletadas chamando o retorno de chamada de tempos. Como voc\u00ea pode ver na API, voc\u00ea obter\u00e1 o valor m\u00ednimo e m\u00e1ximo do intervalo e o n\u00famero de opera\u00e7\u00f5es realizadas dentro desse intervalo. Essas m\u00e9tricas n\u00e3o devem ser consideradas como n\u00fameros exatos, pois dependem do que voc\u00ea faz no c\u00f3digo do cliente desde o momento em que chama a opera\u00e7\u00e3o at\u00e9 chamar libcouchbase_wait para que a opera\u00e7\u00e3o seja conclu\u00edda.<\/p>\n<p>Ent\u00e3o, vamos executar o programa. Eu preenchi previamente\u00a0<span style=\"font-family: 'Courier New', Courier, monospace\">\/var\/spool\/vacuum<\/span> com v\u00e1rios arquivos JSON, para que o programa fa\u00e7a alguma coisa.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">trond@illumos ~&gt; .\/vacuum<br \/>\ndormindo 3 segundos antes de tentar novamente.<\/div>\n<\/div>\n<p>Em outro withdow, executo o comando:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">trond@illumos ~&gt; touch \/var\/spool\/vacuum\/.dump_stats<\/div>\n<\/div>\n<p>E quando o cron\u00f4metro expira na primeira janela, ele \u00e9 impresso:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">Estat\u00edsticas de despejo:<br \/>\n[ 60 - 69]us |######################################## - 18<br \/>\n[ 70 - 79]us |## - 1<br \/>\n[240 - 249]us |## - 1<br \/>\n&#8212;-<br \/>\ndormindo 3 segundos antes de tentar novamente.<\/div>\n<\/div>\n<p>Espero que este blog tenha revelado como \u00e9 f\u00e1cil usar a libcouchbase para se comunicar com um cluster do Couchbase. Temos v\u00e1rios clientes para outras linguagens de programa\u00e7\u00e3o, como PHP e Ruby, criados com base na libcouchbase, portanto, posso prometer que voc\u00ea ver\u00e1 mais funcionalidades adicionadas!<\/p>","protected":false},"excerpt":{"rendered":"<p>Some of you may have noticed that we released Couchbase 1.8 earlier\u00a0today, and a new set of smart clients for various languages. For me\u00a0personally this is a milestone, because libcouchbase is now a supported client for the C language. So [&hellip;]<\/p>","protected":false},"author":14,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8981],"class_list":["post-1790","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>So, how do I use this libcouchbase? - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn more about how easy it is to use libcouchbase to\u00a0communicate with a Couchbase cluster. Also read how libcouchbase work in a\u00a0multithreaded context.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/so-how-do-i-use-libcouchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"So, how do I use this libcouchbase?\" \/>\n<meta property=\"og:description\" content=\"Learn more about how easy it is to use libcouchbase to\u00a0communicate with a Couchbase cluster. Also read how libcouchbase work in a\u00a0multithreaded context.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/so-how-do-i-use-libcouchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T18:21:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-28T08:17:48+00:00\" \/>\n<meta name=\"author\" content=\"Trond Norbye, Senior Developer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Trond Norbye, Senior Developer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/\"},\"author\":{\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d\"},\"headline\":\"So, how do I use this libcouchbase?\",\"datePublished\":\"2014-12-16T18:21:15+00:00\",\"dateModified\":\"2023-06-28T08:17:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/\"},\"wordCount\":1860,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/\",\"name\":\"So, how do I use this libcouchbase? - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T18:21:15+00:00\",\"dateModified\":\"2023-06-28T08:17:48+00:00\",\"description\":\"Learn more about how easy it is to use libcouchbase to\u00a0communicate with a Couchbase cluster. Also read how libcouchbase work in a\u00a0multithreaded context.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"So, how do I use this libcouchbase?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d\",\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/03d13b4ab5eaa14c91cab7658f04df07\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g\",\"caption\":\"Trond Norbye, Senior Developer, Couchbase\"},\"description\":\"Trond Norbye is a Software Architect at Couchbase. Core contributor to Couchbase &amp; Memcached projects. Created the C\/C++ &amp; node.js Couchbase client libraries.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/trond-norbye\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"So, how do I use this libcouchbase? - The Couchbase Blog","description":"Learn more about how easy it is to use libcouchbase to\u00a0communicate with a Couchbase cluster. Also read how libcouchbase work in a\u00a0multithreaded context.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/so-how-do-i-use-libcouchbase\/","og_locale":"pt_BR","og_type":"article","og_title":"So, how do I use this libcouchbase?","og_description":"Learn more about how easy it is to use libcouchbase to\u00a0communicate with a Couchbase cluster. Also read how libcouchbase work in a\u00a0multithreaded context.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/so-how-do-i-use-libcouchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T18:21:15+00:00","article_modified_time":"2023-06-28T08:17:48+00:00","author":"Trond Norbye, Senior Developer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Trond Norbye, Senior Developer, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/"},"author":{"name":"Trond Norbye, Senior Developer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d"},"headline":"So, how do I use this libcouchbase?","datePublished":"2014-12-16T18:21:15+00:00","dateModified":"2023-06-28T08:17:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/"},"wordCount":1860,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/","url":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/","name":"So, how do I use this libcouchbase? - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T18:21:15+00:00","dateModified":"2023-06-28T08:17:48+00:00","description":"Learn more about how easy it is to use libcouchbase to\u00a0communicate with a Couchbase cluster. Also read how libcouchbase work in a\u00a0multithreaded context.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/so-how-do-i-use-libcouchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"So, how do I use this libcouchbase?"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d","name":"Trond Norbye, desenvolvedor s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/03d13b4ab5eaa14c91cab7658f04df07","url":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","caption":"Trond Norbye, Senior Developer, Couchbase"},"description":"Trond Norbye \u00e9 arquiteto de software na Couchbase. Principal colaborador dos projetos Couchbase e Memcached. Criou as bibliotecas de clientes C\/C++ e node.js do Couchbase.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/trond-norbye\/"}]}},"authors":[{"term_id":8981,"user_id":14,"is_guest":0,"slug":"trond-norbye","display_name":"Trond Norbye, Senior Developer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","first_name":"Trond","last_name":"Norbye","user_url":"","author_category":"","description":"Trond Norbye \u00e9 arquiteto de software na Couchbase. Principal colaborador dos projetos Couchbase e Memcached. Criou as bibliotecas de clientes C\/C++ e node.js do Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1790"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1790\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1790"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}