in quick-start/go/main.go [97:172]
func execute_sql_data_api(redshift_database string, command string, query string, redshift_user string, redshift_cluster_id string, isSynchronous bool) string {
var max_wait_cycles = 20
var attempts = 0
var query_status = ""
done := false
// Calling Redshift Data API with executeStatement()
execstmt_req, execstmt_err := redshiftclient.ExecuteStatement(&redshiftdataapiservice.ExecuteStatementInput{
ClusterIdentifier: aws.String(redshift_cluster_id),
DbUser: aws.String(redshift_user),
Database: aws.String(redshift_database),
Sql: aws.String(query),
})
if execstmt_err != nil {
// logs error and exists
log.Fatal(execstmt_err)
}
descstmt_req, descstmt_err := redshiftclient.DescribeStatement(&redshiftdataapiservice.DescribeStatementInput{
Id: execstmt_req.Id,
})
query_status = aws.StringValue(descstmt_req.Status)
if descstmt_err != nil {
// logs error and exists
log.Fatal(descstmt_err)
}
//Wait until query is finished or max cycles limit has been reached.
for done == false && isSynchronous && attempts < max_wait_cycles {
attempts += 1
time.Sleep(1 * time.Second)
descstmt_req, descstmt_err := redshiftclient.DescribeStatement(&redshiftdataapiservice.DescribeStatementInput{
Id: execstmt_req.Id,
})
query_status = aws.StringValue(descstmt_req.Status)
if query_status == "FAILED" {
// Fatal functions call os.Exit(1) after writing the log message
log.Fatal("Query status: ", query_status, " .... for query--> ", query)
} else if query_status == "FINISHED" {
log.Print("Query status: ", query_status, " .... for query--> ", query)
done = true
if *descstmt_req.HasResultSet {
getresult_req, getresult_err := redshiftclient.GetStatementResult(&redshiftdataapiservice.GetStatementResultInput{
Id: execstmt_req.Id,
})
if getresult_err != nil {
// logs error and exists
log.Fatal(getresult_err)
}
log.Print(getresult_req.Records)
}
} else {
log.Print("Currently working... query status: ", query_status, " .... for query--> ", query)
}
if descstmt_err != nil {
// logs error and exists
log.Fatal(descstmt_err)
}
}
//Timeout Precaution
if done == false && attempts >= max_wait_cycles && isSynchronous {
log.Print("Query status: ", query_status, " .... for query--> ", query)
// Fatal functions call os.Exit(1) after writing the log message
log.Fatal("Limit for max_wait_cycles has been reached before the query was able to finish. We have exited out of the while-loop. You may increase the limit accordingly.")
}
return query_status
}