Refactored the stores to use the accumulator.

Fixed the accumulator.
This commit is contained in:
Azareal 2017-11-06 07:23:32 +00:00
parent 01239f82f1
commit 6b64a2e28d
5 changed files with 54 additions and 163 deletions

View File

@ -59,61 +59,30 @@ type MemoryForumStore struct {
forumView atomic.Value // []*Forum
//fids []int
get *sql.Stmt
getAll *sql.Stmt
delete *sql.Stmt
create *sql.Stmt
count *sql.Stmt
updateCache *sql.Stmt
addTopicsToForum *sql.Stmt
removeTopicsFromForum *sql.Stmt
get *sql.Stmt
getAll *sql.Stmt
delete *sql.Stmt
create *sql.Stmt
count *sql.Stmt
updateCache *sql.Stmt
addTopics *sql.Stmt
removeTopics *sql.Stmt
}
// NewMemoryForumStore gives you a new instance of MemoryForumStore
func NewMemoryForumStore() (*MemoryForumStore, error) {
getStmt, err := qgen.Builder.SimpleSelect("forums", "name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID", "fid = ?", "", "")
if err != nil {
return nil, err
}
getAllStmt, err := qgen.Builder.SimpleSelect("forums", "fid, name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID", "", "fid ASC", "")
if err != nil {
return nil, err
}
acc := qgen.Builder.Accumulator()
// TODO: Do a proper delete
deleteStmt, err := qgen.Builder.SimpleUpdate("forums", "name= '', active = 0", "fid = ?")
if err != nil {
return nil, err
}
createStmt, err := qgen.Builder.SimpleInsert("forums", "name, desc, active, preset", "?,?,?,?")
if err != nil {
return nil, err
}
forumCountStmt, err := qgen.Builder.SimpleCount("forums", "name != ''", "")
if err != nil {
return nil, err
}
updateCacheStmt, err := qgen.Builder.SimpleUpdate("forums", "lastTopicID = ?, lastReplyerID = ?", "fid = ?")
if err != nil {
return nil, err
}
addTopicsToForumStmt, err := qgen.Builder.SimpleUpdate("forums", "topicCount = topicCount + ?", "fid = ?")
if err != nil {
return nil, err
}
removeTopicsFromForumStmt, err := qgen.Builder.SimpleUpdate("forums", "topicCount = topicCount - ?", "fid = ?")
if err != nil {
return nil, err
}
return &MemoryForumStore{
get: getStmt,
getAll: getAllStmt,
delete: deleteStmt,
create: createStmt,
count: forumCountStmt,
updateCache: updateCacheStmt,
addTopicsToForum: addTopicsToForumStmt,
removeTopicsFromForum: removeTopicsFromForumStmt,
}, nil
get: acc.SimpleSelect("forums", "name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID", "fid = ?", "", ""),
getAll: acc.SimpleSelect("forums", "fid, name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID", "", "fid ASC", ""),
delete: acc.SimpleUpdate("forums", "name= '', active = 0", "fid = ?"),
create: acc.SimpleInsert("forums", "name, desc, active, preset", "?,?,?,?"),
count: acc.SimpleCount("forums", "name != ''", ""),
updateCache: acc.SimpleUpdate("forums", "lastTopicID = ?, lastReplyerID = ?", "fid = ?"),
addTopics: acc.SimpleUpdate("forums", "topicCount = topicCount + ?", "fid = ?"),
removeTopics: acc.SimpleUpdate("forums", "topicCount = topicCount - ?", "fid = ?"),
}, acc.FirstError()
}
// TODO: Add support for subforums
@ -355,7 +324,7 @@ func (mfs *MemoryForumStore) AddTopic(tid int, uid int, fid int) error {
if err != nil {
return err
}
_, err = mfs.addTopicsToForum.Exec(1, fid)
_, err = mfs.addTopics.Exec(1, fid)
if err != nil {
return err
}
@ -365,7 +334,7 @@ func (mfs *MemoryForumStore) AddTopic(tid int, uid int, fid int) error {
// TODO: Update the forum cache with the latest topic
func (mfs *MemoryForumStore) RemoveTopic(fid int) error {
_, err := mfs.removeTopicsFromForum.Exec(1, fid)
_, err := mfs.removeTopics.Exec(1, fid)
if err != nil {
return err
}

View File

@ -43,21 +43,13 @@ type MemoryGroupStore struct {
}
func NewMemoryGroupStore() (*MemoryGroupStore, error) {
getAllStmt, err := qgen.Builder.SimpleSelect("users_groups", "gid, name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", "", "", "")
if err != nil {
return nil, err
}
getGroupStmt, err := qgen.Builder.SimpleSelect("users_groups", "name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", "gid = ?", "", "")
if err != nil {
return nil, err
}
acc := qgen.Builder.Accumulator()
return &MemoryGroupStore{
groups: make(map[int]*Group),
groupCount: 0,
getAll: getAllStmt,
get: getGroupStmt,
}, nil
getAll: acc.SimpleSelect("users_groups", "gid, name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", "", "", ""),
get: acc.SimpleSelect("users_groups", "name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", "gid = ?", "", ""),
}, acc.FirstError()
}
// TODO: Move this query from the global stmt store into this store

View File

@ -1,7 +1,9 @@
/* WIP: A version of the builder which accumulates errors, we'll see if we can't unify the implementations at some point */
package qgen
import "database/sql"
import (
"database/sql"
)
type accBuilder struct {
conn *sql.DB
@ -34,7 +36,7 @@ func (build *accBuilder) recordError(err error) {
if err == nil {
return
}
if build.firstErr != nil {
if build.firstErr == nil {
build.firstErr = err
}
}

View File

@ -63,25 +63,14 @@ type MemoryTopicStore struct {
// NewMemoryTopicStore gives you a new instance of MemoryTopicStore
func NewMemoryTopicStore(capacity int) (*MemoryTopicStore, error) {
getStmt, err := qgen.Builder.SimpleSelect("topics", "title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data", "tid = ?", "", "")
if err != nil {
return nil, err
}
existsStmt, err := qgen.Builder.SimpleSelect("topics", "tid", "tid = ?", "", "")
if err != nil {
return nil, err
}
topicCountStmt, err := qgen.Builder.SimpleCount("topics", "", "")
if err != nil {
return nil, err
}
acc := qgen.Builder.Accumulator()
return &MemoryTopicStore{
items: make(map[int]*Topic),
capacity: capacity,
get: getStmt,
exists: existsStmt,
topicCount: topicCountStmt,
}, nil
get: acc.SimpleSelect("topics", "title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data", "tid = ?", "", ""),
exists: acc.SimpleSelect("topics", "tid", "tid = ?", "", ""),
topicCount: acc.SimpleCount("topics", "", ""),
}, acc.FirstError()
}
func (mts *MemoryTopicStore) CacheGet(id int) (*Topic, error) {
@ -267,23 +256,12 @@ type SQLTopicStore struct {
}
func NewSQLTopicStore() (*SQLTopicStore, error) {
getStmt, err := qgen.Builder.SimpleSelect("topics", "title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data", "tid = ?", "", "")
if err != nil {
return nil, err
}
existsStmt, err := qgen.Builder.SimpleSelect("topics", "tid", "tid = ?", "", "")
if err != nil {
return nil, err
}
topicCountStmt, err := qgen.Builder.SimpleCount("topics", "", "")
if err != nil {
return nil, err
}
acc := qgen.Builder.Accumulator()
return &SQLTopicStore{
get: getStmt,
exists: existsStmt,
topicCount: topicCountStmt,
}, nil
get: acc.SimpleSelect("topics", "title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data", "tid = ?", "", ""),
exists: acc.SimpleSelect("topics", "tid", "tid = ?", "", ""),
topicCount: acc.SimpleCount("topics", "", ""),
}, acc.FirstError()
}
func (sts *SQLTopicStore) Get(id int) (*Topic, error) {

View File

@ -56,42 +56,17 @@ type MemoryUserStore struct {
// NewMemoryUserStore gives you a new instance of MemoryUserStore
func NewMemoryUserStore(capacity int) (*MemoryUserStore, error) {
getStmt, err := qgen.Builder.SimpleSelect("users", "name, group, is_super_admin, session, email, avatar, message, url_prefix, url_name, level, score, last_ip, temp_group", "uid = ?", "", "")
if err != nil {
return nil, err
}
existsStmt, err := qgen.Builder.SimpleSelect("users", "uid", "uid = ?", "", "")
if err != nil {
return nil, err
}
// Add an admin version of register_stmt with more flexibility?
// create_account_stmt, err = db.Prepare("INSERT INTO
registerStmt, err := qgen.Builder.SimpleInsert("users", "name, email, password, salt, group, is_super_admin, session, active, message, createdAt, lastActiveAt", "?,?,?,?,?,0,'',?,'',UTC_TIMESTAMP(),UTC_TIMESTAMP()")
if err != nil {
return nil, err
}
usernameExistsStmt, err := qgen.Builder.SimpleSelect("users", "name", "name = ?", "", "")
if err != nil {
return nil, err
}
userCountStmt, err := qgen.Builder.SimpleCount("users", "", "")
if err != nil {
return nil, err
}
acc := qgen.Builder.Accumulator()
// TODO: Add an admin version of registerStmt with more flexibility?
return &MemoryUserStore{
items: make(map[int]*User),
capacity: capacity,
get: getStmt,
exists: existsStmt,
register: registerStmt,
usernameExists: usernameExistsStmt,
userCount: userCountStmt,
}, nil
get: acc.SimpleSelect("users", "name, group, is_super_admin, session, email, avatar, message, url_prefix, url_name, level, score, last_ip, temp_group", "uid = ?", "", ""),
exists: acc.SimpleSelect("users", "uid", "uid = ?", "", ""),
register: acc.SimpleInsert("users", "name, email, password, salt, group, is_super_admin, session, active, message, createdAt, lastActiveAt", "?,?,?,?,?,0,'',?,'',UTC_TIMESTAMP(),UTC_TIMESTAMP()"),
usernameExists: acc.SimpleSelect("users", "name", "name = ?", "", ""),
userCount: acc.SimpleCount("users", "", ""),
}, acc.FirstError()
}
func (mus *MemoryUserStore) CacheGet(id int) (*User, error) {
@ -385,40 +360,15 @@ type SQLUserStore struct {
}
func NewSQLUserStore() (*SQLUserStore, error) {
getStmt, err := qgen.Builder.SimpleSelect("users", "name, group, is_super_admin, session, email, avatar, message, url_prefix, url_name, level, score, last_ip, temp_group", "uid = ?", "", "")
if err != nil {
return nil, err
}
existsStmt, err := qgen.Builder.SimpleSelect("users", "uid", "uid = ?", "", "")
if err != nil {
return nil, err
}
// Add an admin version of register_stmt with more flexibility?
// create_account_stmt, err = db.Prepare("INSERT INTO
registerStmt, err := qgen.Builder.SimpleInsert("users", "name, email, password, salt, group, is_super_admin, session, active, message, createdAt, lastActiveAt", "?,?,?,?,?,0,'',?,'',UTC_TIMESTAMP(),UTC_TIMESTAMP()")
if err != nil {
return nil, err
}
usernameExistsStmt, err := qgen.Builder.SimpleSelect("users", "name", "name = ?", "", "")
if err != nil {
return nil, err
}
userCountStmt, err := qgen.Builder.SimpleCount("users", "", "")
if err != nil {
return nil, err
}
acc := qgen.Builder.Accumulator()
// TODO: Add an admin version of registerStmt with more flexibility?
return &SQLUserStore{
get: getStmt,
exists: existsStmt,
register: registerStmt,
usernameExists: usernameExistsStmt,
userCount: userCountStmt,
}, nil
get: acc.SimpleSelect("users", "name, group, is_super_admin, session, email, avatar, message, url_prefix, url_name, level, score, last_ip, temp_group", "uid = ?", "", ""),
exists: acc.SimpleSelect("users", "uid", "uid = ?", "", ""),
register: acc.SimpleInsert("users", "name, email, password, salt, group, is_super_admin, session, active, message, createdAt, lastActiveAt", "?,?,?,?,?,0,'',?,'',UTC_TIMESTAMP(),UTC_TIMESTAMP()"),
usernameExists: acc.SimpleSelect("users", "name", "name = ?", "", ""),
userCount: acc.SimpleCount("users", "", ""),
}, acc.FirstError()
}
func (mus *SQLUserStore) Get(id int) (*User, error) {