<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pages on KvSQL.com</title>
    <link>https://kvsql.com/pages/</link>
    <description>Recent content in Pages on KvSQL.com</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://kvsql.com/pages/index.xml" rel="self" type="application/rss+xml" />
    <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>
