I've revamped the query generator to reduce the number of globals, this'll help us split up the software and plugins in the future.
Refactored the router. Added the MemberOnly middleware and tests for it.
This commit is contained in:
parent
f5190e83ba
commit
3fa9bf7373
|
@ -122,7 +122,7 @@ func buildAlert(asid int, event string, elementType string, actorID int, targetU
|
|||
}
|
||||
|
||||
func notifyWatchers(asid int64) {
|
||||
rows, err := getWatchersStmt.Query(asid)
|
||||
rows, err := stmts.getWatchers.Query(asid)
|
||||
if err != nil && err != ErrNoRows {
|
||||
log.Fatal(err.Error())
|
||||
return
|
||||
|
@ -147,7 +147,7 @@ func notifyWatchers(asid int64) {
|
|||
|
||||
var actorID, targetUserID, elementID int
|
||||
var event, elementType string
|
||||
err = getActivityEntryStmt.QueryRow(asid).Scan(&actorID, &targetUserID, &event, &elementType, &elementID)
|
||||
err = stmts.getActivityEntry.QueryRow(asid).Scan(&actorID, &targetUserID, &event, &elementType, &elementID)
|
||||
if err != nil && err != ErrNoRows {
|
||||
log.Fatal(err.Error())
|
||||
return
|
||||
|
|
2
auth.go
2
auth.go
|
@ -170,7 +170,7 @@ func (auth *DefaultAuth) CreateSession(uid int) (session string, err error) {
|
|||
return "", err
|
||||
}
|
||||
|
||||
_, err = updateSessionStmt.Exec(session, uid)
|
||||
_, err = stmts.updateSession.Exec(session, uid)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@ import "log"
|
|||
|
||||
import "database/sql"
|
||||
|
||||
var stmts *Stmts
|
||||
|
||||
var db *sql.DB
|
||||
var dbVersion string
|
||||
var dbAdapter string
|
||||
|
@ -14,11 +16,14 @@ var ErrNoRows = sql.ErrNoRows
|
|||
var _initDatabase func() error
|
||||
|
||||
func initDatabase() (err error) {
|
||||
stmts = &Stmts{Mocks: false}
|
||||
|
||||
// Engine specific code
|
||||
err = _initDatabase()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
globs = &Globs{stmts}
|
||||
|
||||
log.Print("Loading the usergroups.")
|
||||
gstore, err = NewMemoryGroupStore()
|
||||
|
|
|
@ -143,7 +143,7 @@ func initExtend() (err error) {
|
|||
|
||||
// LoadPlugins polls the database to see which plugins have been activated and which have been installed
|
||||
func LoadPlugins() error {
|
||||
rows, err := getPluginsStmt.Query()
|
||||
rows, err := stmts.getPlugins.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
2
forum.go
2
forum.go
|
@ -82,7 +82,7 @@ func (forum *Forum) Update(name string, desc string, active bool, preset string)
|
|||
name = forum.Name
|
||||
}
|
||||
preset = strings.TrimSpace(preset)
|
||||
_, err := updateForumStmt.Exec(name, desc, active, preset, forum.ID)
|
||||
_, err := stmts.updateForum.Exec(name, desc, active, preset, forum.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ func (fps *ForumPermsStore) Init() error {
|
|||
log.Print("fids: ", fids)
|
||||
}
|
||||
|
||||
rows, err := getForumsPermissionsStmt.Query()
|
||||
rows, err := stmts.getForumsPermissions.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -102,7 +102,8 @@ func (mfs *MemoryForumStore) LoadForums() error {
|
|||
}
|
||||
}
|
||||
|
||||
rows, err := getForumsStmt.Query()
|
||||
// TODO: Move this statement into the store
|
||||
rows, err := stmts.getForums.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -327,11 +328,11 @@ func (mfs *MemoryForumStore) Delete(id int) error {
|
|||
}
|
||||
|
||||
func (mfs *MemoryForumStore) AddTopic(tid int, uid int, fid int) error {
|
||||
_, err := updateForumCacheStmt.Exec(tid, uid, fid)
|
||||
_, err := stmts.updateForumCache.Exec(tid, uid, fid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = addTopicsToForumStmt.Exec(1, fid)
|
||||
_, err = stmts.addTopicsToForum.Exec(1, fid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -341,7 +342,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 := removeTopicsFromForumStmt.Exec(1, fid)
|
||||
_, err := stmts.removeTopicsFromForum.Exec(1, fid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -353,7 +354,7 @@ func (mfs *MemoryForumStore) RemoveTopic(fid int) error {
|
|||
// DEPRECATED. forum.Update() will be the way to do this in the future, once it's completed
|
||||
// TODO: Have a pointer to the last topic rather than storing it on the forum itself
|
||||
func (mfs *MemoryForumStore) UpdateLastTopic(tid int, uid int, fid int) error {
|
||||
_, err := updateForumCacheStmt.Exec(tid, uid, fid)
|
||||
_, err := stmts.updateForumCache.Exec(tid, uid, fid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -363,7 +364,8 @@ func (mfs *MemoryForumStore) UpdateLastTopic(tid int, uid int, fid int) error {
|
|||
|
||||
func (mfs *MemoryForumStore) Create(forumName string, forumDesc string, active bool, preset string) (int, error) {
|
||||
forumCreateMutex.Lock()
|
||||
res, err := createForumStmt.Exec(forumName, forumDesc, active, preset)
|
||||
// TODO: Move this query into the store
|
||||
res, err := stmts.createForum.Exec(forumName, forumDesc, active, preset)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
|
462
gen_mssql.go
462
gen_mssql.go
File diff suppressed because it is too large
Load Diff
462
gen_mysql.go
462
gen_mysql.go
File diff suppressed because it is too large
Load Diff
182
gen_pgsql.go
182
gen_pgsql.go
|
@ -7,48 +7,62 @@ import "log"
|
|||
import "database/sql"
|
||||
|
||||
// nolint
|
||||
var addRepliesToTopicStmt *sql.Stmt
|
||||
var removeRepliesFromTopicStmt *sql.Stmt
|
||||
var addTopicsToForumStmt *sql.Stmt
|
||||
var removeTopicsFromForumStmt *sql.Stmt
|
||||
var updateForumCacheStmt *sql.Stmt
|
||||
var addLikesToTopicStmt *sql.Stmt
|
||||
var addLikesToReplyStmt *sql.Stmt
|
||||
var editTopicStmt *sql.Stmt
|
||||
var editReplyStmt *sql.Stmt
|
||||
var stickTopicStmt *sql.Stmt
|
||||
var unstickTopicStmt *sql.Stmt
|
||||
var lockTopicStmt *sql.Stmt
|
||||
var unlockTopicStmt *sql.Stmt
|
||||
var updateLastIPStmt *sql.Stmt
|
||||
var updateSessionStmt *sql.Stmt
|
||||
var setPasswordStmt *sql.Stmt
|
||||
var setAvatarStmt *sql.Stmt
|
||||
var setUsernameStmt *sql.Stmt
|
||||
var changeGroupStmt *sql.Stmt
|
||||
var activateUserStmt *sql.Stmt
|
||||
var updateUserLevelStmt *sql.Stmt
|
||||
var incrementUserScoreStmt *sql.Stmt
|
||||
var incrementUserPostsStmt *sql.Stmt
|
||||
var incrementUserBigpostsStmt *sql.Stmt
|
||||
var incrementUserMegapostsStmt *sql.Stmt
|
||||
var incrementUserTopicsStmt *sql.Stmt
|
||||
var editProfileReplyStmt *sql.Stmt
|
||||
var updateForumStmt *sql.Stmt
|
||||
var updateSettingStmt *sql.Stmt
|
||||
var updatePluginStmt *sql.Stmt
|
||||
var updatePluginInstallStmt *sql.Stmt
|
||||
var updateThemeStmt *sql.Stmt
|
||||
var updateUserStmt *sql.Stmt
|
||||
var updateUserGroupStmt *sql.Stmt
|
||||
var updateGroupPermsStmt *sql.Stmt
|
||||
var updateGroupRankStmt *sql.Stmt
|
||||
var updateGroupStmt *sql.Stmt
|
||||
var updateEmailStmt *sql.Stmt
|
||||
var verifyEmailStmt *sql.Stmt
|
||||
var setTempGroupStmt *sql.Stmt
|
||||
var updateWordFilterStmt *sql.Stmt
|
||||
var bumpSyncStmt *sql.Stmt
|
||||
type Stmts struct {
|
||||
addRepliesToTopic *sql.Stmt
|
||||
removeRepliesFromTopic *sql.Stmt
|
||||
addTopicsToForum *sql.Stmt
|
||||
removeTopicsFromForum *sql.Stmt
|
||||
updateForumCache *sql.Stmt
|
||||
addLikesToTopic *sql.Stmt
|
||||
addLikesToReply *sql.Stmt
|
||||
editTopic *sql.Stmt
|
||||
editReply *sql.Stmt
|
||||
stickTopic *sql.Stmt
|
||||
unstickTopic *sql.Stmt
|
||||
lockTopic *sql.Stmt
|
||||
unlockTopic *sql.Stmt
|
||||
updateLastIP *sql.Stmt
|
||||
updateSession *sql.Stmt
|
||||
setPassword *sql.Stmt
|
||||
setAvatar *sql.Stmt
|
||||
setUsername *sql.Stmt
|
||||
changeGroup *sql.Stmt
|
||||
activateUser *sql.Stmt
|
||||
updateUserLevel *sql.Stmt
|
||||
incrementUserScore *sql.Stmt
|
||||
incrementUserPosts *sql.Stmt
|
||||
incrementUserBigposts *sql.Stmt
|
||||
incrementUserMegaposts *sql.Stmt
|
||||
incrementUserTopics *sql.Stmt
|
||||
editProfileReply *sql.Stmt
|
||||
updateForum *sql.Stmt
|
||||
updateSetting *sql.Stmt
|
||||
updatePlugin *sql.Stmt
|
||||
updatePluginInstall *sql.Stmt
|
||||
updateTheme *sql.Stmt
|
||||
updateUser *sql.Stmt
|
||||
updateUserGroup *sql.Stmt
|
||||
updateGroupPerms *sql.Stmt
|
||||
updateGroupRank *sql.Stmt
|
||||
updateGroup *sql.Stmt
|
||||
updateEmail *sql.Stmt
|
||||
verifyEmail *sql.Stmt
|
||||
setTempGroup *sql.Stmt
|
||||
updateWordFilter *sql.Stmt
|
||||
bumpSync *sql.Stmt
|
||||
|
||||
getActivityFeedByWatcher *sql.Stmt
|
||||
getActivityCountByWatcher *sql.Stmt
|
||||
todaysPostCount *sql.Stmt
|
||||
todaysTopicCount *sql.Stmt
|
||||
todaysReportCount *sql.Stmt
|
||||
todaysNewUserCount *sql.Stmt
|
||||
findUsersByIPUsers *sql.Stmt
|
||||
findUsersByIPTopics *sql.Stmt
|
||||
findUsersByIPReplies *sql.Stmt
|
||||
|
||||
Mocks bool
|
||||
}
|
||||
|
||||
// nolint
|
||||
func _gen_pgsql() (err error) {
|
||||
|
@ -57,253 +71,253 @@ func _gen_pgsql() (err error) {
|
|||
}
|
||||
|
||||
log.Print("Preparing addRepliesToTopic statement.")
|
||||
addRepliesToTopicStmt, err = db.Prepare("UPDATE `topics` SET `postCount` = `postCount` + ?,`lastReplyBy` = ?,`lastReplyAt` = LOCALTIMESTAMP() WHERE `tid` = ?")
|
||||
stmts.addRepliesToTopic, err = db.Prepare("UPDATE `topics` SET `postCount` = `postCount` + ?,`lastReplyBy` = ?,`lastReplyAt` = LOCALTIMESTAMP() WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing removeRepliesFromTopic statement.")
|
||||
removeRepliesFromTopicStmt, err = db.Prepare("UPDATE `topics` SET `postCount` = `postCount` - ? WHERE `tid` = ?")
|
||||
stmts.removeRepliesFromTopic, err = db.Prepare("UPDATE `topics` SET `postCount` = `postCount` - ? WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing addTopicsToForum statement.")
|
||||
addTopicsToForumStmt, err = db.Prepare("UPDATE `forums` SET `topicCount` = `topicCount` + ? WHERE `fid` = ?")
|
||||
stmts.addTopicsToForum, err = db.Prepare("UPDATE `forums` SET `topicCount` = `topicCount` + ? WHERE `fid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing removeTopicsFromForum statement.")
|
||||
removeTopicsFromForumStmt, err = db.Prepare("UPDATE `forums` SET `topicCount` = `topicCount` - ? WHERE `fid` = ?")
|
||||
stmts.removeTopicsFromForum, err = db.Prepare("UPDATE `forums` SET `topicCount` = `topicCount` - ? WHERE `fid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateForumCache statement.")
|
||||
updateForumCacheStmt, err = db.Prepare("UPDATE `forums` SET `lastTopicID` = ?,`lastReplyerID` = ? WHERE `fid` = ?")
|
||||
stmts.updateForumCache, err = db.Prepare("UPDATE `forums` SET `lastTopicID` = ?,`lastReplyerID` = ? WHERE `fid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing addLikesToTopic statement.")
|
||||
addLikesToTopicStmt, err = db.Prepare("UPDATE `topics` SET `likeCount` = `likeCount` + ? WHERE `tid` = ?")
|
||||
stmts.addLikesToTopic, err = db.Prepare("UPDATE `topics` SET `likeCount` = `likeCount` + ? WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing addLikesToReply statement.")
|
||||
addLikesToReplyStmt, err = db.Prepare("UPDATE `replies` SET `likeCount` = `likeCount` + ? WHERE `rid` = ?")
|
||||
stmts.addLikesToReply, err = db.Prepare("UPDATE `replies` SET `likeCount` = `likeCount` + ? WHERE `rid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing editTopic statement.")
|
||||
editTopicStmt, err = db.Prepare("UPDATE `topics` SET `title` = ?,`content` = ?,`parsed_content` = ? WHERE `tid` = ?")
|
||||
stmts.editTopic, err = db.Prepare("UPDATE `topics` SET `title` = ?,`content` = ?,`parsed_content` = ? WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing editReply statement.")
|
||||
editReplyStmt, err = db.Prepare("UPDATE `replies` SET `content` = ?,`parsed_content` = ? WHERE `rid` = ?")
|
||||
stmts.editReply, err = db.Prepare("UPDATE `replies` SET `content` = ?,`parsed_content` = ? WHERE `rid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing stickTopic statement.")
|
||||
stickTopicStmt, err = db.Prepare("UPDATE `topics` SET `sticky` = 1 WHERE `tid` = ?")
|
||||
stmts.stickTopic, err = db.Prepare("UPDATE `topics` SET `sticky` = 1 WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing unstickTopic statement.")
|
||||
unstickTopicStmt, err = db.Prepare("UPDATE `topics` SET `sticky` = 0 WHERE `tid` = ?")
|
||||
stmts.unstickTopic, err = db.Prepare("UPDATE `topics` SET `sticky` = 0 WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing lockTopic statement.")
|
||||
lockTopicStmt, err = db.Prepare("UPDATE `topics` SET `is_closed` = 1 WHERE `tid` = ?")
|
||||
stmts.lockTopic, err = db.Prepare("UPDATE `topics` SET `is_closed` = 1 WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing unlockTopic statement.")
|
||||
unlockTopicStmt, err = db.Prepare("UPDATE `topics` SET `is_closed` = 0 WHERE `tid` = ?")
|
||||
stmts.unlockTopic, err = db.Prepare("UPDATE `topics` SET `is_closed` = 0 WHERE `tid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateLastIP statement.")
|
||||
updateLastIPStmt, err = db.Prepare("UPDATE `users` SET `last_ip` = ? WHERE `uid` = ?")
|
||||
stmts.updateLastIP, err = db.Prepare("UPDATE `users` SET `last_ip` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateSession statement.")
|
||||
updateSessionStmt, err = db.Prepare("UPDATE `users` SET `session` = ? WHERE `uid` = ?")
|
||||
stmts.updateSession, err = db.Prepare("UPDATE `users` SET `session` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing setPassword statement.")
|
||||
setPasswordStmt, err = db.Prepare("UPDATE `users` SET `password` = ?,`salt` = ? WHERE `uid` = ?")
|
||||
stmts.setPassword, err = db.Prepare("UPDATE `users` SET `password` = ?,`salt` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing setAvatar statement.")
|
||||
setAvatarStmt, err = db.Prepare("UPDATE `users` SET `avatar` = ? WHERE `uid` = ?")
|
||||
stmts.setAvatar, err = db.Prepare("UPDATE `users` SET `avatar` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing setUsername statement.")
|
||||
setUsernameStmt, err = db.Prepare("UPDATE `users` SET `name` = ? WHERE `uid` = ?")
|
||||
stmts.setUsername, err = db.Prepare("UPDATE `users` SET `name` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing changeGroup statement.")
|
||||
changeGroupStmt, err = db.Prepare("UPDATE `users` SET `group` = ? WHERE `uid` = ?")
|
||||
stmts.changeGroup, err = db.Prepare("UPDATE `users` SET `group` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing activateUser statement.")
|
||||
activateUserStmt, err = db.Prepare("UPDATE `users` SET `active` = 1 WHERE `uid` = ?")
|
||||
stmts.activateUser, err = db.Prepare("UPDATE `users` SET `active` = 1 WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateUserLevel statement.")
|
||||
updateUserLevelStmt, err = db.Prepare("UPDATE `users` SET `level` = ? WHERE `uid` = ?")
|
||||
stmts.updateUserLevel, err = db.Prepare("UPDATE `users` SET `level` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing incrementUserScore statement.")
|
||||
incrementUserScoreStmt, err = db.Prepare("UPDATE `users` SET `score` = `score` + ? WHERE `uid` = ?")
|
||||
stmts.incrementUserScore, err = db.Prepare("UPDATE `users` SET `score` = `score` + ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing incrementUserPosts statement.")
|
||||
incrementUserPostsStmt, err = db.Prepare("UPDATE `users` SET `posts` = `posts` + ? WHERE `uid` = ?")
|
||||
stmts.incrementUserPosts, err = db.Prepare("UPDATE `users` SET `posts` = `posts` + ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing incrementUserBigposts statement.")
|
||||
incrementUserBigpostsStmt, err = db.Prepare("UPDATE `users` SET `posts` = `posts` + ?,`bigposts` = `bigposts` + ? WHERE `uid` = ?")
|
||||
stmts.incrementUserBigposts, err = db.Prepare("UPDATE `users` SET `posts` = `posts` + ?,`bigposts` = `bigposts` + ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing incrementUserMegaposts statement.")
|
||||
incrementUserMegapostsStmt, err = db.Prepare("UPDATE `users` SET `posts` = `posts` + ?,`bigposts` = `bigposts` + ?,`megaposts` = `megaposts` + ? WHERE `uid` = ?")
|
||||
stmts.incrementUserMegaposts, err = db.Prepare("UPDATE `users` SET `posts` = `posts` + ?,`bigposts` = `bigposts` + ?,`megaposts` = `megaposts` + ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing incrementUserTopics statement.")
|
||||
incrementUserTopicsStmt, err = db.Prepare("UPDATE `users` SET `topics` = `topics` + ? WHERE `uid` = ?")
|
||||
stmts.incrementUserTopics, err = db.Prepare("UPDATE `users` SET `topics` = `topics` + ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing editProfileReply statement.")
|
||||
editProfileReplyStmt, err = db.Prepare("UPDATE `users_replies` SET `content` = ?,`parsed_content` = ? WHERE `rid` = ?")
|
||||
stmts.editProfileReply, err = db.Prepare("UPDATE `users_replies` SET `content` = ?,`parsed_content` = ? WHERE `rid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateForum statement.")
|
||||
updateForumStmt, err = db.Prepare("UPDATE `forums` SET `name` = ?,`desc` = ?,`active` = ?,`preset` = ? WHERE `fid` = ?")
|
||||
stmts.updateForum, err = db.Prepare("UPDATE `forums` SET `name` = ?,`desc` = ?,`active` = ?,`preset` = ? WHERE `fid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateSetting statement.")
|
||||
updateSettingStmt, err = db.Prepare("UPDATE `settings` SET `content` = ? WHERE `name` = ?")
|
||||
stmts.updateSetting, err = db.Prepare("UPDATE `settings` SET `content` = ? WHERE `name` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updatePlugin statement.")
|
||||
updatePluginStmt, err = db.Prepare("UPDATE `plugins` SET `active` = ? WHERE `uname` = ?")
|
||||
stmts.updatePlugin, err = db.Prepare("UPDATE `plugins` SET `active` = ? WHERE `uname` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updatePluginInstall statement.")
|
||||
updatePluginInstallStmt, err = db.Prepare("UPDATE `plugins` SET `installed` = ? WHERE `uname` = ?")
|
||||
stmts.updatePluginInstall, err = db.Prepare("UPDATE `plugins` SET `installed` = ? WHERE `uname` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateTheme statement.")
|
||||
updateThemeStmt, err = db.Prepare("UPDATE `themes` SET `default` = ? WHERE `uname` = ?")
|
||||
stmts.updateTheme, err = db.Prepare("UPDATE `themes` SET `default` = ? WHERE `uname` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateUser statement.")
|
||||
updateUserStmt, err = db.Prepare("UPDATE `users` SET `name` = ?,`email` = ?,`group` = ? WHERE `uid` = ?")
|
||||
stmts.updateUser, err = db.Prepare("UPDATE `users` SET `name` = ?,`email` = ?,`group` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateUserGroup statement.")
|
||||
updateUserGroupStmt, err = db.Prepare("UPDATE `users` SET `group` = ? WHERE `uid` = ?")
|
||||
stmts.updateUserGroup, err = db.Prepare("UPDATE `users` SET `group` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateGroupPerms statement.")
|
||||
updateGroupPermsStmt, err = db.Prepare("UPDATE `users_groups` SET `permissions` = ? WHERE `gid` = ?")
|
||||
stmts.updateGroupPerms, err = db.Prepare("UPDATE `users_groups` SET `permissions` = ? WHERE `gid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateGroupRank statement.")
|
||||
updateGroupRankStmt, err = db.Prepare("UPDATE `users_groups` SET `is_admin` = ?,`is_mod` = ?,`is_banned` = ? WHERE `gid` = ?")
|
||||
stmts.updateGroupRank, err = db.Prepare("UPDATE `users_groups` SET `is_admin` = ?,`is_mod` = ?,`is_banned` = ? WHERE `gid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateGroup statement.")
|
||||
updateGroupStmt, err = db.Prepare("UPDATE `users_groups` SET `name` = ?,`tag` = ? WHERE `gid` = ?")
|
||||
stmts.updateGroup, err = db.Prepare("UPDATE `users_groups` SET `name` = ?,`tag` = ? WHERE `gid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateEmail statement.")
|
||||
updateEmailStmt, err = db.Prepare("UPDATE `emails` SET `email` = ?,`uid` = ?,`validated` = ?,`token` = ? WHERE `email` = ?")
|
||||
stmts.updateEmail, err = db.Prepare("UPDATE `emails` SET `email` = ?,`uid` = ?,`validated` = ?,`token` = ? WHERE `email` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing verifyEmail statement.")
|
||||
verifyEmailStmt, err = db.Prepare("UPDATE `emails` SET `validated` = 1,`token` = '' WHERE `email` = ?")
|
||||
stmts.verifyEmail, err = db.Prepare("UPDATE `emails` SET `validated` = 1,`token` = '' WHERE `email` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing setTempGroup statement.")
|
||||
setTempGroupStmt, err = db.Prepare("UPDATE `users` SET `temp_group` = ? WHERE `uid` = ?")
|
||||
stmts.setTempGroup, err = db.Prepare("UPDATE `users` SET `temp_group` = ? WHERE `uid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing updateWordFilter statement.")
|
||||
updateWordFilterStmt, err = db.Prepare("UPDATE `word_filters` SET `find` = ?,`replacement` = ? WHERE `wfid` = ?")
|
||||
stmts.updateWordFilter, err = db.Prepare("UPDATE `word_filters` SET `find` = ?,`replacement` = ? WHERE `wfid` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing bumpSync statement.")
|
||||
bumpSyncStmt, err = db.Prepare("UPDATE `sync` SET `last_update` = LOCALTIMESTAMP()")
|
||||
stmts.bumpSync, err = db.Prepare("UPDATE `sync` SET `last_update` = LOCALTIMESTAMP()")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -136,6 +136,12 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||
router.handleError(err,w,req,user)
|
||||
}
|
||||
case "/report":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
switch(req.URL.Path) {
|
||||
case "/report/submit/":
|
||||
err = routeReportSubmit(w,req,user,extra_data)
|
||||
|
@ -146,6 +152,12 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||
case "/topics":
|
||||
switch(req.URL.Path) {
|
||||
case "/topics/create/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeTopicCreate(w,req,user,extra_data)
|
||||
default:
|
||||
err = routeTopics(w,req,user)
|
||||
|
@ -233,6 +245,79 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
}
|
||||
case "/user":
|
||||
switch(req.URL.Path) {
|
||||
case "/user/edit/critical/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditCritical(w,req,user)
|
||||
case "/user/edit/critical/submit/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditCriticalSubmit(w,req,user)
|
||||
case "/user/edit/avatar/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditAvatar(w,req,user)
|
||||
case "/user/edit/avatar/submit/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditAvatarSubmit(w,req,user)
|
||||
case "/user/edit/username/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditUsername(w,req,user)
|
||||
case "/user/edit/username/submit/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditUsernameSubmit(w,req,user)
|
||||
case "/user/edit/email/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditEmail(w,req,user)
|
||||
case "/user/edit/token/":
|
||||
err = MemberOnly(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
|
||||
err = routeAccountOwnEditEmailTokenSubmit(w,req,user,extra_data)
|
||||
default:
|
||||
req.URL.Path += extra_data
|
||||
err = routeProfile(w,req,user)
|
||||
}
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
}
|
||||
case "/uploads":
|
||||
if extra_data == "" {
|
||||
NotFound(w,req)
|
||||
|
|
2
group.go
2
group.go
|
@ -28,7 +28,7 @@ type Group struct {
|
|||
}
|
||||
|
||||
func (group *Group) ChangeRank(isAdmin bool, isMod bool, isBanned bool) (err error) {
|
||||
_, err = updateGroupRankStmt.Exec(isAdmin, isMod, isBanned, group.ID)
|
||||
_, err = stmts.updateGroupRank.Exec(isAdmin, isMod, isBanned, group.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -54,12 +54,13 @@ func NewMemoryGroupStore() (*MemoryGroupStore, error) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
// TODO: Move this query from the global stmt store into this store
|
||||
func (mgs *MemoryGroupStore) LoadGroups() error {
|
||||
mgs.Lock()
|
||||
defer mgs.Unlock()
|
||||
mgs.groups[0] = &Group{ID: 0, Name: "Unknown"}
|
||||
|
||||
rows, err := getGroupsStmt.Query()
|
||||
rows, err := stmts.getGroups.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
28
main.go
28
main.go
|
@ -75,6 +75,13 @@ func (slice StringList) Contains(needle string) bool {
|
|||
var staticFiles = make(map[string]SFile)
|
||||
var logWriter = io.MultiWriter(os.Stderr)
|
||||
|
||||
// TODO: Wrap the globals in here so we can pass pointers to them to subpackages
|
||||
var globs *Globs
|
||||
|
||||
type Globs struct {
|
||||
stmts *Stmts
|
||||
}
|
||||
|
||||
func main() {
|
||||
// TODO: Recover from panics
|
||||
/*defer func() {
|
||||
|
@ -238,18 +245,21 @@ func main() {
|
|||
//router.HandleFunc("/accounts/list/", routeLogin) // Redirect /accounts/ and /user/ to here.. // Get a list of all of the accounts on the forum
|
||||
//router.HandleFunc("/accounts/create/full/", routeLogout) // Advanced account creator for admins?
|
||||
//router.HandleFunc("/user/edit/", routeLogout)
|
||||
router.HandleFunc("/user/edit/critical/", routeAccountOwnEditCritical) // Password & Email
|
||||
router.HandleFunc("/user/edit/critical/submit/", routeAccountOwnEditCriticalSubmit)
|
||||
router.HandleFunc("/user/edit/avatar/", routeAccountOwnEditAvatar)
|
||||
router.HandleFunc("/user/edit/avatar/submit/", routeAccountOwnEditAvatarSubmit)
|
||||
router.HandleFunc("/user/edit/username/", routeAccountOwnEditUsername)
|
||||
router.HandleFunc("/user/edit/username/submit/", routeAccountOwnEditUsernameSubmit)
|
||||
router.HandleFunc("/user/edit/email/", routeAccountOwnEditEmail)
|
||||
router.HandleFunc("/user/edit/token/", routeAccountOwnEditEmailTokenSubmit)
|
||||
router.HandleFunc("/user/", routeProfile)
|
||||
////router.HandleFunc("/user/edit/critical/", routeAccountOwnEditCritical) // Password & Email
|
||||
////router.HandleFunc("/user/edit/critical/submit/", routeAccountOwnEditCriticalSubmit)
|
||||
////router.HandleFunc("/user/edit/avatar/", routeAccountOwnEditAvatar)
|
||||
////router.HandleFunc("/user/edit/avatar/submit/", routeAccountOwnEditAvatarSubmit)
|
||||
////router.HandleFunc("/user/edit/username/", routeAccountOwnEditUsername)
|
||||
////router.HandleFunc("/user/edit/username/submit/", routeAccountOwnEditUsernameSubmit)
|
||||
////router.HandleFunc("/user/edit/email/", routeAccountOwnEditEmail)
|
||||
////router.HandleFunc("/user/edit/token/", routeAccountOwnEditEmailTokenSubmit)
|
||||
////router.HandleFunc("/user/", routeProfile)
|
||||
|
||||
// TODO: Move these into /user/?
|
||||
router.HandleFunc("/profile/reply/create/", routeProfileReplyCreate)
|
||||
router.HandleFunc("/profile/reply/edit/submit/", routeProfileReplyEditSubmit)
|
||||
router.HandleFunc("/profile/reply/delete/submit/", routeProfileReplyDeleteSubmit)
|
||||
|
||||
//router.HandleFunc("/user/edit/submit/", routeLogout) // routeLogout? what on earth? o.o
|
||||
//router.HandleFunc("/users/ban/", routeBan)
|
||||
router.HandleFunc("/users/ban/submit/", routeBanSubmit)
|
||||
|
|
|
@ -153,7 +153,7 @@ func routeTopicCreateSubmit(w http.ResponseWriter, r *http.Request, user User) R
|
|||
}
|
||||
}
|
||||
|
||||
_, err = addSubscriptionStmt.Exec(user.ID, tid, "topic")
|
||||
_, err = stmts.addSubscription.Exec(user.ID, tid, "topic")
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -224,7 +224,7 @@ func routeTopicCreateSubmit(w http.ResponseWriter, r *http.Request, user User) R
|
|||
return LocalError("Upload failed [Copy Failed]", w, r, user)
|
||||
}
|
||||
|
||||
_, err = addAttachmentStmt.Exec(fid, "forums", tid, "topics", user.ID, filename)
|
||||
_, err = stmts.addAttachment.Exec(fid, "forums", tid, "topics", user.ID, filename)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -329,7 +329,7 @@ func routeCreateReply(w http.ResponseWriter, r *http.Request, user User) RouteEr
|
|||
return LocalError("Upload failed [Copy Failed]", w, r, user)
|
||||
}
|
||||
|
||||
_, err = addAttachmentStmt.Exec(topic.ParentID, "forums", tid, "replies", user.ID, filename)
|
||||
_, err = stmts.addAttachment.Exec(topic.ParentID, "forums", tid, "replies", user.ID, filename)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -353,7 +353,7 @@ func routeCreateReply(w http.ResponseWriter, r *http.Request, user User) RouteEr
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
res, err := addActivityStmt.Exec(user.ID, topic.CreatedBy, "reply", "topic", tid)
|
||||
res, err := stmts.addActivity.Exec(user.ID, topic.CreatedBy, "reply", "topic", tid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -362,7 +362,7 @@ func routeCreateReply(w http.ResponseWriter, r *http.Request, user User) RouteEr
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
_, err = notifyWatchersStmt.Exec(lastID)
|
||||
_, err = stmts.notifyWatchers.Exec(lastID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -414,7 +414,7 @@ func routeLikeTopic(w http.ResponseWriter, r *http.Request, user User) RouteErro
|
|||
return LocalError("You can't like your own topics", w, r, user)
|
||||
}
|
||||
|
||||
err = hasLikedTopicStmt.QueryRow(user.ID, tid).Scan(&tid)
|
||||
err = stmts.hasLikedTopic.QueryRow(user.ID, tid).Scan(&tid)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
} else if err != ErrNoRows {
|
||||
|
@ -429,17 +429,17 @@ func routeLikeTopic(w http.ResponseWriter, r *http.Request, user User) RouteErro
|
|||
}
|
||||
|
||||
score := 1
|
||||
_, err = createLikeStmt.Exec(score, tid, "topics", user.ID)
|
||||
_, err = stmts.createLike.Exec(score, tid, "topics", user.ID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
_, err = addLikesToTopicStmt.Exec(1, tid)
|
||||
_, err = stmts.addLikesToTopic.Exec(1, tid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
res, err := addActivityStmt.Exec(user.ID, topic.CreatedBy, "like", "topic", tid)
|
||||
res, err := stmts.addActivity.Exec(user.ID, topic.CreatedBy, "like", "topic", tid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -448,7 +448,7 @@ func routeLikeTopic(w http.ResponseWriter, r *http.Request, user User) RouteErro
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
_, err = notifyOneStmt.Exec(topic.CreatedBy, lastID)
|
||||
_, err = stmts.notifyOne.Exec(topic.CreatedBy, lastID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -484,7 +484,7 @@ func routeReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user User) Rou
|
|||
}
|
||||
|
||||
var fid int
|
||||
err = getTopicFIDStmt.QueryRow(reply.ParentID).Scan(&fid)
|
||||
err = stmts.getTopicFID.QueryRow(reply.ParentID).Scan(&fid)
|
||||
if err == ErrNoRows {
|
||||
return PreError("The parent topic doesn't exist.", w, r)
|
||||
} else if err != nil {
|
||||
|
@ -518,7 +518,7 @@ func routeReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user User) Rou
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
res, err := addActivityStmt.Exec(user.ID, reply.CreatedBy, "like", "post", rid)
|
||||
res, err := stmts.addActivity.Exec(user.ID, reply.CreatedBy, "like", "post", rid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -527,7 +527,7 @@ func routeReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user User) Rou
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
_, err = notifyOneStmt.Exec(reply.CreatedBy, lastID)
|
||||
_, err = stmts.notifyOne.Exec(reply.CreatedBy, lastID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -559,13 +559,13 @@ func routeProfileReplyCreate(w http.ResponseWriter, r *http.Request, user User)
|
|||
}
|
||||
|
||||
content := html.EscapeString(preparseMessage(r.PostFormValue("reply-content")))
|
||||
_, err = createProfileReplyStmt.Exec(uid, content, parseMessage(content, 0, ""), user.ID, ipaddress)
|
||||
_, err = stmts.createProfileReply.Exec(uid, content, parseMessage(content, 0, ""), user.ID, ipaddress)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
var userName string
|
||||
err = getUserNameStmt.QueryRow(uid).Scan(&userName)
|
||||
err = stmts.getUserName.QueryRow(uid).Scan(&userName)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("The profile you're trying to post on doesn't exist.", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -626,7 +626,7 @@ func routeReportSubmit(w http.ResponseWriter, r *http.Request, user User, sitemI
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
err = getUserNameStmt.QueryRow(userReply.ParentID).Scan(&title)
|
||||
err = stmts.getUserName.QueryRow(userReply.ParentID).Scan(&title)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("We weren't able to find the profile the reported post is supposed to be on", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -635,7 +635,7 @@ func routeReportSubmit(w http.ResponseWriter, r *http.Request, user User, sitemI
|
|||
title = "Profile: " + title
|
||||
content = userReply.Content + "\n\nOriginal Post: @" + strconv.Itoa(userReply.ParentID)
|
||||
} else if itemType == "topic" {
|
||||
err = getTopicBasicStmt.QueryRow(itemID).Scan(&title, &content)
|
||||
err = stmts.getTopicBasic.QueryRow(itemID).Scan(&title, &content)
|
||||
if err == ErrNoRows {
|
||||
return NotFound(w, r)
|
||||
} else if err != nil {
|
||||
|
@ -653,7 +653,7 @@ func routeReportSubmit(w http.ResponseWriter, r *http.Request, user User, sitemI
|
|||
}
|
||||
|
||||
var count int
|
||||
rows, err := reportExistsStmt.Query(itemType + "_" + strconv.Itoa(itemID))
|
||||
rows, err := stmts.reportExists.Query(itemType + "_" + strconv.Itoa(itemID))
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -670,7 +670,7 @@ func routeReportSubmit(w http.ResponseWriter, r *http.Request, user User, sitemI
|
|||
|
||||
// TODO: Repost attachments in the reports forum, so that the mods can see them
|
||||
// ? - Can we do this via the TopicStore?
|
||||
res, err := createReportStmt.Exec(title, content, parseMessage(content, 0, ""), user.ID, user.ID, itemType+"_"+strconv.Itoa(itemID))
|
||||
res, err := stmts.createReport.Exec(title, content, parseMessage(content, 0, ""), user.ID, user.ID, itemType+"_"+strconv.Itoa(itemID))
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -680,7 +680,7 @@ func routeReportSubmit(w http.ResponseWriter, r *http.Request, user User, sitemI
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
_, err = addTopicsToForumStmt.Exec(1, fid)
|
||||
_, err = stmts.addTopicsToForum.Exec(1, fid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -698,9 +698,6 @@ func routeAccountOwnEditCritical(w http.ResponseWriter, r *http.Request, user Us
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
|
||||
pi := Page{"Edit Password", user, headerVars, tList, nil}
|
||||
if preRenderHooks["pre_render_account_own_edit_critical"] != nil {
|
||||
|
@ -720,9 +717,6 @@ func routeAccountOwnEditCriticalSubmit(w http.ResponseWriter, r *http.Request, u
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
|
@ -734,7 +728,7 @@ func routeAccountOwnEditCriticalSubmit(w http.ResponseWriter, r *http.Request, u
|
|||
newPassword := r.PostFormValue("account-new-password")
|
||||
confirmPassword := r.PostFormValue("account-confirm-password")
|
||||
|
||||
err = getPasswordStmt.QueryRow(user.ID).Scan(&realPassword, &salt)
|
||||
err = stmts.getPassword.QueryRow(user.ID).Scan(&realPassword, &salt)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("Your account no longer exists.", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -774,9 +768,7 @@ func routeAccountOwnEditAvatar(w http.ResponseWriter, r *http.Request, user User
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
|
||||
pi := Page{"Edit Avatar", user, headerVars, tList, nil}
|
||||
if preRenderHooks["pre_render_account_own_edit_avatar"] != nil {
|
||||
if runPreRenderHook("pre_render_account_own_edit_avatar", w, r, &user, &pi) {
|
||||
|
@ -801,9 +793,6 @@ func routeAccountOwnEditAvatarSubmit(w http.ResponseWriter, r *http.Request, use
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
|
||||
err := r.ParseMultipartForm(int64(megabyte))
|
||||
if err != nil {
|
||||
|
@ -884,9 +873,7 @@ func routeAccountOwnEditUsername(w http.ResponseWriter, r *http.Request, user Us
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
|
||||
pi := Page{"Edit Username", user, headerVars, tList, user.Name}
|
||||
if preRenderHooks["pre_render_account_own_edit_username"] != nil {
|
||||
if runPreRenderHook("pre_render_account_own_edit_username", w, r, &user, &pi) {
|
||||
|
@ -905,9 +892,6 @@ func routeAccountOwnEditUsernameSubmit(w http.ResponseWriter, r *http.Request, u
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
return LocalError("Bad Form", w, r, user)
|
||||
|
@ -939,22 +923,19 @@ func routeAccountOwnEditEmail(w http.ResponseWriter, r *http.Request, user User)
|
|||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
|
||||
email := Email{UserID: user.ID}
|
||||
var emailList []interface{}
|
||||
rows, err := getEmailsByUserStmt.Query(user.ID)
|
||||
rows, err := stmts.getEmailsByUser.Query(user.ID)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
err := rows.Scan(&email.Email, &email.Validated, &email.Token)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
if email.Email == user.Email {
|
||||
|
@ -964,7 +945,7 @@ func routeAccountOwnEditEmail(w http.ResponseWriter, r *http.Request, user User)
|
|||
}
|
||||
err = rows.Err()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
// Was this site migrated from another forum software? Most of them don't have multiple emails for a single user.
|
||||
|
@ -992,20 +973,16 @@ func routeAccountOwnEditEmail(w http.ResponseWriter, r *http.Request, user User)
|
|||
return nil
|
||||
}
|
||||
|
||||
func routeAccountOwnEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
||||
func routeAccountOwnEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request, user User, token string) RouteError {
|
||||
headerVars, ferr := UserCheck(w, r, &user)
|
||||
if ferr != nil {
|
||||
return ferr
|
||||
}
|
||||
if !user.Loggedin {
|
||||
return LocalError("You need to login to edit your account.", w, r, user)
|
||||
}
|
||||
token := r.URL.Path[len("/user/edit/token/"):]
|
||||
|
||||
email := Email{UserID: user.ID}
|
||||
targetEmail := Email{UserID: user.ID}
|
||||
var emailList []interface{}
|
||||
rows, err := getEmailsByUserStmt.Query(user.ID)
|
||||
rows, err := stmts.getEmailsByUser.Query(user.ID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1037,14 +1014,14 @@ func routeAccountOwnEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request,
|
|||
return LocalError("That's not a valid token!", w, r, user)
|
||||
}
|
||||
|
||||
_, err = verifyEmailStmt.Exec(user.Email)
|
||||
_, err = stmts.verifyEmail.Exec(user.Email)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
// If Email Activation is on, then activate the account while we're here
|
||||
if headerVars.Settings["activation_type"] == 2 {
|
||||
_, err = activateUserStmt.Exec(user.ID)
|
||||
_, err = stmts.activateUser.Exec(user.ID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1098,7 +1075,7 @@ func routeShowAttachment(w http.ResponseWriter, r *http.Request, user User, file
|
|||
|
||||
var originTable string
|
||||
var originID, uploadedBy int
|
||||
err = getAttachmentStmt.QueryRow(filename, sectionID, sectionTable).Scan(§ionID, §ionTable, &originID, &originTable, &uploadedBy, &filename)
|
||||
err = stmts.getAttachment.QueryRow(filename, sectionID, sectionTable).Scan(§ionID, §ionTable, &originID, &originTable, &uploadedBy, &filename)
|
||||
if err == ErrNoRows {
|
||||
return NotFound(w, r)
|
||||
} else if err != nil {
|
||||
|
|
15
misc_test.go
15
misc_test.go
|
@ -475,6 +475,21 @@ func TestPermsMiddleware(t *testing.T) {
|
|||
expect(t, ferr == nil, "Supermods should be allowed through supermod gates")
|
||||
|
||||
// TODO: Loop over the Control Panel routes and make sure only supermods can get in
|
||||
|
||||
user = getDummyUser()
|
||||
|
||||
ferr = MemberOnly(dummyResponseRecorder, dummyRequest, *user)
|
||||
expect(t, ferr != nil, "Blank users shouldn't be considered loggedin")
|
||||
|
||||
user.Loggedin = false
|
||||
ferr = MemberOnly(dummyResponseRecorder, dummyRequest, *user)
|
||||
expect(t, ferr != nil, "Guests shouldn't be able to access member areas")
|
||||
|
||||
user.Loggedin = true
|
||||
ferr = MemberOnly(dummyResponseRecorder, dummyRequest, *user)
|
||||
expect(t, ferr == nil, "Logged in users should be able to access member areas")
|
||||
|
||||
// TODO: Loop over the /user/ routes and make sure only members can access the ones other than /user/username
|
||||
}
|
||||
|
||||
func TestTopicStore(t *testing.T) {
|
||||
|
|
|
@ -123,7 +123,7 @@ func routeDeleteTopic(w http.ResponseWriter, r *http.Request, user User) RouteEr
|
|||
}
|
||||
|
||||
// ? - We might need to add soft-delete before we can do an action reply for this
|
||||
/*_, err = createActionReplyStmt.Exec(tid,"delete",ipaddress,user.ID)
|
||||
/*_, err = stmts.createActionReply.Exec(tid,"delete",ipaddress,user.ID)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err,w,r,isJs)
|
||||
}*/
|
||||
|
@ -350,13 +350,13 @@ func routeReplyEditSubmit(w http.ResponseWriter, r *http.Request, user User) Rou
|
|||
|
||||
// Get the Reply ID..
|
||||
var tid int
|
||||
err = getReplyTIDStmt.QueryRow(rid).Scan(&tid)
|
||||
err = stmts.getReplyTID.QueryRow(rid).Scan(&tid)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
||||
var fid int
|
||||
err = getTopicFIDStmt.QueryRow(tid).Scan(&fid)
|
||||
err = stmts.getTopicFID.QueryRow(tid).Scan(&fid)
|
||||
if err == ErrNoRows {
|
||||
return PreErrorJSQ("The parent topic doesn't exist.", w, r, isJs)
|
||||
} else if err != nil {
|
||||
|
@ -373,7 +373,7 @@ func routeReplyEditSubmit(w http.ResponseWriter, r *http.Request, user User) Rou
|
|||
}
|
||||
|
||||
content := html.EscapeString(preparseMessage(r.PostFormValue("edit_item")))
|
||||
_, err = editReplyStmt.Exec(content, parseMessage(content, fid, "forums"), rid)
|
||||
_, err = stmts.editReply.Exec(content, parseMessage(content, fid, "forums"), rid)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -408,7 +408,7 @@ func routeReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user User) R
|
|||
}
|
||||
|
||||
var fid int
|
||||
err = getTopicFIDStmt.QueryRow(reply.ParentID).Scan(&fid)
|
||||
err = stmts.getTopicFID.QueryRow(reply.ParentID).Scan(&fid)
|
||||
if err == ErrNoRows {
|
||||
return PreErrorJSQ("The parent topic doesn't exist.", w, r, isJs)
|
||||
} else if err != nil {
|
||||
|
@ -472,7 +472,7 @@ func routeProfileReplyEditSubmit(w http.ResponseWriter, r *http.Request, user Us
|
|||
|
||||
// Get the Reply ID..
|
||||
var uid int
|
||||
err = getUserReplyUIDStmt.QueryRow(rid).Scan(&uid)
|
||||
err = stmts.getUserReplyUID.QueryRow(rid).Scan(&uid)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -482,7 +482,7 @@ func routeProfileReplyEditSubmit(w http.ResponseWriter, r *http.Request, user Us
|
|||
}
|
||||
|
||||
content := html.EscapeString(preparseMessage(r.PostFormValue("edit_item")))
|
||||
_, err = editProfileReplyStmt.Exec(content, parseMessage(content, 0, ""), rid)
|
||||
_, err = stmts.editProfileReply.Exec(content, parseMessage(content, 0, ""), rid)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -508,7 +508,7 @@ func routeProfileReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user
|
|||
}
|
||||
|
||||
var uid int
|
||||
err = getUserReplyUIDStmt.QueryRow(rid).Scan(&uid)
|
||||
err = stmts.getUserReplyUID.QueryRow(rid).Scan(&uid)
|
||||
if err == ErrNoRows {
|
||||
return LocalErrorJSQ("The reply you tried to delete doesn't exist.", w, r, user, isJs)
|
||||
} else if err != nil {
|
||||
|
@ -519,7 +519,7 @@ func routeProfileReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user
|
|||
return NoPermissionsJSQ(w, r, user, isJs)
|
||||
}
|
||||
|
||||
_, err = deleteProfileReplyStmt.Exec(rid)
|
||||
_, err = stmts.deleteProfileReply.Exec(rid)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -546,7 +546,7 @@ func routeIps(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
var uid int
|
||||
var reqUserList = make(map[int]bool)
|
||||
|
||||
rows, err := findUsersByIPUsersStmt.Query(ip)
|
||||
rows, err := stmts.findUsersByIPUsers.Query(ip)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -564,7 +564,7 @@ func routeIps(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
rows2, err := findUsersByIPTopicsStmt.Query(ip)
|
||||
rows2, err := stmts.findUsersByIPTopics.Query(ip)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -582,7 +582,7 @@ func routeIps(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
return InternalError(err, w, r)
|
||||
}
|
||||
|
||||
rows3, err := findUsersByIPRepliesStmt.Query(ip)
|
||||
rows3, err := stmts.findUsersByIPReplies.Query(ip)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
|
10
mssql.go
10
mssql.go
|
@ -20,16 +20,6 @@ import (
|
|||
|
||||
var dbInstance string = ""
|
||||
|
||||
var getActivityFeedByWatcherStmt *sql.Stmt
|
||||
var getActivityCountByWatcherStmt *sql.Stmt
|
||||
var todaysPostCountStmt *sql.Stmt
|
||||
var todaysTopicCountStmt *sql.Stmt
|
||||
var todaysReportCountStmt *sql.Stmt
|
||||
var todaysNewUserCountStmt *sql.Stmt
|
||||
var findUsersByIPUsersStmt *sql.Stmt
|
||||
var findUsersByIPTopicsStmt *sql.Stmt
|
||||
var findUsersByIPRepliesStmt *sql.Stmt
|
||||
|
||||
func init() {
|
||||
dbAdapter = "mssql"
|
||||
_initDatabase = initMSSQL
|
||||
|
|
27
mysql.go
27
mysql.go
|
@ -16,15 +16,6 @@ import _ "github.com/go-sql-driver/mysql"
|
|||
import "./query_gen/lib"
|
||||
|
||||
var dbCollation = "utf8mb4_general_ci"
|
||||
var getActivityFeedByWatcherStmt *sql.Stmt
|
||||
var getActivityCountByWatcherStmt *sql.Stmt
|
||||
var todaysPostCountStmt *sql.Stmt
|
||||
var todaysTopicCountStmt *sql.Stmt
|
||||
var todaysReportCountStmt *sql.Stmt
|
||||
var todaysNewUserCountStmt *sql.Stmt
|
||||
var findUsersByIPUsersStmt *sql.Stmt
|
||||
var findUsersByIPTopicsStmt *sql.Stmt
|
||||
var findUsersByIPRepliesStmt *sql.Stmt
|
||||
|
||||
func init() {
|
||||
dbAdapter = "mysql"
|
||||
|
@ -75,54 +66,54 @@ func initMySQL() (err error) {
|
|||
|
||||
// TODO: Is there a less noisy way of doing this for tests?
|
||||
log.Print("Preparing get_activity_feed_by_watcher statement.")
|
||||
getActivityFeedByWatcherStmt, err = db.Prepare("SELECT activity_stream_matches.asid, activity_stream.actor, activity_stream.targetUser, activity_stream.event, activity_stream.elementType, activity_stream.elementID FROM `activity_stream_matches` INNER JOIN `activity_stream` ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE `watcher` = ? ORDER BY activity_stream.asid ASC LIMIT 8")
|
||||
stmts.getActivityFeedByWatcher, err = db.Prepare("SELECT activity_stream_matches.asid, activity_stream.actor, activity_stream.targetUser, activity_stream.event, activity_stream.elementType, activity_stream.elementID FROM `activity_stream_matches` INNER JOIN `activity_stream` ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE `watcher` = ? ORDER BY activity_stream.asid ASC LIMIT 8")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing get_activity_count_by_watcher statement.")
|
||||
getActivityCountByWatcherStmt, err = db.Prepare("SELECT count(*) FROM `activity_stream_matches` INNER JOIN `activity_stream` ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE `watcher` = ?")
|
||||
stmts.getActivityCountByWatcher, err = db.Prepare("SELECT count(*) FROM `activity_stream_matches` INNER JOIN `activity_stream` ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE `watcher` = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing todays_post_count statement.")
|
||||
todaysPostCountStmt, err = db.Prepare("select count(*) from replies where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp()")
|
||||
stmts.todaysPostCount, err = db.Prepare("select count(*) from replies where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp()")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing todays_topic_count statement.")
|
||||
todaysTopicCountStmt, err = db.Prepare("select count(*) from topics where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp()")
|
||||
stmts.todaysTopicCount, err = db.Prepare("select count(*) from topics where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp()")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing todays_report_count statement.")
|
||||
todaysReportCountStmt, err = db.Prepare("select count(*) from topics where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp() and parentID = 1")
|
||||
stmts.todaysReportCount, err = db.Prepare("select count(*) from topics where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp() and parentID = 1")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing todays_newuser_count statement.")
|
||||
todaysNewUserCountStmt, err = db.Prepare("select count(*) from users where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp()")
|
||||
stmts.todaysNewUserCount, err = db.Prepare("select count(*) from users where createdAt BETWEEN (utc_timestamp() - interval 1 day) and utc_timestamp()")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing find_users_by_ip_users statement.")
|
||||
findUsersByIPUsersStmt, err = db.Prepare("select uid from users where last_ip = ?")
|
||||
stmts.findUsersByIPUsers, err = db.Prepare("select uid from users where last_ip = ?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing find_users_by_ip_topics statement.")
|
||||
findUsersByIPTopicsStmt, err = db.Prepare("select uid from users where uid in(select createdBy from topics where ipaddress = ?)")
|
||||
stmts.findUsersByIPTopics, err = db.Prepare("select uid from users where uid in(select createdBy from topics where ipaddress = ?)")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("Preparing find_users_by_ip_replies statement.")
|
||||
findUsersByIPRepliesStmt, err = db.Prepare("select uid from users where uid in(select createdBy from replies where ipaddress = ?)")
|
||||
stmts.findUsersByIPReplies, err = db.Prepare("select uid from users where uid in(select createdBy from replies where ipaddress = ?)")
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ func routePanel(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
}
|
||||
|
||||
var postCount int
|
||||
err = todaysPostCountStmt.QueryRow().Scan(&postCount)
|
||||
err = stmts.todaysPostCount.QueryRow().Scan(&postCount)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ func routePanel(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
}
|
||||
|
||||
var topicCount int
|
||||
err = todaysTopicCountStmt.QueryRow().Scan(&topicCount)
|
||||
err = stmts.todaysTopicCount.QueryRow().Scan(&topicCount)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -95,14 +95,14 @@ func routePanel(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
}
|
||||
|
||||
var reportCount int
|
||||
err = todaysReportCountStmt.QueryRow().Scan(&reportCount)
|
||||
err = stmts.todaysReportCount.QueryRow().Scan(&reportCount)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
var reportInterval = "week"
|
||||
|
||||
var newUserCount int
|
||||
err = todaysNewUserCountStmt.QueryRow().Scan(&newUserCount)
|
||||
err = stmts.todaysNewUserCount.QueryRow().Scan(&newUserCount)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -483,7 +483,7 @@ func routePanelForumsEditPermsSubmit(w http.ResponseWriter, r *http.Request, use
|
|||
}
|
||||
|
||||
// TODO: Add this and replaceForumPermsForGroup into a transaction?
|
||||
_, err = updateForumStmt.Exec(forum.Name, forum.Desc, forum.Active, "", fid)
|
||||
_, err = stmts.updateForum.Exec(forum.Name, forum.Desc, forum.Active, "", fid)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -512,7 +512,7 @@ func routePanelSettings(w http.ResponseWriter, r *http.Request, user User) Route
|
|||
|
||||
//log.Print("headerVars.Settings",headerVars.Settings)
|
||||
var settingList = make(map[string]interface{})
|
||||
rows, err := getSettingsStmt.Query()
|
||||
rows, err := stmts.getSettings.Query()
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -572,7 +572,7 @@ func routePanelSetting(w http.ResponseWriter, r *http.Request, user User, sname
|
|||
}
|
||||
setting := Setting{sname, "", "", ""}
|
||||
|
||||
err := getSettingStmt.QueryRow(setting.Name).Scan(&setting.Content, &setting.Type)
|
||||
err := stmts.getSetting.QueryRow(setting.Name).Scan(&setting.Content, &setting.Type)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("The setting you want to edit doesn't exist.", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -630,7 +630,7 @@ func routePanelSettingEdit(w http.ResponseWriter, r *http.Request, user User, sn
|
|||
var stype, sconstraints string
|
||||
scontent := r.PostFormValue("setting-value")
|
||||
|
||||
err = getFullSettingStmt.QueryRow(sname).Scan(&sname, &stype, &sconstraints)
|
||||
err = stmts.getFullSetting.QueryRow(sname).Scan(&sname, &stype, &sconstraints)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("The setting you want to edit doesn't exist.", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -646,7 +646,7 @@ func routePanelSettingEdit(w http.ResponseWriter, r *http.Request, user User, sn
|
|||
}
|
||||
|
||||
// TODO: Make this a method or function?
|
||||
_, err = updateSettingStmt.Exec(scontent, sname)
|
||||
_, err = stmts.updateSetting.Exec(scontent, sname)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -707,7 +707,7 @@ func routePanelWordFiltersCreate(w http.ResponseWriter, r *http.Request, user Us
|
|||
// Unlike with find, it's okay if we leave this blank, as this means that the admin wants to remove the word entirely with no replacement
|
||||
replacement := strings.TrimSpace(r.PostFormValue("replacement"))
|
||||
|
||||
res, err := createWordFilterStmt.Exec(find, replacement)
|
||||
res, err := stmts.createWordFilter.Exec(find, replacement)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -778,7 +778,7 @@ func routePanelWordFiltersEditSubmit(w http.ResponseWriter, r *http.Request, use
|
|||
// Unlike with find, it's okay if we leave this blank, as this means that the admin wants to remove the word entirely with no replacement
|
||||
replacement := strings.TrimSpace(r.PostFormValue("replacement"))
|
||||
|
||||
_, err = updateWordFilterStmt.Exec(find, replacement, id)
|
||||
_, err = stmts.updateWordFilter.Exec(find, replacement, id)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -811,7 +811,7 @@ func routePanelWordFiltersDeleteSubmit(w http.ResponseWriter, r *http.Request, u
|
|||
return LocalErrorJSQ("The word filter ID must be an integer.", w, r, user, isJs)
|
||||
}
|
||||
|
||||
_, err = deleteWordFilterStmt.Exec(id)
|
||||
_, err = stmts.deleteWordFilter.Exec(id)
|
||||
if err != nil {
|
||||
return InternalErrorJSQ(err, w, r, isJs)
|
||||
}
|
||||
|
@ -874,7 +874,7 @@ func routePanelPluginsActivate(w http.ResponseWriter, r *http.Request, user User
|
|||
}
|
||||
|
||||
var active bool
|
||||
err := isPluginActiveStmt.QueryRow(uname).Scan(&active)
|
||||
err := stmts.isPluginActive.QueryRow(uname).Scan(&active)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -894,13 +894,13 @@ func routePanelPluginsActivate(w http.ResponseWriter, r *http.Request, user User
|
|||
return LocalError("The plugin is already active", w, r, user)
|
||||
}
|
||||
//log.Print("updatePlugin")
|
||||
_, err = updatePluginStmt.Exec(1, uname)
|
||||
_, err = stmts.updatePlugin.Exec(1, uname)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
} else {
|
||||
//log.Print("addPlugin")
|
||||
_, err := addPluginStmt.Exec(uname, 1, 0)
|
||||
_, err := stmts.addPlugin.Exec(uname, 1, 0)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -936,7 +936,7 @@ func routePanelPluginsDeactivate(w http.ResponseWriter, r *http.Request, user Us
|
|||
}
|
||||
|
||||
var active bool
|
||||
err := isPluginActiveStmt.QueryRow(uname).Scan(&active)
|
||||
err := stmts.isPluginActive.QueryRow(uname).Scan(&active)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("The plugin you're trying to deactivate isn't active", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -946,7 +946,7 @@ func routePanelPluginsDeactivate(w http.ResponseWriter, r *http.Request, user Us
|
|||
if !active {
|
||||
return LocalError("The plugin you're trying to deactivate isn't active", w, r, user)
|
||||
}
|
||||
_, err = updatePluginStmt.Exec(0, uname)
|
||||
_, err = stmts.updatePlugin.Exec(0, uname)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -985,7 +985,7 @@ func routePanelPluginsInstall(w http.ResponseWriter, r *http.Request, user User,
|
|||
}
|
||||
|
||||
var active bool
|
||||
err := isPluginActiveStmt.QueryRow(uname).Scan(&active)
|
||||
err := stmts.isPluginActive.QueryRow(uname).Scan(&active)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1006,16 +1006,16 @@ func routePanelPluginsInstall(w http.ResponseWriter, r *http.Request, user User,
|
|||
}
|
||||
|
||||
if hasPlugin {
|
||||
_, err = updatePluginInstallStmt.Exec(1, uname)
|
||||
_, err = stmts.updatePluginInstall.Exec(1, uname)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
_, err = updatePluginStmt.Exec(1, uname)
|
||||
_, err = stmts.updatePlugin.Exec(1, uname)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
} else {
|
||||
_, err := addPluginStmt.Exec(uname, 1, 1)
|
||||
_, err := stmts.addPlugin.Exec(uname, 1, 1)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1046,7 +1046,7 @@ func routePanelUsers(w http.ResponseWriter, r *http.Request, user User) RouteErr
|
|||
|
||||
var userList []User
|
||||
// TODO: Move this into the UserStore
|
||||
rows, err := getUsersOffsetStmt.Query(offset, perPage)
|
||||
rows, err := stmts.getUsersOffset.Query(offset, perPage)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1216,7 +1216,7 @@ func routePanelUsersEditSubmit(w http.ResponseWriter, r *http.Request, user User
|
|||
return LocalError("You need the EditUserGroupSuperMod permission to assign someone to a super mod group.", w, r, user)
|
||||
}
|
||||
|
||||
_, err = updateUserStmt.Exec(newname, newemail, newgroup, targetUser.ID)
|
||||
_, err = stmts.updateUser.Exec(newname, newemail, newgroup, targetUser.ID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1516,7 +1516,7 @@ func routePanelGroupsEditSubmit(w http.ResponseWriter, r *http.Request, user Use
|
|||
}
|
||||
|
||||
// TODO: Move this to *Group
|
||||
_, err = updateGroupStmt.Exec(gname, gtag, gid)
|
||||
_, err = stmts.updateGroup.Exec(gname, gtag, gid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1581,7 +1581,7 @@ func routePanelGroupsEditPermsSubmit(w http.ResponseWriter, r *http.Request, use
|
|||
if err != nil {
|
||||
return LocalError("Unable to marshal the data", w, r, user)
|
||||
}
|
||||
_, err = updateGroupPermsStmt.Exec(pjson, gid)
|
||||
_, err = stmts.updateGroupPerms.Exec(pjson, gid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1696,7 +1696,7 @@ func routePanelThemesSetDefault(w http.ResponseWriter, r *http.Request, user Use
|
|||
|
||||
var isDefault bool
|
||||
log.Print("uname", uname) // TODO: Do we need to log this?
|
||||
err := isThemeDefaultStmt.QueryRow(uname).Scan(&isDefault)
|
||||
err := stmts.isThemeDefault.QueryRow(uname).Scan(&isDefault)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1707,12 +1707,12 @@ func routePanelThemesSetDefault(w http.ResponseWriter, r *http.Request, user Use
|
|||
if isDefault {
|
||||
return LocalError("The theme is already active", w, r, user)
|
||||
}
|
||||
_, err = updateThemeStmt.Exec(1, uname)
|
||||
_, err = stmts.updateTheme.Exec(1, uname)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
} else {
|
||||
_, err := addThemeStmt.Exec(uname, 1)
|
||||
_, err := stmts.addTheme.Exec(uname, 1)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1721,7 +1721,7 @@ func routePanelThemesSetDefault(w http.ResponseWriter, r *http.Request, user Use
|
|||
// TODO: Make this less racey
|
||||
changeDefaultThemeMutex.Lock()
|
||||
defaultTheme := defaultThemeBox.Load().(string)
|
||||
_, err = updateThemeStmt.Exec(0, defaultTheme)
|
||||
_, err = stmts.updateTheme.Exec(0, defaultTheme)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1803,7 +1803,7 @@ func routePanelLogsMod(w http.ResponseWriter, r *http.Request, user User) RouteE
|
|||
}
|
||||
|
||||
var logCount int
|
||||
err := modlogCountStmt.QueryRow().Scan(&logCount)
|
||||
err := stmts.modlogCount.QueryRow().Scan(&logCount)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1812,7 +1812,7 @@ func routePanelLogsMod(w http.ResponseWriter, r *http.Request, user User) RouteE
|
|||
perPage := 10
|
||||
offset, page, lastPage := pageOffset(logCount, page, perPage)
|
||||
|
||||
rows, err := getModlogsOffsetStmt.Query(offset, perPage)
|
||||
rows, err := stmts.getModlogsOffset.Query(offset, perPage)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
|
6
pgsql.go
6
pgsql.go
|
@ -13,12 +13,6 @@ import "./query_gen/lib"
|
|||
|
||||
// TODO: Add support for SSL for all database drivers, not just pgsql
|
||||
var db_sslmode = "disable" // verify-full
|
||||
var get_activity_feed_by_watcher_stmt *sql.Stmt
|
||||
var get_activity_count_by_watcher_stmt *sql.Stmt
|
||||
var todays_post_count_stmt *sql.Stmt
|
||||
var todays_topic_count_stmt *sql.Stmt
|
||||
var todays_report_count_stmt *sql.Stmt
|
||||
var todays_newuser_count_stmt *sql.Stmt
|
||||
|
||||
func init() {
|
||||
db_adapter = "pgsql"
|
||||
|
|
|
@ -491,14 +491,6 @@ func (adapter *MssqlAdapter) SimpleSelect(name string, table string, columns str
|
|||
}
|
||||
}
|
||||
|
||||
/*if limiter.MaxCount != "" {
|
||||
if limiter.MaxCount == "?" {
|
||||
substituteCount++
|
||||
limiter.MaxCount = "?" + strconv.Itoa(substituteCount)
|
||||
}
|
||||
querystr = "TOP " + limiter.MaxCount + " " + querystr
|
||||
}*/
|
||||
|
||||
// ! Does this work without an offset?
|
||||
if limiter.MaxCount != "" {
|
||||
if limiter.MaxCount == "?" {
|
||||
|
@ -1086,10 +1078,10 @@ func (adapter *MssqlAdapter) Write() error {
|
|||
stmt := adapter.Buffer[name]
|
||||
// TODO: Add support for create-table? Table creation might be a little complex for Go to do outside a SQL file :(
|
||||
if stmt.Type != "create-table" {
|
||||
stmts += "var " + name + "Stmt *sql.Stmt\n"
|
||||
stmts += "\t" + name + " *sql.Stmt\n"
|
||||
body += `
|
||||
log.Print("Preparing ` + name + ` statement.")
|
||||
` + name + `Stmt, err = db.Prepare("` + stmt.Contents + `")
|
||||
stmts.` + name + `, err = db.Prepare("` + stmt.Contents + `")
|
||||
if err != nil {
|
||||
log.Print("Bad Query: ","` + stmt.Contents + `")
|
||||
return err
|
||||
|
@ -1098,6 +1090,7 @@ func (adapter *MssqlAdapter) Write() error {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Move these custom queries out of this file
|
||||
out := `// +build mssql
|
||||
|
||||
// This file was generated by Gosora's Query Generator. Please try to avoid modifying this file, as it might change at any time.
|
||||
|
@ -1107,7 +1100,21 @@ import "log"
|
|||
import "database/sql"
|
||||
|
||||
// nolint
|
||||
type Stmts struct {
|
||||
` + stmts + `
|
||||
getActivityFeedByWatcher *sql.Stmt
|
||||
getActivityCountByWatcher *sql.Stmt
|
||||
todaysPostCount *sql.Stmt
|
||||
todaysTopicCount *sql.Stmt
|
||||
todaysReportCount *sql.Stmt
|
||||
todaysNewUserCount *sql.Stmt
|
||||
findUsersByIPUsers *sql.Stmt
|
||||
findUsersByIPTopics *sql.Stmt
|
||||
findUsersByIPReplies *sql.Stmt
|
||||
|
||||
Mocks bool
|
||||
}
|
||||
|
||||
// nolint
|
||||
func _gen_mssql() (err error) {
|
||||
if dev.DebugMode {
|
||||
|
|
|
@ -129,10 +129,10 @@ func (adapter *MysqlAdapter) SimpleInsert(name string, table string, columns str
|
|||
}
|
||||
querystr += field.Name + ","
|
||||
}
|
||||
querystr = querystr[0 : len(querystr)-1]
|
||||
querystr = querystr[0:len(querystr)-1] + ")"
|
||||
|
||||
adapter.pushStatement(name, "insert", querystr+")")
|
||||
return querystr + ")", nil
|
||||
adapter.pushStatement(name, "insert", querystr)
|
||||
return querystr, nil
|
||||
}
|
||||
|
||||
func (adapter *MysqlAdapter) buildColumns(columns string) (querystr string) {
|
||||
|
@ -307,7 +307,7 @@ func (adapter *MysqlAdapter) Purge(name string, table string) (string, error) {
|
|||
// TODO: Add support for BETWEEN x.x
|
||||
func (adapter *MysqlAdapter) buildWhere(where string) (querystr string, err error) {
|
||||
if len(where) != 0 {
|
||||
querystr += " WHERE"
|
||||
querystr = " WHERE"
|
||||
for _, loc := range processWhere(where) {
|
||||
for _, token := range loc.Expr {
|
||||
switch token.Type {
|
||||
|
@ -330,7 +330,7 @@ func (adapter *MysqlAdapter) buildWhere(where string) (querystr string, err erro
|
|||
|
||||
func (adapter *MysqlAdapter) buildOrderby(orderby string) (querystr string) {
|
||||
if len(orderby) != 0 {
|
||||
querystr += " ORDER BY "
|
||||
querystr = " ORDER BY "
|
||||
for _, column := range processOrderby(orderby) {
|
||||
// TODO: We might want to escape this column
|
||||
querystr += column.Column + " " + strings.ToUpper(column.Order) + ","
|
||||
|
@ -468,7 +468,7 @@ func (adapter *MysqlAdapter) buildJoiners(joiners string) (querystr string) {
|
|||
// Add support for BETWEEN x.x
|
||||
func (adapter *MysqlAdapter) buildJoinWhere(where string) (querystr string, err error) {
|
||||
if len(where) != 0 {
|
||||
querystr += " WHERE"
|
||||
querystr = " WHERE"
|
||||
for _, loc := range processWhere(where) {
|
||||
for _, token := range loc.Expr {
|
||||
switch token.Type {
|
||||
|
@ -496,24 +496,22 @@ func (adapter *MysqlAdapter) buildJoinWhere(where string) (querystr string, err
|
|||
|
||||
func (adapter *MysqlAdapter) buildLimit(limit string) (querystr string) {
|
||||
if limit != "" {
|
||||
querystr += " LIMIT " + limit
|
||||
querystr = " LIMIT " + limit
|
||||
}
|
||||
return querystr
|
||||
}
|
||||
|
||||
func (adapter *MysqlAdapter) buildJoinColumns(columns string) (querystr string) {
|
||||
for _, column := range processColumns(columns) {
|
||||
var source, alias string
|
||||
|
||||
// Escape the column names, just in case we've used a reserved keyword
|
||||
var source = column.Left
|
||||
if column.Table != "" {
|
||||
source = "`" + column.Table + "`.`" + column.Left + "`"
|
||||
} else if column.Type == "function" {
|
||||
source = column.Left
|
||||
} else {
|
||||
source = "`" + column.Left + "`"
|
||||
source = "`" + column.Table + "`.`" + source + "`"
|
||||
} else if column.Type != "function" {
|
||||
source = "`" + source + "`"
|
||||
}
|
||||
|
||||
var alias string
|
||||
if column.Alias != "" {
|
||||
alias = " AS `" + column.Alias + "`"
|
||||
}
|
||||
|
@ -563,19 +561,19 @@ func (adapter *MysqlAdapter) Write() error {
|
|||
stmt := adapter.Buffer[name]
|
||||
// ? - Table creation might be a little complex for Go to do outside a SQL file :(
|
||||
if stmt.Type == "upsert" {
|
||||
stmts += "var " + name + "Stmt *qgen.MySQLUpsertCallback\n"
|
||||
stmts += "\t" + name + " *qgen.MySQLUpsertCallback\n"
|
||||
body += `
|
||||
log.Print("Preparing ` + name + ` statement.")
|
||||
` + name + `Stmt, err = qgen.PrepareMySQLUpsertCallback(db, "` + stmt.Contents + `")
|
||||
stmts.` + name + `, err = qgen.PrepareMySQLUpsertCallback(db, "` + stmt.Contents + `")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
`
|
||||
} else if stmt.Type != "create-table" {
|
||||
stmts += "var " + name + "Stmt *sql.Stmt\n"
|
||||
stmts += "\t" + name + " *sql.Stmt\n"
|
||||
body += `
|
||||
log.Print("Preparing ` + name + ` statement.")
|
||||
` + name + `Stmt, err = db.Prepare("` + stmt.Contents + `")
|
||||
stmts.` + name + `, err = db.Prepare("` + stmt.Contents + `")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -583,6 +581,7 @@ func (adapter *MysqlAdapter) Write() error {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Move these custom queries out of this file
|
||||
out := `// +build !pgsql, !sqlite, !mssql
|
||||
|
||||
/* This file was generated by Gosora's Query Generator. Please try to avoid modifying this file, as it might change at any time. */
|
||||
|
@ -594,7 +593,21 @@ import "database/sql"
|
|||
//import "./query_gen/lib"
|
||||
|
||||
// nolint
|
||||
type Stmts struct {
|
||||
` + stmts + `
|
||||
getActivityFeedByWatcher *sql.Stmt
|
||||
getActivityCountByWatcher *sql.Stmt
|
||||
todaysPostCount *sql.Stmt
|
||||
todaysTopicCount *sql.Stmt
|
||||
todaysReportCount *sql.Stmt
|
||||
todaysNewUserCount *sql.Stmt
|
||||
findUsersByIPUsers *sql.Stmt
|
||||
findUsersByIPTopics *sql.Stmt
|
||||
findUsersByIPReplies *sql.Stmt
|
||||
|
||||
Mocks bool
|
||||
}
|
||||
|
||||
// nolint
|
||||
func _gen_mysql() (err error) {
|
||||
if dev.DebugMode {
|
||||
|
|
|
@ -327,10 +327,10 @@ func (adapter *PgsqlAdapter) Write() error {
|
|||
stmt := adapter.Buffer[name]
|
||||
// TODO: Add support for create-table? Table creation might be a little complex for Go to do outside a SQL file :(
|
||||
if stmt.Type != "create-table" {
|
||||
stmts += "var " + name + "Stmt *sql.Stmt\n"
|
||||
stmts += "\t" + name + " *sql.Stmt\n"
|
||||
body += `
|
||||
log.Print("Preparing ` + name + ` statement.")
|
||||
` + name + `Stmt, err = db.Prepare("` + stmt.Contents + `")
|
||||
stmts.` + name + `, err = db.Prepare("` + stmt.Contents + `")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -338,6 +338,7 @@ func (adapter *PgsqlAdapter) Write() error {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Move these custom queries out of this file
|
||||
out := `// +build pgsql
|
||||
|
||||
// This file was generated by Gosora's Query Generator. Please try to avoid modifying this file, as it might change at any time.
|
||||
|
@ -347,7 +348,21 @@ import "log"
|
|||
import "database/sql"
|
||||
|
||||
// nolint
|
||||
type Stmts struct {
|
||||
` + stmts + `
|
||||
getActivityFeedByWatcher *sql.Stmt
|
||||
getActivityCountByWatcher *sql.Stmt
|
||||
todaysPostCount *sql.Stmt
|
||||
todaysTopicCount *sql.Stmt
|
||||
todaysReportCount *sql.Stmt
|
||||
todaysNewUserCount *sql.Stmt
|
||||
findUsersByIPUsers *sql.Stmt
|
||||
findUsersByIPTopics *sql.Stmt
|
||||
findUsersByIPReplies *sql.Stmt
|
||||
|
||||
Mocks bool
|
||||
}
|
||||
|
||||
// nolint
|
||||
func _gen_pgsql() (err error) {
|
||||
if dev.DebugMode {
|
||||
|
|
20
reply.go
20
reply.go
|
@ -65,7 +65,7 @@ var ErrAlreadyLiked = errors.New("You already liked this!")
|
|||
// TODO: Wrap these queries in a transaction to make sure the state is consistent
|
||||
func (reply *Reply) Like(uid int) (err error) {
|
||||
var rid int // unused, just here to avoid mutating reply.ID
|
||||
err = hasLikedReplyStmt.QueryRow(uid, reply.ID).Scan(&rid)
|
||||
err = stmts.hasLikedReply.QueryRow(uid, reply.ID).Scan(&rid)
|
||||
if err != nil && err != ErrNoRows {
|
||||
return err
|
||||
} else if err != ErrNoRows {
|
||||
|
@ -73,21 +73,21 @@ func (reply *Reply) Like(uid int) (err error) {
|
|||
}
|
||||
|
||||
score := 1
|
||||
_, err = createLikeStmt.Exec(score, reply.ID, "replies", uid)
|
||||
_, err = stmts.createLike.Exec(score, reply.ID, "replies", uid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = addLikesToReplyStmt.Exec(1, reply.ID)
|
||||
_, err = stmts.addLikesToReply.Exec(1, reply.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO: Write tests for this
|
||||
func (reply *Reply) Delete() error {
|
||||
_, err := deleteReplyStmt.Exec(reply.ID)
|
||||
_, err := stmts.deleteReply.Exec(reply.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = removeRepliesFromTopicStmt.Exec(1, reply.ParentID)
|
||||
_, err = stmts.removeRepliesFromTopic.Exec(1, reply.ParentID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(reply.ParentID)
|
||||
|
@ -100,6 +100,7 @@ func (reply *Reply) Copy() Reply {
|
|||
return *reply
|
||||
}
|
||||
|
||||
// TODO: Refactor this to stop hitting the global stmt store
|
||||
type ReplyStore interface {
|
||||
Get(id int) (*Reply, error)
|
||||
Create(tid int, content string, ipaddress string, fid int, uid int) (id int, err error)
|
||||
|
@ -114,14 +115,14 @@ func NewSQLReplyStore() *SQLReplyStore {
|
|||
|
||||
func (store *SQLReplyStore) Get(id int) (*Reply, error) {
|
||||
reply := Reply{ID: id}
|
||||
err := getReplyStmt.QueryRow(id).Scan(&reply.ParentID, &reply.Content, &reply.CreatedBy, &reply.CreatedAt, &reply.LastEdit, &reply.LastEditBy, &reply.IPAddress, &reply.LikeCount)
|
||||
err := stmts.getReply.QueryRow(id).Scan(&reply.ParentID, &reply.Content, &reply.CreatedBy, &reply.CreatedAt, &reply.LastEdit, &reply.LastEditBy, &reply.IPAddress, &reply.LikeCount)
|
||||
return &reply, err
|
||||
}
|
||||
|
||||
// TODO: Write a test for this
|
||||
func (store *SQLReplyStore) Create(tid int, content string, ipaddress string, fid int, uid int) (id int, err error) {
|
||||
wcount := wordCount(content)
|
||||
res, err := createReplyStmt.Exec(tid, content, parseMessage(content, fid, "forums"), ipaddress, wcount, uid)
|
||||
res, err := stmts.createReply.Exec(tid, content, parseMessage(content, fid, "forums"), ipaddress, wcount, uid)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
@ -130,7 +131,7 @@ func (store *SQLReplyStore) Create(tid int, content string, ipaddress string, fi
|
|||
return 0, err
|
||||
}
|
||||
|
||||
_, err = addRepliesToTopicStmt.Exec(1, uid, tid)
|
||||
_, err = stmts.addRepliesToTopic.Exec(1, uid, tid)
|
||||
if err != nil {
|
||||
return int(lastID), err
|
||||
}
|
||||
|
@ -145,6 +146,7 @@ type ProfileReplyStore interface {
|
|||
Get(id int) (*Reply, error)
|
||||
}
|
||||
|
||||
// TODO: Refactor this to stop using the global stmt store
|
||||
type SQLProfileReplyStore struct {
|
||||
}
|
||||
|
||||
|
@ -154,6 +156,6 @@ func NewSQLProfileReplyStore() *SQLProfileReplyStore {
|
|||
|
||||
func (store *SQLProfileReplyStore) Get(id int) (*Reply, error) {
|
||||
reply := Reply{ID: id}
|
||||
err := getUserReplyStmt.QueryRow(id).Scan(&reply.ParentID, &reply.Content, &reply.CreatedBy, &reply.CreatedAt, &reply.LastEdit, &reply.LastEditBy, &reply.IPAddress)
|
||||
err := stmts.getUserReply.QueryRow(id).Scan(&reply.ParentID, &reply.Content, &reply.CreatedBy, &reply.CreatedAt, &reply.LastEdit, &reply.LastEditBy, &reply.IPAddress)
|
||||
return &reply, err
|
||||
}
|
||||
|
|
|
@ -26,8 +26,20 @@ func main() {
|
|||
end = len(route.Path) - 1
|
||||
}
|
||||
out += "\n\t\tcase \"" + route.Path[0:end] + "\":"
|
||||
if route.Before != "" {
|
||||
out += "\n\t\t\t" + route.Before
|
||||
if len(route.RunBefore) > 0 {
|
||||
for _, runnable := range route.RunBefore {
|
||||
if runnable.Literal {
|
||||
out += "\n\t\t\t\t\t" + runnable.Contents
|
||||
} else {
|
||||
out += `
|
||||
err = ` + runnable.Contents + `(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
`
|
||||
}
|
||||
}
|
||||
}
|
||||
out += "\n\t\t\terr = " + route.Name + "(w,req,user"
|
||||
for _, item := range route.Vars {
|
||||
|
@ -48,14 +60,18 @@ func main() {
|
|||
}
|
||||
out += `
|
||||
case "` + group.Path[0:end] + `":`
|
||||
for _, callback := range group.Before {
|
||||
out += `
|
||||
err = ` + callback + `(w,req,user)
|
||||
for _, runnable := range group.RunBefore {
|
||||
if runnable.Literal {
|
||||
out += "\t\t\t" + runnable.Contents
|
||||
} else {
|
||||
out += `
|
||||
err = ` + runnable.Contents + `(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
`
|
||||
}
|
||||
}
|
||||
out += "\n\t\t\tswitch(req.URL.Path) {"
|
||||
|
||||
|
@ -67,8 +83,20 @@ func main() {
|
|||
}
|
||||
|
||||
out += "\n\t\t\t\tcase \"" + route.Path + "\":"
|
||||
if route.Before != "" {
|
||||
out += "\n\t\t\t\t\t" + route.Before
|
||||
if len(route.RunBefore) > 0 {
|
||||
for _, runnable := range route.RunBefore {
|
||||
if runnable.Literal {
|
||||
out += "\n\t\t\t\t\t" + runnable.Contents
|
||||
} else {
|
||||
out += `
|
||||
err = ` + runnable.Contents + `(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
`
|
||||
}
|
||||
}
|
||||
}
|
||||
out += "\n\t\t\t\t\terr = " + route.Name + "(w,req,user"
|
||||
for _, item := range route.Vars {
|
||||
|
@ -79,8 +107,20 @@ func main() {
|
|||
|
||||
if defaultRoute.Name != "" {
|
||||
out += "\n\t\t\t\tdefault:"
|
||||
if defaultRoute.Before != "" {
|
||||
out += "\n\t\t\t\t\t" + defaultRoute.Before
|
||||
if len(defaultRoute.RunBefore) > 0 {
|
||||
for _, runnable := range defaultRoute.RunBefore {
|
||||
if runnable.Literal {
|
||||
out += "\n\t\t\t\t\t" + runnable.Contents
|
||||
} else {
|
||||
out += `
|
||||
err = ` + runnable.Contents + `(w,req,user)
|
||||
if err != nil {
|
||||
router.handleError(err,w,req,user)
|
||||
return
|
||||
}
|
||||
`
|
||||
}
|
||||
}
|
||||
}
|
||||
out += "\n\t\t\t\t\terr = " + defaultRoute.Name + "(w,req,user"
|
||||
for _, item := range defaultRoute.Vars {
|
||||
|
|
|
@ -1,32 +1,51 @@
|
|||
package main
|
||||
|
||||
type RouteImpl struct {
|
||||
Name string
|
||||
Path string
|
||||
Before string
|
||||
Vars []string
|
||||
Name string
|
||||
Path string
|
||||
Vars []string
|
||||
RunBefore []Runnable
|
||||
}
|
||||
|
||||
type RouteGroup struct {
|
||||
Path string
|
||||
RouteList []*RouteImpl
|
||||
Before []string
|
||||
RunBefore []Runnable
|
||||
}
|
||||
|
||||
func addRoute(fname string, path string, before string, vars ...string) {
|
||||
routeList = append(routeList, &RouteImpl{fname, path, before, vars})
|
||||
type Runnable struct {
|
||||
Contents string
|
||||
Literal bool
|
||||
}
|
||||
|
||||
func addRoute(route *RouteImpl) {
|
||||
routeList = append(routeList, route)
|
||||
}
|
||||
|
||||
func (route *RouteImpl) Before(item string, literal ...bool) *RouteImpl {
|
||||
var litItem bool
|
||||
if len(literal) > 0 {
|
||||
litItem = literal[0]
|
||||
}
|
||||
route.RunBefore = append(route.RunBefore, Runnable{item, litItem})
|
||||
return route
|
||||
}
|
||||
|
||||
func newRouteGroup(path string, routes ...*RouteImpl) *RouteGroup {
|
||||
return &RouteGroup{path, routes, []string{}}
|
||||
return &RouteGroup{path, routes, []Runnable{}}
|
||||
}
|
||||
|
||||
func addRouteGroup(routeGroup *RouteGroup) {
|
||||
routeGroups = append(routeGroups, routeGroup)
|
||||
}
|
||||
|
||||
func (group *RouteGroup) RunBefore(line string) {
|
||||
group.Before = append(group.Before, line)
|
||||
func (group *RouteGroup) Before(line string, literal ...bool) *RouteGroup {
|
||||
var litItem bool
|
||||
if len(literal) > 0 {
|
||||
litItem = literal[0]
|
||||
}
|
||||
group.RunBefore = append(group.RunBefore, Runnable{line, litItem})
|
||||
return group
|
||||
}
|
||||
|
||||
func (group *RouteGroup) Routes(routes ...*RouteImpl) {
|
||||
|
@ -34,88 +53,101 @@ func (group *RouteGroup) Routes(routes ...*RouteImpl) {
|
|||
}
|
||||
|
||||
func blankRoute() *RouteImpl {
|
||||
return &RouteImpl{"", "", "", []string{}}
|
||||
return &RouteImpl{"", "", []string{}, []Runnable{}}
|
||||
}
|
||||
|
||||
func Route(fname string, path string, args ...string) *RouteImpl {
|
||||
var before = ""
|
||||
if len(args) > 0 {
|
||||
before = args[0]
|
||||
args = args[1:]
|
||||
}
|
||||
return &RouteImpl{fname, path, before, args}
|
||||
return &RouteImpl{fname, path, args, []Runnable{}}
|
||||
}
|
||||
|
||||
func routes() {
|
||||
//addRoute("default_route","","")
|
||||
addRoute("routeAPI", "/api/", "")
|
||||
addRoute(Route("routeAPI", "/api/"))
|
||||
///addRoute("routeStatic","/static/","req.URL.Path += extra_data")
|
||||
addRoute("routeOverview", "/overview/", "")
|
||||
addRoute(Route("routeOverview", "/overview/"))
|
||||
//addRoute("routeCustomPage","/pages/",""/*,"&extra_data"*/)
|
||||
addRoute("routeForums", "/forums/", "" /*,"&forums"*/)
|
||||
addRoute("routeForum", "/forum/", "", "extra_data")
|
||||
addRoute(Route("routeForums", "/forums/" /*,"&forums"*/))
|
||||
addRoute(Route("routeForum", "/forum/", "extra_data"))
|
||||
//addRoute("routeTopicCreate","/topics/create/","","extra_data")
|
||||
//addRoute("routeTopics","/topics/",""/*,"&groups","&forums"*/)
|
||||
addRoute("routeChangeTheme", "/theme/", "")
|
||||
addRoute("routeShowAttachment", "/attachs/", "", "extra_data")
|
||||
addRoute(Route("routeChangeTheme", "/theme/"))
|
||||
addRoute(Route("routeShowAttachment", "/attachs/", "extra_data"))
|
||||
|
||||
reportGroup := newRouteGroup("/report/",
|
||||
Route("routeReportSubmit", "/report/submit/", "", "extra_data"),
|
||||
)
|
||||
Route("routeReportSubmit", "/report/submit/", "extra_data"),
|
||||
).Before("MemberOnly")
|
||||
addRouteGroup(reportGroup)
|
||||
|
||||
topicGroup := newRouteGroup("/topics/",
|
||||
Route("routeTopics", "/topics/"),
|
||||
Route("routeTopicCreate", "/topics/create/", "", "extra_data"),
|
||||
Route("routeTopicCreate", "/topics/create/", "extra_data").Before("MemberOnly"),
|
||||
)
|
||||
addRouteGroup(topicGroup)
|
||||
|
||||
buildPanelRoutes()
|
||||
buildUserRoutes()
|
||||
}
|
||||
|
||||
// TODO: Test the email token route
|
||||
// TODO: Add a BeforeExcept method?
|
||||
func buildUserRoutes() {
|
||||
userGroup := newRouteGroup("/user/") //.Before("MemberOnly")
|
||||
userGroup.Routes(
|
||||
Route("routeProfile", "/user/").Before("req.URL.Path += extra_data", true),
|
||||
Route("routeAccountOwnEditCritical", "/user/edit/critical/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditCriticalSubmit", "/user/edit/critical/submit/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditAvatar", "/user/edit/avatar/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditAvatarSubmit", "/user/edit/avatar/submit/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditUsername", "/user/edit/username/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditUsernameSubmit", "/user/edit/username/submit/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditEmail", "/user/edit/email/").Before("MemberOnly"),
|
||||
Route("routeAccountOwnEditEmailTokenSubmit", "/user/edit/token/", "extra_data").Before("MemberOnly"),
|
||||
)
|
||||
addRouteGroup(userGroup)
|
||||
}
|
||||
|
||||
func buildPanelRoutes() {
|
||||
panelGroup := newRouteGroup("/panel/")
|
||||
panelGroup.RunBefore("SuperModOnly")
|
||||
panelGroup := newRouteGroup("/panel/").Before("SuperModOnly")
|
||||
panelGroup.Routes(
|
||||
Route("routePanel", "/panel/"),
|
||||
Route("routePanelForums", "/panel/forums/"),
|
||||
Route("routePanelForumsCreateSubmit", "/panel/forums/create/"),
|
||||
Route("routePanelForumsDelete", "/panel/forums/delete/", "", "extra_data"),
|
||||
Route("routePanelForumsDeleteSubmit", "/panel/forums/delete/submit/", "", "extra_data"),
|
||||
Route("routePanelForumsEdit", "/panel/forums/edit/", "", "extra_data"),
|
||||
Route("routePanelForumsEditSubmit", "/panel/forums/edit/submit/", "", "extra_data"),
|
||||
Route("routePanelForumsEditPermsSubmit", "/panel/forums/edit/perms/submit/", "", "extra_data"),
|
||||
Route("routePanelForumsDelete", "/panel/forums/delete/", "extra_data"),
|
||||
Route("routePanelForumsDeleteSubmit", "/panel/forums/delete/submit/", "extra_data"),
|
||||
Route("routePanelForumsEdit", "/panel/forums/edit/", "extra_data"),
|
||||
Route("routePanelForumsEditSubmit", "/panel/forums/edit/submit/", "extra_data"),
|
||||
Route("routePanelForumsEditPermsSubmit", "/panel/forums/edit/perms/submit/", "extra_data"),
|
||||
|
||||
Route("routePanelSettings", "/panel/settings/"),
|
||||
Route("routePanelSetting", "/panel/settings/edit/", "", "extra_data"),
|
||||
Route("routePanelSettingEdit", "/panel/settings/edit/submit/", "", "extra_data"),
|
||||
Route("routePanelSetting", "/panel/settings/edit/", "extra_data"),
|
||||
Route("routePanelSettingEdit", "/panel/settings/edit/submit/", "extra_data"),
|
||||
|
||||
Route("routePanelWordFilters", "/panel/settings/word-filters/"),
|
||||
Route("routePanelWordFiltersCreate", "/panel/settings/word-filters/create/"),
|
||||
Route("routePanelWordFiltersEdit", "/panel/settings/word-filters/edit/", "", "extra_data"),
|
||||
Route("routePanelWordFiltersEditSubmit", "/panel/settings/word-filters/edit/submit/", "", "extra_data"),
|
||||
Route("routePanelWordFiltersDeleteSubmit", "/panel/settings/word-filters/delete/submit/", "", "extra_data"),
|
||||
Route("routePanelWordFiltersEdit", "/panel/settings/word-filters/edit/", "extra_data"),
|
||||
Route("routePanelWordFiltersEditSubmit", "/panel/settings/word-filters/edit/submit/", "extra_data"),
|
||||
Route("routePanelWordFiltersDeleteSubmit", "/panel/settings/word-filters/delete/submit/", "extra_data"),
|
||||
|
||||
Route("routePanelThemes", "/panel/themes/"),
|
||||
Route("routePanelThemesSetDefault", "/panel/themes/default/", "", "extra_data"),
|
||||
Route("routePanelThemesSetDefault", "/panel/themes/default/", "extra_data"),
|
||||
|
||||
Route("routePanelPlugins", "/panel/plugins/"),
|
||||
Route("routePanelPluginsActivate", "/panel/plugins/activate/", "", "extra_data"),
|
||||
Route("routePanelPluginsDeactivate", "/panel/plugins/deactivate/", "", "extra_data"),
|
||||
Route("routePanelPluginsInstall", "/panel/plugins/install/", "", "extra_data"),
|
||||
Route("routePanelPluginsActivate", "/panel/plugins/activate/", "extra_data"),
|
||||
Route("routePanelPluginsDeactivate", "/panel/plugins/deactivate/", "extra_data"),
|
||||
Route("routePanelPluginsInstall", "/panel/plugins/install/", "extra_data"),
|
||||
|
||||
Route("routePanelUsers", "/panel/users/"),
|
||||
Route("routePanelUsersEdit", "/panel/users/edit/", "", "extra_data"),
|
||||
Route("routePanelUsersEditSubmit", "/panel/users/edit/submit/", "", "extra_data"),
|
||||
Route("routePanelUsersEdit", "/panel/users/edit/", "extra_data"),
|
||||
Route("routePanelUsersEditSubmit", "/panel/users/edit/submit/", "extra_data"),
|
||||
|
||||
Route("routePanelGroups", "/panel/groups/"),
|
||||
Route("routePanelGroupsEdit", "/panel/groups/edit/", "", "extra_data"),
|
||||
Route("routePanelGroupsEditPerms", "/panel/groups/edit/perms/", "", "extra_data"),
|
||||
Route("routePanelGroupsEditSubmit", "/panel/groups/edit/submit/", "", "extra_data"),
|
||||
Route("routePanelGroupsEditPermsSubmit", "/panel/groups/edit/perms/submit/", "", "extra_data"),
|
||||
Route("routePanelGroupsEdit", "/panel/groups/edit/", "extra_data"),
|
||||
Route("routePanelGroupsEditPerms", "/panel/groups/edit/perms/", "extra_data"),
|
||||
Route("routePanelGroupsEditSubmit", "/panel/groups/edit/submit/", "extra_data"),
|
||||
Route("routePanelGroupsEditPermsSubmit", "/panel/groups/edit/perms/submit/", "extra_data"),
|
||||
Route("routePanelGroupsCreateSubmit", "/panel/groups/create/"),
|
||||
|
||||
Route("routePanelBackups", "/panel/backups/", "", "extra_data"),
|
||||
Route("routePanelBackups", "/panel/backups/", "extra_data"),
|
||||
Route("routePanelLogsMod", "/panel/logs/mod/"),
|
||||
Route("routePanelDebug", "/panel/debug/"),
|
||||
)
|
||||
|
|
16
routes.go
16
routes.go
|
@ -351,7 +351,7 @@ func routeForum(w http.ResponseWriter, r *http.Request, user User, sfid string)
|
|||
}
|
||||
|
||||
// TODO: Move this to *Forum
|
||||
rows, err := getForumTopicsOffsetStmt.Query(fid, offset, config.ItemsPerPage)
|
||||
rows, err := stmts.getForumTopicsOffset.Query(fid, offset, config.ItemsPerPage)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -558,7 +558,7 @@ func routeTopicID(w http.ResponseWriter, r *http.Request, user User) RouteError
|
|||
tpage := TopicPage{topic.Title, user, headerVars, replyList, topic, page, lastPage}
|
||||
|
||||
// Get the replies..
|
||||
rows, err := getTopicRepliesOffsetStmt.Query(topic.ID, offset, config.ItemsPerPage)
|
||||
rows, err := stmts.getTopicRepliesOffset.Query(topic.ID, offset, config.ItemsPerPage)
|
||||
if err == ErrNoRows {
|
||||
return LocalError("Bad Page. Some of the posts may have been deleted or you got here by directly typing in the page number.", w, r, user)
|
||||
} else if err != nil {
|
||||
|
@ -684,7 +684,7 @@ func routeProfile(w http.ResponseWriter, r *http.Request, user User) RouteError
|
|||
}
|
||||
|
||||
// Get the replies..
|
||||
rows, err := getProfileRepliesStmt.Query(puser.ID)
|
||||
rows, err := stmts.getProfileReplies.Query(puser.ID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -904,7 +904,7 @@ func routeRegisterSubmit(w http.ResponseWriter, r *http.Request, user User) Rout
|
|||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
_, err = addEmailStmt.Exec(email, uid, 0, token)
|
||||
_, err = stmts.addEmail.Exec(email, uid, 0, token)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -946,7 +946,7 @@ func routeChangeTheme(w http.ResponseWriter, r *http.Request, user User) RouteEr
|
|||
|
||||
// TODO: Store the current theme in the user's account?
|
||||
/*if user.Loggedin {
|
||||
_, err = change_theme_stmt.Exec(newTheme, user.ID)
|
||||
_, err = stmts.changeTheme.Exec(newTheme, user.ID)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -986,7 +986,7 @@ func routeAPI(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
return PreErrorJS("Invalid asid", w, r)
|
||||
}
|
||||
|
||||
_, err = deleteActivityStreamMatchStmt.Exec(user.ID, asid)
|
||||
_, err = stmts.deleteActivityStreamMatch.Exec(user.ID, asid)
|
||||
if err != nil {
|
||||
return InternalError(err, w, r)
|
||||
}
|
||||
|
@ -1000,14 +1000,14 @@ func routeAPI(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
|||
var asid, actorID, targetUserID, elementID int
|
||||
var msgCount int
|
||||
|
||||
err = getActivityCountByWatcherStmt.QueryRow(user.ID).Scan(&msgCount)
|
||||
err = stmts.getActivityCountByWatcher.QueryRow(user.ID).Scan(&msgCount)
|
||||
if err == ErrNoRows {
|
||||
return PreErrorJS("Couldn't find the parent topic", w, r)
|
||||
} else if err != nil {
|
||||
return InternalErrorJS(err, w, r)
|
||||
}
|
||||
|
||||
rows, err := getActivityFeedByWatcherStmt.Query(user.ID)
|
||||
rows, err := stmts.getActivityFeedByWatcher.Query(user.ID)
|
||||
if err != nil {
|
||||
return InternalErrorJS(err, w, r)
|
||||
}
|
||||
|
|
|
@ -166,7 +166,7 @@ func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerV
|
|||
}
|
||||
}
|
||||
|
||||
err = groupCountStmt.QueryRow().Scan(&stats.Groups)
|
||||
err = stmts.groupCount.QueryRow().Scan(&stats.Groups)
|
||||
if err != nil {
|
||||
return headerVars, stats, InternalError(err, w, r)
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) {
|
|||
return *user, false
|
||||
}
|
||||
if host != user.LastIP {
|
||||
_, err = updateLastIPStmt.Exec(host, user.ID)
|
||||
_, err = stmts.updateLastIP.Exec(host, user.ID)
|
||||
if err != nil {
|
||||
InternalError(err, w, r)
|
||||
return *user, false
|
||||
|
@ -306,3 +306,11 @@ func SuperModOnly(w http.ResponseWriter, r *http.Request, user User) RouteError
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// MemberOnly makes sure that only logged in users can access this route
|
||||
func MemberOnly(w http.ResponseWriter, r *http.Request, user User) RouteError {
|
||||
if !user.Loggedin {
|
||||
return NoPermissions(w, r, user) // TODO: Do an error telling them to login instead?
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ func init() {
|
|||
}
|
||||
|
||||
func LoadSettings() error {
|
||||
rows, err := getFullSettingsStmt.Query()
|
||||
rows, err := stmts.getFullSettings.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
4
tasks.go
4
tasks.go
|
@ -18,7 +18,7 @@ func init() {
|
|||
}
|
||||
|
||||
func handleExpiredScheduledGroups() error {
|
||||
rows, err := getExpiredScheduledGroupsStmt.Query()
|
||||
rows, err := stmts.getExpiredScheduledGroups.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ func handleExpiredScheduledGroups() error {
|
|||
|
||||
func handleServerSync() error {
|
||||
var lastUpdate time.Time
|
||||
err := getSyncStmt.QueryRow().Scan(&lastUpdate)
|
||||
err := stmts.getSync.QueryRow().Scan(&lastUpdate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -77,7 +77,7 @@ func init() {
|
|||
// ? - Delete themes which no longer exist in the themes folder from the database?
|
||||
func LoadThemes() error {
|
||||
changeDefaultThemeMutex.Lock()
|
||||
rows, err := getThemesStmt.Query()
|
||||
rows, err := stmts.getThemes.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
20
topic.go
20
topic.go
|
@ -103,7 +103,7 @@ type TopicsRow struct {
|
|||
}
|
||||
|
||||
func (topic *Topic) Lock() (err error) {
|
||||
_, err = lockTopicStmt.Exec(topic.ID)
|
||||
_, err = stmts.lockTopic.Exec(topic.ID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(topic.ID)
|
||||
|
@ -112,7 +112,7 @@ func (topic *Topic) Lock() (err error) {
|
|||
}
|
||||
|
||||
func (topic *Topic) Unlock() (err error) {
|
||||
_, err = unlockTopicStmt.Exec(topic.ID)
|
||||
_, err = stmts.unlockTopic.Exec(topic.ID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(topic.ID)
|
||||
|
@ -123,7 +123,7 @@ func (topic *Topic) Unlock() (err error) {
|
|||
// TODO: We might want more consistent terminology rather than using stick in some places and pin in others. If you don't understand the difference, there is none, they are one and the same.
|
||||
// ? - We do a CacheDelete() here instead of mutating the pointer to avoid creating a race condition
|
||||
func (topic *Topic) Stick() (err error) {
|
||||
_, err = stickTopicStmt.Exec(topic.ID)
|
||||
_, err = stmts.stickTopic.Exec(topic.ID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(topic.ID)
|
||||
|
@ -132,7 +132,7 @@ func (topic *Topic) Stick() (err error) {
|
|||
}
|
||||
|
||||
func (topic *Topic) Unstick() (err error) {
|
||||
_, err = unstickTopicStmt.Exec(topic.ID)
|
||||
_, err = stmts.unstickTopic.Exec(topic.ID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(topic.ID)
|
||||
|
@ -168,7 +168,7 @@ func (topic *Topic) Delete() error {
|
|||
return err
|
||||
}
|
||||
|
||||
_, err = deleteTopicStmt.Exec(topic.ID)
|
||||
_, err = stmts.deleteTopic.Exec(topic.ID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(topic.ID)
|
||||
|
@ -179,7 +179,7 @@ func (topic *Topic) Delete() error {
|
|||
func (topic *Topic) Update(name string, content string) error {
|
||||
content = preparseMessage(content)
|
||||
parsed_content := parseMessage(html.EscapeString(content), topic.ParentID, "forums")
|
||||
_, err := editTopicStmt.Exec(name, content, parsed_content, topic.ID)
|
||||
_, err := stmts.editTopic.Exec(name, content, parsed_content, topic.ID)
|
||||
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
|
@ -189,11 +189,11 @@ func (topic *Topic) Update(name string, content string) error {
|
|||
}
|
||||
|
||||
func (topic *Topic) CreateActionReply(action string, ipaddress string, user User) (err error) {
|
||||
_, err = createActionReplyStmt.Exec(topic.ID, action, ipaddress, user.ID)
|
||||
_, err = stmts.createActionReply.Exec(topic.ID, action, ipaddress, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = addRepliesToTopicStmt.Exec(1, user.ID, topic.ID)
|
||||
_, err = stmts.addRepliesToTopic.Exec(1, user.ID, topic.ID)
|
||||
tcache, ok := topics.(TopicCache)
|
||||
if ok {
|
||||
tcache.CacheRemove(topic.ID)
|
||||
|
@ -235,7 +235,7 @@ func getTopicUser(tid int) (TopicUser, error) {
|
|||
}
|
||||
|
||||
tu := TopicUser{ID: tid}
|
||||
err := getTopicUserStmt.QueryRow(tid).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
|
||||
err := stmts.getTopicUser.QueryRow(tid).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
|
||||
tu.Link = buildTopicURL(nameToSlug(tu.Title), tu.ID)
|
||||
tu.UserLink = buildProfileURL(nameToSlug(tu.CreatedByName), tu.CreatedBy)
|
||||
tu.Tag = gstore.DirtyGet(tu.Group).Tag
|
||||
|
@ -282,7 +282,7 @@ func getDummyTopic() *Topic {
|
|||
|
||||
func getTopicByReply(rid int) (*Topic, error) {
|
||||
topic := Topic{ID: 0}
|
||||
err := getTopicByReplyStmt.QueryRow(rid).Scan(&topic.ID, &topic.Title, &topic.Content, &topic.CreatedBy, &topic.CreatedAt, &topic.IsClosed, &topic.Sticky, &topic.ParentID, &topic.IPAddress, &topic.PostCount, &topic.LikeCount, &topic.Data)
|
||||
err := stmts.getTopicByReply.QueryRow(rid).Scan(&topic.ID, &topic.Title, &topic.Content, &topic.CreatedBy, &topic.CreatedAt, &topic.IsClosed, &topic.Sticky, &topic.ParentID, &topic.IPAddress, &topic.PostCount, &topic.LikeCount, &topic.Data)
|
||||
topic.Link = buildTopicURL(nameToSlug(topic.Title), topic.ID)
|
||||
return &topic, err
|
||||
}
|
||||
|
|
|
@ -157,7 +157,7 @@ func (mts *MemoryTopicStore) Create(fid int, topicName string, content string, u
|
|||
|
||||
wcount := wordCount(content)
|
||||
// TODO: Move this statement into the topic store
|
||||
res, err := createTopicStmt.Exec(fid, topicName, content, parsedContent, uid, ipaddress, wcount, uid)
|
||||
res, err := stmts.createTopic.Exec(fid, topicName, content, parsedContent, uid, ipaddress, wcount, uid)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
@ -319,7 +319,7 @@ func (sts *SQLTopicStore) Create(fid int, topicName string, content string, uid
|
|||
|
||||
wcount := wordCount(content)
|
||||
// TODO: Move this statement into the topic store
|
||||
res, err := createTopicStmt.Exec(fid, topicName, content, parsedContent, uid, ipaddress, wcount, uid)
|
||||
res, err := stmts.createTopic.Exec(fid, topicName, content, parsedContent, uid, ipaddress, wcount, uid)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
|
38
user.go
38
user.go
|
@ -174,11 +174,11 @@ func (user *User) RevertGroupUpdate() error {
|
|||
// TODO: Use a transaction here
|
||||
// ? - Add a Deactivate method? Not really needed, if someone's been bad you could do a ban, I guess it might be useful, if someone says that email x isn't actually owned by the user in question?
|
||||
func (user *User) Activate() (err error) {
|
||||
_, err = activateUserStmt.Exec(user.ID)
|
||||
_, err = stmts.activateUser.Exec(user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = changeGroupStmt.Exec(config.DefaultGroup, user.ID)
|
||||
_, err = stmts.changeGroup.Exec(config.DefaultGroup, user.ID)
|
||||
ucache, ok := users.(UserCache)
|
||||
if ok {
|
||||
ucache.CacheRemove(user.ID)
|
||||
|
@ -190,7 +190,7 @@ func (user *User) Activate() (err error) {
|
|||
// TODO: Delete this user's content too?
|
||||
// TODO: Expose this to the admin?
|
||||
func (user *User) Delete() error {
|
||||
_, err := deleteUserStmt.Exec(user.ID)
|
||||
_, err := stmts.deleteUser.Exec(user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ func (user *User) Delete() error {
|
|||
}
|
||||
|
||||
func (user *User) ChangeName(username string) (err error) {
|
||||
_, err = setUsernameStmt.Exec(username, user.ID)
|
||||
_, err = stmts.setUsername.Exec(username, user.ID)
|
||||
ucache, ok := users.(UserCache)
|
||||
if ok {
|
||||
ucache.CacheRemove(user.ID)
|
||||
|
@ -211,7 +211,7 @@ func (user *User) ChangeName(username string) (err error) {
|
|||
}
|
||||
|
||||
func (user *User) ChangeAvatar(avatar string) (err error) {
|
||||
_, err = setAvatarStmt.Exec(avatar, user.ID)
|
||||
_, err = stmts.setAvatar.Exec(avatar, user.ID)
|
||||
ucache, ok := users.(UserCache)
|
||||
if ok {
|
||||
ucache.CacheRemove(user.ID)
|
||||
|
@ -220,7 +220,7 @@ func (user *User) ChangeAvatar(avatar string) (err error) {
|
|||
}
|
||||
|
||||
func (user *User) ChangeGroup(group int) (err error) {
|
||||
_, err = updateUserGroupStmt.Exec(group, user.ID)
|
||||
_, err = stmts.updateUserGroup.Exec(group, user.ID)
|
||||
ucache, ok := users.(UserCache)
|
||||
if ok {
|
||||
ucache.CacheRemove(user.ID)
|
||||
|
@ -232,7 +232,7 @@ func (user *User) increasePostStats(wcount int, topic bool) (err error) {
|
|||
var mod int
|
||||
baseScore := 1
|
||||
if topic {
|
||||
_, err = incrementUserTopicsStmt.Exec(1, user.ID)
|
||||
_, err = stmts.incrementUserTopics.Exec(1, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -241,26 +241,26 @@ func (user *User) increasePostStats(wcount int, topic bool) (err error) {
|
|||
|
||||
settings := settingBox.Load().(SettingBox)
|
||||
if wcount >= settings["megapost_min_words"].(int) {
|
||||
_, err = incrementUserMegapostsStmt.Exec(1, 1, 1, user.ID)
|
||||
_, err = stmts.incrementUserMegaposts.Exec(1, 1, 1, user.ID)
|
||||
mod = 4
|
||||
} else if wcount >= settings["bigpost_min_words"].(int) {
|
||||
_, err = incrementUserBigpostsStmt.Exec(1, 1, user.ID)
|
||||
_, err = stmts.incrementUserBigposts.Exec(1, 1, user.ID)
|
||||
mod = 1
|
||||
} else {
|
||||
_, err = incrementUserPostsStmt.Exec(1, user.ID)
|
||||
_, err = stmts.incrementUserPosts.Exec(1, user.ID)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = incrementUserScoreStmt.Exec(baseScore+mod, user.ID)
|
||||
_, err = stmts.incrementUserScore.Exec(baseScore+mod, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
//log.Print(user.Score + base_score + mod)
|
||||
//log.Print(getLevel(user.Score + base_score + mod))
|
||||
// TODO: Use a transaction to prevent level desyncs?
|
||||
_, err = updateUserLevelStmt.Exec(getLevel(user.Score+baseScore+mod), user.ID)
|
||||
_, err = stmts.updateUserLevel.Exec(getLevel(user.Score+baseScore+mod), user.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -268,7 +268,7 @@ func (user *User) decreasePostStats(wcount int, topic bool) (err error) {
|
|||
var mod int
|
||||
baseScore := -1
|
||||
if topic {
|
||||
_, err = incrementUserTopicsStmt.Exec(-1, user.ID)
|
||||
_, err = stmts.incrementUserTopics.Exec(-1, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -277,24 +277,24 @@ func (user *User) decreasePostStats(wcount int, topic bool) (err error) {
|
|||
|
||||
settings := settingBox.Load().(SettingBox)
|
||||
if wcount >= settings["megapost_min_words"].(int) {
|
||||
_, err = incrementUserMegapostsStmt.Exec(-1, -1, -1, user.ID)
|
||||
_, err = stmts.incrementUserMegaposts.Exec(-1, -1, -1, user.ID)
|
||||
mod = 4
|
||||
} else if wcount >= settings["bigpost_min_words"].(int) {
|
||||
_, err = incrementUserBigpostsStmt.Exec(-1, -1, user.ID)
|
||||
_, err = stmts.incrementUserBigposts.Exec(-1, -1, user.ID)
|
||||
mod = 1
|
||||
} else {
|
||||
_, err = incrementUserPostsStmt.Exec(-1, user.ID)
|
||||
_, err = stmts.incrementUserPosts.Exec(-1, user.ID)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = incrementUserScoreStmt.Exec(baseScore-mod, user.ID)
|
||||
_, err = stmts.incrementUserScore.Exec(baseScore-mod, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO: Use a transaction to prevent level desyncs?
|
||||
_, err = updateUserLevelStmt.Exec(getLevel(user.Score-baseScore-mod), user.ID)
|
||||
_, err = stmts.updateUserLevel.Exec(getLevel(user.Score-baseScore-mod), user.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -359,7 +359,7 @@ func SetPassword(uid int, password string) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = setPasswordStmt.Exec(hashedPassword, salt, uid)
|
||||
_, err = stmts.setPassword.Exec(hashedPassword, salt, uid)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
6
utils.go
6
utils.go
|
@ -423,12 +423,14 @@ func buildSlug(slug string, id int) string {
|
|||
return slug + "." + strconv.Itoa(id)
|
||||
}
|
||||
|
||||
// TODO: Make a store for this?
|
||||
func addModLog(action string, elementID int, elementType string, ipaddress string, actorID int) (err error) {
|
||||
_, err = addModlogEntryStmt.Exec(action, elementID, elementType, ipaddress, actorID)
|
||||
_, err = stmts.addModlogEntry.Exec(action, elementID, elementType, ipaddress, actorID)
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO: Make a store for this?
|
||||
func addAdminLog(action string, elementID string, elementType int, ipaddress string, actorID int) (err error) {
|
||||
_, err = addAdminlogEntryStmt.Exec(action, elementID, elementType, ipaddress, actorID)
|
||||
_, err = stmts.addAdminlogEntry.Exec(action, elementID, elementType, ipaddress, actorID)
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -40,8 +40,9 @@ type NameTextPair struct {
|
|||
Text string
|
||||
}
|
||||
|
||||
// TODO: Make a store for this?
|
||||
func initWidgets() error {
|
||||
rows, err := getWidgetsStmt.Query()
|
||||
rows, err := stmts.getWidgets.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ func init() {
|
|||
}
|
||||
|
||||
func LoadWordFilters() error {
|
||||
rows, err := getWordFiltersStmt.Query()
|
||||
rows, err := stmts.getWordFilters.Query()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue