in db/generate_orders.go [17:85]
func GenerateOrders(db *sqlx.DB, driver string, n int, rng *rand.Rand) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
productIDs, err := getIDs(ctx, db, "products")
if err != nil {
return err
}
customerIDs, err := getIDs(ctx, db, "customers")
if err != nil {
return err
}
tx, err := db.BeginTx(ctx, nil)
if err != nil {
return err
}
returningID := "RETURNING id"
if driver == "sqlite3" {
returningID = ""
}
insertOrderStmt, err := tx.PrepareContext(ctx, db.Rebind(
"INSERT INTO orders (customer_id) VALUES (?) "+returningID,
))
if err != nil {
return errors.Wrap(err, "failed to prepare insert orders statement")
}
defer insertOrderStmt.Close()
insertOrderLineStmt, err := tx.PrepareContext(ctx, db.Rebind(
"INSERT INTO order_lines (order_id, product_id, amount) VALUES(?, ?, ?)",
))
if err != nil {
return errors.Wrap(err, "failed to prepare insert order lines statement")
}
defer insertOrderLineStmt.Close()
for i := 0; i < n; i++ {
productID := productIDs[rng.Intn(len(productIDs))]
customerID := customerIDs[rng.Intn(len(customerIDs))]
var orderID int64
if driver == "sqlite3" {
result, err := insertOrderStmt.ExecContext(ctx, customerID)
if err != nil {
return err
}
rowID, err := result.LastInsertId()
if err != nil {
return err
}
orderID = rowID
} else {
err := insertOrderStmt.QueryRowContext(ctx, customerID).Scan(&orderID)
if err != nil {
return err
}
}
amount := rng.Intn(maxOrderAmount + 1)
if _, err := insertOrderLineStmt.ExecContext(ctx, orderID, productID, amount); err != nil {
return err
}
}
return tx.Commit()
}