Compare commits
24 Commits
Author | SHA1 | Date |
---|---|---|
Vincent Batts | f6aa21f676 | |
Vincent Batts | 5b5ff55501 | |
Vincent Batts | 32da34b741 | |
Vincent Batts | 22e0b9821a | |
irieda | c965d5c21b | |
unknown | 1464c8035f | |
unknown | d4f1b96885 | |
irieda | 75fc045742 | |
unknown | eb589791cd | |
irieda | 306fbb4209 | |
irieda | fa91283ecf | |
nobonobo | 7f40cedf8d | |
nobonobo | 0dfcc04c47 | |
Dan Goldsmith | e350fa2043 | |
irieda | dd85ad5a91 | |
nobonobo | e7945470e7 | |
nobonobo | 2bf37243a8 | |
nobonobo | ef0e8fcbec | |
nobonobo | f4ea1cdab8 | |
irieda | a265077155 | |
irieda | eaeec8ef44 | |
irieda | b5eb549502 | |
nobonobo | af10d52ee0 | |
nobonobo | 1238fa4318 |
|
@ -0,0 +1,6 @@
|
|||
pipeline:
|
||||
build:
|
||||
image: golang:1.10
|
||||
commands:
|
||||
- go get ./...
|
||||
- go test ./...
|
|
@ -1,3 +1,3 @@
|
|||
[submodule "src"]
|
||||
path = src
|
||||
url = https://github.com/unqlite/unqlite.git
|
||||
[submodule "unqlite"]
|
||||
path = unqlite
|
||||
url = https://github.com/symisc/unqlite.git
|
||||
|
|
|
@ -2,11 +2,12 @@ language: go
|
|||
|
||||
go:
|
||||
- 1.1
|
||||
- 1.2
|
||||
- tip
|
||||
|
||||
install:
|
||||
- go get github.com/r7kamura/gospel
|
||||
- make install
|
||||
- go install .
|
||||
|
||||
script:
|
||||
- make test
|
||||
- go test .
|
||||
|
|
25
Makefile
25
Makefile
|
@ -1,25 +0,0 @@
|
|||
# for GNU make
|
||||
.PHONY: all build install test clean
|
||||
|
||||
all: build
|
||||
|
||||
build: libunqlite.a
|
||||
go build
|
||||
|
||||
install: libunqlite.a
|
||||
go install
|
||||
|
||||
clean:
|
||||
rm -f libunqlite.a
|
||||
rm -rf src/*
|
||||
|
||||
test:
|
||||
go test ./
|
||||
|
||||
src/unqlite.c:
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
libunqlite.a: src/unqlite.c src/unqlite.h
|
||||
gcc -c src/unqlite.c -I./src -DUNQLITE_ENABLE_THREADS=1
|
||||
ar rv libunqlite.a unqlite.o
|
10
README.md
10
README.md
|
@ -3,19 +3,21 @@ unqlitego
|
|||
|
||||
UnQLite Binding for golang.
|
||||
|
||||
[Docs](https://godoc.org/git.thisco.de/vbatts/unqlitego)
|
||||
|
||||
Install
|
||||
---------
|
||||
|
||||
```sh
|
||||
$ go get -d github.com/nobonobo/unqlitego
|
||||
$ make -C $GOPATH/src/github.com/nobonobo/unqlitego install
|
||||
$ go get git.thisco.de/vbatts/unqlitego
|
||||
```
|
||||
|
||||
Test
|
||||
---------
|
||||
```sh
|
||||
$ go get github.com/r7kamura/gospel
|
||||
$ make -C $GOPATH/src/github.com/nobonobo/unqlitego test
|
||||
$ cd ${GOPATH/:*/}/src/git.thisco.de/vbatts/unqlitego
|
||||
$ go test .
|
||||
```
|
||||
|
||||
Benchmark
|
||||
|
@ -23,7 +25,7 @@ Benchmark
|
|||
|
||||
```sh
|
||||
$ go get github.com/r7kamura/gospel
|
||||
$ cd $GOPATH/src/github.com/nobonobo/unqlitego
|
||||
$ cd ${GOPATH/:*/}/src/git.thisco.de/vbatts/unqlitego
|
||||
$ go test -bench Bench*
|
||||
```
|
||||
|
||||
|
|
1
src
1
src
|
@ -1 +0,0 @@
|
|||
Subproject commit 480271123692090441b41c54d0433218d592da15
|
|
@ -0,0 +1 @@
|
|||
Subproject commit ca65e2b9f690c7609bd0d062c142479b53074bd5
|
105
unqlite.go
105
unqlite.go
|
@ -1,8 +1,10 @@
|
|||
package unqlitego
|
||||
|
||||
/*
|
||||
#cgo LDFLAGS: -L./ -lunqlite
|
||||
#include "./src/unqlite.h"
|
||||
#cgo linux CFLAGS: -DUNQLITE_ENABLE_THREADS=1 -Wno-unused-but-set-variable
|
||||
#cgo darwin CFLAGS: -DUNQLITE_ENABLE_THREADS=1
|
||||
#cgo windows CFLAGS: -DUNQLITE_ENABLE_THREADS=1
|
||||
#include "./unqlite.h"
|
||||
#include <stdlib.h>
|
||||
*/
|
||||
import "C"
|
||||
|
@ -24,13 +26,30 @@ func (e UnQLiteError) Error() string {
|
|||
return s
|
||||
}
|
||||
|
||||
const (
|
||||
// UnQLiteNoMemErr ...
|
||||
UnQLiteNoMemErr UnQLiteError = UnQLiteError(C.UNQLITE_NOMEM)
|
||||
)
|
||||
|
||||
var errString = map[UnQLiteError]string{
|
||||
C.UNQLITE_NOMEM: "Out of memory",
|
||||
C.UNQLITE_LOCKERR: "Locking protocol error",
|
||||
C.UNQLITE_READ_ONLY: "Read only Key/Value storage engine",
|
||||
C.UNQLITE_CANTOPEN: "Unable to open the database file",
|
||||
C.UNQLITE_FULL: "Full database",
|
||||
C.UNQLITE_VM_ERR: "Virtual machine error",
|
||||
C.UNQLITE_COMPILE_ERR: "Compilation error",
|
||||
C.UNQLITE_DONE: "Operation done", // Not an error.
|
||||
C.UNQLITE_CORRUPT: "Corrupt pointer",
|
||||
C.UNQLITE_NOOP: "No such method",
|
||||
C.UNQLITE_PERM: "Permission error",
|
||||
C.UNQLITE_EOF: "End Of Input",
|
||||
C.UNQLITE_NOTIMPLEMENTED: "Method not implemented by the underlying Key/Value storage engine",
|
||||
C.UNQLITE_BUSY: "The database file is locked",
|
||||
C.UNQLITE_UNKNOWN: "Unknown configuration option",
|
||||
C.UNQLITE_EXISTS: "Record exists",
|
||||
C.UNQLITE_ABORT: "Another thread have released this instance",
|
||||
C.UNQLITE_INVALID: "Invalid parameter",
|
||||
C.UNQLITE_LIMIT: "Database limit reached",
|
||||
C.UNQLITE_NOTFOUND: "No such record",
|
||||
C.UNQLITE_LOCKED: "Forbidden Operation",
|
||||
C.UNQLITE_EMPTY: "Empty record",
|
||||
C.UNQLITE_IOERR: "IO error",
|
||||
C.UNQLITE_NOMEM: "Out of memory",
|
||||
}
|
||||
|
||||
// Database ...
|
||||
|
@ -80,9 +99,19 @@ func (db *Database) Close() (err error) {
|
|||
|
||||
// Store ...
|
||||
func (db *Database) Store(key, value []byte) (err error) {
|
||||
var k, v unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
if len(value) > 0 {
|
||||
v = unsafe.Pointer(&value[0])
|
||||
}
|
||||
|
||||
res := C.unqlite_kv_store(db.handle,
|
||||
unsafe.Pointer(&key[0]), C.int(len(key)),
|
||||
unsafe.Pointer(&value[0]), C.unqlite_int64(len(value)))
|
||||
k, C.int(len(key)),
|
||||
v, C.unqlite_int64(len(value)))
|
||||
if res == C.UNQLITE_OK {
|
||||
return nil
|
||||
}
|
||||
|
@ -91,9 +120,19 @@ func (db *Database) Store(key, value []byte) (err error) {
|
|||
|
||||
// Append ...
|
||||
func (db *Database) Append(key, value []byte) (err error) {
|
||||
var k, v unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
if len(value) > 0 {
|
||||
v = unsafe.Pointer(&value[0])
|
||||
}
|
||||
|
||||
res := C.unqlite_kv_append(db.handle,
|
||||
unsafe.Pointer(&key[0]), C.int(len(key)),
|
||||
unsafe.Pointer(&value[0]), C.unqlite_int64(len(value)))
|
||||
k, C.int(len(key)),
|
||||
v, C.unqlite_int64(len(value)))
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
}
|
||||
|
@ -102,14 +141,20 @@ func (db *Database) Append(key, value []byte) (err error) {
|
|||
|
||||
// Fetch ...
|
||||
func (db *Database) Fetch(key []byte) (value []byte, err error) {
|
||||
var k unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
var n C.unqlite_int64
|
||||
res := C.unqlite_kv_fetch(db.handle, unsafe.Pointer(&key[0]), C.int(len(key)), nil, &n)
|
||||
res := C.unqlite_kv_fetch(db.handle, k, C.int(len(key)), nil, &n)
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
return
|
||||
}
|
||||
value = make([]byte, int(n))
|
||||
res = C.unqlite_kv_fetch(db.handle, unsafe.Pointer(&key[0]), C.int(len(key)), unsafe.Pointer(&value[0]), &n)
|
||||
res = C.unqlite_kv_fetch(db.handle, k, C.int(len(key)), unsafe.Pointer(&value[0]), &n)
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
}
|
||||
|
@ -118,7 +163,13 @@ func (db *Database) Fetch(key []byte) (value []byte, err error) {
|
|||
|
||||
// Delete ...
|
||||
func (db *Database) Delete(key []byte) (err error) {
|
||||
res := C.unqlite_kv_delete(db.handle, unsafe.Pointer(&key[0]), C.int(len(key)))
|
||||
var k unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
res := C.unqlite_kv_delete(db.handle, k, C.int(len(key)))
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
}
|
||||
|
@ -177,7 +228,13 @@ func (curs *Cursor) Close() (err error) {
|
|||
|
||||
// Seek ...
|
||||
func (curs *Cursor) Seek(key []byte) (err error) {
|
||||
res := C.unqlite_kv_cursor_seek(curs.handle, unsafe.Pointer(&key[0]), C.int(len(key)), C.UNQLITE_CURSOR_MATCH_EXACT)
|
||||
var k unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
res := C.unqlite_kv_cursor_seek(curs.handle, k, C.int(len(key)), C.UNQLITE_CURSOR_MATCH_EXACT)
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
}
|
||||
|
@ -186,7 +243,13 @@ func (curs *Cursor) Seek(key []byte) (err error) {
|
|||
|
||||
// SeekLE ...
|
||||
func (curs *Cursor) SeekLE(key []byte) (err error) {
|
||||
res := C.unqlite_kv_cursor_seek(curs.handle, unsafe.Pointer(&key[0]), C.int(len(key)), C.UNQLITE_CURSOR_MATCH_LE)
|
||||
var k unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
res := C.unqlite_kv_cursor_seek(curs.handle, k, C.int(len(key)), C.UNQLITE_CURSOR_MATCH_LE)
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
}
|
||||
|
@ -195,7 +258,13 @@ func (curs *Cursor) SeekLE(key []byte) (err error) {
|
|||
|
||||
// SeekGE ...
|
||||
func (curs *Cursor) SeekGE(key []byte) (err error) {
|
||||
res := C.unqlite_kv_cursor_seek(curs.handle, unsafe.Pointer(&key[0]), C.int(len(key)), C.UNQLITE_CURSOR_MATCH_GE)
|
||||
var k unsafe.Pointer
|
||||
|
||||
if len(key) > 0 {
|
||||
k = unsafe.Pointer(&key[0])
|
||||
}
|
||||
|
||||
res := C.unqlite_kv_cursor_seek(curs.handle, k, C.int(len(key)), C.UNQLITE_CURSOR_MATCH_GE)
|
||||
if res != C.UNQLITE_OK {
|
||||
err = UnQLiteError(res)
|
||||
}
|
||||
|
|
|
@ -3,9 +3,10 @@ package unqlitego
|
|||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
. "github.com/r7kamura/gospel"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
. "github.com/r7kamura/gospel"
|
||||
)
|
||||
|
||||
func Testライブラリ(t *testing.T) {
|
||||
|
@ -15,16 +16,16 @@ func Testライブラリ(t *testing.T) {
|
|||
Expect(IsThreadSafe()).To(Equal, true)
|
||||
})
|
||||
It("Version", func() {
|
||||
Expect(Version()).To(Equal, "1.1.6")
|
||||
Expect(Version()).To(Equal, "1.1.7")
|
||||
})
|
||||
It("Signature", func() {
|
||||
Expect(Signature()).To(Equal, "unqlite/1.1.6")
|
||||
Expect(Signature()).To(Equal, "unqlite/1.1.7")
|
||||
})
|
||||
It("Ident", func() {
|
||||
Expect(Ident()).To(Equal, "unqlite:b172a1e2c3f62fb35c8e1fb2795121f82356cad6")
|
||||
})
|
||||
It("Copyright", func() {
|
||||
Expect(Copyright()).To(Equal, "Copyright (C) Symisc Systems, S.U.A.R.L [Mrad Chems Eddine <chm@symisc.net>] 2012-2013, http://unqlite.org/")
|
||||
Expect(Copyright()).To(Equal, `Copyright (C) Symisc Systems, S.U.A.R.L [Mrad Chems Eddine <chm@symisc.net>] 2012-2016, http://unqlite.org/`)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
@ -54,11 +55,20 @@ func Testモジュール(t *testing.T) {
|
|||
err := db.Store([]byte("sample"), src)
|
||||
Expect(err).To(NotExist)
|
||||
})
|
||||
It("Database.Store.ZeroByte", func() {
|
||||
err := db.Store([]byte{}, src)
|
||||
Expect(err).To(Exist)
|
||||
})
|
||||
It("Database.Fetch", func() {
|
||||
dst, err := db.Fetch([]byte("sample"))
|
||||
Expect(err).To(NotExist)
|
||||
Expect(bytes.Compare(src, dst)).To(Equal, 0)
|
||||
})
|
||||
It("Database.Fetch.ZeroByte", func() {
|
||||
value, err := db.Fetch([]byte{})
|
||||
Expect(err).To(Exist)
|
||||
Expect(value).To(NotExist)
|
||||
})
|
||||
It("Database.Append", func() {
|
||||
err1 := db.Append([]byte("sample"), []byte(" append"))
|
||||
Expect(err1).To(NotExist)
|
||||
|
|
Loading…
Reference in New Issue