1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
Maksym Pavlenko 0170bbfbca Use Feed model
2017-11-03 16:04:33 -07:00

77 lines
1.6 KiB
Go

package storage
import (
"log"
"net"
"strings"
"time"
"github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/proxy"
"github.com/go-pg/pg"
"github.com/mxpv/podsync/pkg/model"
"github.com/pkg/errors"
)
type PgConfig struct {
ConnectionUrl string `yaml:"connectionUrl"`
}
type PgStorage struct {
db *pg.DB
}
func (p *PgStorage) CreateFeed(feed *model.Feed) error {
feed.LastAccess = time.Now().UTC()
_, err := p.db.Model(feed).OnConflict("DO NOTHING").Insert()
if err != nil {
return errors.Wrap(err, "failed to create feed")
}
return nil
}
func (p *PgStorage) GetFeed(hashId string) (*model.Feed, error) {
lastAccess := time.Now().UTC()
feed := &model.Feed{}
_, err := p.db.Model(feed).
Set("last_access = ?", lastAccess).
Where("hash_id = ?", hashId).
Returning("*").
Update()
return feed, err
}
func NewPgStorage(config *PgConfig) (*PgStorage, error) {
opts, err := pg.ParseURL(config.ConnectionUrl)
if err != nil {
return nil, err
}
// If host format is "projection:region:host", than use Google SQL Proxy
// See https://github.com/go-pg/pg/issues/576
if strings.Count(opts.Addr, ":") == 2 {
log.Print("using GCP SQL proxy")
opts.Dialer = func(network, addr string) (net.Conn, error) {
return proxy.Dial(addr)
}
}
db := pg.Connect(opts)
// Check database connectivity
if _, err := db.ExecOne("SELECT 1"); err != nil {
db.Close()
return nil, errors.Wrap(err, "failed to check database connectivity")
}
log.Print("running update script")
if _, err := db.Exec(installScript); err != nil {
return nil, errors.Wrap(err, "failed to upgrade database structure")
}
storage := &PgStorage{db: db}
return storage, nil
}