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