unqliteインストール/使用/テスト


UnQLiteは、埋め込み型NoSQL(キー/値格納およびドキュメント格納)データベースエンジンです.他のほとんどのNoSQLデータベースとは異なり、UnQLiteには独立したサーバプロセスはありません.UnQLiteは通常のディスクファイルを直接読み書きします.複数のデータセットを含む完全なデータベースで、単一のディスクファイルに格納されます.データベース・ファイル・フォーマットは、プラットフォーム間で、32ビットと64ビットのシステムまたは大端と小端のアーキテクチャの間で、1つのデータベースを自由にコピーできます.UnQLiteの主な特徴.詳細については、以下を参照してください.http://unqlite.github.io/2013/05/26/about/
unqliteのインストールと構成:
これはあまり言わないで、shellスクリプトに直接行きます.以下はubuntuインストールshellスクリプトです
<!-- lang: shell -->
#! /bin/sh

#     
wget -c http://unqlite.org/db/unqlite-db-116.zip

#     
unzip unqlite-db-116.zip

#     
gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libunqlite.so.1 -o libunqlite.so.1.0 *.o

#      
sudo cp `pwd`/libunqlite.so.1.0 /usr/local/lib/
sudo cp `pwd`/unqlite.h /usr/local/include/
sudo ln -sf /usr/local/lib/libunqlite.so.1.0 /usr/local/lib/libunqlite.so.1
sudo ln -sf /usr/local/lib/libunqlite.so.1 /usr/local/lib/libunqlite.so

#     
sudo ldconfig /usr/local/lib/libunqlite.so

#   golang unqlite   
git clone [email protected]:ceh/gounqlite.git

Google goo言語を使用してunqliteデータベースをテストする
テストコードは次のとおりです.
<!-- lang: cpp -->
package main

import (
    "bytes"
    "fmt"
    "github.com/ceh/gounqlite"
    "sync"
    "time"
)

var (
    db    *gounqlite.Handle
    mutex sync.Mutex
)

func init() {
    mutex.Lock()
    defer mutex.Unlock()

    if db != nil {
        return
    }

    //   open   ":mem:"  ,        ;
    //       ,         。
    udb, err := gounqlite.Open(":mem:")
    if err != nil {
        fmt.Println("Open: ", err.Error())
        return
    }

    db = udb
}

//     
var kvs = []struct {
    key   []byte
    value []byte
}{
    {[]byte("name"), []byte("viney")},
    {[]byte("  "), []byte("  ")},
    {[]byte("email"), []byte("[email protected]")},
}

//     
func benchmark() {
    count := 1000
    finish := make(chan bool)

    t := time.Now()
        for i := 0; i < count; i++ {
        go func(i int) {
            defer func() { finish <- true }()
            byt := []byte(fmt.Sprint(i))
            if err := db.Store(byt, byt); err != nil {
                fmt.Println("benchmark: ", err.Error())
                return
            }
        }(i)
    }

    for i := 0; i < count; i++ {
        <-finish
    }

    fmt.Println(time.Now().Sub(t).String())
}

func main() {
    //     
    benchmark()

    //     /    
    //   key        ,       
    for _, v := range kvs {
        //     
        if err := db.Store(v.key, v.value); err != nil {
            fmt.Println("insert: ", err.Error(), string(v.key), string(v.value))
            return
        }

        //   
        if value, err := db.Fetch(v.key); err != nil {
            fmt.Println("Fetch: ", err.Error())
            return
        } else if !bytes.Equal(v.value, value) {
            fmt.Println("Equal: ", string(v.value), string(value))
            return
        }

        //     
        var hello []byte = []byte("hello")
        if err := db.Store(v.key, hello); err != nil {
            fmt.Println("update: ", err.Error())
            return
        }

        //          
        if value, err := db.Fetch(v.key); err != nil {
            fmt.Println("Fetch: ", err.Error())
            return
        } else if !bytes.Equal(hello, value) {
            fmt.Println("Equal: ", string(hello), string(value))
            return
        }

        //     
        var world []byte = []byte("world")
        if err := db.Append(v.key, world); err != nil {
            fmt.Println("Append: ", err.Error())
            return
        }

        //          
        if value, err := db.Fetch(v.key); err != nil {
            fmt.Println("Fetch: ", err.Error())
            return
        } else if value != nil {
            hello = append(hello, world...)
            if !bytes.Equal(value, hello) {
                fmt.Println("Equal: ", string(value), string(hello))
                return
            }
        }

        //   
        if err := db.Delete(v.key); err != nil {
            fmt.Println("Delete: ", err.Error())
            return
        }
    }

    //   open
    defer func() {
        if err := db.Close(); err != nil {
            fmt.Println("Close: ", err.Error())
            return
        }
    }()
}