2020-11-03 09:55:20 +00:00
package service
import (
"github.com/jmoiron/sqlx"
2020-11-05 03:00:51 +00:00
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
2020-11-03 09:55:20 +00:00
"github.com/c9s/bbgo/pkg/types"
)
type OrderService struct {
DB * sqlx . DB
}
2020-11-05 03:00:51 +00:00
// QueryLast queries the last order from the database
2021-01-19 18:09:12 +00:00
func ( s * OrderService ) QueryLast ( ex types . ExchangeName , symbol string , isMargin bool , isIsolated bool ) ( * types . Order , error ) {
log . Infof ( "querying last order exchange = %s AND symbol = %s AND is_margin = %v AND is_isolated = %v" , ex , symbol , isMargin , isIsolated )
rows , err := s . DB . NamedQuery ( ` SELECT * FROM orders WHERE exchange = :exchange AND symbol = :symbol AND is_margin = :is_margin AND is_isolated = :is_isolated ORDER BY gid DESC LIMIT 1 ` , map [ string ] interface { } {
"exchange" : ex ,
"symbol" : symbol ,
"is_margin" : isMargin ,
"is_isolated" : isIsolated ,
2020-11-05 03:00:51 +00:00
} )
if err != nil {
return nil , errors . Wrap ( err , "query last order error" )
}
if rows . Err ( ) != nil {
return nil , rows . Err ( )
}
defer rows . Close ( )
if rows . Next ( ) {
var order types . Order
err = rows . StructScan ( & order )
return & order , err
}
return nil , rows . Err ( )
}
func ( s * OrderService ) Query ( ex types . ExchangeName , symbol string ) ( [ ] types . Order , error ) {
rows , err := s . DB . NamedQuery ( ` SELECT * FROM orders WHERE exchange = :exchange AND symbol = :symbol ORDER BY gid ASC ` , map [ string ] interface { } {
"exchange" : ex ,
"symbol" : symbol ,
2020-11-03 09:55:20 +00:00
} )
if err != nil {
return nil , err
}
defer rows . Close ( )
return s . scanRows ( rows )
}
func ( s * OrderService ) scanRows ( rows * sqlx . Rows ) ( orders [ ] types . Order , err error ) {
for rows . Next ( ) {
var order types . Order
if err := rows . StructScan ( & order ) ; err != nil {
return nil , err
}
orders = append ( orders , order )
}
return orders , rows . Err ( )
}
func ( s * OrderService ) Insert ( order types . Order ) error {
_ , err := s . DB . NamedExec ( `
2021-01-19 15:33:06 +00:00
INSERT INTO orders ( exchange , order_id , client_order_id , order_type , status , symbol , price , stop_price , quantity , executed_quantity , side , is_working , time_in_force , created_at , updated_at , is_margin , is_isolated )
VALUES ( : exchange , : order_id , : client_order_id , : order_type , : status , : symbol , : price , : stop_price , : quantity , : executed_quantity , : side , : is_working , : time_in_force , : created_at , : updated_at , : is_margin , : is_isolated )
2020-11-05 05:35:04 +00:00
ON DUPLICATE KEY UPDATE status = : status , executed_quantity = : executed_quantity , is_working = : is_working , updated_at = : updated_at ` , order )
2020-11-03 09:55:20 +00:00
return err
}