From 1f0c249c82b7e1b19038173a32f6bc195be43bdd Mon Sep 17 00:00:00 2001 From: Brad Rydzewski Date: Sat, 13 Jun 2015 17:49:21 -0700 Subject: [PATCH] migrated star to auto-gen sql --- pkg/store/builtin/migrate/migrate.go | 8 +- pkg/store/builtin/repo.go | 4 +- pkg/store/builtin/star.go | 51 +++----- pkg/store/builtin/star_sql.go | 185 +++++++++++++++++++++++++++ pkg/store/builtin/user.go | 4 +- 5 files changed, 212 insertions(+), 40 deletions(-) create mode 100644 pkg/store/builtin/star_sql.go diff --git a/pkg/store/builtin/migrate/migrate.go b/pkg/store/builtin/migrate/migrate.go index 8d0f7b0e8..d9f3d1454 100644 --- a/pkg/store/builtin/migrate/migrate.go +++ b/pkg/store/builtin/migrate/migrate.go @@ -109,10 +109,10 @@ CREATE INDEX repos_user_idx ON repos (repo_user_id); var starTable = ` CREATE TABLE IF NOT EXISTS stars ( - star_id INTEGER PRIMARY KEY AUTOINCREMENT - ,user_id INTEGER - ,repo_id INTEGER - ,UNIQUE (repo_id, user_id) + star_id INTEGER PRIMARY KEY AUTOINCREMENT + ,star_user_id INTEGER + ,star_repo_id INTEGER + ,UNIQUE (star_repo_id, star_user_id) ); ` diff --git a/pkg/store/builtin/repo.go b/pkg/store/builtin/repo.go index e8b3e006f..db42123be 100644 --- a/pkg/store/builtin/repo.go +++ b/pkg/store/builtin/repo.go @@ -80,6 +80,6 @@ SELECT FROM repos r ,stars s -WHERE r.repo_id = s.repo_id - AND s.user_id = ? +WHERE r.repo_id = s.star_repo_id + AND s.star_user_id = ? ` diff --git a/pkg/store/builtin/star.go b/pkg/store/builtin/star.go index e79a28401..f01afab95 100644 --- a/pkg/store/builtin/star.go +++ b/pkg/store/builtin/star.go @@ -1,60 +1,47 @@ package builtin import ( - "github.com/drone/drone/Godeps/_workspace/src/github.com/russross/meddler" - common "github.com/drone/drone/pkg/types" + "database/sql" + + "github.com/drone/drone/pkg/types" ) type Starstore struct { - meddler.DB + *sql.DB } -func NewStarstore(db meddler.DB) *Starstore { +func NewStarstore(db *sql.DB) *Starstore { return &Starstore{db} } // Starred returns true if the user starred // the given repository. -func (db *Starstore) Starred(user *common.User, repo *common.Repo) (bool, error) { - var star = new(star) - err := meddler.QueryRow(db, star, rebind(starQuery), user.ID, repo.ID) +func (db *Starstore) Starred(user *types.User, repo *types.Repo) (bool, error) { + _, err := getStar(db, rebind(stmtStarSelectStarUserRepo), user.ID, repo.ID) return (err == nil), err } // AddStar inserts a starred repo / user in the datastore. -func (db *Starstore) AddStar(user *common.User, repo *common.Repo) error { - var star = &star{UserID: user.ID, RepoID: repo.ID} - return meddler.Insert(db, starTable, star) +func (db *Starstore) AddStar(user *types.User, repo *types.Repo) error { + var star = &Star{UserID: user.ID, RepoID: repo.ID} + return createStar(db, rebind(stmtStarInsert), star) } // DelStar removes starred repo / user from the datastore. -func (db *Starstore) DelStar(user *common.User, repo *common.Repo) error { - var _, err = db.Exec(rebind(starDeleteStmt), user.ID, repo.ID) +func (db *Starstore) DelStar(user *types.User, repo *types.Repo) error { + var _, err = db.Exec(rebind(stmtStartDeleteUserRepo), user.ID, repo.ID) return err } -type star struct { - ID int64 `meddler:"star_id,pk"` - UserID int64 `meddler:"user_id"` - RepoID int64 `meddler:"repo_id"` +type Star struct { + ID int64 + UserID int64 `sql:"unique:ux_star_user_repo"` + RepoID int64 `sql:"unique:ux_star_user_repo"` } -// Stars table name in database. -const starTable = "stars" - -// SQL query to retrieve a user's stars to -// access a repository. -const starQuery = ` -SELECT * -FROM stars -WHERE user_id=? -AND repo_id=? -LIMIT 1 -` - // SQL statement to delete a star by ID. -const starDeleteStmt = ` +const stmtStartDeleteUserRepo = ` DELETE FROM stars -WHERE user_id=? - AND repo_id=? +WHERE star_user_id=? + AND star_repo_id=? ` diff --git a/pkg/store/builtin/star_sql.go b/pkg/store/builtin/star_sql.go new file mode 100644 index 000000000..979bb20bc --- /dev/null +++ b/pkg/store/builtin/star_sql.go @@ -0,0 +1,185 @@ +package builtin + +// DO NOT EDIT +// code generated by go:generate + +import ( + "database/sql" + "encoding/json" +) + +var _ = json.Marshal + +// generic database interface, matching both *sql.Db and *sql.Tx +type starDB interface { + Exec(query string, args ...interface{}) (sql.Result, error) + Query(query string, args ...interface{}) (*sql.Rows, error) + QueryRow(query string, args ...interface{}) *sql.Row +} + +func getStar(db starDB, query string, args ...interface{}) (*Star, error) { + row := db.QueryRow(query, args...) + return scanStar(row) +} + +func getStars(db starDB, query string, args ...interface{}) ([]*Star, error) { + rows, err := db.Query(query, args...) + if err != nil { + return nil, err + } + defer rows.Close() + return scanStars(rows) +} + +func createStar(db starDB, query string, v *Star) error { + var v0 int64 + var v1 int64 + v0 = v.UserID + v1 = v.RepoID + + res, err := db.Exec(query, + &v0, + &v1, + ) + if err != nil { + return err + } + + v.ID, err = res.LastInsertId() + return err +} + +func updateStar(db starDB, query string, v *Star) error { + var v0 int64 + var v1 int64 + var v2 int64 + v0 = v.ID + v1 = v.UserID + v2 = v.RepoID + + _, err := db.Exec(query, + &v1, + &v2, + &v0, + ) + return err +} + +func scanStar(row *sql.Row) (*Star, error) { + var v0 int64 + var v1 int64 + var v2 int64 + + err := row.Scan( + &v0, + &v1, + &v2, + ) + if err != nil { + return nil, err + } + + v := &Star{} + v.ID = v0 + v.UserID = v1 + v.RepoID = v2 + + return v, nil +} + +func scanStars(rows *sql.Rows) ([]*Star, error) { + var err error + var vv []*Star + for rows.Next() { + var v0 int64 + var v1 int64 + var v2 int64 + err = rows.Scan( + &v0, + &v1, + &v2, + ) + if err != nil { + return vv, err + } + + v := &Star{} + v.ID = v0 + v.UserID = v1 + v.RepoID = v2 + vv = append(vv, v) + } + return vv, rows.Err() +} + +const stmtStarSelectList = ` +SELECT + star_id +,star_user_id +,star_repo_id +FROM stars +` + +const stmtStarSelectRange = ` +SELECT + star_id +,star_user_id +,star_repo_id +FROM stars +LIMIT ? OFFSET ? +` + +const stmtStarSelect = ` +SELECT + star_id +,star_user_id +,star_repo_id +FROM stars +WHERE star_id = ? +` + +const stmtStarSelectStarUserRepo = ` +SELECT + star_id +,star_user_id +,star_repo_id +FROM stars +WHERE star_user_id = ? +AND star_repo_id = ? +` + +const stmtStarSelectCount = ` +SELECT count(1) +FROM stars +` + +const stmtStarInsert = ` +INSERT INTO stars ( + star_user_id +,star_repo_id +) VALUES (?,?); +` + +const stmtStarUpdate = ` +UPDATE stars SET + star_user_id = ? +,star_repo_id = ? +WHERE star_id = ? +` + +const stmtStarDelete = ` +DELETE FROM stars +WHERE star_id = ? +` + +const stmtStarTable = ` +CREATE TABLE IF NOT EXISTS stars ( + star_id INTEGER PRIMARY KEY AUTOINCREMENT +,star_user_id INTEGER +,star_repo_id INTEGER +); +` + +const stmtStarStarUserRepoIndex = ` +CREATE UNIQUE INDEX IF NOT EXISTS ux_star_user_repo ON stars (star_user_id,star_repo_id); +` diff --git a/pkg/store/builtin/user.go b/pkg/store/builtin/user.go index 5027e6ac1..183957caa 100644 --- a/pkg/store/builtin/user.go +++ b/pkg/store/builtin/user.go @@ -83,8 +83,8 @@ FROM ,repos r ,stars s WHERE c.repo_id = r.repo_id - AND r.repo_id = s.repo_id - AND s.user_id = ? + AND r.repo_id = s.star_repo_id + AND s.star_user_id = ? ORDER BY c.commit_seq DESC LIMIT ? OFFSET ? `