mysql.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package infrastructure
  2. import (
  3. "code.osinet.fr/fgm/kurz/domain"
  4. "database/sql"
  5. )
  6. type MySQLShortURLRepository struct {
  7. db *sql.DB
  8. }
  9. type MySQLTargetURLRepository struct {
  10. db *sql.DB
  11. }
  12. func (sr MySQLShortURLRepository) GetTarget(su domain.ShortURL) (domain.TargetURL, error) {
  13. var tu domain.TargetURL
  14. row := sr.db.QueryRow(`
  15. SELECT map.url
  16. FROM map
  17. WHERE map.hash = ?
  18. `, su.URL)
  19. err := row.Scan(&tu.URL)
  20. switch err {
  21. case sql.ErrNoRows:
  22. err = domain.MakeError(domain.ShortNotFound, string(su.URL))
  23. case nil:
  24. break
  25. default:
  26. err = domain.MakeError(domain.StorageReadError, "")
  27. }
  28. return tu, err
  29. }
  30. func (tr MySQLTargetURLRepository) GetShort(tu domain.TargetURL) (su domain.ShortURL, isNew bool, err error) {
  31. // TODO future versions may have multiple shorts for a target, and choose a
  32. // specific short based on the domain and Kurz user. For now just ensure we
  33. // don't get more than one.
  34. row := tr.db.QueryRow(`
  35. SELECT map.hash
  36. FROM map
  37. LIMIT 1
  38. `)
  39. err = row.Scan(&su.URL)
  40. switch err {
  41. case sql.ErrNoRows:
  42. // If it doesn't exist, attempt to create it.
  43. su, err = domain.NewUnspecifiedShortURL(tu)
  44. if err != nil {
  45. // Creation failed.
  46. return su, false, err
  47. }
  48. _, err = tr.db.Exec(`
  49. INSERT INTO map(hash, url, date1, date2, date3, refcount)
  50. VALUES (?, ?, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), 0)
  51. `, su.URL, tu.URL)
  52. if err != nil {
  53. err = domain.MakeError(domain.StorageWriteError, "storing new mapping")
  54. }
  55. isNew = true
  56. case nil:
  57. break
  58. default:
  59. err = domain.MakeError(domain.StorageReadError, "looking for mapping")
  60. }
  61. return
  62. }