mirror of
https://github.com/codex-storage/nim-leveldb.git
synced 2025-02-19 19:08:34 +00:00
Merge pull request #5 from xyb/client
add command line tool and bump verion to 0.3.0
This commit is contained in:
commit
051b3aeda4
@ -1,6 +1,6 @@
|
||||
# Package
|
||||
|
||||
version = "0.2.0"
|
||||
version = "0.3.0"
|
||||
author = "Michał Zieliński"
|
||||
description = "LevelDB wrapper for Nim"
|
||||
license = "MIT"
|
||||
|
146
src/leveldb.nim
146
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..<size]
|
||||
free(s)
|
||||
|
||||
proc delete*(self: LevelDb, key: string, sync = true) =
|
||||
@ -126,5 +128,137 @@ proc removeDb*(name: string) =
|
||||
leveldb_destroy_db(options, name, addr err)
|
||||
checkError(err)
|
||||
|
||||
proc repaireDb*(name: string) =
|
||||
let options = leveldb_options_create()
|
||||
leveldb_options_set_create_if_missing(options, 0)
|
||||
leveldb_options_set_error_if_exists(options, 0)
|
||||
var errPtr: cstring = nil
|
||||
leveldb_repair_db(options, name, addr errPtr)
|
||||
checkError(errPtr)
|
||||
|
||||
when isMainModule:
|
||||
discard
|
||||
import os
|
||||
|
||||
proc usage() =
|
||||
echo "LevelDB client"
|
||||
echo ""
|
||||
echo "Usage:"
|
||||
echo " leveldb [-d <db_path>] create"
|
||||
echo " leveldb [-d <db_path>] get <key> [-x | --hex]"
|
||||
echo " leveldb [-d <db_path>] put <key> <value> [-x | --hex]"
|
||||
echo " leveldb [-d <db_path>] list [-x | --hex]"
|
||||
echo " leveldb [-d <db_path>] keys"
|
||||
echo " leveldb [-d <db_path>] delete <key>"
|
||||
echo " leveldb [-d <db_path>] 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)
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user