summaryrefslogtreecommitdiffstats
path: root/database/database.go
blob: 2059d5082fc9434cb7f62e2eed69d2ea72538ab6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package database

import (
	"github.com/NyaaPantsu/nyaa/common"
	"github.com/NyaaPantsu/nyaa/config"
	"github.com/NyaaPantsu/nyaa/database/postgres"
	//"github.com/NyaaPantsu/nyaa/db/sqlite"
	"github.com/NyaaPantsu/nyaa/model"
	"github.com/NyaaPantsu/nyaa/util/log"

	"errors"
)

// Database obstraction layer
type Database interface {

	// Initialize internal state
	Init() error

	// return true if we need to call MigrateNext again
	NeedsMigrate() (bool, error)
	// migrate to next database revision
	MigrateNext() error

	// get torrents given parameters
	GetTorrentsWhere(param *common.TorrentParam) ([]model.Torrent, error)

	// insert new comment
	InsertComment(comment *model.Comment) error
	// new torrent report
	InsertTorrentReport(report *model.TorrentReport) error

	// check if user A follows B (by id)
	UserFollows(a, b uint32) (bool, error)

	// delete reports given params
	DeleteTorrentReportsWhere(param *common.ReportParam) (uint32, error)

	// get reports given params
	GetTorrentReportsWhere(param *common.ReportParam) ([]model.TorrentReport, error)

	// bulk record scrape events in 1 transaction
	RecordScrapes(scrapes []common.ScrapeResult) error

	// insert new user
	InsertUser(u *model.User) error

	// update existing user info
	UpdateUser(u *model.User) error

	// get users given paramteters
	GetUsersWhere(param *common.UserParam) ([]model.User, error)

	// delete many users given parameters
	DeleteUsersWhere(param *common.UserParam) (uint32, error)

	// get comments by given parameters
	GetCommentsWhere(param *common.CommentParam) ([]model.Comment, error)

	// delete comment by given parameters
	DeleteCommentsWhere(param *common.CommentParam) (uint32, error)

	// add user A following B
	AddUserFollowing(a, b uint32) error

	// delete user A following B
	DeleteUserFollowing(a, b uint32) (bool, error)

	// insert/update torrent
	UpsertTorrent(t *model.Torrent) error

	// XXX: add more as needed
}

var ErrInvalidDatabaseDialect = errors.New("invalid database dialect")
var ErrSqliteSucksAss = errors.New("sqlite3 sucks ass so it's not supported yet")

var Impl Database

func Configure(conf *config.Config) (err error) {
	switch conf.DBType {
	case "postgres":
		Impl, err = postgres.New(conf.DBParams)
		break
	case "sqlite3":
		err = ErrSqliteSucksAss
		// Impl, err = sqlite.New(conf.DBParams)
		break
	default:
		err = ErrInvalidDatabaseDialect
	}
	if err == nil {
		log.Infof("Init %s database", conf.DBType)
		err = Impl.Init()
	}
	return
}

// Migrate migrates the database to latest revision, call after Configure
func Migrate() (err error) {
	next := true
	for err == nil && next {
		next, err = Impl.NeedsMigrate()
		if next {
			err = Impl.MigrateNext()
		}

	}
	return
}