Exec implements write query feature.
(ctx context.Context, queries []Query)
| 324 | |
| 325 | // Exec implements write query feature. |
| 326 | func (s *Storage) Exec(ctx context.Context, queries []Query) (result ExecResult, err error) { |
| 327 | if len(queries) == 0 { |
| 328 | return |
| 329 | } |
| 330 | |
| 331 | var tx *sql.Tx |
| 332 | var txOptions = &sql.TxOptions{ |
| 333 | ReadOnly: false, |
| 334 | } |
| 335 | |
| 336 | if tx, err = s.db.BeginTx(ctx, txOptions); err != nil { |
| 337 | return |
| 338 | } |
| 339 | |
| 340 | defer tx.Rollback() |
| 341 | |
| 342 | for _, q := range queries { |
| 343 | // convert arguments types |
| 344 | args := make([]interface{}, len(q.Args)) |
| 345 | |
| 346 | for i, v := range q.Args { |
| 347 | args[i] = v |
| 348 | } |
| 349 | |
| 350 | var r sql.Result |
| 351 | if r, err = tx.Exec(q.Pattern, args...); err != nil { |
| 352 | log.WithError(err).Debug("execute query failed") |
| 353 | return |
| 354 | } |
| 355 | |
| 356 | var affected int64 |
| 357 | affected, _ = r.RowsAffected() |
| 358 | result.RowsAffected += affected |
| 359 | result.LastInsertID, _ = r.LastInsertId() |
| 360 | } |
| 361 | |
| 362 | tx.Commit() |
| 363 | |
| 364 | return |
| 365 | } |
| 366 | |
| 367 | // Close implements database safe close feature. |
| 368 | func (s *Storage) Close() (err error) { |
no test coverage detected