<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>KvSQL.com</title>
    <link>https://kvsql.com/</link>
    <description>Recent content on KvSQL.com</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 22 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://kvsql.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>KvSQL Launches With an Embedded Engine and a Database Server on One Set of Records</title>
      <link>https://kvsql.com/kvsql-launches-with-an-embedded-engine-and-a-database-server-on-one-set-of-records/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/kvsql-launches-with-an-embedded-engine-and-a-database-server-on-one-set-of-records/</guid>
      <description>&lt;p&gt;KvSQL 0.1.0 is out. It&amp;rsquo;s a key-value store and an SQL database that keep one copy of the data between them. Read a row by its key and it comes straight from the storage tree, with nothing parsed or planned. Ask SQL about the same rows and it reads the same bytes. One transaction covers both, and an index stays right whichever way a row was written.&lt;/p&gt;&#xA;&lt;p&gt;The release has two products. &lt;strong&gt;KvSQL Engine&lt;/strong&gt; is a Rust library you put in your own program: one file on disk, no server, and no dependencies beyond the Rust standard library. &lt;strong&gt;KvSQL DB&lt;/strong&gt; is built on it: &lt;code&gt;kvsqld&lt;/code&gt; serves a database file over HTTP with JSON, and &lt;code&gt;kvsql&lt;/code&gt; is a shell that talks to the server or opens a file directly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Key Lookups and SQL Belong on the Same Records</title>
      <link>https://kvsql.com/why-key-lookups-and-sql-belong-on-the-same-records/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/why-key-lookups-and-sql-belong-on-the-same-records/</guid>
      <description>&lt;p&gt;Think of a cloakroom. At one window you hand over a ticket and get your coat back. Nobody searches, nobody asks what colour it was. At another window you can ask the attendant for every blue coat left after nine o&amp;rsquo;clock, and somebody has to go through the racks to answer. Both are useful. A database that only has the first window is a key-value store. One that only has the second is an SQL database.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How KvSQL Was Tested With Power Cuts, Killed Processes and 30000 Statements Checked Against SQLite</title>
      <link>https://kvsql.com/how-kvsql-was-tested-with-power-cuts-killed-processes-and-30000-statements-checked-against-sqlite/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/how-kvsql-was-tested-with-power-cuts-killed-processes-and-30000-statements-checked-against-sqlite/</guid>
      <description>&lt;p&gt;A database makes one promise above the rest. When it says a commit is done, the data is there, even if the power goes a moment later. And if the power goes during a commit, the file holds the whole transaction or none of it, never part. Most of KvSQL&amp;rsquo;s tests are aimed at that promise, from several sides.&lt;/p&gt;&#xA;&lt;p&gt;All the figures below come from one recorded run of the project&amp;rsquo;s test script, &lt;code&gt;scripts/record-results.sh&lt;/code&gt;, on a Linux container with two virtual CPUs, on October 22, 2026. The full output is in the repository under &lt;a href=&#34;https://github.com/softdevstudio/kvsql/tree/main/test/results/latest&#34;&gt;test/results/latest&lt;/a&gt;. CI runs the same script on Linux and macOS on every change.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Case Study: A Checkout That Is Never Half Done, Tested With 1200 Power Cuts</title>
      <link>https://kvsql.com/case-study-a-checkout-that-is-never-half-done-tested-with-1200-power-cuts/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/case-study-a-checkout-that-is-never-half-done-tested-with-1200-power-cuts/</guid>
      <description>&lt;p&gt;A checkout touches several things that must change together. The cart goes away, an order appears with its lines, and the stock goes down. If the power fails halfway, the worst outcomes are an order with the stock never taken, or a paid order with the cart still sitting there. With a key-value store for carts and an SQL database for orders, those are two systems and two commits, and somebody has to write the cleanup for the gap between them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Case Study: An Edge Gateway Collecting Sensor Readings Over HTTP With kvsqld</title>
      <link>https://kvsql.com/case-study-an-edge-gateway-collecting-sensor-readings-over-http-with-kvsqld/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/case-study-an-edge-gateway-collecting-sensor-readings-over-http-with-kvsqld/</guid>
      <description>&lt;p&gt;An edge gateway sits between a set of devices and the rest of the world. Sensors post readings to it, a dashboard on the same network shows the latest value per device, and someone asks about history: averages, peaks, the hour a fridge ran warm. The gateway is often a small box with no room for a database team, so it should be one program and one file.&lt;/p&gt;&#xA;&lt;p&gt;This case study runs that set-up with &lt;code&gt;kvsqld&lt;/code&gt;. Twenty simulated devices post readings over HTTP on their own connections, while a dashboard reads the latest value by key and asks SQL for history. It&amp;rsquo;s part of &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/crates/kvsql-db/examples/case_studies.rs&#34;&gt;case_studies.rs&lt;/a&gt; in the repository. The figures are from its recorded run of October 22, 2026, on a real file on a Linux container with two virtual CPUs. The output is in &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/test/results/latest/case-studies.md&#34;&gt;case-studies.md&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Case Study: Sessions and Reporting in One Store Instead of Two</title>
      <link>https://kvsql.com/case-study-sessions-and-reporting-in-one-store-instead-of-two/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/case-study-sessions-and-reporting-in-one-store-instead-of-two/</guid>
      <description>&lt;p&gt;A web application checks its session table on every request. A token comes in, and the app needs the user behind it, fast. Once in a while somebody wants a different view of the same data: how many sessions are live per country, or every session of one user, revoked at once when a password changes. Teams often split this in two, with sessions in Redis for speed and a copy in SQL for the reports and the bulk revokes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>KvSQL Against SQLite on the Same Machine: Key Reads, SQL Reads and Synced Commits</title>
      <link>https://kvsql.com/kvsql-against-sqlite-on-the-same-machine-key-reads-sql-reads-and-synced-commits/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/kvsql-against-sqlite-on-the-same-machine-key-reads-sql-reads-and-synced-commits/</guid>
      <description>&lt;p&gt;KvSQL&amp;rsquo;s claim is a fast path by key that skips the SQL machinery, on the same records SQL reads. A claim like that needs a measurement, and the obvious yardstick is SQLite. It&amp;rsquo;s the most used embedded database there is, and it&amp;rsquo;s very good. So the project&amp;rsquo;s test script runs a benchmark against SQLite every time it records results, and saves it next to the test output.&lt;/p&gt;&#xA;&lt;p&gt;The figures here are from the recorded run of October 22, 2026, on a Linux container with two virtual CPUs. The full table, with every condition, is &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/test/results/latest/bench.md&#34;&gt;bench.md&lt;/a&gt; in the repository. A container like this is noisy: between runs on the same day, single figures moved by 20 to 30 percent. Treat the gaps below as rough sizes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Example: A Cache With Expiry Using Key Reads and an SQL Sweep</title>
      <link>https://kvsql.com/use-example-a-cache-with-expiry-using-key-reads-and-an-sql-sweep/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/use-example-a-cache-with-expiry-using-key-reads-and-an-sql-sweep/</guid>
      <description>&lt;p&gt;A response cache has two jobs that pull in different directions. On a hit, it has to find one entry by its key as fast as possible. Now and then it has to throw away everything that has expired, which is a question over all the entries. In KvSQL both jobs run on one table.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db.execute(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CREATE TABLE cache (key TEXT PRIMARY KEY, body BLOB, expires INTEGER NOT NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            CREATE INDEX cache_expires ON cache(expires)&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;[])&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Store a response with &lt;code&gt;put_row&lt;/code&gt;, which replaces an older entry under the same key:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Example: Settings Read by Key and Audited With SQL</title>
      <link>https://kvsql.com/use-example-settings-read-by-key-and-audited-with-sql/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/use-example-settings-read-by-key-and-audited-with-sql/</guid>
      <description>&lt;p&gt;Feature flags and settings are read all the time and listed rarely. The code asks &amp;ldquo;is the new checkout on?&amp;rdquo; on every request. Once in a while a person asks &amp;ldquo;what are all the search settings right now?&amp;rdquo; A plain keyspace in KvSQL answers both, with no schema at all.&lt;/p&gt;&#xA;&lt;p&gt;Write settings as keys and values:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; tx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; db.begin_write()&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;checkout.new_flow&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;search.fuzzy&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;search.limit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;upload.max_mb&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.commit()&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Read one by key, straight from storage:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Example: Working With a Database File in the kvsql Shell</title>
      <link>https://kvsql.com/use-example-working-with-a-database-file-in-the-kvsql-shell/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/use-example-working-with-a-database-file-in-the-kvsql-shell/</guid>
      <description>&lt;p&gt;Sometimes you just want to look inside a database. Maybe a test left a file behind, or you&amp;rsquo;re checking what a service wrote, or you want to try a query before putting it in code. The &lt;code&gt;kvsql&lt;/code&gt; shell opens a file directly, with no server running, and takes SQL and key-value commands side by side.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kvsql --file jobs.kvsql&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is a short session, as the project&amp;rsquo;s &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/crates/kvsql-db/examples/case_studies.rs&#34;&gt;use example program&lt;/a&gt; ran it through the shell&amp;rsquo;s own command code, one command at a time the way &lt;code&gt;-c&lt;/code&gt; takes them. The output is exactly what came back:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why the Project Is Called KvSQL</title>
      <link>https://kvsql.com/why-the-project-is-called-kvsql/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/why-the-project-is-called-kvsql/</guid>
      <description>&lt;p&gt;The name is the design, spelled out. KV for key-value, SQL for SQL, written together because in this database they aren&amp;rsquo;t two systems glued side by side. They&amp;rsquo;re two ways into one store.&lt;/p&gt;&#xA;&lt;p&gt;The lower-case v is on purpose. Kv reads as one small syllable in front of the three letters everybody knows, and it keeps the name from turning into a row of capitals. Say it &amp;ldquo;K-V-S-Q-L&amp;rdquo;, or &amp;ldquo;kv sequel&amp;rdquo; if you prefer; both are fine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://kvsql.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/about/</guid>
      <description>&lt;p&gt;KvSQL is a hybrid of key-value and SQL in Rust. It comes as two products built on one set of records. &lt;strong&gt;KvSQL Engine&lt;/strong&gt; is a library you embed in your program: one file on disk, no server. &lt;strong&gt;KvSQL DB&lt;/strong&gt; is a database server, &lt;code&gt;kvsqld&lt;/code&gt;, and a shell, &lt;code&gt;kvsql&lt;/code&gt;, built on the same engine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-it-exists&#34;&gt;Why It Exists&lt;/h2&gt;&#xA;&lt;p&gt;Many programs need two things from their data. They need fast lookups by key, thousands of times a second, and they need real questions answered: totals, filters, joins. The usual answer is two stores, a key-value store such as RocksDB or Redis for the lookups and SQLite for the questions. The data then lives twice. Code has to keep the two copies in step, and a change can&amp;rsquo;t be atomic across both.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact</title>
      <link>https://kvsql.com/contact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/contact/</guid>
      <description>&lt;p&gt;The project would like to hear from:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Developers&lt;/strong&gt; weighing KvSQL for an application, a service or an edge gateway, with questions the &lt;a href=&#34;https://kvsql.com/reference/&#34;&gt;reference&lt;/a&gt; doesn&amp;rsquo;t answer.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone who found a bug.&lt;/strong&gt; A short program or a list of &lt;code&gt;kvsql&lt;/code&gt; commands that shows it is the best report. The &lt;a href=&#34;https://github.com/softdevstudio/kvsql/issues&#34;&gt;issue tracker&lt;/a&gt; on GitHub works too.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Teams with a workload worth testing&lt;/strong&gt;, such as a key-value store and SQLite running side by side today.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Write to &lt;strong&gt;&lt;a href=&#34;mailto:info@kvsql.com&#34;&gt;info@kvsql.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Download KvSQL</title>
      <link>https://kvsql.com/download/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/download/</guid>
      <description>&lt;p&gt;Each archive holds the two KvSQL DB programs, &lt;code&gt;kvsqld&lt;/code&gt; (the server) and &lt;code&gt;kvsql&lt;/code&gt; (the shell), with the license files and the README. The links always point to the latest release.&lt;/p&gt;&#xA;&lt;div style=&#34;overflow-x:auto&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;System&lt;/th&gt;&#xA;          &lt;th&gt;Download&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux, x86-64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases/latest/download/kvsql-linux-x86_64.tar.gz&#34;&gt;kvsql-linux-x86_64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux, ARM64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases/latest/download/kvsql-linux-arm64.tar.gz&#34;&gt;kvsql-linux-arm64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS, Apple silicon&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases/latest/download/kvsql-macos-arm64.tar.gz&#34;&gt;kvsql-macos-arm64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS, Intel&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases/latest/download/kvsql-macos-x86_64.tar.gz&#34;&gt;kvsql-macos-x86_64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Windows, x86-64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases/latest/download/kvsql-windows-x86_64.zip&#34;&gt;kvsql-windows-x86_64.zip&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;em&gt;Checksums are in &lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases/latest/download/SHA256SUMS&#34;&gt;SHA256SUMS&lt;/a&gt;. Every release is listed on &lt;a href=&#34;https://github.com/softdevstudio/kvsql/releases&#34;&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Each of these builds ran the engine&amp;rsquo;s test suite and a smoke test on its own platform before the release went out: a file opened with the shell, then the server started, written to with curl and read back through the shell.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Start</title>
      <link>https://kvsql.com/quick-start/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/quick-start/</guid>
      <description>&lt;p&gt;There are two ways in. Embed KvSQL Engine in a Rust program, or run the KvSQL DB server and use it from any language over HTTP.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-engine-in-a-rust-program&#34;&gt;The Engine in a Rust Program&lt;/h2&gt;&#xA;&lt;p&gt;Add the engine as a Git dependency. It has no dependencies of its own.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;dependencies&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;kvsql-engine&lt;/span&gt; = { &lt;span style=&#34;color:#a6e22e&#34;&gt;git&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/softdevstudio/kvsql&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;tag&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;v0.1.0&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open a file, write some keys and read them back:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; kvsql_engine::Db;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvsql_engine&lt;/span&gt;::Result&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; db &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Db::open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.kvsql&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Several changes, committed together.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; tx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; db.begin_write()&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;42&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ada&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;43&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Grace&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tx.commit()&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; db.get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;42&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;                     &lt;span style=&#34;color:#75715e&#34;&gt;// Some(b&amp;#34;Ada&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; some &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; db.scan(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;40&amp;#34;&lt;/span&gt;, Some(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;  &lt;span style=&#34;color:#75715e&#34;&gt;// keys 40 up to 50&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{:?}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, name, some.len());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Ok(())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now SQL on the same records. A table is a keyspace with a schema, and each row sits under its primary key:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reference</title>
      <link>https://kvsql.com/reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/reference/</guid>
      <description>&lt;p&gt;This page is the short version. The full reference lives with the code: &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/docs/sql.md&#34;&gt;SQL&lt;/a&gt;, &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/docs/server.md&#34;&gt;server and shell&lt;/a&gt; and &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/docs/file-format.md&#34;&gt;file format&lt;/a&gt;, plus the &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/README.md&#34;&gt;README&lt;/a&gt;, which is the manual.&lt;/p&gt;&#xA;&lt;h2 id=&#34;engine-api&#34;&gt;Engine API&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Call&lt;/th&gt;&#xA;          &lt;th&gt;What it does&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;Db::open(path)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Open or create a database file. A second process gets &lt;code&gt;Error::Locked&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.get(ks, key)&lt;/code&gt;, &lt;code&gt;db.scan(ks, from, to, limit)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Read by key, or a key range in order, on a snapshot&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.put(ks, key, value)&lt;/code&gt;, &lt;code&gt;db.delete(ks, key)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;One change, committed on its own&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.begin_write()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;A write transaction: &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;scan&lt;/code&gt;, &lt;code&gt;put&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;drop_keyspace&lt;/code&gt;, &lt;code&gt;execute&lt;/code&gt;, &lt;code&gt;put_row&lt;/code&gt;, &lt;code&gt;delete_row&lt;/code&gt;, then &lt;code&gt;commit&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.begin_read()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;A snapshot that sees nothing committed after it began: &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;scan&lt;/code&gt;, &lt;code&gt;query&lt;/code&gt;, &lt;code&gt;get_row&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.execute(sql, params)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;SQL in its own transaction. Reads run on a snapshot; writes commit only if every statement succeeds&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.get_row(table, pk)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;A table row by primary key, straight from storage, no SQL&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;db.verify()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Check every page, every row against its table and every index entry&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;When &lt;code&gt;commit&lt;/code&gt; returns, the transaction is on disk. A crash or power cut during a commit leaves the whole commit or none of it. If a commit fails part way, the handle refuses further use; reopen the file to continue from the last good commit.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
