// Invoke executes the statement block func (s Statement) Invoke(c *spiffy.DbConnection, tx *sql.Tx) (err error) { for _, step := range s { err = c.ExecInTx(step, tx) if err != nil { return } } return }
// Invoke consumes the data file and writes it to the db. func (dfr *DataFileReader) invoke(c *spiffy.DbConnection, tx *sql.Tx) (err error) { var f *os.File if f, err = os.Open(dfr.path); err != nil { return } defer f.Close() var stmt *sql.Stmt var state int var cursor int64 var readBuffer = make([]byte, 32) var readErr error var lineBuffer = bytes.NewBuffer([]byte{}) var line string var pieces []interface{} for readErr == nil { lineBuffer.Reset() switch state { case 0: cursor, readErr = dfr.readLine(f, cursor, readBuffer, lineBuffer) if readErr != nil { continue } line = lineBuffer.String() if spiffy.HasPrefixCaseInsensitive(line, "--") { continue } if spiffy.HasPrefixCaseInsensitive(line, "set") { continue } if spiffy.HasPrefixCaseInsensitive(line, "copy") { if !spiffy.HasSuffixCaseInsensitive(line, "from stdin;") { err = fmt.Errorf("Only `stdin` from clauses supported at this time, cannot continue.") return } stmt, err = dfr.executeCopyLine(line, c, tx) if err != nil { return } state = 1 continue } err = c.ExecInTx(line, tx) if err != nil { return } case 1: pieces, cursor, readErr = dfr.readTabLine(f, cursor, readBuffer, lineBuffer) if readErr != nil { continue } if len(pieces) == 0 { err = fmt.Errorf("Empty data line, we error on this for now.") return } if len(pieces) == 1 && spiffy.HasPrefixCaseInsensitive(pieces[0].(string), `\.`) { err = stmt.Close() if err != nil { return } state = 0 continue } _, err = stmt.Exec(pieces...) if err != nil { return } } } return nil }