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  }