db/script.go (32 lines of code) (raw):
package opbeansdb
import (
"bufio"
"bytes"
"context"
"io"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
)
func ExecCommands(ctx context.Context, db *sqlx.DB, r io.Reader) error {
scanner := bufio.NewScanner(r)
scanner.Split(scanStatements)
for scanner.Scan() {
stmt := scanner.Text()
if _, err := db.ExecContext(ctx, stmt); err != nil {
return errors.Wrapf(err, "executing statement failed:\n%s", stmt)
}
}
return nil
}
func scanStatements(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := bytes.IndexByte(data, ';'); i >= 0 {
return i + 1, data[:i], nil
}
if atEOF {
return 0, nil, errors.New("unterminated statement")
}
// Request more data.
return 0, nil, nil
}