doulun7739 2013-09-16 16:51
浏览 53

覆盖现有值的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
  • 写回答

1条回答

  • droe9376 2013-09-16 22:45
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办