Use two db queueing interfaces: Now and Later
This commit is contained in:
parent
68c1465c92
commit
5259b8552a
20
db/db.go
20
db/db.go
|
@ -10,8 +10,9 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
db *sqlx.DB
|
||||
queryQueue = make(chan func())
|
||||
db *sqlx.DB
|
||||
priorityQueue = make(chan func())
|
||||
delayedQueue = make(chan func(), 1000)
|
||||
)
|
||||
|
||||
func Connect(params string) (err error) {
|
||||
|
@ -44,13 +45,22 @@ func mustSelectN(dest interface{}, query string, params interface{}) {
|
|||
}
|
||||
}
|
||||
|
||||
func Queue(fun func()) {
|
||||
queryQueue <- fun
|
||||
func Now(fun func()) {
|
||||
priorityQueue <- fun
|
||||
}
|
||||
|
||||
func Later(fun func()) {
|
||||
delayedQueue <- fun
|
||||
}
|
||||
|
||||
func processQueue() {
|
||||
for {
|
||||
(<-queryQueue)()
|
||||
var fun func()
|
||||
select {
|
||||
case fun = <-priorityQueue:
|
||||
case fun = <-delayedQueue:
|
||||
}
|
||||
fun()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -26,15 +26,13 @@ func Authenticate(code string) (token, login string, err error) {
|
|||
return
|
||||
}
|
||||
login = user.Login
|
||||
log.Println("Saving user", user)
|
||||
db.Queue(func() { user.Save() })
|
||||
db.Later(func() { user.Save() })
|
||||
|
||||
tok := &db.Token{
|
||||
User: login,
|
||||
Token: token,
|
||||
}
|
||||
log.Println("Saving token", tok)
|
||||
db.Queue(func() { tok.Save() })
|
||||
db.Later(func() { tok.Save() })
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -64,6 +62,7 @@ func FetchAccessToken(code string) (token string, err error) {
|
|||
if token = pairs.Get("access_token"); token == "" {
|
||||
err = fmt.Errorf("Failed to fetch access token usign code %q: %s", code, pairs.Get("error_description"))
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
|
44
task/sync.go
44
task/sync.go
|
@ -7,6 +7,36 @@ import (
|
|||
"github.com/localhots/empact/db"
|
||||
)
|
||||
|
||||
func SyncUserInfo(token, login string) {
|
||||
defer report(time.Now(), "SyncUserInfo (%s)", login)
|
||||
client := newGithubClient(token)
|
||||
|
||||
var user *github.User
|
||||
var resp *github.Response
|
||||
var err error
|
||||
if user, resp, err = client.Users.Get(login); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
saveResponseMeta(token, resp)
|
||||
|
||||
var name, avatarURL string
|
||||
if user.Name != nil {
|
||||
name = *user.Name
|
||||
}
|
||||
if user.AvatarURL != nil {
|
||||
avatarURL = *user.AvatarURL
|
||||
}
|
||||
u := &db.User{
|
||||
Login: *user.Login,
|
||||
Name: name,
|
||||
ID: *user.ID,
|
||||
AvatarURL: avatarURL,
|
||||
}
|
||||
db.Now(func() { u.Save() })
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func SyncOrgRepos(token string, org *db.Org) {
|
||||
defer report(time.Now(), "SyncOrgRepos (%s)", org.Login)
|
||||
client := newGithubClient(token)
|
||||
|
@ -36,7 +66,7 @@ func SyncOrgRepos(token string, org *db.Org) {
|
|||
IsFork: *repo.Fork,
|
||||
}
|
||||
go SyncContrib(token, org.Login, r)
|
||||
db.Queue(func() { r.Save() })
|
||||
db.Now(func() { r.Save() })
|
||||
}
|
||||
if opt.Page >= resp.LastPage {
|
||||
break
|
||||
|
@ -74,7 +104,7 @@ func SyncContrib(token, owner string, repo *db.Repo) {
|
|||
Additions: *week.Additions,
|
||||
Deletions: *week.Deletions,
|
||||
}
|
||||
db.Queue(func() { c.Save() })
|
||||
db.Now(func() { c.Save() })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -111,7 +141,7 @@ func SyncUserOrgs(token string) {
|
|||
go SyncOrgTeams(token, o)
|
||||
go SyncOrgMembers(token, o)
|
||||
go SyncOrgRepos(token, o)
|
||||
db.Queue(func() { o.Save() })
|
||||
db.Now(func() { o.Save() })
|
||||
}
|
||||
if opt.Page >= resp.LastPage {
|
||||
break
|
||||
|
@ -146,7 +176,7 @@ func SyncOrgTeams(token string, org *db.Org) {
|
|||
}
|
||||
go SyncTeamMembers(token, t)
|
||||
go SyncTeamRepos(token, t)
|
||||
db.Queue(func() { t.Save() })
|
||||
db.Now(func() { t.Save() })
|
||||
}
|
||||
if opt.Page >= resp.LastPage {
|
||||
break
|
||||
|
@ -180,7 +210,7 @@ func SyncOrgMembers(token string, org *db.Org) {
|
|||
break
|
||||
}
|
||||
}
|
||||
db.Queue(func() { db.SaveOrgMembers(org.ID, ids) })
|
||||
db.Now(func() { db.SaveOrgMembers(org.ID, ids) })
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -208,7 +238,7 @@ func SyncTeamMembers(token string, team *db.Team) {
|
|||
break
|
||||
}
|
||||
}
|
||||
db.Queue(func() { db.SaveTeamMembers(team.OrgID, team.ID, ids) })
|
||||
db.Now(func() { db.SaveTeamMembers(team.OrgID, team.ID, ids) })
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -236,7 +266,7 @@ func SyncTeamRepos(token string, team *db.Team) {
|
|||
break
|
||||
}
|
||||
}
|
||||
db.Queue(func() { db.SaveTeamRepos(team.OrgID, team.ID, ids) })
|
||||
db.Now(func() { db.SaveTeamRepos(team.OrgID, team.ID, ids) })
|
||||
|
||||
return
|
||||
}
|
||||
|
|
|
@ -21,13 +21,13 @@ func saveResponseMeta(token string, res *github.Response) {
|
|||
if res == nil {
|
||||
return
|
||||
}
|
||||
tok := &db.Token{
|
||||
t := &db.Token{
|
||||
Token: token,
|
||||
Quota: res.Limit,
|
||||
Remaining: res.Remaining,
|
||||
ResetAt: res.Reset.Time,
|
||||
}
|
||||
db.Queue(func() { tok.Save() })
|
||||
db.Later(func() { t.Save() })
|
||||
}
|
||||
|
||||
func report(start time.Time, format string, args ...interface{}) {
|
||||
|
|
47
task/user.go
47
task/user.go
|
@ -1,47 +0,0 @@
|
|||
package task
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/go-github/github"
|
||||
"github.com/localhots/empact/db"
|
||||
)
|
||||
|
||||
func FetchUserInfo(token, login string) (u *db.User, err error) {
|
||||
defer report(time.Now(), "FetchUserInfo (%s)", login)
|
||||
client := newGithubClient(token)
|
||||
var user *github.User
|
||||
var resp *github.Response
|
||||
if user, resp, err = client.Users.Get(login); err != nil {
|
||||
return
|
||||
}
|
||||
saveResponseMeta(token, resp)
|
||||
|
||||
name := ""
|
||||
if n := user.Name; n != nil {
|
||||
name = *user.Name
|
||||
}
|
||||
|
||||
avatarURL := ""
|
||||
if url := user.AvatarURL; url != nil {
|
||||
avatarURL = *user.AvatarURL
|
||||
}
|
||||
|
||||
u = &db.User{
|
||||
Login: *user.Login,
|
||||
Name: name,
|
||||
ID: *user.ID,
|
||||
AvatarURL: avatarURL,
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func SyncUserInfo(token, login string) (err error) {
|
||||
defer report(time.Now(), "SyncUserInfo (%s)", login)
|
||||
var u *db.User
|
||||
if u, err = FetchUserInfo(token, login); err == nil {
|
||||
db.Queue(func() { u.Save() })
|
||||
}
|
||||
return
|
||||
}
|
Loading…
Reference in New Issue