Skip to content
/ fbptree Public

A persistent storage (in file) based using B+ tree with byte-slice keys and values

License

Notifications You must be signed in to change notification settings

krasun/fbptree

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Jan 9, 2022
8003ab1 · Jan 9, 2022

History

21 Commits
Jan 9, 2022
Jul 24, 2021
Jan 9, 2022
Oct 26, 2021
Oct 26, 2021
Oct 26, 2021
Oct 26, 2021
Aug 21, 2021
Oct 19, 2021
Oct 19, 2021
Aug 28, 2021
Oct 1, 2021
Aug 28, 2021
Oct 26, 2021

Repository files navigation

fbptree

Build codecov Go Report Card GoDoc

fbptree is a persistent key-value storage engine based on B+ tree with byte-slice keys and values.

Installation

To install, run:

go get github.com/krasun/fbptree

Usage

An example of usage:

package fbptree_test

import (
	"fmt"
	"io/ioutil"
	"os"
	"path"

	"github.com/krasun/fbptree"
)

func Example() {
	dbDir, err := ioutil.TempDir(os.TempDir(), "example")
	if err != nil {
		panic(fmt.Errorf("failed to create %s: %w", dbDir, err))
	}
	defer func() {
		if err := os.RemoveAll(dbDir); err != nil {
			panic(fmt.Errorf("failed to remove %s: %w", dbDir, err))
		}
	}()

	dbPath := path.Join(dbDir, "sample.data")

	tree, err := fbptree.Open(dbPath, fbptree.PageSize(4096), fbptree.Order(500))
	if err != nil {
		panic(fmt.Errorf("failed to open B+ tree %s: %w", dbDir, err))
	}

	_, _, err = tree.Put([]byte("Hi!"), []byte("Hello world, B+ tree!"))
	if err != nil {
		panic(fmt.Errorf("failed to put: %w", err))
	}

	_, _, err = tree.Put([]byte("Does it override key?"), []byte("No!"))
	if err != nil {
		panic(fmt.Errorf("failed to put: %w", err))
	}

	_, _, err = tree.Put([]byte("Does it override key?"), []byte("Yes, absolutely! The key has been overridden."))
	if err != nil {
		panic(fmt.Errorf("failed to put: %w", err))
	}

	if err := tree.Close(); err != nil {
		panic(fmt.Errorf("failed to close: %w", err))
	}

	tree, err = fbptree.Open(dbPath, fbptree.PageSize(4096), fbptree.Order(500))
	if err != nil {
		panic(fmt.Errorf("failed to open B+ tree %s: %w", dbDir, err))
	}

	value, ok, err := tree.Get([]byte("Hi!"))
	if err != nil {
		panic(fmt.Errorf("failed to get value: %w", err))
	}
	if !ok {
		fmt.Println("failed to find value")
	}

	fmt.Println(string(value))

	value, ok, err = tree.Get([]byte("Does it override key?"))
	if err != nil {
		panic(fmt.Errorf("failed to get value: %w", err))
	}
	if !ok {
		fmt.Println("failed to find value")
	}

	if err := tree.Close(); err != nil {
		panic(fmt.Errorf("failed to close: %w", err))
	}

	fmt.Println(string(value))
	// Output:
	// Hello world, B+ tree!
	// Yes, absolutely! The key has been overridden.
}

Tests

Run tests with:

$ go test .
ok  	github.com/krasun/fbptree	0.679s

License

fbptree is released under the MIT license.

About

A persistent storage (in file) based using B+ tree with byte-slice keys and values

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages