levigo is a Go wrapper for LevelDB

GoDoc

levigo

levigo is a Go wrapper for LevelDB.

The API has been godoc'ed and is available on the web.

Questions answered at [email protected].

Building

You'll need the shared library build of LevelDB installed on your machine. The current LevelDB will build it by default.

The minimum version of LevelDB required is currently 1.7. If you require the use of an older version of LevelDB, see the fork of levigo for LevelDB 1.4. Prefer putting in the work to be up to date as LevelDB moves very quickly.

Now, if you build LevelDB and put the shared library and headers in one of the standard places for your OS, you'll be able to simply run:

go get github.com/jmhodges/levigo

But, suppose you put the shared LevelDB library somewhere weird like /path/to/lib and the headers were installed in /path/to/include. To install levigo remotely, you'll run:

CGO_CFLAGS="-I/path/to/leveldb/include" CGO_LDFLAGS="-L/path/to/leveldb/lib" go get github.com/jmhodges/levigo

and there you go.

In order to build with snappy, you'll have to explicitly add "-lsnappy" to the CGO_LDFLAGS. Supposing that both snappy and leveldb are in weird places, you'll run something like:

CGO_CFLAGS="-I/path/to/leveldb/include -I/path/to/snappy/include"
CGO_LDFLAGS="-L/path/to/leveldb/lib -L/path/to/snappy/lib -lsnappy" go get github.com/jmhodges/levigo

(and make sure the -lsnappy is after the snappy library path!).

Of course, these same rules apply when doing go build, as well.

Caveats

Comparators and WriteBatch iterators must be written in C in your own library. This seems like a pain in the ass, but remember that you'll have the LevelDB C API available to your in your client package when you import levigo.

An example of writing your own Comparator can be found in https://github.com/jmhodges/levigo/blob/master/examples.

Status

Build: Build Status

Documentation: GoDoc

Lint: Go Lint

Comments
  • Random test error from GetApproximateSizes()

    Random test error from GetApproximateSizes()

    When I run test on Ubuntu 12 (amd64) with leveldb built with -lsnappy.

    $ go test github.com/jmhodges/levigo

    Here are the errors

       leveldb_test.go:128: First size range was 0
       leveldb_test.go:131: Second size range was 0
    

    This error is not persist, but just shows up sometimes. Is this really a problem?

  • When the DB is closed, panic with a message that says that

    When the DB is closed, panic with a message that says that

    The docs indicate that there will be a panic if a DB is used after it is closed. While that's true, the panic comes in the form of a sigpanic from C, which is quite difficult to understand what exactly happened. (I spent about an hour trying to figure out what the issue was).

    This patch makes it so the panic at least helps out the user to tell them: "Oh no you didn't."

  • fix win32 error

    fix win32 error

    Could not run it on Win32, I modified it, it would be nice.

    1. Why does leveldb_free not work on your system? becase I build leveldb with msvc, so free(in c files) and C.free(in go) is diff implemention.
    2. Why is the db.Close in leveldb_test important? Will failed to Delete test temp directory after unit test is end. Must close file handle before delete the file on the win32 platform.
  • Minor API, Documentation, and Testing Environment Improvements

    Minor API, Documentation, and Testing Environment Improvements

    Hi, @jmhodges! I've used Levigo quite a bit, and I want to volunteer a couple of cleanups to improve user experience. I've kept each change atomic as a separate self-standing commit; but if you want, I can squash them together into one. For ease and speed of review, I have included the rationales in each commit log message.

    A major improvement is the inclusion of automated testing with Travis, which works: Build Status.

    The only thing you would need to do, should you accept this pull request, is to manually enable Travis CI for jmhodges/levigo in your project setup. Nothing in this pull request relies on my configuration, except for this pull request description. :-)

  • leveldb.Open() causes to stop writing to file

    leveldb.Open() causes to stop writing to file

    What steps will reproduce the problem?

    1. log.SetOutput(io.MultiWriter(f, os.Stdout))
    2. log some stuff, shows up in file f
    3. open database: levigo.Open(dbName, dbOpts) 4.) log some more stuff, but now it doesn't show up in file f

    What is the expected output? What do you see instead? logging should continue after the db is opened, but it doesn't. There is a workaround, where you can call log.SetOutput() again just after leveldb.Open() and logging resumes.

    What version of the product are you using? On what operating system? go 1.2.1 on amd64 ubuntu 14.04, with leveldb from github on 04/28/14 (sorry, commit # missing as the files were copied to a new repo)

  • segmentation violation

    segmentation violation

    SIGSEGV: segmentation violation PC=0x45fc7d6 signal arrived during cgo execution

    github.com/jmhodges/levigo._Cfunc_leveldb_iter_seek(0x0, 0xc2000abed0, 0x8) github.com/jmhodges/levigo/_obj/_cgo_defun.c:231 +0x2f github.com/jmhodges/levigo.(*Iterator).Seek(0xc2000008e8, 0xc2000abed0, 0x8, 0xe) github.com/jmhodges/levigo/_obj/batch.cgo1.go:579 +0x42 ...


    $ go version

    go version go1.1 darwin/amd64

    code

    cache := levigo.NewLRUCache(1 << 24) // 16MB
    options := levigo.NewOptions()
    //options.SetComparator(cmp)
    options.SetCache(cache)
    options.SetParanoidChecks(true)
    options.SetInfoLog(nil)
    options.SetWriteBufferSize(1 << 20) // 1MB
    options.SetMaxOpenFiles(1023)
    options.SetBlockSize(1 << 15) // 32KB
    options.SetCompression(1)     // snappy compression, 0 == no compression
    options.SetCreateIfMissing(true)
    
    levelDb, err := levigo.Open("./store", options)
    if err != nil {
        panic(err)
    }
    roptions := levigo.NewReadOptions()
    //roptions.SetVerifyChecksums(true)
    roptions.SetFillCache(false)
    defer roptions.Close()
    
    iter :=levelDb.NewIterator(roptions)
    iter.Close()
    
    target := append("t_user", uint8(1))
    iter.Seek(target)  // <== segmentation violation
    
  • Add a go.mod file to support Go modules.

    Add a go.mod file to support Go modules.

    In order to work well with Go modules, packages should have a go.mod file and semantic version tags on release versions.

    Here I have provided a rudimentary go.mod file for levigo. If you accept this change, and if you are willing to also git tag v0.0.1 master and git push origin v0.0.1 after it is merged, that would begin the release history. I don't know whether you consider the API stable enough for a v1.0.0 release, but users will expect stability so v0 is a safe default.

  • Fix golint warnings where practical.

    Fix golint warnings where practical.

    This commit applies a number of trivial fixes across Levigo to remedy golint warnings. One change not associated with lint but rather overall convention is the inclusion of the package name prefix/breadcrumb in the emitted error strings.

  • Build fail on golang 1.3.3 mac osx

    Build fail on golang 1.3.3 mac osx

    $go get github.com/jmhodges/levigo

    the console give the resutl as flow:

    github.com/jmhodges/levigo

    gcc did not produce error at completed:1 on input:

    line 3 "/Users/jeff/projects/gocode/src/github.com/jmhodges/levigo/db.go"

    include <stdlib.h>

    include "leveldb/c.h"

    // This function exists only to clean up lack-of-const warnings when // leveldb_approximate_sizes is called from Go-land. void levigo_leveldb_approximate_sizes( leveldb_t* db, int num_ranges, char** range_start_key, const size_t* range_start_key_len, char** range_limit_key, const size_t* range_limit_key_len, uint64_t* sizes) { leveldb_approximate_sizes(db, num_ranges, (const char* const_)range_start_key, range_start_key_len, (const char_ const*)range_limit_key, range_limit_key_len, sizes); }

    include <sys/types.h> /* for size_t below */

    /* Define intgo when compiling with GCC. */

    ifdef PTRDIFF_TYPE

    typedef PTRDIFF_TYPE intgo;

    elif defined(_LP64)

    typedef long long intgo;

    else

    typedef int intgo;

    endif

    typedef struct { char *p; intgo n; } GoString; typedef struct { char *p; intgo n; intgo c; } GoBytes; GoString GoString(char *p); GoString GoStringN(char *p, int l); GoBytes GoBytes(void *p, int n); char *CString(GoString); void *_CMalloc(size_t);

    line 1 "not-declared"

    void cgo_f_1_1(void) { __typeof(int) *cgo_undefined; }

    line 1 "not-type"

    void *cgo_f_1_2(void) { int __cgo_undefined; }

    line 1 "not-const"

    void cgo_f_1_3(void) { enum { __cgo__undefined = (int)*1 }; }

    line 2 "not-declared"

    void cgo_f_2_1(void) { __typeof(leveldb_create_iterator) *cgo_undefined; }

    line 2 "not-type"

    void *cgo_f_2_2(void) { leveldb_create_iterator __cgo_undefined; }

    line 2 "not-const"

    void cgo_f_2_3(void) { enum { __cgo__undefined = (leveldb_create_iterator)*1 }; }

    line 3 "not-declared"

    void cgo_f_3_1(void) { __typeof(leveldb_t) *cgo_undefined; }

    line 3 "not-type"

    void *cgo_f_3_2(void) { leveldb_t __cgo_undefined; }

    line 3 "not-const"

    void cgo_f_3_3(void) { enum { __cgo__undefined = (leveldb_t)*1 }; }

    line 4 "not-declared"

    void cgo_f_4_1(void) { __typeof(leveldb_put) *cgo_undefined; }

    line 4 "not-type"

    void *cgo_f_4_2(void) { leveldb_put __cgo_undefined; }

    line 4 "not-const"

    void cgo_f_4_3(void) { enum { __cgo__undefined = (leveldb_put)*1 }; }

    line 5 "not-declared"

    void cgo_f_5_1(void) { __typeof(leveldb_repair_db) *cgo_undefined; }

    line 5 "not-type"

    void *cgo_f_5_2(void) { leveldb_repair_db __cgo_undefined; }

    line 5 "not-const"

    void cgo_f_5_3(void) { enum { __cgo__undefined = (leveldb_repair_db)*1 }; }

    line 6 "not-declared"

    void cgo_f_6_1(void) { __typeof(leveldb_get) *cgo_undefined; }

    line 6 "not-type"

    void *cgo_f_6_2(void) { leveldb_get __cgo_undefined; }

    line 6 "not-const"

    void cgo_f_6_3(void) { enum { __cgo__undefined = (leveldb_get)*1 }; }

    line 7 "not-declared"

    void cgo_f_7_1(void) { __typeof(GoBytes) *cgo_undefined; }

    line 7 "not-type"

    void *cgo_f_7_2(void) { GoBytes __cgo_undefined; }

    line 7 "not-const"

    void cgo_f_7_3(void) { enum { __cgo__undefined = (GoBytes)*1 }; }

    line 8 "not-declared"

    void cgo_f_8_1(void) { __typeof(leveldb_write) *cgo_undefined; }

    line 8 "not-type"

    void *cgo_f_8_2(void) { leveldb_write __cgo_undefined; }

    line 8 "not-const"

    void cgo_f_8_3(void) { enum { __cgo__undefined = (leveldb_write)*1 }; }

    line 9 "not-declared"

    void cgo_f_9_1(void) { __typeof(leveldb_close) *cgo_undefined; }

    line 9 "not-type"

    void *cgo_f_9_2(void) { leveldb_close __cgo_undefined; }

    line 9 "not-const"

    void cgo_f_9_3(void) { enum { __cgo__undefined = (leveldb_close)*1 }; }

    line 10 "not-declared"

    void cgo_f_10_1(void) { __typeof(leveldb_snapshot_t) *cgo_undefined; }

    line 10 "not-type"

    void *cgo_f_10_2(void) { leveldb_snapshot_t __cgo_undefined; }

    line 10 "not-const"

    void cgo_f_10_3(void) { enum { __cgo__undefined = (leveldb_snapshot_t)*1 }; }

    line 11 "not-declared"

    void cgo_f_11_1(void) { __typeof(leveldb_free) *cgo_undefined; }

    line 11 "not-type"

    void *cgo_f_11_2(void) { leveldb_free __cgo_undefined; }

    line 11 "not-const"

    void cgo_f_11_3(void) { enum { __cgo__undefined = (leveldb_free)*1 }; }

    line 12 "not-declared"

    void cgo_f_12_1(void) { __typeof(uint64_t) *cgo_undefined; }

    line 12 "not-type"

    void *cgo_f_12_2(void) { uint64_t __cgo_undefined; }

    line 12 "not-const"

    void cgo_f_12_3(void) { enum { __cgo__undefined = (uint64_t)*1 }; }

    line 13 "not-declared"

    void cgo_f_13_1(void) { __typeof(leveldb_property_value) *cgo_undefined; }

    line 13 "not-type"

    void *cgo_f_13_2(void) { leveldb_property_value __cgo_undefined; }

    line 13 "not-const"

    void cgo_f_13_3(void) { enum { __cgo__undefined = (leveldb_property_value)*1 }; }

    line 14 "not-declared"

    void cgo_f_14_1(void) { __typeof(leveldb_create_snapshot) *cgo_undefined; }

    line 14 "not-type"

    void *cgo_f_14_2(void) { leveldb_create_snapshot __cgo_undefined; }

    line 14 "not-const"

    void cgo_f_14_3(void) { enum { __cgo__undefined = (leveldb_create_snapshot)*1 }; }

    line 15 "not-declared"

    void cgo_f_15_1(void) { __typeof(leveldb_compact_range) *cgo_undefined; }

    line 15 "not-type"

    void *cgo_f_15_2(void) { leveldb_compact_range __cgo_undefined; }

    line 15 "not-const"

    void cgo_f_15_3(void) { enum { __cgo__undefined = (leveldb_compact_range)*1 }; }

    line 16 "not-declared"

    void cgo_f_16_1(void) { __typeof(char) *cgo_undefined; }

    line 16 "not-type"

    void *cgo_f_16_2(void) { char __cgo_undefined; }

    line 16 "not-const"

    void cgo_f_16_3(void) { enum { __cgo__undefined = (char)*1 }; }

    line 17 "not-declared"

    void cgo_f_17_1(void) { __typeof(size_t) *cgo_undefined; }

    line 17 "not-type"

    void *cgo_f_17_2(void) { size_t __cgo_undefined; }

    line 17 "not-const"

    void cgo_f_17_3(void) { enum { __cgo__undefined = (size_t)*1 }; }

    line 18 "not-declared"

    void cgo_f_18_1(void) { __typeof(GoString) *cgo_undefined; }

    line 18 "not-type"

    void *cgo_f_18_2(void) { GoString __cgo_undefined; }

    line 18 "not-const"

    void cgo_f_18_3(void) { enum { __cgo__undefined = (GoString)*1 }; }

    line 19 "not-declared"

    void cgo_f_19_1(void) { __typeof(leveldb_destroy_db) *cgo_undefined; }

    line 19 "not-type"

    void *cgo_f_19_2(void) { leveldb_destroy_db __cgo_undefined; }

    line 19 "not-const"

    void cgo_f_19_3(void) { enum { __cgo__undefined = (leveldb_destroy_db)*1 }; }

    line 20 "not-declared"

    void cgo_f_20_1(void) { __typeof(leveldb_delete) *cgo_undefined; }

    line 20 "not-type"

    void *cgo_f_20_2(void) { leveldb_delete __cgo_undefined; }

    line 20 "not-const"

    void cgo_f_20_3(void) { enum { __cgo__undefined = (leveldb_delete)*1 }; }

    line 21 "not-declared"

    void cgo_f_21_1(void) { __typeof(levigo_leveldb_approximate_sizes) *cgo_undefined; }

    line 21 "not-type"

    void *cgo_f_21_2(void) { levigo_leveldb_approximate_sizes __cgo_undefined; }

    line 21 "not-const"

    void cgo_f_21_3(void) { enum { __cgo__undefined = (levigo_leveldb_approximate_sizes)*1 }; }

    line 22 "not-declared"

    void cgo_f_22_1(void) { __typeof(leveldb_release_snapshot) *cgo_undefined; }

    line 22 "not-type"

    void *cgo_f_22_2(void) { leveldb_release_snapshot __cgo_undefined; }

    line 22 "not-const"

    void cgo_f_22_3(void) { enum { __cgo__undefined = (leveldb_release_snapshot)*1 }; }

    line 23 "not-declared"

    void cgo_f_23_1(void) { __typeof(CString) *cgo_undefined; }

    line 23 "not-type"

    void *cgo_f_23_2(void) { CString __cgo_undefined; }

    line 23 "not-const"

    void cgo_f_23_3(void) { enum { __cgo__undefined = (CString)*1 }; }

    line 24 "not-declared"

    void cgo_f_24_1(void) { __typeof(leveldb_open) *cgo_undefined; }

    line 24 "not-type"

    void *cgo_f_24_2(void) { leveldb_open __cgo_undefined; }

    line 24 "not-const"

    void cgo_f_24_3(void) { enum { __cgo__undefined = (leveldb_open)*1 }; }

    line 1 "completed"

    int __cgo__1 = __cgo__2;

  • Cannot find c.h on OS X Mavericks

    Cannot find c.h on OS X Mavericks

    When I try to run a project with levigo in OS X 10.9 (Mavericks), I get the following error:

    # github.com/jmhodges/levigo
    ../../jmhodges/levigo/batch.go:4:11: fatal error: 'leveldb/c.h' file not found
     #include "leveldb/c.h"
              ^
    1 error generated
    

    LevelDB is installed via homebrew, which symlinks leveldb/c.h into /usr/local/include.

    When I explicitly set cgo flags like this:

    CGO_CFLAGS="-I/usr/local/include" CGO_LDFLAGS="-L/usr/local/lib" go run myapp.go
    

    It works, but only on go version 1.2rc2. On 1.1.2 it fails with another message due to this bug: https://code.google.com/p/go/issues/detail?id=4829

    This doesn't really seem to be on levigo's end, as cgo/clang is apparently not searching /usr/local/include for includes for some reason, but I'm filing it here in case anyone else gets stuck on this issue.

  • Build with current tip Go on darwin?

    Build with current tip Go on darwin?

    Hey,

    Would you be able to confirm whether you are still able to compile levigo executable on darwin,amd64 with a current tip version of Go?

    I am able to build on Linux, but not on OSX.

    The linker keeps refusing to find symbols. Oddly a couple of weeks ago I had no problem. I cannot figure out what is going on.

    My CGO_LDFLAGS="-L/Users/petar/aux/leveldb/lib -lleveldb -lstdc++" and I've removed the #cgo -lleveldb directives from the code. I doubt that makes any difference? (It works on Linux with that modification.)

    Thank you Petar

  • Update actions/setup-go action to v3

    Update actions/setup-go action to v3

    WhiteSource Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | actions/setup-go | action | major | v1 -> v3 |


    Release Notes

    actions/setup-go

    v3

    Compare Source

    v2

    Compare Source


    Configuration

    📅 Schedule: At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by WhiteSource Renovate. View repository job log here.

  • Update actions/checkout action to v3

    Update actions/checkout action to v3

    WhiteSource Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | actions/checkout | action | major | v1 -> v3 |


    Release Notes

    actions/checkout

    v3

    Compare Source

    v2

    Compare Source


    Configuration

    📅 Schedule: At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by WhiteSource Renovate. View repository job log here.

  • Dependency Dashboard

    Dependency Dashboard

  • WriteBatch.Delete() panics on empty key

    WriteBatch.Delete() panics on empty key

    Calling WriteBatch.Delete() with an empty key, i.e. []byte{}, panics:

    goroutine 38 [running]:
    testing.tRunner.func1.1(0x43ddc60, 0xc0005d4060)
    	/usr/local/Cellar/go/1.14/libexec/src/testing/testing.go:941 +0x3d0
    testing.tRunner.func1(0xc0005da000)
    	/usr/local/Cellar/go/1.14/libexec/src/testing/testing.go:944 +0x3f9
    panic(0x43ddc60, 0xc0005d4060)
    	/usr/local/Cellar/go/1.14/libexec/src/runtime/panic.go:967 +0x15d
    github.com/jmhodges/levigo.(*WriteBatch).Delete.func1(0xc0005c22b0, 0x4744c10, 0x0, 0x0)
    	github.com/jmhodges/[email protected]/batch.go:60 +0x84
    github.com/jmhodges/levigo.(*WriteBatch).Delete(0xc0005c22b0, 0x4744c10, 0x0, 0x0)
    	github.com/jmhodges/[email protected]/batch.go:60 +0x49
    
  • go build calls linker with seven -lleveldb flags

    go build calls linker with seven -lleveldb flags

    This is fairly harmless, but I noticed using go build -extldflags="-v" that the linker is called with one -lleveldb per comment in the code base:

    0.71 host link: "gcc" "-o" "/tmp/go-build236882147/b001/exe/a.out" "-static" "/tmp/go-link-066068984/go.o" "/tmp/go-link-066068984/000000.o" "/tmp/go-link-066068984/000001.o" "/tmp/go-link-066068984/000002.o" "/tmp/go-link-066068984/000003.o" "/tmp/go-link-066068984/000004.o" "/tmp/go-link-066068984/000005.o" "/tmp/go-link-066068984/000006.o" "/tmp/go-link-066068984/000007.o" "/tmp/go-link-066068984/000008.o" "/tmp/go-link-066068984/000009.o" "/tmp/go-link-066068984/000010.o" "/tmp/go-link-066068984/000011.o" "/tmp/go-link-066068984/000012.o" "/tmp/go-link-066068984/000013.o" "/tmp/go-link-066068984/000014.o" "/tmp/go-link-066068984/000015.o" "/tmp/go-link-066068984/000016.o" "/tmp/go-link-066068984/000017.o" "/tmp/go-link-066068984/000018.o" "/tmp/go-link-066068984/000019.o" "/tmp/go-link-066068984/000020.o" "/tmp/go-link-066068984/000021.o" "/tmp/go-link-066068984/000022.o" "/tmp/go-link-066068984/000023.o" "/tmp/go-link-066068984/000024.o" "/tmp/go-link-066068984/000025.o" "/tmp/go-link-066068984/000026.o" "/tmp/go-link-066068984/000027.o" "/tmp/go-link-066068984/000028.o" "/tmp/go-link-066068984/000029.o" "-lleveldb" "-lleveldb" "-lleveldb" "-lleveldb" "-lleveldb" "-lleveldb" "-lleveldb" "-lleveldb" "-lleveldb" "-static" "-lpthread"

    This is related to https://github.com/golang/go/issues/25930 and will hopefully be fixed upstream. Regardless, it might be nice to consolidate all the cgo comments in the code-base into one cgo.go file, similar to https://github.com/golang/go/blob/master/src/runtime/cgo/cgo.go.

RocksDB/LevelDB inspired key-value database in Go

Pebble Nightly benchmarks Pebble is a LevelDB/RocksDB inspired key-value store focused on performance and internal usage by CockroachDB. Pebble inheri

Dec 29, 2022
levigo is a Go wrapper for LevelDB

levigo levigo is a Go wrapper for LevelDB. The API has been godoc'ed and is available on the web. Questions answered at [email protected].

Jan 5, 2023
LevelDB style LRU cache for Go, support non GC object.

Go语言QQ群: 102319854, 1055927514 凹语言(凹读音“Wa”)(The Wa Programming Language): https://github.com/wa-lang/wa LRU Cache Install go get github.com/chai2010/c

Jul 5, 2020
LevelDB key/value database in Go.

This is an implementation of the LevelDB key/value database in the Go programming language. Installation go get github.com/syndtr/goleveldb/leveldb R

Jan 1, 2023
Simple key-value store abstraction and implementations for Go (Redis, Consul, etcd, bbolt, BadgerDB, LevelDB, Memcached, DynamoDB, S3, PostgreSQL, MongoDB, CockroachDB and many more)

gokv Simple key-value store abstraction and implementations for Go Contents Features Simple interface Implementations Value types Marshal formats Road

Dec 24, 2022
LevelDB key/value database in Go.

This is an implementation of the LevelDB key/value database in the Go programming language. Installation go get github.com/syndtr/goleveldb/leveldb R

Jan 9, 2023
RocksDB/LevelDB inspired key-value database in Go

Pebble Nightly benchmarks Pebble is a LevelDB/RocksDB inspired key-value store focused on performance and internal usage by CockroachDB. Pebble inheri

Dec 29, 2022
a key-value store with multiple backends including leveldb, badgerdb, postgresql

Overview goukv is an abstraction layer for golang based key-value stores, it is easy to add any backend provider. Available Providers badgerdb: Badger

Jan 5, 2023
Persistent stacks and queues for Go backed by LevelDB

Goque Goque provides embedded, disk-based implementations of stack and queue data structures. Motivation for creating this project was the need for a

Dec 17, 2022
Stand up a statediffing service directly on top of a go-ethereum leveldb instance

eth-statediff-service standalone statediffing service ontop of leveldb Purpose:

Dec 21, 2021
A utility for modifying chunks in Minecraft: Bedrock Edition LevelDB

MC-BE-Chunk-Editor A utility for modifying chunks in Minecraft: Bedrock Edition

Feb 16, 2022
Go-video-preview-ffmpeg-wrapper - A simple helper wrapper to generate small webm video previews using ffmpeg, useful for web previews.

Go-video-preview-ffmpeg-wrapper A simple helper wrapper to generate small webm video previews using ffmpeg, useful for web previews. Getting Started u

Jan 5, 2022
Via Cep Wrapper is a api wrapper used to find address by zipcode (Brazil only)
Via Cep Wrapper is a api wrapper used to find address by zipcode (Brazil only)

Viacep Wrapper Viacep Wrapper is an API wrapper built with Golang used to find address by zipcode (Brazil only). This project was developed for study

Jan 25, 2022
Golang telegram bot API wrapper, session-based router and middleware

go-tgbot Pure Golang telegram bot API wrapper generated from swagger definition, session-based routing and middlewares. Usage benefits No need to lear

Nov 16, 2022
JSON or YAML configuration wrapper with convenient access methods.

Config Package config provides convenient access methods to configuration stored as JSON or YAML. This is a fork of the original version. This version

Dec 16, 2022
Go wrapper for LZO compression library

This is a cgo wrapper around the LZO real-time compression library. LZO is available at http://www.oberhumer.com/opensource/lzo/ lzo.go is the go pack

Mar 4, 2022
An easy-to-use XChaCha20-encryption wrapper for io.ReadWriteCloser (even lossy UDP) using ECDH key exchange algorithm, ED25519 signatures and Blake3+Poly1305 checksums/message-authentication for Go (golang). Also a multiplexer.

Quick start Prepare keys (on both sides): [ -f ~/.ssh/id_ed25519 ] && [ -f ~/.ssh/id_ed25519.pub ] || ssh-keygen -t ed25519 scp ~/.ssh/id_ed25519.pub

Dec 30, 2022
A light libxml wrapper for Go

Gokogiri LibXML bindings for the Go programming language. By Zhigang Chen and Hampton Catlin This is a major rewrite from v0 in the following places:

Dec 27, 2022
goxml - A thin wrapper around libxml2

golibxml golibxml is a simple wrapper for libxml. The goal is to avoid any extra magic so that a more friendly library can be written to sit on top of

Oct 25, 2020
Database wrapper that manage read write connections

rwdb Database wrapper that manage read write connections Install go get github.com/andizzle/rwdb Create connections package main import "github.com/

Dec 10, 2022