1package pouchdb 2 3import ( 4 "context" 5 "fmt" 6 "io" 7 8 "github.com/gopherjs/gopherjs/js" 9 10 "github.com/go-kivik/kivik/driver" 11 "github.com/go-kivik/kivik/errors" 12) 13 14type bulkResult struct { 15 *js.Object 16 OK bool `js:"ok"` 17 ID string `js:"id"` 18 Rev string `js:"rev"` 19 Error string `js:"name"` 20 StatusCode int `js:"status"` 21 Reason string `js:"message"` 22 IsError bool `js:"error"` 23} 24 25type bulkResults struct { 26 results *js.Object 27} 28 29var _ driver.BulkResults = &bulkResults{} 30 31func (r *bulkResults) Next(update *driver.BulkResult) (err error) { 32 defer func() { 33 if r := recover(); r != nil { 34 if e, ok := r.(error); ok { 35 err = e 36 } else { 37 err = fmt.Errorf("%v", r) 38 } 39 } 40 }() 41 if r.results == js.Undefined || r.results.Length() == 0 { 42 return io.EOF 43 } 44 result := &bulkResult{} 45 result.Object = r.results.Call("shift") 46 update.ID = result.ID 47 update.Rev = result.ID 48 update.Error = nil 49 if result.IsError { 50 update.Error = errors.Status(result.StatusCode, result.Reason) 51 } 52 return nil 53} 54 55func (r *bulkResults) Close() error { 56 r.results = nil // Free up memory used by any remaining rows 57 return nil 58} 59 60func (d *db) BulkDocs(ctx context.Context, docs []interface{}, options map[string]interface{}) (driver.BulkResults, error) { 61 result, err := d.db.BulkDocs(ctx, docs, options) 62 if err != nil { 63 return nil, err 64 } 65 return &bulkResults{results: result}, nil 66} 67