Skip to content

Commit 57fafb1

Browse files
committed
Merge pull request #240 from bithavoc/use_json_numbers
UseJSONNumber
2 parents f1725d7 + e422a6c commit 57fafb1

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

cursor.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gorethink
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"errors"
67
"reflect"
@@ -200,7 +201,11 @@ func (c *Cursor) loadNextLocked(dest interface{}) (bool, error) {
200201
if c.buffer.Len() == 0 && c.responses.Len() > 0 {
201202
if response, ok := c.responses.Pop().(json.RawMessage); ok {
202203
var value interface{}
203-
err := json.Unmarshal(response, &value)
204+
decoder := json.NewDecoder(bytes.NewBuffer(response))
205+
if c.conn.opts.UseJSONNumber {
206+
decoder.UseNumber()
207+
}
208+
err := decoder.Decode(&value)
204209
if err != nil {
205210
return false, err
206211
}

query_select_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gorethink
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"math/rand"
67
"testing"
@@ -31,6 +32,35 @@ func (s *RethinkSuite) TestSelectGet(c *test.C) {
3132
res.Close()
3233
}
3334

35+
func (s *RethinkSuite) TestSelectJSONNumbers(c *test.C) {
36+
session, err := Connect(ConnectOpts{
37+
Address: url,
38+
AuthKey: authKey,
39+
UseJSONNumber: true,
40+
})
41+
c.Assert(err, test.IsNil)
42+
defer session.Close()
43+
// Ensure table + database exist
44+
DBCreate("test").Exec(session)
45+
DB("test").TableCreate("Table1").Exec(session)
46+
47+
// Insert rows
48+
DB("test").Table("Table1").Insert(objList).Exec(session)
49+
50+
// Test query
51+
var response interface{}
52+
query := DB("test").Table("Table1").Get(6)
53+
res, err := query.Run(session)
54+
c.Assert(err, test.IsNil)
55+
56+
err = res.One(&response)
57+
58+
c.Assert(err, test.IsNil)
59+
c.Assert(response, jsonEquals, map[string]interface{}{"id": json.Number("6"), "g1": json.Number("1"), "g2": json.Number("1"), "num": json.Number("15")})
60+
61+
res.Close()
62+
}
63+
3464
func (s *RethinkSuite) TestSelectGetAll(c *test.C) {
3565
// Ensure table + database exist
3666
DBCreate("test").Exec(session)

session.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ type ConnectOpts struct {
4343
// NodeRefreshInterval is used to determine how often the driver should
4444
// refresh the status of a node.
4545
NodeRefreshInterval time.Duration `gorethink:"node_refresh_interval,omitempty"`
46+
47+
// Indicates whether the cursors running in this session should use json.Number instead of float64 while
48+
// unmarshaling documents with interface{}. The default is `false`.
49+
UseJSONNumber bool
4650
}
4751

4852
func (o *ConnectOpts) toMap() map[string]interface{} {

0 commit comments

Comments
 (0)