From 8c215d13a36e837170d898e319d4de7d69414567 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Mon, 11 Nov 2019 01:02:57 +0800 Subject: [PATCH] add command line tool and bump verion to 0.3.0 * breaking change: rename `version` to `getLibVersion` * add `repaireDb` * fix `get` bug --- leveldb.nimble | 2 +- src/leveldb.nim | 146 ++++++++++++++++++++++++++++++++++++++++++++++-- tests/test.nim | 2 +- 3 files changed, 142 insertions(+), 8 deletions(-) diff --git a/leveldb.nimble b/leveldb.nimble index 599dec8..cd0a99e 100644 --- a/leveldb.nimble +++ b/leveldb.nimble @@ -1,6 +1,6 @@ # Package -version = "0.2.0" +version = "0.3.0" author = "Michał Zieliński" description = "LevelDB wrapper for Nim" license = "MIT" diff --git a/src/leveldb.nim b/src/leveldb.nim index b0da220..e50eddd 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -13,6 +13,8 @@ const levelDbTrue = uint8(1) levelDbFalse = uint8(0) + version = "0.3.0" + proc free(p: pointer) {.importc.} proc checkError(errPtr: cstring) = @@ -20,6 +22,10 @@ proc checkError(errPtr: cstring) = defer: free(errPtr) raise newException(LevelDbException, $errPtr) +proc getLibVersion*(): (int, int) = + result[0] = leveldb_major_version() + result[1] = leveldb_minor_version() + proc close*(self: LevelDb) = if self.db == nil: return @@ -46,10 +52,6 @@ proc open*(path: string): LevelDb = result.db = leveldb_open(options, path, addr errPtr) checkError(errPtr) -proc version*(self: LevelDb): (int, int) = - result[0] = leveldb_major_version() - result[1] = leveldb_minor_version() - proc put*(self: LevelDb, key: string, value: string, sync = true) = assert self.db != nil var errPtr: cstring = nil @@ -67,7 +69,7 @@ proc get*(self: LevelDb, key: string): Option[string] = if s == nil: result = none(string) else: - result = some($s) + result = some ($s)[0..] create" + echo " leveldb [-d ] get [-x | --hex]" + echo " leveldb [-d ] put [-x | --hex]" + echo " leveldb [-d ] list [-x | --hex]" + echo " leveldb [-d ] keys" + echo " leveldb [-d ] delete " + echo " leveldb [-d ] repair" + echo " leveldb -h | --help" + echo " leveldb -v | --version" + echo "" + echo "Options:" + echo " -d --database Database path" + echo " -x --hex binary value in uppercase hex" + echo " -h --help Show this screen" + echo " -v --version Show version" + quit() + + var args = commandLineParams() + + if "-h" in args or "--help" in args or len(args) == 0: + usage() + + if "-v" in args or "--version" in args: + echo "leveldb.nim ", version + let (major, minor) = getLibVersion() + echo "leveldb ", major, ".", minor + quit() + + proc findArg(s: seq[string], item: string): int = + result = find(s, item) + let stop = find(s, "--") + if stop >= 0 and stop <= result: + result = -1 + + var dbPath = "./" + var i = findArg(args, "-d") + var j = findArg(args, "--database") + if i >= 0 and j >= 0: + quit("Please specify database path one time only.") + i = max(i, j) + if i >= 0: + if (i + 1) < len(args): + dbPath = args[i+1] + args.delete(i+1) + args.delete(i) + else: + quit("Please specify database path.") + + var hex = false + i = findArg(args, "-x") + j = findArg(args, "--hex") + if i >= 0: + hex = true + args.delete(i) + if j >= 0: + hex = true + args.delete(j) + + # drop stop word + if "--" in args: + args.delete(args.find("--")) + + if len(args) == 0: + usage() + + proc checkCommand(args: seq[string], requires: int) = + if len(args) < requires + 1: + quit("Command " & args[0] & " requires at least " & $(requires) & " arguments.") + + import strutils + + var db: LevelDb + var key, value: string + if args[0] == "create": + db = open(dbPath) + db.close() + elif args[0] == "get": + checkCommand(args, 1) + db = open(dbPath) + key = args[1] + let val = db.get(key) + if val.isNone(): + quit() + else: + if hex: + echo val.get().toHex() + else: + echo val.get() + db.close() + elif args[0] == "put": + checkCommand(args, 2) + db = open(dbPath) + key = args[1] + value = args[2] + if hex: + value = parseHexStr(value) + db.put(key, value) + db.close() + elif args[0] == "list": + db = open(dbPath) + for (key, value) in db.iter(): + if hex: + echo key, " ", value.toHex() + else: + echo key, " ", value + db.close() + elif args[0] == "keys": + db = open(dbPath) + for (key, value) in db.iter(): + echo key + db.close() + elif args[0] == "delete": + checkCommand(args, 1) + db = open(dbPath) + key = args[1] + db.delete(key) + db.close() + elif args[0] == "repair": + repaireDb(dbPath) diff --git a/tests/test.nim b/tests/test.nim index f43121d..8bb8f3d 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -13,7 +13,7 @@ suite "leveldb": removeDb(dbName) test "version": - let (major, minor) = db.version() + let (major, minor) = getLibVersion() check(major > 0) check(minor > 0)