{"id":1672,"date":"2014-12-16T19:38:25","date_gmt":"2014-12-16T19:38:24","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1672"},"modified":"2017-05-03T13:25:05","modified_gmt":"2017-05-03T20:25:05","slug":"libcouchbase-couchbase-server-from-c","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/libcouchbase-couchbase-server-from-c\/","title":{"rendered":"libcouchbase - Explore todos os recursos do seu servidor Couchbase a partir de C"},"content":{"rendered":"<p>Comecei a implementa\u00e7\u00e3o da libcouchbase h\u00e1 quase um ano, devido \u00e0 minha necessidade pessoal de testar o funcionamento interno da <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\"><span style=\"color: #7d181e;\">Couchbase<\/span><\/a>. Como eu trabalho no \"n\u00facleo\" do Couchase, precisava de uma maneira f\u00e1cil de testar as altera\u00e7\u00f5es que fiz l\u00e1. Naquela \u00e9poca, havia apenas clientes para Java, Python e C# com suporte para interface REST para o Couchbase. N\u00e3o sou f\u00e3 de Python, e minha m\u00e1quina Solaris n\u00e3o suporta C#, ent\u00e3o Java era minha \u00fanica op\u00e7\u00e3o. Como gosto muito de Java, essa foi minha linguagem de escolha inicialmente quando precisei testar algo. Infelizmente, acho um pouco mais inc\u00f4modo ter que lidar com v\u00e1rias linguagens (e o fato de n\u00e3o poder vincular o c\u00f3digo de teste ao n\u00facleo para test\u00e1-lo \"por dentro\" ;-)) Diante disso, comecei a tentar encontrar uma alternativa.<\/p>\n<p>Nos \u00faltimos anos, me esforcei um pouco para <a href=\"https:\/\/launchpad.net\/libmemcached\"><span style=\"color: #d52a33;\">libmemcached<\/span><\/a>Por isso, a primeira coisa que fiz foi ver o que seria necess\u00e1rio para adicionar suporte a um \"comportamento de cliente inteligente\" na libmemcached. Se isso fosse poss\u00edvel, eu poderia ter uma biblioteca com todos os recursos que as pessoas mantinham. Infelizmente, n\u00e3o foi f\u00e1cil adicionar o que eu queria devido \u00e0 forma como a biblioteca funciona. A libmemcached inicializaria sua lista de estruturas de servidor no momento da inicializa\u00e7\u00e3o e mapearia a chave para o servidor ao qual ela pertenceria. Para o Couchbase, eu teria de poder substituir a lista de servidores a qualquer momento. Al\u00e9m disso, o Couchbase usa um mapeamento da chave em dois n\u00edveis. Primeiro, mapeamos a chave para um <a href=\"https:\/\/dustin.github.com\/2010\/06\/29\/memcached-vbuckets.html\"><i><span style=\"color: #d52a33;\">vbucket<\/span><\/i><\/a>e, em seguida, tentamos procurar o servidor onde o bucket reside. Na \u00e9poca, achei que teria de mudar muito o funcionamento interno da libmemcached para que ela funcionasse no Couchbase (e, dado o fato de que a libmemcached n\u00e3o \u00e9 uma biblioteca espec\u00edfica do fornecedor, achei que era a coisa errada a fazer). Como eu n\u00e3o queria ficar em cima de uma \"bomba-rel\u00f3gio\" quando se tratava de tentar mesclar meu \"patch\" privado para a libmemcached com as altera\u00e7\u00f5es do upstream, decidi apenas escrever algo que atendesse \u00e0s minhas necessidades. Acho que vale a pena mencionar que a libcouchbase n\u00e3o foi feita para substituir a libmemcached, mas para ser uma alternativa para aqueles que querem\/precisam explorar todos os recursos do Couchbase.<\/p>\n<p>A solu\u00e7\u00e3o \"r\u00e1pida e suja\" teria sido simplesmente codificar as coisas de que eu precisava em v\u00e1rios programas de teste e usar o recurso copiar e colar at\u00e9 encontrar o ceifador, mas isso n\u00e3o teria sido particularmente inovador (ou divertido). Em vez disso, sentei-me e defini alguns crit\u00e9rios para a biblioteca:<\/p>\n<ul class=\"bullet\">\n<li>Tudo isso deve ser feito de forma ass\u00edncrona<br \/>\n<blockquote><p>Acredito que todas as bibliotecas devem fornecer uma interface ass\u00edncrona e, se a biblioteca fornecer uma interface s\u00edncrona, ela dever\u00e1 ser constru\u00edda sobre a interface ass\u00edncrona e aguardar a conclus\u00e3o.<\/p><\/blockquote>\n<\/li>\n<li>Sem travamento interno<br \/>\n<blockquote><p>O uso de bloqueios internamente pode levar \u00e0 conten\u00e7\u00e3o de bloqueios. Se eu puder evitar o bloqueio dentro da biblioteca, ela poder\u00e1 ser melhor dimensionada. Caber\u00e1 inteiramente ao cliente da biblioteca proteger as vari\u00e1veis contra o acesso de v\u00e1rios threads.<\/p><\/blockquote>\n<\/li>\n<li>Tem que ser multiplataforma!<br \/>\n<blockquote><p>Fa\u00e7o todo o meu desenvolvimento no Solaris, mas respeito o fato de que outras pessoas podem ter necessidades diferentes das minhas. Algumas pessoas preferem o Mac OS, outras preferem o Windows e j\u00e1 ouvi falar de pessoas que usam o Linux. Por que todas elas n\u00e3o deveriam poder usar a libcouchbase?<\/p><\/blockquote>\n<\/li>\n<li>N\u00e3o deve depender de um \"monte de merda\" de outros m\u00f3dulos<br \/>\n<blockquote><p>N\u00e3o \u00e9 que eu sofra de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Not_Invented_Here\"><span style=\"color: #d52a33;\">s\u00edndrome de n\u00e3o-inventado-aqui<\/span><\/a>Mas acho uma chatice ter que compilar v\u00e1rias outras bibliotecas (que podem ter depend\u00eancias adicionais etc.) apenas para que a biblioteca funcione (e manter todas elas sincronizadas entre si \u00e0 medida que surgem novas vers\u00f5es). Todo uso de biblioteca deve ser justificado.<\/p><\/blockquote>\n<\/li>\n<li>Compatibilidade bin\u00e1ria<br \/>\n<blockquote><p>A interface bin\u00e1ria deve ser est\u00e1vel e n\u00e3o mudar o tempo todo. Criar uma boa API n\u00e3o \u00e9 f\u00e1cil, portanto, durante o desenvolvimento, espera-se que a API evolua. Se um cliente usar apenas uma interface comprometida, ele n\u00e3o precisar\u00e1 fazer nada al\u00e9m de substituir o objeto compartilhado quando a nova vers\u00e3o for lan\u00e7ada.<\/p><\/blockquote>\n<\/li>\n<li>Sem GPL<br \/>\n<blockquote><p>Eu simplesmente n\u00e3o suporto a licen\u00e7a GPL.<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>Embora eu tenha come\u00e7ado a trabalhar na libcouchbase h\u00e1 um ano, isso n\u00e3o significa que eu tenha trabalhado nela em tempo integral. Meu trabalho principal \u00e9 trabalhar no n\u00facleo, portanto, s\u00f3 estendi a biblioteca quando precisei da funcionalidade para meus pr\u00f3prios testes. Mais recentemente, fico feliz em dizer que recebi algumas contribui\u00e7\u00f5es de algumas pessoas que a pegaram e usaram e de alguns outros desenvolvedores do Couchbase (obrigado Sergey, Paul, Sebastian, Jan e Bill!).  Sem d\u00favida, h\u00e1 algo que podemos fazer melhor, portanto, envie um e-mail para a lista de discuss\u00e3o de desenvolvimento do Couchbase (<a href=\"mailto:couchbase@googlegroups.com\"><span style=\"color: #d52a33;\">couchbase@googlegroups.com<\/span><\/a>) se houver algo que voc\u00ea acha que precisa ser consertado. Ainda acho que a biblioteca tem algumas arestas que precisam ser resolvidas antes que voc\u00ea possa come\u00e7ar a us\u00e1-la na produ\u00e7\u00e3o ;-)<\/p>\n<h3>Cria\u00e7\u00e3o do software<\/h3>\n<p>Se estiver tentando compilar a libcoucbase no Solaris \/ *BSD \/ MacOS ou Linux, basta usar o m\u00e9todo \"configure &amp;&amp; make\" com o qual est\u00e1 acostumado. Para os usu\u00e1rios do Windows, escrevi um NMakefile que pode ser usado para compilar e instalar os v\u00e1rios bits. Como estou fazendo quase todo o meu desenvolvimento, posso ter feito coisas \"erradas\", mas ficarei feliz se voc\u00ea me enviar um e-mail dizendo o que preciso mudar.<\/p>\n<p>Estou usando o Windows 7 com o Microsoft Developer Studio 2010 para criar e testar a biblioteca. Execute os seguintes comandos para criar e instalar os bits:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">nmake -f NMakefile install<\/span><\/p>\n<p>Por padr\u00e3o, ele usar\u00e1 c:local como o diret\u00f3rio raiz (para facilitar a cria\u00e7\u00e3o de um instalador ou mov\u00ea-lo para onde voc\u00ea quiser). Voc\u00ea sempre pode substituir isso especificando INSTALL da seguinte forma:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">nmake -f NMakefile INSTALL=c:couchbase install<\/span><\/p>\n<h3>Pr\u00e9-requisitos<\/h3>\n<p>Temos alguns pr\u00e9-requisitos para a libcouchbase. \u00c9 poss\u00edvel que voc\u00ea encontre pacotes bin\u00e1rios dispon\u00edveis para sua plataforma, mas n\u00e3o deve ser muito dif\u00edcil compilar a partir do c\u00f3digo-fonte.<\/p>\n<p>1) Os arquivos de cabe\u00e7alho da ramifica\u00e7\u00e3o do mecanismo do memcached.<\/p>\n<p>Basta copiar o diret\u00f3rio memcached de\u00a0<a href=\"https:\/\/github.com\/memcached\/memcached\/tree\/engine-pu\/include\"><span style=\"color: #d52a33;\">https:\/\/github.com\/memcached\/memcached\/tree\/engine-pu\/include<\/span><\/a> para c:localinclude (ou o que voc\u00ea escolher como diret\u00f3rio)<\/p>\n<p>2) Uma implementa\u00e7\u00e3o sasl.<\/p>\n<p>A libcouchbase precisa executar autentica\u00e7\u00f5es SASL para os diferentes buckets. Se voc\u00ea n\u00e3o quiser instalar uma biblioteca SASL completa, poder\u00e1 instalar a \"libisasl\" a partir de: <a href=\"https:\/\/github.com\/membase\/libisasl\"><span style=\"color: #d52a33;\">https:\/\/github.com\/membase\/libisasl<\/span><\/a><\/p>\n<p>3) libvbucket<\/p>\n<p>O mapeamento entre uma chave e o vbucket (e para localizar em qual servidor o vbucket est\u00e1 localizado) \u00e9 fornecido por essa biblioteca. <a href=\"https:\/\/github.com\/membase\/libvbucket\"><span style=\"color: #d52a33;\">https:\/\/github.com\/membase\/libvbucket<\/span><\/a><\/p>\n<p>4) libevent (opcional)<\/p>\n<p>A libcouchbase permite plug-ins para diferentes estruturas de notifica\u00e7\u00e3o de eventos. A estrutura padr\u00e3o para sistemas do tipo UNIX \u00e9 a libevent, portanto, a menos que voc\u00ea crie seu pr\u00f3prio plug-in, conv\u00e9m instal\u00e1-la. Observe que o padr\u00e3o para o Windows \u00e9 outro, portanto, voc\u00ea n\u00e3o precisa dele para o Windows.<\/p>\n<h3>Ent\u00e3o, como a biblioteca funciona?<\/h3>\n<p>A ideia principal da biblioteca \u00e9 que tudo deve ser orientado por eventos e que um retorno de chamada deve ser acionado quando algo acontecer. Isso significa que voc\u00ea deve configurar retornos de chamada para lidar com tudo o que quiser. N\u00e3o existe um simples:<\/p>\n<p>std::string myvalue = libcoucbase-&gt;get(\"hello\");<\/p>\n<p>mas voc\u00ea pode implementar isso facilmente, se quiser.<\/p>\n<p>Devido ao fato de n\u00e3o haver bloqueio na libcouchbase, voc\u00ea pode pensar que ela n\u00e3o \u00e9 adequada para uso em um processo com v\u00e1rios threads, mas isso n\u00e3o \u00e9 verdade. Desde que voc\u00ea n\u00e3o use o mesmo identificador para a libcouchbase em v\u00e1rios threads, poder\u00e1 usar quantos threads quiser (se quiser usar a mesma inst\u00e2ncia da libcouchbase em v\u00e1rios threads, ser\u00e1 necess\u00e1rio fornecer bloqueio)<\/p>\n<h3>Chega de conversa, mostre-me o c\u00f3digo!<\/h3>\n<p>Tudo o que voc\u00ea precisa fazer em seu programa para come\u00e7ar a usar a libcouchbase \u00e9 incluir <span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase\/couchbase.h<\/span>. e vincular a libcouchbase. A primeira coisa que voc\u00ea precisa fazer \u00e9 criar uma inst\u00e2ncia para a libcouchbase:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">#inclui <\/span> <br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">&#8230;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">const char *host = NULL; \/* Use localhost:8091 *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">const char *username = NULL; \/* Nenhum usu\u00e1rio especificado *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">const char *password = NULL; \/* Nenhuma senha especificada *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">const char *bucket = NULL; \/* usar o bucket padr\u00e3o *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">struct libcouchbase_io_opt_st *io = NULL; \/* Usar op\u00e7\u00f5es io padr\u00e3o *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_t handle = libcouchbase_create(host, nome de usu\u00e1rio, senha,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bucket, io);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">Se (handle == NULL) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 \/* Falha ao criar o identificador *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><\/p>\n<p>O fragmento de c\u00f3digo acima n\u00e3o faz nada mais do que alocar o identificador para a libcouchbase e n\u00e3o tentou conect\u00e1-la ao servidor para receber a lista de servidores etc. A combina\u00e7\u00e3o de nome de usu\u00e1rio\/senha aqui ser\u00e1 usada para autenticar o servidor REST que escuta na porta do host. Com o identificador instalado, devemos configurar o primeiro retorno de chamada: o manipulador de erros. Vamos criar um callback de erro simples que imprime o erro e encerra o aplicativo:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">static void error_callback(libcouchbase_t instance,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Erro da libcouchbase_error_t,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const char *errinfo)<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 fprintf(stderr, \"%s\", libcouchbase_strerror(instance, error));<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 Se (errinfo) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \": %s\", errinfo);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 fprintf(stderr, \"n\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 exit(EXIT_FAILURE);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/>A chamada de retorno \u00e9 instalada com:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_set_error_callback(handle, error_callback);<\/span><\/p>\n<p>Agora que temos nossa chamada de retorno de erro instalada, podemos come\u00e7ar a nos conectar ao servidor e receber a lista de servidores. Como tudo \u00e9 ass\u00edncrono, precisamos aguardar a conclus\u00e3o da conex\u00e3o (n\u00e3o vou mostrar como usar a biblioteca em um loop de evento compartilhado neste exemplo).<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_connect(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\/\/ Aguarde a conclus\u00e3o da conex\u00e3o<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_wait(handle);<\/span><\/p>\n<p>Neste momento, temos uma inst\u00e2ncia \"funcional\" da libcouchbase que podemos usar. Ent\u00e3o, vamos em frente e armazenar alguns itens no cache. Se n\u00e3o nos importarmos com a mensagem de resposta do servidor, n\u00e3o precisaremos configurar uma chamada de retorno, mas, para tornar o exemplo mais completo, vamos criar uma chamada de retorno que encerre o programa se n\u00e3o conseguirmos armazenar um dos itens:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">static void storage_callback(libcouchbase_t instance,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const void *cookie,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 libcouchbase_storage_t operation,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Erro da libcouchbase_error_t,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const void *key, size_t nkey,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint64_t cas)<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 se (erro != LIBCOUCHBASE_SUCCESS) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"Falha ao armazenar \"\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fwrite(key, nkey, 1, stderr);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"\"n\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(EXIT_FAILURE);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/>N\u00e3o tenho um bom exemplo do que queremos armazenar, ent\u00e3o vamos apenas fazer um loop e armazenar alguns n\u00fameros:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_set_storage_callback(instance, storage_callback);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">for (int ii = 0; ii &lt; 10; ++ii) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 char key[80];<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 size_t nkey = sprintf(key, \"%d\", ii);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 libcouchbase_store(handle, NULL, LIBCOUCHBASE_SET,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 key, nkey, &amp;ii, sizeof(ii), 0, 0, 0);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\/* Aguarde a conclus\u00e3o de todos eles *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_wait(handle);<\/span><\/p>\n<h3>Hor\u00e1rios<\/h3>\n<p>Uma das coisas que considero interessantes na libcouchbase \u00e9 a capacidade de obter algumas estat\u00edsticas de tempo sobre o tr\u00e1fego atual. Todos os que conhecem o DTrace adoram a possibilidade de obter um histograma que representa o que voc\u00ea decidiu medir. Muitas vezes, quando voc\u00ea est\u00e1 executando suas coisas em produ\u00e7\u00e3o, pode querer analisar os tempos de resposta obtidos do cluster do Couchbase. Para ajud\u00e1-lo a fazer isso, adicionei alguns tempos relativamente leves que voc\u00ea pode usar. Devido \u00e0 natureza ass\u00edncrona da libcouchbase (e ao fato de voc\u00ea ser respons\u00e1vel por conduzir o loop de eventos), \u00e9 poss\u00edvel que voc\u00ea imponha um grande efeito sobre os tempos, de modo que eles n\u00e3o representem mais a verdade. De qualquer forma, vamos adicionar um exemplo que os utiliza para criar um histograma da se\u00e7\u00e3o da loja acima (mas, em vez de executar todos eles em um \u00fanico lote, use um<br \/>\nconjunto s\u00edncrono.<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_enable_timings(handle);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">for (int ii = 0; ii &lt; 10; ++ii) {<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 char key[80];<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 size_t nkey = sprintf(key, \"%d\", ii);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 libcouchbase_store(handle, NULL, LIBCOUCHBASE_SET,<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 key, nkey, &amp;ii, sizeof(ii), 0, 0, 0);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 libcouchbase_wait(handle);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">\/* Obter os tempos atuais *\/<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_get_timings(handle, stdout, timings_callback);<\/span><\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">\/* Parar de coletar informa\u00e7\u00f5es de tempo *\/<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">libcouchbase_disable_timings(handle);<\/span><\/p>\n<p>Ent\u00e3o, qual \u00e9 a apar\u00eancia desse \"timings_callback\"? Isso depende totalmente de voc\u00ea, mas poder\u00edamos criar um histograma simples com o seguinte c\u00f3digo:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">static void timings_callback(libcouchbase_t instance, const void *cookie,<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 libcouchbase_timeunit_t timeunit,<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t min, uint32_t max,<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t total, uint32_t maxtotal)<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 char buffer[1024];<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 int offset = sprintf(buffer, \"[%3u - %3u]\", min, max);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 switch (timeunit) {<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_NSEC:<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"ns\");<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_USEC:<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"us\");<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_MSEC:<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"ms\");<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_SEC:<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"s\");<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 padr\u00e3o:<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 }<\/span><\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 int num = (float)40.0 * (float)total \/ (float)maxtotal;<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \" |\");<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 for (int ii = 0; ii &lt; num; ++ii) {<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"#\");<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 }<\/span><\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \" - %un\", total);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0 fputs(buffer, (FILE*)cookie);<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><\/p>\n<p>Isso geraria algo como:<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">[140 - 149]us |# - 2<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[150 - 159]us |## - 3<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[160 - 169]us |######################################## - 47<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[170 - 179]us |#################### - 26<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[180 - 189]us |########### - 14<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[190 - 199]us |# - 2<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[210 - 219]us | - 1<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[220 - 229]us | - 1<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[230 - 239]us | - 1<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[250 - 259]us | - 1<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[280 - 289]us | - 1<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">[400 - 409]us | - 1<\/span><\/p>\n<h3>C\u00f3digo-fonte<\/h3>\n<p>Acho que voc\u00ea quer experimentar o programa por conta pr\u00f3pria :)<\/p>\n<p><span style=\"font-family: 'Courier New',Courier,monospace;\">\/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">#inclui<br \/>\n#inclui<br \/>\n#include <\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/> <br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">static void error_callback(libcouchbase_t instance,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Erro da libcouchbase_error_t,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const char *errinfo)<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 fprintf(stderr, \"%s\", libcouchbase_strerror(instance, error));<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 Se (errinfo) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \": %s\", errinfo);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 fprintf(stderr, \"n\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 exit(EXIT_FAILURE);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">static void storage_callback(libcouchbase_t instance,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const void *cookie,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 libcouchbase_storage_t operation,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Erro da libcouchbase_error_t,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const void *key, size_t nkey,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint64_t cas)<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 se (erro != LIBCOUCHBASE_SUCCESS) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"Falha ao armazenar \"\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 fwrite(key, nkey, 1, stderr);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"\"n\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 exit(EXIT_FAILURE);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">static void timings_callback(libcouchbase_t instance, const void *cookie,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 libcouchbase_timeunit_t timeunit,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t min, uint32_t max,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t total, uint32_t maxtotal)<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 char buffer[1024];<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 int offset = sprintf(buffer, \"[%3u - %3u]\", min, max);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 switch (timeunit) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_NSEC:<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"ns\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_USEC:<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"us\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_MSEC:<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"ms\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 case LIBCOUCHBASE_TIMEUNIT_SEC:<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"s\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 pausa;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 padr\u00e3o:<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 ;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 int num = (float)40.0 * (float)total \/ (float)maxtotal;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 offset += sprintf(buffer + offset, \" |\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 for (int ii = 0; ii &lt; num; ++ii) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 offset += sprintf(buffer + offset, \"#\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 offset += sprintf(buffer + offset, \" - %un\", total);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 fputs(buffer, (FILE*)cookie);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">int main(int argc, char **argv)<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">{<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 const char *host = NULL; \/* Use localhost:8091 *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 const char *username = NULL; \/* Nenhum usu\u00e1rio especificado *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 const char *password = NULL; \/* Nenhuma senha especificada *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 const char *bucket = NULL; \/* usar o bucket padr\u00e3o *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 struct libcouchbase_io_opt_st *io = NULL; \/* Usar op\u00e7\u00f5es io padr\u00e3o *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_t handle = libcouchbase_create(host,\u00a0<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nome de usu\u00e1rio,\u00a0<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 senha,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bucket, io);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 Se (handle == NULL) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Falha ao criar o identificador *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"Failed to create instancen\");<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 exit(EXIT_FAILURE);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_set_error_callback(handle, error_callback);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_connect(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 \/\/ Aguarde a conclus\u00e3o da conex\u00e3o<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_wait(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_set_storage_callback(instance, storage_callback);<\/span> <span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0<\/span><br \/>\n<span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_enable_timings(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 for (int ii = 0; ii &lt; 100; ++ii) {<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 char key[80];<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 size_t nkey = sprintf(key, \"%d\", ii);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 libcouchbase_store(handle, NULL, LIBCOUCHBASE_SET,<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 key, nkey, &amp;ii, sizeof(ii), 0, 0, 0);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0\u00a0\u00a0\u00a0 libcouchbase_wait(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 }<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 \/* Obter os tempos atuais *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_get_timings(handle, stdout, timings_callback);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 \/* Parar de coletar informa\u00e7\u00f5es de tempo *\/<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_disable_timings(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 libcouchbase_destroy(handle);<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">\u00a0\u00a0 retornar 0;<\/span><br style=\"font-family: 'Courier New',Courier,monospace;\" \/><span style=\"font-family: 'Courier New',Courier,monospace;\">}<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>I started the implementation of libcouchbase almost year ago out of my personal need to test the inner workings of Couchbase. Since I work in &#8220;core&#8221; of Couchase I needed an easy way to test out the changes I made [&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-1672","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 v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>libcouchbase \u2013 Explore the full features of your Couchbase server from C - The Couchbase Blog<\/title>\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\/libcouchbase-couchbase-server-from-c\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"libcouchbase \u2013 Explore the full features of your Couchbase server from C\" \/>\n<meta property=\"og:description\" content=\"I started the implementation of libcouchbase almost year ago out of my personal need to test the inner workings of Couchbase. Since I work in &#8220;core&#8221; of Couchase I needed an easy way to test out the changes I made [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/libcouchbase-couchbase-server-from-c\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:38:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-05-03T20:25:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/\"},\"author\":{\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d\"},\"headline\":\"libcouchbase \u2013 Explore the full features of your Couchbase server from C\",\"datePublished\":\"2014-12-16T19:38:24+00:00\",\"dateModified\":\"2017-05-03T20:25:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/\"},\"wordCount\":2581,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#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\/libcouchbase-couchbase-server-from-c\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/\",\"name\":\"libcouchbase \u2013 Explore the full features of your Couchbase server from C - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:38:24+00:00\",\"dateModified\":\"2017-05-03T20:25:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#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\/libcouchbase-couchbase-server-from-c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"libcouchbase \u2013 Explore the full features of your Couchbase server from C\"}]},{\"@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":"libcouchbase \u2013 Explore the full features of your Couchbase server from C - The Couchbase Blog","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\/libcouchbase-couchbase-server-from-c\/","og_locale":"pt_BR","og_type":"article","og_title":"libcouchbase \u2013 Explore the full features of your Couchbase server from C","og_description":"I started the implementation of libcouchbase almost year ago out of my personal need to test the inner workings of Couchbase. Since I work in &#8220;core&#8221; of Couchase I needed an easy way to test out the changes I made [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/libcouchbase-couchbase-server-from-c\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:38:24+00:00","article_modified_time":"2017-05-03T20:25:05+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Trond Norbye, Senior Developer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Trond Norbye, Senior Developer, Couchbase","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/"},"author":{"name":"Trond Norbye, Senior Developer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d"},"headline":"libcouchbase \u2013 Explore the full features of your Couchbase server from C","datePublished":"2014-12-16T19:38:24+00:00","dateModified":"2017-05-03T20:25:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/"},"wordCount":2581,"commentCount":3,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#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\/libcouchbase-couchbase-server-from-c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/","url":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/","name":"libcouchbase \u2013 Explore the full features of your Couchbase server from C - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:38:24+00:00","dateModified":"2017-05-03T20:25:05+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-couchbase-server-from-c\/#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\/libcouchbase-couchbase-server-from-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"libcouchbase \u2013 Explore the full features of your Couchbase server from C"}]},{"@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","author_category":"","last_name":"Norbye","first_name":"Trond","job_title":"","user_url":"","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\/1672","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=1672"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1672\/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=1672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1672"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}