github.com/snowflakedb/gosnowflake@v1.9.0/result.go (about) 1 // Copyright (c) 2017-2022 Snowflake Computing Inc. All rights reserved. 2 3 package gosnowflake 4 5 import "errors" 6 7 type queryStatus string 8 9 const ( 10 // QueryStatusInProgress denotes a query execution in progress 11 QueryStatusInProgress queryStatus = "queryStatusInProgress" 12 // QueryStatusComplete denotes a completed query execution 13 QueryStatusComplete queryStatus = "queryStatusComplete" 14 // QueryFailed denotes a failed query 15 QueryFailed queryStatus = "queryFailed" 16 ) 17 18 // SnowflakeResult provides an API for methods exposed to the clients 19 type SnowflakeResult interface { 20 GetQueryID() string 21 GetStatus() queryStatus 22 GetArrowBatches() ([]*ArrowBatch, error) 23 } 24 25 type snowflakeResult struct { 26 affectedRows int64 27 insertID int64 // Snowflake doesn't support last insert id 28 queryID string 29 status queryStatus 30 err error 31 errChannel chan error 32 } 33 34 func (res *snowflakeResult) LastInsertId() (int64, error) { 35 if err := res.waitForAsyncExecStatus(); err != nil { 36 return -1, err 37 } 38 return res.insertID, nil 39 } 40 41 func (res *snowflakeResult) RowsAffected() (int64, error) { 42 if err := res.waitForAsyncExecStatus(); err != nil { 43 return -1, err 44 } 45 return res.affectedRows, nil 46 } 47 48 func (res *snowflakeResult) GetQueryID() string { 49 return res.queryID 50 } 51 52 func (res *snowflakeResult) GetStatus() queryStatus { 53 return res.status 54 } 55 56 func (res *snowflakeResult) GetArrowBatches() ([]*ArrowBatch, error) { 57 return nil, &SnowflakeError{ 58 Number: ErrNotImplemented, 59 Message: errMsgNotImplemented, 60 } 61 } 62 63 func (res *snowflakeResult) waitForAsyncExecStatus() error { 64 // if async exec, block until execution is finished 65 if res.status == QueryStatusInProgress { 66 err := <-res.errChannel 67 res.status = QueryStatusComplete 68 if err != nil { 69 res.status = QueryFailed 70 res.err = err 71 return err 72 } 73 } else if res.status == QueryFailed { 74 return res.err 75 } 76 return nil 77 } 78 79 type snowflakeResultNoRows struct { 80 queryID string 81 } 82 83 func (*snowflakeResultNoRows) LastInsertId() (int64, error) { 84 return 0, errors.New("no LastInsertId available") 85 } 86 87 func (*snowflakeResultNoRows) RowsAffected() (int64, error) { 88 return 0, errors.New("no RowsAffected available") 89 } 90 91 func (rnr *snowflakeResultNoRows) GetQueryID() string { 92 return rnr.queryID 93 }