From bc5358489f01665752396f4cfdf93ce2eb83ded4 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Wed, 12 Nov 2014 09:15:01 +0000
Subject: [PATCH] use Gob for database blobs, to avoid loss of numerical
 precision on uint64 with JSON

---
 database.go | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/database.go b/database.go
index 070200b..1c92cac 100644
--- a/database.go
+++ b/database.go
@@ -4,7 +4,7 @@ import (
 	"bytes"
 	cryptorand "crypto/rand"
 	"encoding/binary"
-	"encoding/json"
+	"encoding/gob"
 	"errors"
 	"math/rand"
 	"os"
@@ -196,7 +196,7 @@ func (db *Database) GetBookFiles(bookid BookId) ([]*File, error) {
 	var out []*File
 	for it.Seek(start); it.Valid() && bytes.Compare(it.Key(), end) < 0; it.Next() {
 		var filepath string
-		if json.Unmarshal(it.Value(), &filepath) == nil {
+		if gob.NewDecoder(bytes.NewReader(it.Value())).Decode(&filepath) == nil {
 			if file, err := db.GetFile(filepath); err == nil {
 				out = append(out, file)
 			}
@@ -212,7 +212,7 @@ func (db *Database) Get(bucket, key []byte, obj interface{}) error {
 	if err != nil {
 		return err
 	}
-	return json.Unmarshal(data, obj)
+	return gob.NewDecoder(bytes.NewReader(data)).Decode(obj)
 }
 
 func (db *Database) PutBook(b *Book) error {
@@ -237,15 +237,15 @@ func (db *Database) PutFile(f *File) error {
 }
 
 func (db *Database) Put(bucket, key []byte, obj interface{}) error {
-	data, err := json.Marshal(obj)
-	if err != nil {
+	var buf bytes.Buffer
+	if err := gob.NewEncoder(&buf).Encode(obj); err != nil {
 		return err
 	}
 
 	wo := levigo.NewWriteOptions()
 	defer wo.Close()
 
-	return db.leveldb.Put(wo, bktToKey(bucket, key), data)
+	return db.leveldb.Put(wo, bktToKey(bucket, key), buf.Bytes())
 }
 
 func (db *Database) DeleteBook(bookid BookId) error {
@@ -303,7 +303,7 @@ func (i *DatabaseIterator) Id() BookId {
 }
 
 func (i *DatabaseIterator) Value(obj interface{}) error {
-	return json.Unmarshal(i.iter.Value(), obj)
+	return gob.NewDecoder(bytes.NewReader(i.iter.Value())).Decode(obj)
 }
 
 // Scan an entire bucket.
-- 
GitLab