<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 --> <p>The Geode Zig client library (<code>geode-client-zig</code>) provides a production-ready, native Zig interface for connecting to Geode graph databases. Built with Zig&rsquo;s focus on performance and correctness, it offers low-level QUIC protocol access while maintaining ergonomic APIs through fluent query builders and comprehensive type support.</p> <p>The Zig client is designed for systems programmers and performance-critical applications where memory safety, predictable performance, and minimal runtime overhead are essential. With native QUIC+TLS 1.3 transport and zero-copy optimizations where possible, it delivers sub-millisecond query latency.</p> <h3 id="key-features" class="position-relative d-flex align-items-center group"> <span>Key Features</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="key-features" aria-haspopup="dialog" aria-label="Share link: Key Features"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script><p><strong>QUIC + TLS 1.3</strong>: Native QUIC transport with mandatory TLS 1.3 for secure, high-performance connections.</p> <p><strong>Full GQL Type System</strong>: 15+ value types including temporal and graph types with type-safe accessors.</p> <p><strong>Fluent Query Builders</strong>: Type-safe query construction with <code>QueryBuilder</code>, <code>PatternBuilder</code>, and <code>PredicateBuilder</code>.</p> <p><strong>Connection Pooling</strong>: Configurable pooling with health checks and automatic connection management.</p> <p><strong>ISO GQL Status Codes</strong>: Standardized error handling with proper status code categorization.</p> <p><strong>DSN Parsing</strong>: Flexible connection configuration through Data Source Name strings.</p> <p><strong>Input Validation</strong>: Robust security with comprehensive input validation utilities.</p> <p><strong>Memory Safety</strong>: Proper allocation/deallocation with <code>errdefer</code> and <code>defer</code> patterns.</p> <h3 id="requirements" class="position-relative d-flex align-items-center group"> <span>Requirements</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="requirements" aria-haspopup="dialog" aria-label="Share link: Requirements"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Zig 0.1.0 or later</li> <li>OpenSSL (for TLS support on Linux)</li> <li>Running Geode server</li> </ul> <h3 id="installation" class="position-relative d-flex align-items-center group"> <span>Installation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="installation" aria-haspopup="dialog" aria-label="Share link: Installation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Add to your <code>build.zig.zon</code>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="p">.</span><span class="n">dependencies</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">geode_client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">url</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;https://gitlab.com/devnw/geode/geode-client-zig/-/archive/main/geode-client-zig-main.tar.gz&#34;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Add hash after first build attempt </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">},</span><span class="w"> </span></span></span></code></pre></div><p>Then in <code>build.zig</code>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">geode_client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">dependency</span><span class="p">(</span><span class="s">&#34;geode_client&#34;</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">target</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">target</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">optimize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">optimize</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">exe</span><span class="p">.</span><span class="n">root_module</span><span class="p">.</span><span class="n">addImport</span><span class="p">(</span><span class="s">&#34;geode_client&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">geode_client</span><span class="p">.</span><span class="n">module</span><span class="p">(</span><span class="s">&#34;geode_client&#34;</span><span class="p">));</span><span class="w"> </span></span></span></code></pre></div> <h3 id="quick-start" class="position-relative d-flex align-items-center group"> <span>Quick Start</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="quick-start" aria-haspopup="dialog" aria-label="Share link: Quick Start"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">std</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;std&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">geode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;geode_client&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">gpa</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">heap</span><span class="p">.</span><span class="n">GeneralPurposeAllocator</span><span class="p">(.{}){};</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gpa</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gpa</span><span class="p">.</span><span class="n">allocator</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Create client </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;localhost&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">3141</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Connect </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">openStream</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Send handshake </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendHello</span><span class="p">(</span><span class="s">&#34;my-app&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;1.0.0&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">response</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">response</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Execute query </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendQuery</span><span class="p">(</span><span class="s">&#34;MATCH (n:Person) RETURN n.name, n.age&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">result</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">debug</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Result: {s}</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="n">result</span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w"> </span></span></span></code></pre></div> <h3 id="configuration" class="position-relative d-flex align-items-center group"> <span>Configuration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="configuration" aria-haspopup="dialog" aria-label="Share link: Configuration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="config-structure" class="position-relative d-flex align-items-center group"> <span>Config Structure</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="config-structure" aria-haspopup="dialog" aria-label="Share link: Config Structure"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Configuration for client connections:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">Config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;config&#34;</span><span class="p">).</span><span class="n">Config</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">var</span><span class="w"> </span><span class="n">cfg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Config</span><span class="p">.</span><span class="n">init</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cfg</span><span class="p">.</span><span class="n">withHost</span><span class="p">(</span><span class="s">&#34;localhost&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cfg</span><span class="p">.</span><span class="n">withPort</span><span class="p">(</span><span class="mi">3141</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cfg</span><span class="p">.</span><span class="n">withCredentials</span><span class="p">(</span><span class="s">&#34;admin&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;secret&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cfg</span><span class="p">.</span><span class="n">withInsecure</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cfg</span><span class="p">.</span><span class="n">withPageSize</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cfg</span><span class="p">.</span><span class="n">withTimeout</span><span class="p">(</span><span class="mi">60000</span><span class="p">);</span><span class="w"> </span></span></span></code></pre></div> <h4 id="configuration-options" class="position-relative d-flex align-items-center group"> <span>Configuration Options</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="configuration-options" aria-haspopup="dialog" aria-label="Share link: Configuration Options"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Option</th> <th>Type</th> <th>Default</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>host</code></td> <td><code>[]const u8</code></td> <td><code>&quot;localhost&quot;</code></td> <td>Server hostname</td> </tr> <tr> <td><code>port</code></td> <td><code>u16</code></td> <td><code>3141</code></td> <td>Server port</td> </tr> <tr> <td><code>username</code></td> <td><code>?[]const u8</code></td> <td><code>null</code></td> <td>Authentication username</td> </tr> <tr> <td><code>password</code></td> <td><code>?[]const u8</code></td> <td><code>null</code></td> <td>Authentication password</td> </tr> <tr> <td><code>insecure</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Skip TLS verification</td> </tr> <tr> <td><code>page_size</code></td> <td><code>u32</code></td> <td><code>1000</code></td> <td>Result pagination size</td> </tr> <tr> <td><code>timeout_ms</code></td> <td><code>u32</code></td> <td><code>30000</code></td> <td>Connection timeout (ms)</td> </tr> </tbody> </table> <h4 id="dsn-parsing" class="position-relative d-flex align-items-center group"> <span>DSN Parsing</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="dsn-parsing" aria-haspopup="dialog" aria-label="Share link: DSN Parsing"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Parse connection strings in various formats:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">parseDSN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;config&#34;</span><span class="p">).</span><span class="n">parseDSN</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// URL format with credentials </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">cfg1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">parseDSN</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;quic://admin:secret@localhost:3141?insecure_tls_skip_verify=true&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">cfg1</span><span class="p">.</span><span class="n">deinit</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Simple format </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">cfg2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">parseDSN</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;localhost:8443&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">cfg2</span><span class="p">.</span><span class="n">deinit</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// With query parameters </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">cfg3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">parseDSN</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;db.example.com:3141?page_size=500&amp;timeout=60000&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">cfg3</span><span class="p">.</span><span class="n">deinit</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span></code></pre></div> <h4 id="supported-query-parameters" class="position-relative d-flex align-items-center group"> <span>Supported Query Parameters</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="supported-query-parameters" aria-haspopup="dialog" aria-label="Share link: Supported Query Parameters"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Parameter</th> <th>Aliases</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>insecure_tls_skip_verify</code></td> <td>-</td> <td>Skip TLS verification</td> </tr> <tr> <td><code>page_size</code></td> <td><code>pageSize</code></td> <td>Result page size</td> </tr> <tr> <td><code>timeout</code></td> <td><code>timeout_ms</code></td> <td>Connection timeout</td> </tr> <tr> <td><code>username</code></td> <td><code>user</code></td> <td>Authentication username</td> </tr> <tr> <td><code>password</code></td> <td><code>pass</code></td> <td>Authentication password</td> </tr> </tbody> </table> <h3 id="value-types" class="position-relative d-flex align-items-center group"> <span>Value Types</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="value-types" aria-haspopup="dialog" aria-label="Share link: Value Types"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>The <code>Value</code> type supports all GQL value types:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">Value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;types&#34;</span><span class="p">).</span><span class="n">Value</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Primitive types </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">null_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initNull</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">bool_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initBool</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">int_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initInt</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">float_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initFloat</span><span class="p">(</span><span class="mf">3.14159</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">str_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initString</span><span class="p">(</span><span class="s">&#34;hello&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">bytes_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initBytes</span><span class="p">(</span><span class="o">&amp;</span><span class="p">[</span><span class="n">_</span><span class="p">]</span><span class="kt">u8</span><span class="p">{</span><span class="mh">0x01</span><span class="p">,</span><span class="w"> </span><span class="mh">0x02</span><span class="p">,</span><span class="w"> </span><span class="mh">0x03</span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Temporal types </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initDate</span><span class="p">(</span><span class="mi">2025</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">24</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">time</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initTime</span><span class="p">(</span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="mi">45</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">timestamp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initTimestamp</span><span class="p">(</span><span class="n">date</span><span class="p">.</span><span class="n">date</span><span class="p">,</span><span class="w"> </span><span class="n">time</span><span class="p">.</span><span class="n">time</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Collections </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">arr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initArray</span><span class="p">(</span><span class="o">&amp;</span><span class="p">[</span><span class="n">_</span><span class="p">]</span><span class="n">Value</span><span class="p">{</span><span class="w"> </span><span class="n">int_val</span><span class="p">,</span><span class="w"> </span><span class="n">str_val</span><span class="w"> </span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Type checking </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">int_val</span><span class="p">.</span><span class="n">isInt</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">int_val</span><span class="p">.</span><span class="n">asInt</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">debug</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Integer value: {}</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="n">i</span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// JSON conversion </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">value</span><span class="p">.</span><span class="n">toJson</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">json</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">back</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">fromJson</span><span class="p">(</span><span class="n">json</span><span class="p">.</span><span class="n">value</span><span class="p">);</span><span class="w"> </span></span></span></code></pre></div> <h4 id="supported-types" class="position-relative d-flex align-items-center group"> <span>Supported Types</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="supported-types" aria-haspopup="dialog" aria-label="Share link: Supported Types"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Type</th> <th>Constructor</th> <th>Accessor</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>null</code></td> <td><code>initNull()</code></td> <td><code>isNull()</code></td> <td>Null value</td> </tr> <tr> <td><code>boolean</code></td> <td><code>initBool(bool)</code></td> <td><code>asBool()</code></td> <td>Boolean</td> </tr> <tr> <td><code>integer</code></td> <td><code>initInt(i64)</code></td> <td><code>asInt()</code></td> <td>64-bit integer</td> </tr> <tr> <td><code>float</code></td> <td><code>initFloat(f64)</code></td> <td><code>asFloat()</code></td> <td>64-bit float</td> </tr> <tr> <td><code>string</code></td> <td><code>initString([]const u8)</code></td> <td><code>asString()</code></td> <td>UTF-8 string</td> </tr> <tr> <td><code>bytes</code></td> <td><code>initBytes([]const u8)</code></td> <td><code>asBytes()</code></td> <td>Binary data</td> </tr> <tr> <td><code>array</code></td> <td><code>initArray([]Value)</code></td> <td><code>asArray()</code></td> <td>Array of values</td> </tr> <tr> <td><code>object</code></td> <td>-</td> <td><code>asObject()</code></td> <td>Key-value map</td> </tr> <tr> <td><code>date</code></td> <td><code>initDate(year, month, day)</code></td> <td><code>asDate()</code></td> <td>Date</td> </tr> <tr> <td><code>time</code></td> <td><code>initTime(hour, min, sec)</code></td> <td><code>asTime()</code></td> <td>Time</td> </tr> <tr> <td><code>timestamp</code></td> <td><code>initTimestamp(date, time)</code></td> <td><code>asTimestamp()</code></td> <td>Date + time</td> </tr> <tr> <td><code>duration</code></td> <td><code>initDuration(days, secs)</code></td> <td><code>asDuration()</code></td> <td>Duration</td> </tr> <tr> <td><code>node</code></td> <td>-</td> <td><code>asNode()</code></td> <td>Graph node</td> </tr> <tr> <td><code>relationship</code></td> <td>-</td> <td><code>asRelationship()</code></td> <td>Graph edge</td> </tr> <tr> <td><code>path</code></td> <td>-</td> <td><code>asPath()</code></td> <td>Graph path</td> </tr> </tbody> </table> <h3 id="query-builder" class="position-relative d-flex align-items-center group"> <span>Query Builder</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="query-builder" aria-haspopup="dialog" aria-label="Share link: Query Builder"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Build GQL queries programmatically with type safety:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">QueryBuilder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;query_builder&#34;</span><span class="p">).</span><span class="n">QueryBuilder</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">var</span><span class="w"> </span><span class="n">qb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">QueryBuilder</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">match</span><span class="p">(</span><span class="s">&#34;(p:Person)&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">where</span><span class="p">(</span><span class="s">&#34;p.age &gt;= $minAge&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">ret</span><span class="p">(</span><span class="s">&#34;p.name, p.age&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">orderBy</span><span class="p">(</span><span class="s">&#34;p.name&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">limit</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">param</span><span class="p">(</span><span class="s">&#34;minAge&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">Value</span><span class="p">.</span><span class="n">initInt</span><span class="p">(</span><span class="mi">21</span><span class="p">));</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">query</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">build</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">query</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Result: &#34;MATCH (p:Person) WHERE p.age &gt;= $minAge RETURN p.name, p.age ORDER BY p.name LIMIT 10&#34; </span></span></span></code></pre></div> <h4 id="available-clauses" class="position-relative d-flex align-items-center group"> <span>Available Clauses</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="available-clauses" aria-haspopup="dialog" aria-label="Share link: Available Clauses"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Method</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>match(pattern)</code></td> <td>MATCH clause</td> </tr> <tr> <td><code>optionalMatch(pattern)</code></td> <td>OPTIONAL MATCH clause</td> </tr> <tr> <td><code>where(condition)</code></td> <td>WHERE clause</td> </tr> <tr> <td><code>with(expressions)</code></td> <td>WITH clause</td> </tr> <tr> <td><code>ret(expressions)</code></td> <td>RETURN clause</td> </tr> <tr> <td><code>orderBy(expressions)</code></td> <td>ORDER BY clause</td> </tr> <tr> <td><code>skip(n)</code></td> <td>SKIP clause</td> </tr> <tr> <td><code>limit(n)</code></td> <td>LIMIT clause</td> </tr> <tr> <td><code>create(pattern)</code></td> <td>CREATE clause</td> </tr> <tr> <td><code>merge(pattern)</code></td> <td>MERGE clause</td> </tr> <tr> <td><code>delete(expressions)</code></td> <td>DELETE clause</td> </tr> <tr> <td><code>detachDelete(expressions)</code></td> <td>DETACH DELETE clause</td> </tr> <tr> <td><code>set(assignments)</code></td> <td>SET clause</td> </tr> <tr> <td><code>remove(items)</code></td> <td>REMOVE clause</td> </tr> <tr> <td><code>raw(clause)</code></td> <td>Raw GQL clause</td> </tr> <tr> <td><code>param(name, value)</code></td> <td>Add parameter</td> </tr> </tbody> </table> <h3 id="pattern-builder" class="position-relative d-flex align-items-center group"> <span>Pattern Builder</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="pattern-builder" aria-haspopup="dialog" aria-label="Share link: Pattern Builder"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Build graph patterns for MATCH clauses:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">PatternBuilder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;query_builder&#34;</span><span class="p">).</span><span class="n">PatternBuilder</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">var</span><span class="w"> </span><span class="n">pb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PatternBuilder</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">nodeLabel</span><span class="p">(</span><span class="s">&#34;a&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Person&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">edgeRight</span><span class="p">(</span><span class="s">&#34;KNOWS&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">nodeLabel</span><span class="p">(</span><span class="s">&#34;b&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Person&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">pattern</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">build</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Result: &#34;(a:Person)-[:KNOWS]-&gt;(b:Person)&#34; </span></span></span></code></pre></div> <h4 id="pattern-methods" class="position-relative d-flex align-items-center group"> <span>Pattern Methods</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="pattern-methods" aria-haspopup="dialog" aria-label="Share link: Pattern Methods"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Method</th> <th>Description</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td><code>nodeVar(name)</code></td> <td>Node with variable</td> <td><code>(n)</code></td> </tr> <tr> <td><code>nodeLabel(var, label)</code></td> <td>Node with label</td> <td><code>(n:Person)</code></td> </tr> <tr> <td><code>edgeRight(type)</code></td> <td>Outgoing edge</td> <td><code>-[:KNOWS]-&gt;</code></td> </tr> <tr> <td><code>edgeLeft(type)</code></td> <td>Incoming edge</td> <td><code>&lt;-[:KNOWS]-</code></td> </tr> <tr> <td><code>relRight(var, type, props)</code></td> <td>Outgoing with var</td> <td><code>-[r:KNOWS]-&gt;</code></td> </tr> <tr> <td><code>relLeft(var, type, props)</code></td> <td>Incoming with var</td> <td><code>&lt;-[r:KNOWS]-</code></td> </tr> <tr> <td><code>relUndirected(var, type, props)</code></td> <td>Undirected edge</td> <td><code>-[:CONNECTED]-</code></td> </tr> </tbody> </table> <h3 id="predicate-builder" class="position-relative d-flex align-items-center group"> <span>Predicate Builder</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="predicate-builder" aria-haspopup="dialog" aria-label="Share link: Predicate Builder"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Build WHERE conditions:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">PredicateBuilder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;query_builder&#34;</span><span class="p">).</span><span class="n">PredicateBuilder</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">var</span><span class="w"> </span><span class="n">pb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PredicateBuilder</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">gt</span><span class="p">(</span><span class="s">&#34;n.age&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;minAge&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">andOp</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">isNotNull</span><span class="p">(</span><span class="s">&#34;n.email&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">orOp</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="s">&#34;n.name&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;searchTerm&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">predicate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pb</span><span class="p">.</span><span class="n">build</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">predicate</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Result: &#34;n.age &gt; $minAge AND n.email IS NOT NULL OR n.name CONTAINS $searchTerm&#34; </span></span></span></code></pre></div> <h4 id="predicate-methods" class="position-relative d-flex align-items-center group"> <span>Predicate Methods</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="predicate-methods" aria-haspopup="dialog" aria-label="Share link: Predicate Methods"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Method</th> <th>Description</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td><code>eq(prop, param)</code></td> <td>Equals</td> <td><code>n.x = $param</code></td> </tr> <tr> <td><code>neq(prop, param)</code></td> <td>Not equals</td> <td><code>n.x &lt;&gt; $param</code></td> </tr> <tr> <td><code>lt(prop, param)</code></td> <td>Less than</td> <td><code>n.x &lt; $param</code></td> </tr> <tr> <td><code>lte(prop, param)</code></td> <td>Less or equal</td> <td><code>n.x &lt;= $param</code></td> </tr> <tr> <td><code>gt(prop, param)</code></td> <td>Greater than</td> <td><code>n.x &gt; $param</code></td> </tr> <tr> <td><code>gte(prop, param)</code></td> <td>Greater or equal</td> <td><code>n.x &gt;= $param</code></td> </tr> <tr> <td><code>isNull(prop)</code></td> <td>Is null</td> <td><code>n.x IS NULL</code></td> </tr> <tr> <td><code>isNotNull(prop)</code></td> <td>Is not null</td> <td><code>n.x IS NOT NULL</code></td> </tr> <tr> <td><code>contains(prop, param)</code></td> <td>Contains string</td> <td><code>n.x CONTAINS $param</code></td> </tr> <tr> <td><code>startsWith(prop, param)</code></td> <td>Starts with</td> <td><code>n.x STARTS WITH $param</code></td> </tr> <tr> <td><code>endsWith(prop, param)</code></td> <td>Ends with</td> <td><code>n.x ENDS WITH $param</code></td> </tr> <tr> <td><code>in(prop, param)</code></td> <td>In list</td> <td><code>n.x IN $param</code></td> </tr> <tr> <td><code>andOp()</code></td> <td>AND operator</td> <td><code>AND</code></td> </tr> <tr> <td><code>orOp()</code></td> <td>OR operator</td> <td><code>OR</code></td> </tr> <tr> <td><code>raw(text)</code></td> <td>Raw predicate</td> <td>Custom text</td> </tr> </tbody> </table> <h3 id="connection-pool" class="position-relative d-flex align-items-center group"> <span>Connection Pool</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="connection-pool" aria-haspopup="dialog" aria-label="Share link: Connection Pool"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Manage connection pools for high-throughput workloads:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">Pool</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;pool&#34;</span><span class="p">).</span><span class="n">Pool</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">PoolConfig</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;pool&#34;</span><span class="p">).</span><span class="n">PoolConfig</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">var</span><span class="w"> </span><span class="n">pool_cfg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PoolConfig</span><span class="p">.</span><span class="n">init</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pool_cfg</span><span class="p">.</span><span class="n">withMinSize</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pool_cfg</span><span class="p">.</span><span class="n">withMaxSize</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pool_cfg</span><span class="p">.</span><span class="n">withAcquireTimeout</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pool_cfg</span><span class="p">.</span><span class="n">withIdleTimeout</span><span class="p">(</span><span class="mi">300000</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">var</span><span class="w"> </span><span class="n">pool</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pool</span><span class="p">(</span><span class="n">ConnectionType</span><span class="p">).</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="n">client_config</span><span class="p">,</span><span class="w"> </span><span class="n">pool_cfg</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">pool</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Acquire connection </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">conn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">pool</span><span class="p">.</span><span class="n">acquire</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">pool</span><span class="p">.</span><span class="n">release</span><span class="p">(</span><span class="n">conn</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Use connection... </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Get statistics </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">stats</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pool</span><span class="p">.</span><span class="n">getStats</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">std</span><span class="p">.</span><span class="n">debug</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Active: {}, Idle: {}</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">stats</span><span class="p">.</span><span class="n">active_connections</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">stats</span><span class="p">.</span><span class="n">idle_connections</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">});</span><span class="w"> </span></span></span></code></pre></div> <h4 id="pool-configuration" class="position-relative d-flex align-items-center group"> <span>Pool Configuration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="pool-configuration" aria-haspopup="dialog" aria-label="Share link: Pool Configuration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Option</th> <th>Type</th> <th>Default</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>min_size</code></td> <td><code>u32</code></td> <td><code>1</code></td> <td>Minimum pool size</td> </tr> <tr> <td><code>max_size</code></td> <td><code>u32</code></td> <td><code>10</code></td> <td>Maximum pool size</td> </tr> <tr> <td><code>acquire_timeout_ms</code></td> <td><code>u32</code></td> <td><code>30000</code></td> <td>Timeout for acquiring connection</td> </tr> <tr> <td><code>idle_timeout_ms</code></td> <td><code>u32</code></td> <td><code>300000</code></td> <td>Idle connection timeout</td> </tr> <tr> <td><code>health_check_interval_ms</code></td> <td><code>u32</code></td> <td><code>30000</code></td> <td>Health check interval</td> </tr> </tbody> </table> <h3 id="input-validation" class="position-relative d-flex align-items-center group"> <span>Input Validation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="input-validation" aria-haspopup="dialog" aria-label="Share link: Input Validation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Validate user input for security:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">validate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;validate&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Validate query string </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">try</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="s">&#34;MATCH (n) RETURN n&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Validate parameter name </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">try</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">paramName</span><span class="p">(</span><span class="s">&#34;myParam&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Validate hostname </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">try</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">hostname</span><span class="p">(</span><span class="s">&#34;db.example.com&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Validate port </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">try</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">port</span><span class="p">(</span><span class="mi">3141</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Validate page size (1-100,000) </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">try</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">pageSize</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Check IP addresses </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">is_v4</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">ipv4</span><span class="p">(</span><span class="s">&#34;192.168.1.1&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">is_v6</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">isIpv6</span><span class="p">(</span><span class="s">&#34;::1&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Sanitize input (removes control characters) </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">clean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">validate</span><span class="p">.</span><span class="n">sanitize</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;input</span><span class="se">\x00</span><span class="s">with</span><span class="se">\x01</span><span class="s">control</span><span class="se">\x02</span><span class="s">chars&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">clean</span><span class="p">);</span><span class="w"> </span></span></span></code></pre></div> <h4 id="validation-errors" class="position-relative d-flex align-items-center group"> <span>Validation Errors</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="validation-errors" aria-haspopup="dialog" aria-label="Share link: Validation Errors"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Error</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>QueryEmpty</code></td> <td>Query string is empty</td> </tr> <tr> <td><code>QueryTooLong</code></td> <td>Query exceeds 1MB limit</td> </tr> <tr> <td><code>QueryContainsNull</code></td> <td>Query contains null bytes</td> </tr> <tr> <td><code>ParamNameEmpty</code></td> <td>Parameter name is empty</td> </tr> <tr> <td><code>ParamNameInvalid</code></td> <td>Invalid parameter name format</td> </tr> <tr> <td><code>ParamNameTooLong</code></td> <td>Parameter name exceeds 256 chars</td> </tr> <tr> <td><code>HostnameEmpty</code></td> <td>Hostname is empty</td> </tr> <tr> <td><code>HostnameInvalid</code></td> <td>Invalid hostname characters</td> </tr> <tr> <td><code>HostnameTooLong</code></td> <td>Hostname exceeds 253 chars</td> </tr> <tr> <td><code>PortOutOfRange</code></td> <td>Port not in 1-65535 range</td> </tr> <tr> <td><code>PageSizeOutOfRange</code></td> <td>Page size not in 1-100,000 range</td> </tr> </tbody> </table> <h3 id="error-handling" class="position-relative d-flex align-items-center group"> <span>Error Handling</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="error-handling" aria-haspopup="dialog" aria-label="Share link: Error Handling"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>The client uses ISO GQL status codes:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">GeodeError</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">&#34;error&#34;</span><span class="p">).</span><span class="n">GeodeError</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Create errors </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">conn_err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GeodeError</span><span class="p">.</span><span class="n">connection</span><span class="p">(</span><span class="s">&#34;connection refused&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">syntax_err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GeodeError</span><span class="p">.</span><span class="n">syntax</span><span class="p">(</span><span class="s">&#34;unexpected token at position 42&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">query_err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GeodeError</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="s">&#34;invalid property access&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;22003&#34;</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Check error properties </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">err</span><span class="p">.</span><span class="n">isRetryable</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Retry the operation </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Get status category </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">category</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">err</span><span class="p">.</span><span class="n">statusCategory</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">category</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">connection</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Handle connection error </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">syntax_error</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Handle syntax error </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">data_exception</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Handle data error </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="n">transaction</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Handle transaction error </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Handle other errors </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Get formatted message </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="p">.</span><span class="n">debug</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Error: {s}</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="n">err</span><span class="p">.</span><span class="n">message</span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">std</span><span class="p">.</span><span class="n">debug</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Code: {s}</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="n">err</span><span class="p">.</span><span class="n">status_code</span><span class="p">});</span><span class="w"> </span></span></span></code></pre></div> <h4 id="status-code-categories" class="position-relative d-flex align-items-center group"> <span>Status Code Categories</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="status-code-categories" aria-haspopup="dialog" aria-label="Share link: Status Code Categories"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Code Range</th> <th>Category</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>00xxx</code></td> <td>Success</td> <td>Operation succeeded</td> </tr> <tr> <td><code>08xxx</code></td> <td>Connection</td> <td>Connection errors</td> </tr> <tr> <td><code>22xxx</code></td> <td>Data</td> <td>Data exceptions</td> </tr> <tr> <td><code>25xxx</code></td> <td>Transaction</td> <td>Transaction state errors</td> </tr> <tr> <td><code>28xxx</code></td> <td>Authorization</td> <td>Auth errors</td> </tr> <tr> <td><code>42xxx</code></td> <td>Syntax</td> <td>Query syntax errors</td> </tr> </tbody> </table> <h3 id="wire-protocol" class="position-relative d-flex align-items-center group"> <span>Wire Protocol</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="wire-protocol" aria-haspopup="dialog" aria-label="Share link: Wire Protocol"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>The client uses Protobuf wire protocol over QUIC:</p> <p><strong>Client Messages:</strong></p> <ul> <li><code>HELLO</code> - Connection handshake</li> <li><code>RUN_GQL</code> - Execute GQL query</li> <li><code>PULL</code> - Fetch results</li> <li><code>BEGIN</code>/<code>COMMIT</code>/<code>ROLLBACK</code> - Transaction control</li> <li><code>PING</code> - Keep-alive</li> </ul> <p><strong>Server Responses:</strong></p> <ul> <li><code>HELLO_ACK</code> - Handshake acknowledgment</li> <li><code>SCHEMA</code> - Query schema</li> <li><code>BINDINGS</code> - Result rows</li> <li><code>ERROR</code> - Error details</li> <li><code>SUCCESS</code> - Operation success</li> </ul> <h3 id="performance" class="position-relative d-flex align-items-center group"> <span>Performance</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="performance" aria-haspopup="dialog" aria-label="Share link: Performance"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>The client is optimized for high performance:</p> <ul> <li><strong>Connection establishment</strong>: ~2ms with connection pooling</li> <li><strong>Query execution</strong>: &lt;1ms for simple queries</li> <li><strong>Value serialization</strong>: Nanosecond-level JSON conversion</li> <li><strong>Memory efficiency</strong>: Zero-copy where possible</li> </ul> <h4 id="quic-system-optimizations" class="position-relative d-flex align-items-center group"> <span>QUIC System Optimizations</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="quic-system-optimizations" aria-haspopup="dialog" aria-label="Share link: QUIC System Optimizations"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>For optimal throughput, configure UDP buffer sizes at the OS level.</p> <p><strong>Linux:</strong></p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo sysctl -w net.core.rmem_max<span class="o">=</span><span class="m">7340032</span> </span></span><span class="line"><span class="cl">sudo sysctl -w net.core.wmem_max<span class="o">=</span><span class="m">7340032</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Persist across reboots</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;net.core.rmem_max=7340032&#34;</span> <span class="p">|</span> sudo tee -a /etc/sysctl.d/99-geode-quic.conf </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;net.core.wmem_max=7340032&#34;</span> <span class="p">|</span> sudo tee -a /etc/sysctl.d/99-geode-quic.conf </span></span></code></pre></div><p><strong>BSD/macOS:</strong></p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo sysctl -w kern.ipc.maxsockbuf<span class="o">=</span><span class="m">8441037</span> </span></span></code></pre></div><p><strong>GSO (Generic Segmentation Offload)</strong>: Available on Linux 4.18+, batches UDP packets to reduce syscall overhead.</p> <p><strong>Path MTU Discovery (DPLPMTUD)</strong>: Enabled by default, probes for optimal packet sizes.</p> <h3 id="building-and-testing" class="position-relative d-flex align-items-center group"> <span>Building and Testing</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="building-and-testing" aria-haspopup="dialog" aria-label="Share link: Building and Testing"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Build debug version</span> </span></span><span class="line"><span class="cl">make build </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Build release version</span> </span></span><span class="line"><span class="cl">make release </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Clean build artifacts</span> </span></span><span class="line"><span class="cl">make clean </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Run unit tests</span> </span></span><span class="line"><span class="cl">make <span class="nb">test</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Run integration tests (requires Geode server)</span> </span></span><span class="line"><span class="cl">make test-integration </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Run integration tests with Docker</span> </span></span><span class="line"><span class="cl">make test-integration-docker </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Run property-based/fuzz tests</span> </span></span><span class="line"><span class="cl">make test-fuzz </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Run benchmarks</span> </span></span><span class="line"><span class="cl">make bench </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Run full CI pipeline</span> </span></span><span class="line"><span class="cl">make ci </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Format code</span> </span></span><span class="line"><span class="cl">make fmt </span></span></code></pre></div> <h3 id="best-practices" class="position-relative d-flex align-items-center group"> <span>Best Practices</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="best-practices" aria-haspopup="dialog" aria-label="Share link: Best Practices"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="memory-management" class="position-relative d-flex align-items-center group"> <span>Memory Management</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="memory-management" aria-haspopup="dialog" aria-label="Share link: Memory Management"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="c1">// Good: Use defer for cleanup </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">var</span><span class="w"> </span><span class="n">qb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">QueryBuilder</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">qb</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Good: Use errdefer for cleanup on error paths </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span><span class="kt">u8</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="p">)</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="o">|</span><span class="n">err</span><span class="o">|</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">err</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">};</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">errdefer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">result</span><span class="p">);</span><span class="w"> </span></span></span></code></pre></div> <h4 id="error-handling-1" class="position-relative d-flex align-items-center group"> <span>Error Handling</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="error-handling-1" aria-haspopup="dialog" aria-label="Share link: Error Handling"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="c1">// Good: Handle errors explicitly </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendQuery</span><span class="p">(</span><span class="n">query</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">value</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Good: Check retryable errors </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">err</span><span class="p">.</span><span class="n">isRetryable</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Implement retry logic with backoff </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"> </span></span></span></code></pre></div> <h4 id="resource-cleanup" class="position-relative d-flex align-items-center group"> <span>Resource Cleanup</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="resource-cleanup" aria-haspopup="dialog" aria-label="Share link: Resource Cleanup"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="c1">// Good: Always pair init with deinit </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">var</span><span class="w"> </span><span class="n">client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;localhost&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">3141</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// Good: Free allocations </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">const</span><span class="w"> </span><span class="n">response</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">response</span><span class="p">);</span><span class="w"> </span></span></span></code></pre></div> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li><a href="/tags/zig/" >Zig</a> </li> <li><a href="/tags/client-libraries/" >Client Libraries</a> </li> <li><a href="/tags/quic/" >QUIC Protocol</a> </li> <li><a href="/tags/systems/" >Systems Programming</a> </li> <li><a href="/tags/connection-pooling/" >Connection Pooling</a> </li> <li><a href="/tags/performance/" >Performance</a> </li> <li><a href="/tags/tutorials/" >Tutorials</a> </li> </ul> <h3 id="further-reading" class="position-relative d-flex align-items-center group"> <span>Further Reading</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="further-reading" aria-haspopup="dialog" aria-label="Share link: Further Reading"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li><a href="https://ziglang.org/documentation/" aria-label="Zig Documentation – opens in new window" target="_blank" rel="noopener noreferrer" >Zig Documentation <span aria-hidden="true" class="external-icon">↗</span> </a> </li> <li><a href="https://www.rfc-editor.org/rfc/rfc9000.html" aria-label="QUIC Protocol RFC 9000 – opens in new window" target="_blank" rel="noopener noreferrer" >QUIC Protocol RFC 9000 <span aria-hidden="true" class="external-icon">↗</span> </a> </li> <li><a href="https://www.iso.org/standard/76120.html" aria-label="ISO/IEC 39075:2024 GQL Standard – opens in new window" target="_blank" rel="noopener noreferrer" >ISO/IEC 39075:2024 GQL Standard <span aria-hidden="true" class="external-icon">↗</span> </a> </li> <li><a href="https://gitlab.com/devnw/geode/geode-client-zig" aria-label="Zig Client Repository – opens in new window" target="_blank" rel="noopener noreferrer" >Zig Client Repository <span aria-hidden="true" class="external-icon">↗</span> </a> </li> <li><a href="/docs/" >Geode Documentation</a> </li> </ul>

Related Articles

No articles found with this tag yet.

Back to Home