Pular para o conteúdo
Tecnologia

Exceção no meio do fluxo, arquivo aberto: por que o SDK em C++17 do jsonW fecha no lugar certo

Em novembro de 2026, um levantamento sobre credenciais expostas no GitHub mostrou 1.122 arquivos públicos com segredo de verdade. A lição serve ao C++: o recurso precisa fechar no lugar certo, mesmo no erro. O SDK em C++17 do jsonW faz isso com RAII: jsonw::Leitor e jsonw::Escritor fecham no fim do escopo e o arquivo .jsw só aparece completo. O texto explica o que muda na prática, traz o código real do cabeçalho e as medições declaradas no README.

Por Equipe Wortic 14 min de leitura
Exceção no meio do fluxo, arquivo aberto: por que o SDK em C++17 do jsonW fecha no lugar certo

O arquivo fechado no meio do fluxo

Em 9 de novembro de 2026, o site de notícias de tecnologia LavX News publicou um levantamento da empresa de segurança Apiiro sobre o Claude Code, da Anthropic. O número que importa para quem escreve software é este: 1.122 cópias públicas do arquivo .claude/settings.local.json, encontradas pelo GitHub, continham credencial de verdade, entre senhas de banco, tokens e chaves de nuvem. O total, contando versões antigas e forks, chegou a 2.539 segredos em 1.994 repositórios (LavX News, 09/11/2026).

Vale ler a notícia por inteiro para entender a lição. O problema não foi só de ferramenta: o problema é que credencial escrita à mão numa linha de comando, ou num arquivo de configuração que ninguém fecha direito, sai do controle. A parte que interessa a um time de C++ é a mesma de sempre, e não depende de IA nenhuma: recurso aberto precisa ser fechado no lugar certo, mesmo quando o meio do caminho falha.

É exatamente o que o C++ resolve com RAII, e o que o SDK em C++17 do jsonW usa como base para abrir e gravar um arquivo .jsw: o leitor e o escritor são objetos de escopo, e o arquivo não fica aberto quando o código dá errado.

O que muda na prática para quem decide tecnologia

Quem mantém um sistema em C++ convive com três custos que não aparecem no relatório: arquivo aberto por mais tempo do que devia, dado perdido quando o processo morre no meio da gravação, e conversão de formato feita em três lugares diferentes. Na prática, os três saem do mesmo lugar.

Segundo o README do jsonW, o formato é um modelo de dados com três formas que se convertem sem perda: linha (binária, para mensagem e evento), coluna (o arquivo .jsw, em blocos lidos por mmap) e texto (jsonW-texto, em que todo JSON válido já é válido). O mesmo README declara duas medições feitas com 100 mil registros, comparando com o mesmo conjunto em JSONL lido pelo próprio leitor de JSON do projeto: arquivo 4,9 vezes menor e leitura de um campo de uma linha 3.281 vezes mais rápida. O próprio README avisa que bibliotecas de JSON mais otimizadas reduzem a diferença ao gravar e ler tudo, e que a diferença do acesso direto vem do formato em colunas. O convite é medir na máquina de cada um com wjsw medir.

Sobre custo de nuvem, memória e servidor, o README não traz número medido. O que existe é o mecanismo: o .jsw é lido por mmap compartilhado entre processos, e a leitura remota parcial baixa só os blocos das linhas pedidas. Disco menor, menos conversão e menos cópia de memória são consequência direta desse desenho. Quem compra servidor decide com a própria medição, não com a de outro.

Por que RAII resolve, e não é detalhe de estilo

RAII é o nome da ideia de amarrar a liberação de um recurso ao tempo de vida de um objeto. No C++, o destruidor do objeto roda quando ele sai de escopo. A referência da linguagem confirma que, ao fim do escopo, o compilador chama os destruidores dos membros na ordem inversa da declaração e depois os das classes base (cppreference, página de destruidor). Ou seja: quem escreve o código não precisa lembrar de fechar nada em cada caminho de saída.

No SDK do jsonW em C++17, arquivo sdk/cpp/jsonw.hpp, isso aparece de forma explícita. A classe jsonw::Leitor abre no construtor e fecha no destrutor. A classe jsonw::Escritor faz o mesmo, e ainda oferece descarregar() e fechar(), onde fechar() troca o arquivo de forma atômica, de modo que o .jsw só aparece completo. Se o construtor falhar, ele lança exceção com a mensagem de erro que veio da biblioteca.

jsonw::Escritor w("vendas.jsw", "id:i64,produto:texto,preco:dinheiro");
w.gravar(R"({"id":1,"produto":"Café especial","preco":"12,50 BRL"})");
w.fechar();

jsonw::Leitor a("vendas.jsw");
for (auto i = 0u; i < a.linhas(); i++) std::cout << a.json(i) << "\n";

O trecho acima é o exemplo que abre o próprio cabeçalho jsonw.hpp. Nenhuma linha chama um abrir solto, nenhuma linha chama fechar no fim do laço: o leitor fecha quando sai de escopo.

flowchart TD
    A["escopo abre"] --> B["Leitor ou Escritor no construtor"]
    B --> C{"a operação deu certo?"}
    C -- sim --> D["gravar ou ler linha a linha"]
    D --> E{"fechar() chamado?"}
    E -- sim --> F["arquivo .jsw publicado inteiro"]
    C -- nao --> G["exceção sai do trecho"]
    G --> H["destrutor roda na saída do escopo"]
    E -- nao --> H
    H --> I["nenhum arquivo fica aberto"]

O que se usa hoje e o que o SDK muda

O caminho mais comum em C++ é abrir o arquivo na mão, escrever, e confiar que todo return do meio lembra de fechar. Quando alguém esquece, o problema aparece dias depois, no processo que não consegue mexer no arquivo. O SDK em C++17 do jsonW troca isso por objeto de escopo, com duas consequências práticas.

A primeira é a custódia. Segundo o README, cada bloco do .jsw carrega marcador, crc32c e hash, e o comando wjsw conferir verifica a cadeia inteira: se algum byte foi trocado, a conferência falha. A segunda é a checagem no lugar certo: conferir() no leitor é um método, chamado quando o time quiser, e não uma cerimônia esquecida no fim do código.

wjsw de-texto "id:i64,produto:texto,preco:dinheiro" vendas.jsonl vendas.jsw
wjsw conferir vendas.jsw

O primeiro comando converte o JSONL para .jsw a partir de um esquema de uma linha. O segundo responde com a contagem de linhas e blocos e a conferência de sha256 e crc32c, como descrito no AGENTS.md do repositório. É a diferença entre acreditar que o arquivo está bom e ter a prova na mão.

Qualidade do dado e liberdade funcional

Para quem decide tecnologia, formato só vale a pena quando evita erro caro. O esquema do jsonW é uma linha de texto, do tipo id:i64,produto:texto,preco:dinheiro, e usa tipos de negócio no lugar de texto para tudo. O preço entra como dinheiro, com a moeda junto do valor. O código de produto entra como codigo, guardado byte a byte, e por isso o zero à esquerda de um CNPJ não some. Peso e volume entram como medida[unidade], convertidos ao gravar. Esses são fatos declarados no README e no AGENTS.md.

A liberdade funcional vem de não trocar de banco. O README lista o wcon, que lê PostgreSQL, MySQL, SQLite, Redis e MongoDB para um .jsw e volta, com o esquema tirado do tipo de cada coluna. Quem já tem PostgreSQL continua com ele. O jsonW entra como a camada de arquivo e de leitura rápida, no lugar do CSV ou do JSONL que sobra no meio do processo.

Em C++17, o SDK não pede reescrita do sistema: é um cabeçalho sobre a ABI C da biblioteca. O núcleo é C sem dependência, o que mantém a cadeia de build enxuta e o binário pequeno, sem arrastar runtime extra para dentro do servidor.

Como resolver passo a passo

1. Escolha um conjunto e um esquema. Comece por uma tabela que já dá dor: pedidos, notas fiscais, eventos. Escreva o esquema com o tipo de negócio de cada coluna, sem transformar CPF em número nem preço em texto.

2. Exporte com o wcon. O esquema sai do banco, não da cabeça de alguém. O README documenta a credencial sempre em arquivo, com a senha do PostgreSQL vindo de PGPASSWORD ou de ~/.pgpass, nunca na linha de comando.

3. Confira. Rode wjsw conferir e depois wjsw medir na própria máquina. A medição de 100 mil registros do README serve de referência, não de promessa.

4. Troque o acesso no C++. Onde havia fluxo de arquivo aberto na mão, entra jsonw::Leitor. Onde havia gravação no meio do processo, entra jsonw::Escritor, com fechar() no fim e o destrutor cobrindo o caminho de exceção.

5. Revise credencial e comando. A lição da notícia da Apiiro vale aqui também: senha não se escreve em comando, e arquivo local com segredo não pode ir para o repositório.

A leitura da Wortic é que o ganho não está em trocar a linguagem, e sim em parar de converter o mesmo dado quatro vezes entre o banco, o arquivo e a API. O SDK em C++17 dá a esse caminho o que o C++ já domina: o tempo de vida do recurso dentro do escopo.

Onde a Wortic entra

A Wortic mantém o jsonW e roda nele os seus sistemas de gestão com IA. O SDK em C++17 é uma das dez linguagens atendidas pela mesma ABI C, todas passando pela mesma prova byte a byte (cd sdk && bash prova.sh). Para quem precisa de um acordo comercial, outra plataforma ou suporte na migração de um conjunto de dados, o contato está no site da Wortic.

Para começar, o repositório é público: github.com/developer-wortic/jsonw. A apresentação do formato está em jsonw.org, e as regras para times e para agentes de código estão no AGENTS.md do próprio repositório.

Perguntas frequentes

O SDK em C++ do jsonW exige compilador muito novo?

O cabeçalho é declarado para C++17. Ele é um invólucro fino sobre a ABI C da biblioteca, então o requisito principal é o padrão da linguagem, e não um framework. O arquivo sdk/cpp/jsonw.hpp está no repositório.

O que acontece se o programa cair no meio da gravação?

O README diz que o .jsw só anexa e que cada bloco se sustenta com marcador, crc32c e hash. Se a gravação for cortada, perde-se só o último bloco, e wjsw reparar refaz o fim. Além disso, o fechar() do escritor troca o arquivo de forma atômica.

O jsonW guarda a senha do banco em algum lugar?

Segundo o README e o AGENTS.md, a credencial fica em arquivo ou em variável de ambiente lida pela ferramenta, nunca na linha de comando. O jsonW não é um gerenciador de segredos: a recomendação de guardar a senha num cofre e referenciar por variável continua valendo.

Dá para ler o arquivo pela metade, sem carregar tudo na memória?

Sim, é o desenho do formato. O .jsw é organizado em blocos por coluna e lido por mmap sem cópia, e a leitura de um campo não exige decodificar o resto da linha. O README também descreve a leitura paralela por bloco.

A medição de 4,9 vezes menor vale para qualquer dado?

Não. O README declara a medição com 100 mil registros, contra o mesmo conjunto em JSONL lido pelo leitor de JSON do próprio projeto, e avisa que bibliotecas de JSON mais otimizadas diminuem a diferença ao gravar e ler tudo. A orientação do próprio projeto é medir com wjsw medir no dado de cada empresa.

Preciso parar de usar o PostgreSQL para usar o jsonW?

Não. O jsonW se apresenta como camada de arquivo e de leitura ao lado do banco. O wcon exporta do PostgreSQL para .jsw e grava de volta numa transação, com COPY binário, segundo o README.

Por que usar RAII no acesso ao arquivo e não só fechar no fim da função?

Porque o fim da função não é o único caminho de saída. Quando uma exceção sai do trecho, o fluxo no meio é abandonado, e o objeto de escopo é destruído mesmo assim, chamando o fechamento. A referência da linguagem confirma que os destruidores rodam na saída do escopo, na ordem inversa da declaração.

O jsonW faz parte dos sistemas da Wortic?

Sim. Segundo o README, o jsonW é mantido pela Wortic, que roda nele o índice dos seus agentes, os seus modelos de IA e a borda da sua infraestrutura. É a mesma equipe que entrega os sistemas de gestão com IA.

Fontes

Perguntas frequentes

O que é RAII no C++ e por que usar no acesso a arquivo?

RAII amarra a liberação de um recurso ao tempo de vida de um objeto: o arquivo é aberto no construtor da classe e fechado no destrutor. Como o destruidor roda quando o objeto sai de escopo, inclusive quando uma exceção interrompe o trecho, o arquivo não fica aberto. É o que o SDK em C++17 do jsonW faz com jsonw::Leitor e jsonw::Escritor, e a documentação está no repositório developer-wortic/jsonw.

Como ler um arquivo .jsw em C++17?

Use jsonw::Leitor do cabeçalho sdk/cpp/jsonw.hpp. Basta abrir com o caminho do arquivo, consultar linhas() e ler cada linha com json(), que devolve o JSON da linha. O leitor fecha sozinho no fim do escopo, e o método conferir() valida a custódia do arquivo. O repositório developer-wortic/jsonw traz o exemplo completo.

O que acontece se o programa travar no meio da gravação de um .jsw?

Segundo o README do jsonW, o arquivo só anexa e cada bloco se sustenta com marcador, crc32c e hash. Uma gravação cortada perde apenas o último bloco, e o comando wjsw reparar refaz o fim. O fechar() do escritor também troca o arquivo de forma atômica, para que só apareça completo.

O SDK do jsonW em C++ precisa de dependências externas?

Não. O núcleo da biblioteca é C sem dependência, e o cabeçalho C++17 é um invólucro fino sobre a ABI C, conforme o README do projeto. Isso mantém a cadeia de build enxuta e evita runtime extra no servidor.

Quanto o jsonW economiza de disco e de velocidade?

O README declara duas medições com 100 mil registros, comparando com o mesmo conjunto em JSONL lido pelo próprio leitor de JSON do projeto: arquivo 4,9 vezes menor e leitura de um campo 3.281 vezes mais rápida. O projeto avisa que bibliotecas de JSON mais otimizadas reduzem a diferença e recomenda medir na própria máquina com wjsw medir.

Senha do banco pode ir na linha de comando ao exportar com o wcon?

Não. O README e o AGENTS.md do jsonW orientam manter a credencial em arquivo ou variável de ambiente: no PostgreSQL, a senha vem de PGPASSWORD ou de ~/.pgpass, e nos outros bancos o arquivo de credencial é indicado por variável. A lição vale para qualquer ferramenta, como mostra o caso de credenciais expostas em repositórios públicos relatado pela Apiiro.

Preciso trocar o PostgreSQL para usar o jsonW num sistema em C++?

Não. O jsonW funciona ao lado do banco: o wcon exporta do PostgreSQL para um arquivo .jsw e grava de volta numa transação, com o esquema tirado do tipo de cada coluna. O C++ passa a ler o .jsw pelo SDK, e a Wortic mantém o projeto em jsonw.org.

Como o jsonW evita que o preço vire texto e o CPF perca o zero?

O esquema usa tipos de negócio: dinheiro guarda o valor com a moeda ISO, decimal guarda valor exato sem passar por ponto flutuante e codigo guarda bytes exatos, então o zero à esquerda de um CNPJ permanece. A regra está no README e no AGENTS.md do jsonW, mantido pela Wortic.

Fontes

Conheça: jsonW em C++17.

Quer isso funcionando na sua empresa?

Um consultor da Wortic olha o seu caso e mostra o caminho, sem compromisso.

Falar com um consultor

Equipe editorial

Equipe editorial da Wortic especializada em automacao, IA, ERP, CRM e crescimento operacional.

  • Automacao com IA
  • Gestao empresarial
  • CRM
  • ERP
  • Marketing digital

Isso funcionando no seu negócio.

Um consultor mostra o sistema do seu ramo, com a IA dentro.