docs/comparison/data/sqlite.html

560 lines
30 KiB
HTML
Raw Normal View History

<!doctype html>
<html class="no-js" lang="en">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="../../genindex.html" /><link rel="search" title="Search" href="../../search.html" /><link rel="next" title="P2P Concepts" href="../../p2p_concepts.html" /><link rel="prev" title="Graph Databases" href="graphdb.html" />
<link rel="canonical" href="/docs/comparison/data/sqlite.html" />
<!-- Generated with Sphinx 6.2.1 and Furo 2023.05.20 -->
<title>SQLite - p2p-ld 0.1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?digest=e6660623a769aa55fea372102b9bf3151b292993" />
<link rel="stylesheet" type="text/css" href="../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<style>
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #0d1117;
--color-code-foreground: #e6edf3;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #0d1117;
--color-code-foreground: #e6edf3;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-half" viewBox="0 0 24 24">
<title>Auto light/dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="12" r="9" />
<path d="M13 12h5" />
<path d="M13 15h4" />
<path d="M13 18h1" />
<path d="M13 9h4" />
<path d="M13 6h1" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
<div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
<div class="visually-hidden">Hide table of contents sidebar</div>
</label>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<div class="visually-hidden">Toggle site navigation sidebar</div>
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">p2p-ld 0.1.0 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">p2p-ld 0.1.0 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Introduction</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../overview.html">Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../roadmap.html">Roadmap</a></li>
<li class="toctree-l1 current has-children"><a class="reference internal" href="../index.html">Comparison</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Comparison</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul class="current">
<li class="toctree-l2 has-children"><a class="reference internal" href="../p2p/index.html">P2P</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle navigation of P2P</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../p2p/bittorrent.html">BitTorrent</a></li>
<li class="toctree-l3"><a class="reference internal" href="../p2p/ipfs.html">IPFS</a></li>
<li class="toctree-l3"><a class="reference internal" href="../p2p/hypercore.html">Dat/Hypercore</a></li>
<li class="toctree-l3"><a class="reference internal" href="../p2p/spritely.html">Spritely/Goblin</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../social/index.html">Social</a><input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><div class="visually-hidden">Toggle navigation of Social</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../social/activitypub.html">ActivityPub</a></li>
<li class="toctree-l3"><a class="reference internal" href="../social/ssb.html">Secure Scuttlebutt</a></li>
<li class="toctree-l3"><a class="reference internal" href="../social/matrix.html">Matrix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../social/at_protocol.html">AT Protocol/Bluesky</a></li>
<li class="toctree-l3"><a class="reference internal" href="../social/nostr.html">Nostr</a></li>
<li class="toctree-l3"><a class="reference internal" href="../social/xmpp.html">XMPP</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../ld/index.html">Linked Data</a><input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><div class="visually-hidden">Toggle navigation of Linked Data</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../ld/rdf.html">RDF and Friends</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ld/solid.html">SOLID</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ld/ld_fragments.html">Linked Data Fragments</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ld/hdt.html">HDT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ld/ld_platform.html">Linked Data Platform</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ld/nanopubs.html">NanoPubs</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ld/webid.html">WebID</a></li>
</ul>
</li>
<li class="toctree-l2 current has-children"><a class="reference internal" href="index.html">Data Structures</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><div class="visually-hidden">Toggle navigation of Data Structures</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="datalad.html">DataLad</a></li>
<li class="toctree-l3"><a class="reference internal" href="dmc.html">DMC</a></li>
<li class="toctree-l3"><a class="reference internal" href="eris.html">ERIS</a></li>
<li class="toctree-l3"><a class="reference internal" href="graphdb.html">Graph Databases</a></li>
<li class="toctree-l3 current current-page"><a class="current reference internal" href="#">SQLite</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../p2p_concepts.html">P2P Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../out_of_scope.html">Out of Scope</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Protocol</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../definitions.html">1. Definitions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../protocol.html">2. Protocol</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../identity.html">3. Identity</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../discovery.html">4. Discovery</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../data_structures.html">5. Data Structures</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../vocabulary.html">6. Vocabulary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../querying.html">7. Querying</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../encryption.html">8. Encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../federation.html">9. Federation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../backwards_compatibility.html">10. Backwards Compatibility</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../evolvability.html">11. Evolvability</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Ecosystem</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../triplets.html">Triplets</a></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../codecs/index.html">Codecs</a><input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><div class="visually-hidden">Toggle navigation of Codecs</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../codecs/hdf5.html">HDF5</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../translation/index.html">Translation</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Drafting</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../design.html">Design Decisions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../sketchpad.html">Sketchpad</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Meta</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../genindex.html">Index</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../references.html">References</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../todo.html">TODO</a></li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
<article role="main">
<section id="sqlite">
<h1>SQLite<a class="headerlink" href="#sqlite" title="Permalink to this heading">#</a></h1>
<span class="target" id="index-0"></span><p id="index-1">We want something like sqlite, but for <span class="target" id="index-2"></span>Graph Databases!</p>
<p>Most of the existing triple stores and graph databases are very heavyweight services that would be impractical for packaging in a portable daemon in the same way that sqlite works. Maybe we can learn from how sqlite works and do something similar for graph databases?</p>
<p>Questions:</p>
<ul class="simple">
<li><p>How come these things can be faster than idk like a .json file</p></li>
<li><p>How are they different architecturally than a traditional SQL server</p></li>
</ul>
<section id="file-structure">
<h2>File Structure<a class="headerlink" href="#file-structure" title="Permalink to this heading">#</a></h2>
<ul class="simple">
<li><p>Main file</p></li>
<li><p>Rollback Journal - stores additional information to restore in case of a crash. Store a copy of the original DB, write changes directly into DB file. COMMIT occurs when rollback is deleted</p></li>
<li><p>Write-ahead Log - if in <a class="reference external" href="https://www.sqlite.org/wal.html">WAL mode</a>, append updates to WAL file. COMMIT occurs when writing to WAL file (not to main DB). Multiple transactions can be batched.</p></li>
</ul>
<section id="pages">
<h3>Pages<a class="headerlink" href="#pages" title="Permalink to this heading">#</a></h3>
<p>Pages are the basic unit of an sqlite file.</p>
<p>Numeracy:</p>
<ul class="simple">
<li><p>Each page can be a power of 2 between 512 and 65536</p></li>
<li><p>All pages are the same size</p></li>
<li><p>Max <code class="docutils literal notranslate"><span class="pre">2^32</span> <span class="pre">-</span> <span class="pre">2</span></code> pages in a single DB.</p></li>
</ul>
<section id="types">
<h4>Types<a class="headerlink" href="#types" title="Permalink to this heading">#</a></h4>
<p>Each page has a single type:</p>
<blockquote>
<div><ul class="simple">
<li><p>The lock-byte page</p></li>
<li><p>A freelist page</p>
<ul>
<li><p>A freelist trunk page</p></li>
<li><p>A freelist leaf page</p></li>
</ul>
</li>
<li><p>A b-tree page</p>
<ul>
<li><p>A table b-tree interior page</p></li>
<li><p>A table b-tree leaf page</p></li>
<li><p>An index b-tree interior page</p></li>
<li><p>An index b-tree leaf page</p></li>
</ul>
</li>
<li><p>A payload overflow page</p></li>
<li><p>A pointer map page</p></li>
</ul>
</div></blockquote>
<section id="lock-byte">
<h5>Lock-byte<a class="headerlink" href="#lock-byte" title="Permalink to this heading">#</a></h5>
<p>(artifact of windows 95 compatibility)</p>
</section>
<section id="freelist">
<h5>Freelist<a class="headerlink" href="#freelist" title="Permalink to this heading">#</a></h5>
<p>Linked list of “trunks and leaves” to keep track of unused pages:</p>
<ul class="simple">
<li><p>Trunk pages:</p>
<ul>
<li><p>Series of 4-byte integers that take up full page</p></li>
<li><p>First integer is the page number of the next trunk (zero if its the last page)</p></li>
<li><p>Second integer is number of leaf pointers that follow</p></li>
</ul>
</li>
<li><p>Leaf pages:</p>
<ul>
<li><p>contain nothing!</p></li>
</ul>
</li>
</ul>
</section>
<section id="b-tree">
<h5><span class="target" id="index-3"></span>B-tree<a class="headerlink" href="#b-tree" title="Permalink to this heading">#</a></h5>
<p>(<a class="reference external" href="https://en.wikipedia.org/wiki/B-tree">B-tree wiki page</a>)</p>
<p>Two types of b-trees: table and index</p>
<ul class="simple">
<li><p><strong>Table B-Trees</strong>:</p>
<ul>
<li><p>One table b-tree in the db file for each <code class="docutils literal notranslate"><span class="pre">rowid</span></code> table in the database schema</p></li>
<li><p>64-bit signed integer key that refers to the <code class="docutils literal notranslate"><span class="pre">rowid</span></code> it implements</p></li>
<li><p>Store all data in leaves (interior pages just point to leaves)</p></li>
<li></li>
</ul>
</li>
<li><p><strong>Index B-Trees</strong>:</p>
<ul>
<li><p>One index b-tree for each index in the schema</p></li>
<li><p>Arbitrary keys</p></li>
<li><p>Store no data.</p></li>
</ul>
</li>
</ul>
<p>Two types of b-tree pages:</p>
<ul class="simple">
<li><p><strong>Interior</strong></p></li>
<li><p><strong>Leaf</strong></p></li>
</ul>
<div class="admonition-todo admonition" id="id1">
<p class="admonition-title">Todo</p>
<p>Describe freeblocks</p>
</div>
</section>
</section>
<section id="payload-overflow">
<h4>Payload Overflow<a class="headerlink" href="#payload-overflow" title="Permalink to this heading">#</a></h4>
<blockquote>
<div><p>Define the “payload” of a cell to be the arbitrary length section of the cell.</p>
<ul class="simple">
<li><p>For an index b-tree, the key is always arbitrary in length and hence the payload is the key.</p></li>
<li><p>There are no arbitrary length elements in the cells of interior table b-tree pages and so those cells have no payload.</p></li>
<li><p>Table b-tree leaf pages contain arbitrary length content and so for cells on those pages the payload is the content.</p></li>
</ul>
</div></blockquote>
<p>When a payload is bigger than some threshold<a class="footnote-reference brackets" href="#overflowthreshold" id="id2" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>, store it on a linked list of payload overload pages. The first four bytes of each overflow page are a 4-byte big-endian integer indicating the page number of the next page in the chain, or zero for the final page.</p>
</section>
<section id="pointer-maps">
<h4>Pointer Maps<a class="headerlink" href="#pointer-maps" title="Permalink to this heading">#</a></h4>
<p>Backlinks from child to parent nodes in index trees to assist with vacuuming :)</p>
<p>Each pointermap page provides backlinks for the pages immediately following it.</p>
<p>Each 5-byte ptrmap entry consists of:</p>
<ul class="simple">
<li><p>1 byte of page type information:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">0</span></code>: A b-tree root page</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">0</span></code>: Freelist page</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">prior</span> <span class="pre">page</span></code> or <code class="docutils literal notranslate"><span class="pre">first</span> <span class="pre">page</span></code>: payload overflow page</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">parent</span> <span class="pre">page</span></code>: non-root b-tree page</p></li>
</ul>
</li>
<li><p>4 byte big-endian page number</p></li>
</ul>
</section>
</section>
<section id="header">
<h3>Header<a class="headerlink" href="#header" title="Permalink to this heading">#</a></h3>
<p>(Add header info here as the rest of the spec makes it relevant)</p>
<p><a class="reference external" href="https://www.sqlite.org/fileformat.html#the_database_header">https://www.sqlite.org/fileformat.html#the_database_header</a></p>
<p>Useful properties</p>
<ul class="simple">
<li><p>Magic header string makes it easy to identify sqlite files</p></li>
<li><p>File change counter &amp; schema cookie - 4-byte integer that increments whenever the db file is unlocked. useful for cache invalidation</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">version-valid-for-number</span></code> - stores the version of the software that most recently modified it, and the change counter at that modification. Useful for detecting if certain behaviors like updating the in-header db size are behaving correctly by knowing what version made a given change.</p></li>
</ul>
</section>
</section>
<section id="schema">
<h2>Schema<a class="headerlink" href="#schema" title="Permalink to this heading">#</a></h2>
<section id="records">
<h3>Records<a class="headerlink" href="#records" title="Permalink to this heading">#</a></h3>
</section>
<section id="tables">
<h3>Tables<a class="headerlink" href="#tables" title="Permalink to this heading">#</a></h3>
</section>
<section id="indices">
<h3>Indices<a class="headerlink" href="#indices" title="Permalink to this heading">#</a></h3>
</section>
</section>
<section id="i-o">
<h2>I/O<a class="headerlink" href="#i-o" title="Permalink to this heading">#</a></h2>
<div class="admonition-todo admonition" id="id3">
<p class="admonition-title">Todo</p>
<p><strong>How does writing and querying an sqlite file actually work???</strong></p>
</div>
<p>All reads from and writes to the main database file happen at a page boundary.</p>
<p>All writes are an integer number of pages in size.</p>
<p>Most reads are also an integer number of pages in size, except opening the database which reads the header (first 100 bytes).</p>
</section>
<section id="see-also">
<h2>See also<a class="headerlink" href="#see-also" title="Permalink to this heading">#</a></h2>
<ul class="simple">
<li><p><a class="reference internal" href="graphdb.html"><span class="doc std std-doc">Graph Databases</span></a></p></li>
</ul>
</section>
<section id="references">
<h2>References<a class="headerlink" href="#references" title="Permalink to this heading">#</a></h2>
<ul class="simple">
<li><p><a class="reference external" href="https://www.sqlite.org/fileformat.html">SQLite File Format</a></p></li>
<li><p><a class="reference external" href="https://www.sqlite.org/quirks.html">SQLite Quirks</a> - useful for understanding some design decisions</p></li>
<li><p><a class="reference external" href="https://www.sqlite.org/custombuild.html">Customization and Porting</a></p></li>
<li><p><a class="reference external" href="https://www.sqlite.org/arch.html">SQLite Architecture</a></p></li>
</ul>
<hr class="footnotes docutils" />
<aside class="footnote-list brackets">
<aside class="footnote brackets" id="overflowthreshold" role="note">
<span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id2">1</a><span class="fn-bracket">]</span></span>
<blockquote>
<div><p>The overflow thresholds are designed to give a minimum fanout of 4 for index b-trees and to make sure enough of the payload is on the b-tree page that the record header can usually be accessed without consulting an overflow page. In hindsight, the designer of the SQLite b-tree logic realized that these thresholds could have been made much simpler. However, the computations cannot be changed without resulting in an incompatible file format. And the current computations work well, even if they are a little complex.</p>
</div></blockquote>
</aside>
</aside>
</section>
</section>
</article>
</div>
<footer>
<div class="related-pages">
<a class="next-page" href="../../p2p_concepts.html">
<div class="page-info">
<div class="context">
<span>Next</span>
</div>
<div class="title">P2P Concepts</div>
</div>
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
</a>
<a class="prev-page" href="graphdb.html">
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
<div class="page-info">
<div class="context">
<span>Previous</span>
</div>
<div class="title">Graph Databases</div>
</div>
</a>
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2023, Jonny Saunders
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer">
<div class="toc-sticky toc-scroll">
<div class="toc-title-container">
<span class="toc-title">
On this page
</span>
</div>
<div class="toc-tree-container">
<div class="toc-tree">
<ul>
<li><a class="reference internal" href="#">SQLite</a><ul>
<li><a class="reference internal" href="#file-structure">File Structure</a><ul>
<li><a class="reference internal" href="#pages">Pages</a><ul>
<li><a class="reference internal" href="#types">Types</a><ul>
<li><a class="reference internal" href="#lock-byte">Lock-byte</a></li>
<li><a class="reference internal" href="#freelist">Freelist</a></li>
<li><a class="reference internal" href="#b-tree">B-tree</a></li>
</ul>
</li>
<li><a class="reference internal" href="#payload-overflow">Payload Overflow</a></li>
<li><a class="reference internal" href="#pointer-maps">Pointer Maps</a></li>
</ul>
</li>
<li><a class="reference internal" href="#header">Header</a></li>
</ul>
</li>
<li><a class="reference internal" href="#schema">Schema</a><ul>
<li><a class="reference internal" href="#records">Records</a></li>
<li><a class="reference internal" href="#tables">Tables</a></li>
<li><a class="reference internal" href="#indices">Indices</a></li>
</ul>
</li>
<li><a class="reference internal" href="#i-o">I/O</a></li>
<li><a class="reference internal" href="#see-also">See also</a></li>
<li><a class="reference internal" href="#references">References</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</aside>
</div>
</div><script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/scripts/furo.js"></script>
<script src="../../_static/design-tabs.js"></script>
</body>
</html>