覆盖现有值的level-db golang实现?

I am trying to use the leveldb-g implementation and having some issues.

Here is my implementaation (based on another answer here

package propertyData

import (
    "code.google.com/p/leveldb-go/leveldb/db"
    "code.google.com/p/leveldb-go/leveldb/table"
    "log"
    "runtime"
)

const (
    DBFILE = "./admin.db"
)

var DBFS = db.DefaultFileSystem

func AddDataToProperty(property, value string) {
    Connection, e := DBFS.Create(DBFILE)
    Check(e)
    w := table.NewWriter(Connection, nil)
    defer w.Close()

    e = w.Set([]byte(property), []byte(value), nil)
}

func GetDataFromProperty(property string) string {

    v := findOne([]byte(property))

    return string(v)
}

func findOne(k []byte) []byte {
    Connection, e := DBFS.Open(DBFILE)
    Check(e)
    r := table.NewReader(Connection, nil)
    v1, err := r.Get([]byte(k), nil)
    if err != nil {
        log.Fatalf("An error occurred finding one", err.Error())
    }

    return v1

}

func Check(e error) {
    if e != nil {
        _, file, line, _ := runtime.Caller(1)
        log.Fatalf("Bad Happened: %s, %s", file, line)
    }
}

and a test:

package propertyData

import (
    "com.levelsbeyond/admin/propertyData"
    "log"
    "os"
    "testing"
)

func TestAddProperty(t *testing.T) {
    os.RemoveAll("./admin.db")

    propertyData.AddDataToProperty("test.property", "one")
    propertyData.AddDataToProperty("test.property", "two")
    propertyData.AddDataToProperty("test.property", "three")

    propertyValue := propertyData.GetDataFromProperty("test.property")
    log.Println(propertyValue)

    propertyData.AddDataToProperty("test.different", "four")
    propertyValue = propertyData.GetDataFromProperty("test.different")
    log.Println(propertyValue)

    propertyValue = propertyData.GetDataFromProperty("test.property")
    log.Println(propertyValue)

}

Which outputs:

=== RUN TestAddProperty
2013/09/16 10:47:50 three
2013/09/16 10:47:50 four
2013/09/16 10:47:50 
--- PASS: TestAddProperty (0.00 seconds)

It's like writing the second property ("property.different") Overwrites the values I already have in there. I'm sure I'm doing something dumb, any help would be greatly appreciated.

EDIT

I added some error handling in the findOne function (thanks @miltonb) and I actually am getting an error there, though I'm not sure what to make of it:

=== RUN TestAddProperty
2013/09/16 15:36:34 three
2013/09/16 15:36:34 four
2013/09/16 15:36:34 An error occurred finding one%!(EXTRA string=leveldb/db: not found)
exit status 1
FAIL    command-line-arguments  0.018s
dougong9987
dougong9987 我不小心偶然发现了levigo,它看起来像是一个非常相似的API的替代实现:godoc.org/github.com/jmhodges/levigo
大约 7 年之前 回复
dpbdl44228
dpbdl44228 当我尝试在Connection对象上调用Close()时,编译器抱怨。稍微看一下他们的一些测试,他们使用的是memfs而不是DBFS,这是表测试。我想我会尝试模仿该测试直到它起作用,或者也许我应该只使用sqlite。我正在尝试将嵌入式数据库用于非常轻量的服务,该服务正在监视和描述非常重的服务,因此最小的依赖关系是理想的。
大约 7 年之前 回复
dongxuanjiao0795
dongxuanjiao0795 我只是注意到数据库连接没有关闭,只是一个想法,因为我不确定leveldb的期望是什么。
大约 7 年之前 回复
doushijiao0679
doushijiao0679 奇怪的错误实际上来自您使用%v进行的日志记录尝试:log.Fatalf(“发现一个%v时发生错误,err.Error())。其次,来自leveldb'未找到退出状态1'的实际错误表明Get尚未检索该值,该值解释了TestAddProperty中的空白条目
大约 7 年之前 回复
dqyq88053
dqyq88053 我要做的第一件事是查明您的findOne函数是否正在产生错误。如果err!=nil{//错误处理,请更改为v1,err:=r.Get([]byte(k),nil)
大约 7 年之前 回复

1个回答



更改为leveldb的另一种实现,它看起来是更好的文档,例如levidb http://godoc.org/github.com/jmhodges/levigo 。</ p>
</ div>

展开原文

原文

Change to another implementation of leveldb with what looks to be better documentation such as levidb http://godoc.org/github.com/jmhodges/levigo.

dpm91915
dpm91915 我个人更喜欢一些非常实用的功能,而不是ORM或其他高度抽象的功能。 拥有一个映射器工具就足以将行映射到模型中并方便地进行测试。 这就使您没有数据库提供的所有功能,没有wtf因素或复杂性。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐