1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package infrastructure
- import (
- "code.osinet.fr/fgm/kurz/domain"
- "database/sql"
- "errors"
- )
- type MySQLShortURLRepository struct {
- db *sql.DB
- }
- type MySQLTargetURLRepository struct {
- db *sql.DB
- }
- func (sr MySQLShortURLRepository) GetTarget(su domain.ShortURL) (domain.TargetURL, error) {
- var tu domain.TargetURL
- row := sr.db.QueryRow(`
- SELECT map.url
- FROM map
- WHERE map.hash = ?
- `, su.URL)
- err := row.Scan(&tu.URL)
- switch err {
- case sql.ErrNoRows:
- err = errors.New("target not found")
- case nil:
- break
- default:
- err = errors.New("storage read error")
- }
- return tu, err
- }
- func (tr MySQLTargetURLRepository) GetShort(tu domain.TargetURL) (su domain.ShortURL, isNew bool, err error) {
- // TODO future versions may have multiple shorts for a target, and choose a
- // specific short based on the domain and Kurz user. For now just ensure we
- // don't get more than one.
- row := tr.db.QueryRow(`
- SELECT map.hash
- FROM map
- LIMIT 1
- `)
- err = row.Scan(&su.URL)
- switch err {
- case sql.ErrNoRows:
- // If it doesn't exist, attempt to create it.
- su, err = domain.NewUnspecifiedShortURL(tu)
- if err != nil {
- // Creation failed.
- return su, false, err
- }
- _, err = tr.db.Exec(`
- INSERT INTO map(hash, url, date1, date2, date3, refcount)
- VALUES (?, ?, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), 0)
- `, su.URL, tu.URL)
- if err != nil {
- err = errors.New("storage write error")
- }
- isNew = true
- case nil:
- break
- default:
- err = errors.New("storage read error")
- }
- return
- }
|