diff --git a/leveldb.nimble b/leveldb.nimble new file mode 100644 index 0000000..599dec8 --- /dev/null +++ b/leveldb.nimble @@ -0,0 +1,13 @@ +# Package + +version = "0.2.0" +author = "Michał Zieliński" +description = "LevelDB wrapper for Nim" +license = "MIT" +srcDir = "src" +binDir = "bin" +bin = @["leveldb"] + +# Dependencies + +requires "nim >= 1.0.0" diff --git a/leveldb.nim b/src/leveldb.nim similarity index 77% rename from leveldb.nim rename to src/leveldb.nim index 9f341fe..b0da220 100644 --- a/leveldb.nim +++ b/src/leveldb.nim @@ -1,7 +1,5 @@ import options, leveldb/raw -proc free(p: pointer) {.importc.} - type LevelDb* = ref object db: ptr leveldb_t @@ -15,6 +13,8 @@ const levelDbTrue = uint8(1) levelDbFalse = uint8(0) +proc free(p: pointer) {.importc.} + proc checkError(errPtr: cstring) = if errPtr != nil: defer: free(errPtr) @@ -127,47 +127,4 @@ proc removeDb*(name: string) = checkError(err) when isMainModule: - import sequtils - - let env = leveldb_create_default_env() - let dbName = $(leveldb_env_get_test_directory(env)) - let db = leveldb.open(dbName) - - block version: - let (major, minor) = db.version() - doAssert major > 0 - doAssert minor > 0 - - block getPutDelete: - doAssert db.get("hello") == none(string) - db.put("hello", "world") - doAssert db.get("hello") == some("world") - db.delete("hello") - doAssert db.get("hello") == none(string) - - block iter: - db.put("aa", "1") - db.put("ba", "2") - db.put("bb", "3") - - block iterNormal: - doAssert toSeq(db.iter()) == - @[("aa", "1"), ("ba", "2"), ("bb", "3")] - - block iterReverse: - doAssert toSeq(db.iter(reverse = true)) == - @[("bb", "3"), ("ba", "2"), ("aa", "1")] - - block iterSeek: - doAssert toSeq(db.iter(seek = "ab")) == - @[("ba", "2"), ("bb", "3")] - - block iterSeekReverse: - doAssert toSeq(db.iter(seek = "ab", reverse = true)) == - @[("ba", "2"), ("aa", "1")] - - block close: - db.close() - - block remove: - removeDb(dbName) + discard diff --git a/leveldb/raw.nim b/src/leveldb/raw.nim similarity index 100% rename from leveldb/raw.nim rename to src/leveldb/raw.nim diff --git a/tests/config.nims b/tests/config.nims new file mode 100644 index 0000000..80091ff --- /dev/null +++ b/tests/config.nims @@ -0,0 +1 @@ +switch("path", "$projectDir/../src") diff --git a/tests/test.nim b/tests/test.nim new file mode 100644 index 0000000..f43121d --- /dev/null +++ b/tests/test.nim @@ -0,0 +1,54 @@ +import unittest, options, sequtils +import leveldb, leveldb/raw + +suite "leveldb": + + setup: + let env = leveldb_create_default_env() + let dbName = $(leveldb_env_get_test_directory(env)) + let db = leveldb.open(dbName) + + teardown: + db.close() + removeDb(dbName) + + test "version": + let (major, minor) = db.version() + check(major > 0) + check(minor > 0) + + test "get nothing": + check(db.get("nothing") == none(string)) + + test "put and get": + db.put("hello", "world") + check(db.get("hello") == some("world")) + + test "delete": + db.put("hello", "world") + db.delete("hello") + check(db.get("hello") == none(string)) + + proc initData(db: LevelDb) = + db.put("aa", "1") + db.put("ba", "2") + db.put("bb", "3") + + test "iter": + initData(db) + check(toSeq(db.iter()) == @[("aa", "1"), ("ba", "2"), ("bb", "3")]) + + test "iter reverse": + initData(db) + check(toSeq(db.iter(reverse = true)) == + @[("bb", "3"), ("ba", "2"), ("aa", "1")]) + + test "iter seek": + initData(db) + check(toSeq(db.iter(seek = "ab")) == + @[("ba", "2"), ("bb", "3")]) + + test "iter seek reverse": + initData(db) + check(toSeq(db.iter(seek = "ab", reverse = true)) == + @[("ba", "2"), ("aa", "1")])