1package pgx
2
3import (
4	"io"
5
6	"github.com/jackc/pgx/pgproto3"
7)
8
9func (c *Conn) readUntilCopyOutResponse() error {
10	for {
11		msg, err := c.rxMsg()
12		if err != nil {
13			return err
14		}
15
16		switch msg := msg.(type) {
17		case *pgproto3.CopyOutResponse:
18			return nil
19		default:
20			err = c.processContextFreeMsg(msg)
21			if err != nil {
22				return err
23			}
24		}
25	}
26}
27
28func (c *Conn) CopyToWriter(w io.Writer, sql string, args ...interface{}) error {
29	if err := c.sendSimpleQuery(sql, args...); err != nil {
30		return err
31	}
32
33	if err := c.readUntilCopyOutResponse(); err != nil {
34		return err
35	}
36
37	for {
38		msg, err := c.rxMsg()
39		if err != nil {
40			return err
41		}
42
43		switch msg := msg.(type) {
44		case *pgproto3.CopyDone:
45			break
46		case *pgproto3.CopyData:
47			_, err := w.Write(msg.Data)
48			if err != nil {
49				c.die(err)
50				return err
51			}
52		case *pgproto3.ReadyForQuery:
53			c.rxReadyForQuery(msg)
54			return nil
55		case *pgproto3.CommandComplete:
56		case *pgproto3.ErrorResponse:
57			return c.rxErrorResponse(msg)
58		default:
59			return c.processContextFreeMsg(msg)
60		}
61	}
62
63	return nil
64}
65