Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -3,10 +3,14 @@ package queries
|
||||
import (
|
||||
"bssapp-backend/db"
|
||||
"bssapp-backend/models"
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func GetProductPricingList() ([]models.ProductPricing, error) {
|
||||
rows, err := db.MssqlDB.Query(`
|
||||
func GetProductPricingList(ctx context.Context) ([]models.ProductPricing, error) {
|
||||
const query = `
|
||||
WITH base_products AS (
|
||||
SELECT
|
||||
LTRIM(RTRIM(ProductCode)) AS ProductCode,
|
||||
@@ -160,9 +164,32 @@ func GetProductPricingList() ([]models.ProductPricing, error) {
|
||||
LEFT JOIN stock_totals st
|
||||
ON st.ItemCode = bp.ProductCode
|
||||
ORDER BY bp.ProductCode;
|
||||
`)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
`
|
||||
|
||||
var (
|
||||
rows *sql.Rows
|
||||
rowsErr error
|
||||
)
|
||||
for attempt := 1; attempt <= 3; attempt++ {
|
||||
var err error
|
||||
rows, err = db.MssqlDB.QueryContext(ctx, query)
|
||||
if err == nil {
|
||||
rowsErr = nil
|
||||
break
|
||||
}
|
||||
rowsErr = err
|
||||
if ctx.Err() != nil || !isTransientMSSQLNetworkError(err) || attempt == 3 {
|
||||
break
|
||||
}
|
||||
wait := time.Duration(attempt*300) * time.Millisecond
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
break
|
||||
case <-time.After(wait):
|
||||
}
|
||||
}
|
||||
if rowsErr != nil {
|
||||
return nil, rowsErr
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
@@ -191,3 +218,17 @@ func GetProductPricingList() ([]models.ProductPricing, error) {
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func isTransientMSSQLNetworkError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
e := strings.ToLower(err.Error())
|
||||
return strings.Contains(e, "i/o timeout") ||
|
||||
strings.Contains(e, "timeout") ||
|
||||
strings.Contains(e, "wsarecv") ||
|
||||
strings.Contains(e, "connection attempt failed") ||
|
||||
strings.Contains(e, "no connection could be made") ||
|
||||
strings.Contains(e, "broken pipe") ||
|
||||
strings.Contains(e, "connection reset")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user