Skip to content

Commit 6468f77

Browse files
committed
Merge branch 'hotfix/v1.1.4'
2 parents 1d4aeb1 + d8910ca commit 6468f77

13 files changed

+219
-107
lines changed

Diff for: CHANGELOG.md

+14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22
All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## v1.1.4
6+
### Added
7+
- Added root table terms (`r.TableCreate`, `r.TableList` and `r.TableDrop`)
8+
9+
### Removed
10+
- Removed `ReadMode` option from `RunOpts` and `ExecOpts` (incorrectly added in v1.1.0)
11+
12+
### Fixed
13+
- Fixed `Decode` no longer setting pointer to nil on document not found
14+
- Fixed panic when `fetchMore` returns an error
15+
- Fixed deadlock when closing changefeed
16+
- Fixed stop query incorrectly waiting for response
17+
- Fixed pointers not to be properly decoded
18+
519
## v1.1.3
620
### Fixed
721
- Fixed pointers not to be properly decoded

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
![GoRethink Logo](https://raw.github.com/wiki/dancannon/gorethink/gopher-and-thinker-s.png "Golang Gopher and RethinkDB Thinker")
1010

11-
Current version: v1.1.3 (RethinkDB v2.1)
11+
Current version: v1.1.4 (RethinkDB v2.1)
1212

1313
Please note that this version of the driver only supports versions of RethinkDB using the v0.4 protocol (any versions of the driver older than RethinkDB 2.0 will not work).
1414

Diff for: cursor.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ func (c *Cursor) Close() error {
119119
q := Query{
120120
Type: p.Query_STOP,
121121
Token: c.token,
122+
Opts: map[string]interface{}{
123+
"noreply": true,
124+
},
122125
}
123126

124127
_, _, err = conn.Query(q)
@@ -184,10 +187,10 @@ func (c *Cursor) loadNextLocked(dest interface{}) (bool, error) {
184187
if c.buffer.Len() == 0 && c.responses.Len() == 0 && !c.finished {
185188
c.mu.Unlock()
186189
err := c.fetchMore()
190+
c.mu.Lock()
187191
if err != nil {
188192
return false, err
189193
}
190-
c.mu.Lock()
191194
}
192195

193196
if c.buffer.Len() == 0 && c.responses.Len() == 0 && c.finished {

Diff for: cursor_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,13 @@ func (s *RethinkSuite) TestEmptyResults(c *test.C) {
218218
res, err = DB("test").Table("test").Filter(obj).Run(session)
219219
c.Assert(err, test.IsNil)
220220
c.Assert(res.IsNil(), test.Equals, true)
221+
222+
var objP *object
223+
224+
res, err = DB("test").Table("test").Get("missing value").Run(session)
225+
res.Next(&objP)
226+
c.Assert(err, test.IsNil)
227+
c.Assert(objP, test.IsNil)
221228
}
222229

223230
func (s *RethinkSuite) TestCursorAll(c *test.C) {
@@ -338,6 +345,22 @@ func (s *RethinkSuite) TestCursorListen(c *test.C) {
338345
})
339346
}
340347

348+
func (s *RethinkSuite) TestCursorChangesClose(c *test.C) {
349+
// Ensure table + database exist
350+
DBCreate("test").Exec(session)
351+
DB("test").TableDrop("Table3").Exec(session)
352+
DB("test").TableCreate("Table3").Exec(session)
353+
354+
// Test query
355+
// res, err := DB("test").Table("Table3").Changes().Run(session)
356+
res, err := DB("test").Table("Table3").Changes().Run(session)
357+
c.Assert(err, test.IsNil)
358+
359+
// Ensure that the cursor can be closed
360+
err = res.Close()
361+
c.Assert(err, test.IsNil)
362+
}
363+
341364
func (s *RethinkSuite) TestCursorReuseResult(c *test.C) {
342365
// Test query
343366
query := Expr([]interface{}{

Diff for: doc.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Package gorethink implements a Go driver for RethinkDB
22
//
3-
// Current version: v1.1.3 (RethinkDB v2.1)
3+
// Current version: v1.1.4 (RethinkDB v2.1)
44
// For more in depth information on how to use RethinkDB check out the API docs
55
// at http://rethinkdb.com/api
66
package gorethink

Diff for: encoding/decoder.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,6 @@ func Decode(dst interface{}, src interface{}) (err error) {
5252

5353
// decode decodes the source value into the destination value
5454
func decode(dv, sv reflect.Value) {
55-
if dv.IsValid() {
56-
dv = indirect(dv, false)
57-
dv.Set(reflect.Zero(dv.Type()))
58-
}
59-
6055
valueDecoder(dv, sv)(dv, sv)
6156
}
6257

@@ -74,6 +69,11 @@ func valueDecoder(dv, sv reflect.Value) decoderFunc {
7469
return invalidValueDecoder
7570
}
7671

72+
if dv.IsValid() {
73+
dv = indirect(dv, false)
74+
dv.Set(reflect.Zero(dv.Type()))
75+
}
76+
7777
return typeDecoder(dv.Type(), sv.Type())
7878
}
7979

Diff for: encoding/decoder_types.go

+3
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ func interfaceDecoder(dv, sv reflect.Value) {
186186

187187
func interfaceAsTypeDecoder(dv, sv reflect.Value) {
188188
if !sv.IsNil() {
189+
dv = indirect(dv, false)
190+
dv.Set(reflect.Zero(dv.Type()))
191+
189192
decode(dv, sv.Elem())
190193
}
191194
}

Diff for: encoding/encoder_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ var optionalsExpected = map[string]interface{}{
9696
func TestOmitEmpty(t *testing.T) {
9797
var o Optionals
9898
o.Sw = "something"
99-
o.Tr = time.Unix(0, 0)
99+
o.Tr = time.Unix(0, 0).In(time.UTC)
100100
o.Mr = map[string]interface{}{}
101101
o.Mo = map[string]interface{}{}
102102

Diff for: gorethink_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
var session *Session
1818
var debug = flag.Bool("gorethink.debug", false, "print query trees")
19+
var testdata = flag.Bool("gorethink.testdata", true, "create test data")
1920
var url, url1, url2, url3, db, authKey string
2021

2122
func init() {

Diff for: query.go

-2
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ type RunOpts struct {
196196
DB interface{} `gorethink:"db,omitempty"`
197197
Db interface{} `gorethink:"db,omitempty"` // Deprecated
198198
Profile interface{} `gorethink:"profile,omitempty"`
199-
ReadMode interface{} `gorethink:"read_mode,omitempty"`
200199
UseOutdated interface{} `gorethink:"use_outdated,omitempty"` // Deprecated
201200
ArrayLimit interface{} `gorethink:"array_limit,omitempty"`
202201
TimeFormat interface{} `gorethink:"time_format,omitempty"`
@@ -280,7 +279,6 @@ type ExecOpts struct {
280279
DB interface{} `gorethink:"db,omitempty"`
281280
Db interface{} `gorethink:"db,omitempty"` // Deprecated
282281
Profile interface{} `gorethink:"profile,omitempty"`
283-
ReadMode interface{} `gorethink:"read_mode,omitempty"`
284282
UseOutdated interface{} `gorethink:"use_outdated,omitempty"` // Deprecated
285283
ArrayLimit interface{} `gorethink:"array_limit,omitempty"`
286284
TimeFormat interface{} `gorethink:"time_format,omitempty"`

Diff for: query_table.go

+22
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@ func (o *TableCreateOpts) toMap() map[string]interface{} {
1717
return optArgsToMap(o)
1818
}
1919

20+
// TableCreate creates a table. A RethinkDB table is a collection of JSON
21+
// documents.
22+
//
23+
// Note: Only alphanumeric characters and underscores are valid for the table name.
24+
func TableCreate(name interface{}, optArgs ...TableCreateOpts) Term {
25+
opts := map[string]interface{}{}
26+
if len(optArgs) >= 1 {
27+
opts = optArgs[0].toMap()
28+
}
29+
return constructRootTerm("TableCreate", p.Term_TABLE_CREATE, []interface{}{name}, opts)
30+
}
31+
2032
// TableCreate creates a table. A RethinkDB table is a collection of JSON
2133
// documents.
2234
//
@@ -29,11 +41,21 @@ func (t Term) TableCreate(name interface{}, optArgs ...TableCreateOpts) Term {
2941
return constructMethodTerm(t, "TableCreate", p.Term_TABLE_CREATE, []interface{}{name}, opts)
3042
}
3143

44+
// TableDrop deletes a table. The table and all its data will be deleted.
45+
func TableDrop(args ...interface{}) Term {
46+
return constructRootTerm("TableDrop", p.Term_TABLE_DROP, args, map[string]interface{}{})
47+
}
48+
3249
// TableDrop deletes a table. The table and all its data will be deleted.
3350
func (t Term) TableDrop(args ...interface{}) Term {
3451
return constructMethodTerm(t, "TableDrop", p.Term_TABLE_DROP, args, map[string]interface{}{})
3552
}
3653

54+
// TableList lists all table names in a database.
55+
func TableList(args ...interface{}) Term {
56+
return constructRootTerm("TableList", p.Term_TABLE_LIST, args, map[string]interface{}{})
57+
}
58+
3759
// TableList lists all table names in a database.
3860
func (t Term) TableList(args ...interface{}) Term {
3961
return constructMethodTerm(t, "TableList", p.Term_TABLE_LIST, args, map[string]interface{}{})

Diff for: query_table_test.go

+48-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,20 @@ func (s *RethinkSuite) TestTableCreate(c *test.C) {
1818
c.Assert(response.TablesCreated, jsonEquals, 1)
1919
}
2020

21+
func (s *RethinkSuite) TestTableCreateSessionDatabase(c *test.C) {
22+
session, err := Connect(ConnectOpts{
23+
Address: url,
24+
AuthKey: authKey,
25+
})
26+
c.Assert(err, test.IsNil)
27+
TableDrop("test").Exec(session)
28+
29+
// Test database creation
30+
response, err := TableCreate("test").RunWrite(session)
31+
c.Assert(err, test.IsNil)
32+
c.Assert(response.TablesCreated, jsonEquals, 1)
33+
}
34+
2135
func (s *RethinkSuite) TestTableCreatePrimaryKey(c *test.C) {
2236
DB("test").TableDrop("testOpts").Exec(session)
2337

@@ -250,9 +264,41 @@ func (s *RethinkSuite) TestTableChangesExit(c *test.C) {
250264
for _ = range change {
251265
n++
252266
}
253-
if res.Err() != nil {
254-
c.Fatal(res.Err())
267+
if res.Err() == nil {
268+
c.Fatal("No error returned, expected connection closed")
255269
}
256270

257271
c.Assert(n, test.Equals, 5)
258272
}
273+
274+
func (s *RethinkSuite) TestTableChangesExitNoResults(c *test.C) {
275+
DB("test").TableDrop("changes").Exec(session)
276+
DB("test").TableCreate("changes").Exec(session)
277+
278+
var n int
279+
280+
res, err := DB("test").Table("changes").Changes().Run(session)
281+
if err != nil {
282+
c.Fatal(err.Error())
283+
}
284+
c.Assert(res.Type(), test.Equals, "Feed")
285+
286+
change := make(chan ChangeResponse)
287+
288+
// Close cursor after one second
289+
go func() {
290+
<-time.After(time.Second)
291+
res.Close()
292+
}()
293+
294+
// Listen for changes
295+
res.Listen(change)
296+
for _ = range change {
297+
n++
298+
}
299+
if res.Err() == nil {
300+
c.Fatal("No error returned, expected connection closed")
301+
}
302+
303+
c.Assert(n, test.Equals, 0)
304+
}

0 commit comments

Comments
 (0)