<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yuuichi fujioka</title>
    <description>The latest articles on DEV Community by yuuichi fujioka (@yuuichifujioka).</description>
    <link>https://dev.to/yuuichifujioka</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F83548%2Fa472243e-fab5-4323-a848-c73aeddf9ea5.jpeg</url>
      <title>DEV Community: yuuichi fujioka</title>
      <link>https://dev.to/yuuichifujioka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuuichifujioka"/>
    <language>en</language>
    <item>
      <title>I thought LevelDB is a good one, so I made client command with Go.</title>
      <dc:creator>yuuichi fujioka</dc:creator>
      <pubDate>Tue, 10 Jul 2018 04:41:34 +0000</pubDate>
      <link>https://dev.to/yuuichifujioka/i-thought-leveldb-is-a-good-one-so-i-made-client-command-with-go-3244</link>
      <guid>https://dev.to/yuuichifujioka/i-thought-leveldb-is-a-good-one-so-i-made-client-command-with-go-3244</guid>
      <description>&lt;p&gt;Suddenly, I looked for KVS that can be used as a library like SQLite and found it in LevelDB.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/google" rel="noopener noreferrer"&gt;
        google
      &lt;/a&gt; / &lt;a href="https://github.com/google/leveldb" rel="noopener noreferrer"&gt;
        leveldb
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This repository is receiving very limited maintenance. We will only review the following types of changes.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixes for critical bugs, such as data loss or memory corruption&lt;/li&gt;
&lt;li&gt;Changes absolutely needed by internally supported leveldb clients. These typically fix breakage introduced by a language/standard library/OS update&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/google/leveldb/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/google/leveldb/actions/workflows/build.yml/badge.svg" alt="ci"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Authors: Sanjay Ghemawat (&lt;a href="https://github.com/google/leveldbmailto:sanjay@google.com" rel="noopener noreferrer"&gt;sanjay@google.com&lt;/a&gt;) and Jeff Dean (&lt;a href="https://github.com/google/leveldbmailto:jeff@google.com" rel="noopener noreferrer"&gt;jeff@google.com&lt;/a&gt;)&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Features&lt;/h1&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Keys and values are arbitrary byte arrays.&lt;/li&gt;
&lt;li&gt;Data is stored sorted by key.&lt;/li&gt;
&lt;li&gt;Callers can provide a custom comparison function to override the sort order.&lt;/li&gt;
&lt;li&gt;The basic operations are &lt;code&gt;Put(key,value)&lt;/code&gt;, &lt;code&gt;Get(key)&lt;/code&gt;, &lt;code&gt;Delete(key)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Multiple changes can be made in one atomic batch.&lt;/li&gt;
&lt;li&gt;Users can create a transient snapshot to get a consistent view of data.&lt;/li&gt;
&lt;li&gt;Forward and backward iteration is supported over the data.&lt;/li&gt;
&lt;li&gt;Data is automatically compressed using…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/google/leveldb" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It was a pleasure to use plyvel of Python's LevelDB library, but I decided to create a client command because I don't want to not write Python every time to retrieve a list or list of keys or to delete unnecessary keys.&lt;/p&gt;

&lt;p&gt;And here is the one.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yuuichi-fujioka" rel="noopener noreferrer"&gt;
        yuuichi-fujioka
      &lt;/a&gt; / &lt;a href="https://github.com/yuuichi-fujioka/go-leveldbctl" rel="noopener noreferrer"&gt;
        go-leveldbctl
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      LevelDB control command
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;leveldbctl&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/yuuichi-fujioka/go-leveldbctl" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1a79324bf636e7f38e8eae99adb8cfad9cde6f418ee3e9519d5a988bc3878b35/68747470733a2f2f7472617669732d63692e6f72672f797575696368692d66756a696f6b612f676f2d6c6576656c646263746c2e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/yuuichi-fujioka/go-leveldbctl?branch=master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/abc10fc68003378a2ab1edb10d375e60a0fd25df44bc73825d246d0ed7654b11/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f797575696368692d66756a696f6b612f676f2d6c6576656c646263746c2f62616467652e7376673f6272616e63683d6d6173746572" alt="Coverage Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LevelDB control command.&lt;/p&gt;
&lt;p&gt;This command provides easy way to CRUD operation on LevelDB.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ leveldbctl put foo bar
put foo: bar into ./
$ leveldbctl get foo
bar&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Initialize LevelDB&lt;/li&gt;
&lt;li&gt;Put key/value into LevelDB&lt;/li&gt;
&lt;li&gt;Get value with key&lt;/li&gt;
&lt;li&gt;Delete key&lt;/li&gt;
&lt;li&gt;Dump all key/values in LevelDB&lt;/li&gt;
&lt;li&gt;Print all keys&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ &lt;span class="pl-k"&gt;export&lt;/span&gt; GO111MODULE=on
$ go get github.com/yuuichi-fujioka/go-leveldbctl/cmd/leveldbctl&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;NAME
   leveldbctl - A new cli application

USAGE:
   leveldbctl [global options] &lt;span class="pl-c1"&gt;command&lt;/span&gt; [command options] [arguments...]

VERSION:
   0.0.0

COMMANDS:
     init, i    Initialize a LevelDB
     walk, w    Walk &lt;span class="pl-k"&gt;in&lt;/span&gt; a LevelDB
     keys, k    Search all keys &lt;span class="pl-k"&gt;in&lt;/span&gt; a LevelDB
     put, p     Put a value into a LevelDB
     get, g     Gut a value from a LevelDB
     delete, d  Delete a value from a LevelDB
     help, h    Shows a list of commands or &lt;span class="pl-c1"&gt;help&lt;/span&gt; &lt;span class="pl-k"&gt;for&lt;/span&gt; one &lt;span class="pl-c1"&gt;command&lt;/span&gt;

GLOBAL OPTIONS:
   --dbdir value, -d value  LevelDB Directory (default: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;./&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;) [&lt;span class="pl-smi"&gt;$LEVELDB_DIR&lt;/span&gt;]
   --hexkey, --xk&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yuuichi-fujioka/go-leveldbctl" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It can be used by installing with go get.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go get github.com/yuuichi-fujioka/go-leveldbctl/cmd/leveldbctl
$ leveldbctl -h
NAME:
   leveldbctl - A new cli application

USAGE:
   leveldbctl [global options] command [command options] [arguments...]

VERSION:
   0.0.0

COMMANDS:
     init, i    Initialize a LevelDB
     walk, w    Walk in a LevelDB
     keys, k    Search all keys in a LevelDB
     put, p     Put a value into a LevelDB
     get, g     Gut a value from a LevelDB
     delete, d  Delete a value from a LevelDB
     help, h    Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --dbdir value, -d value  LevelDB Directory (default: "./") [$LEVELDB_DIR]
   --help, -h               show help
   --version, -v            print the version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Use
&lt;/h2&gt;

&lt;p&gt;It can initialize and CRUD operation, assuming that the current directory is a directory of LevelDB. (Specific directories may be set as LevelDB with the options &lt;code&gt;--dbdir&lt;/code&gt; or &lt;code&gt;-d&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Initialize with &lt;code&gt;init&lt;/code&gt;, make it with &lt;code&gt;put&lt;/code&gt;, get it with &lt;code&gt;get&lt;/code&gt;, delete it with &lt;code&gt;delete&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ leveldbctl init   #  Initialize. Several files are created.
./ is initialized as LevelDB
$ leveldbctl get aaa  # When a key is not exist in db, it is displayed that it cannot be found.
aaa is not found.
$ leveldbctl put aaa bbb  # Put bbb into aaa.
put aaa: bbb into ./.
$ leveldbctl get aaa  # Got bbb
bbb
$ leveldbctl delete aaa  # Delete it.
aaa is deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;walk&lt;/code&gt; can output all key values,&lt;code&gt;keys&lt;/code&gt; can output all keys.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ leveldbctl keys
egg
foo
hoge
$ leveldbctl walk
egg: spam
foo: bar
hoge: fuga
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Misc
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I tested it On Mac OS High Sierra and Ubuntu 16.04.4 LTS.。&lt;/li&gt;
&lt;li&gt;CLI is implemented using &lt;code&gt;github.com/urfave/cli&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;LevelDB operation uses &lt;code&gt;github.com/syndtr/goleveldb/leveldb&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>leveldb</category>
    </item>
  </channel>
</rss>
