summaryrefslogtreecommitdiffstats
path: root/store/sqlstore/emoji_store.go
diff options
context:
space:
mode:
authorChris <ccbrown112@gmail.com>2017-09-25 09:11:25 -0500
committerJoram Wilander <jwawilander@gmail.com>2017-09-25 10:11:25 -0400
commit49fe5fbf3db56fc466b8997b182ee135d7a4365d (patch)
tree1252fea09aa3ce899e2e8edb1fb7b42900f50bca /store/sqlstore/emoji_store.go
parentb2c5b97601b61f5748b46e4e386134203111ebb0 (diff)
downloadchat-49fe5fbf3db56fc466b8997b182ee135d7a4365d.tar.gz
chat-49fe5fbf3db56fc466b8997b182ee135d7a4365d.tar.bz2
chat-49fe5fbf3db56fc466b8997b182ee135d7a4365d.zip
Move sql store code into store/sqlstore package (#7502)
* move sql store code into store/sqlstore package * move non-sql constants back up to store * fix api test * derp
Diffstat (limited to 'store/sqlstore/emoji_store.go')
-rw-r--r--store/sqlstore/emoji_store.go212
1 files changed, 212 insertions, 0 deletions
diff --git a/store/sqlstore/emoji_store.go b/store/sqlstore/emoji_store.go
new file mode 100644
index 000000000..5842af2f3
--- /dev/null
+++ b/store/sqlstore/emoji_store.go
@@ -0,0 +1,212 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package sqlstore
+
+import (
+ "net/http"
+
+ "github.com/mattermost/mattermost-server/einterfaces"
+ "github.com/mattermost/mattermost-server/model"
+ "github.com/mattermost/mattermost-server/store"
+ "github.com/mattermost/mattermost-server/utils"
+)
+
+const (
+ EMOJI_CACHE_SIZE = 5000
+ EMOJI_CACHE_SEC = 1800 // 30 mins
+)
+
+var emojiCache *utils.Cache = utils.NewLru(EMOJI_CACHE_SIZE)
+
+type SqlEmojiStore struct {
+ SqlStore
+ metrics einterfaces.MetricsInterface
+}
+
+func NewSqlEmojiStore(sqlStore SqlStore, metrics einterfaces.MetricsInterface) store.EmojiStore {
+ s := &SqlEmojiStore{
+ SqlStore: sqlStore,
+ metrics: metrics,
+ }
+
+ for _, db := range sqlStore.GetAllConns() {
+ table := db.AddTableWithName(model.Emoji{}, "Emoji").SetKeys(false, "Id")
+ table.ColMap("Id").SetMaxSize(26)
+ table.ColMap("CreatorId").SetMaxSize(26)
+ table.ColMap("Name").SetMaxSize(64)
+
+ table.SetUniqueTogether("Name", "DeleteAt")
+ }
+
+ return s
+}
+
+func (es SqlEmojiStore) CreateIndexesIfNotExists() {
+ es.CreateIndexIfNotExists("idx_emoji_update_at", "Emoji", "UpdateAt")
+ es.CreateIndexIfNotExists("idx_emoji_create_at", "Emoji", "CreateAt")
+ es.CreateIndexIfNotExists("idx_emoji_delete_at", "Emoji", "DeleteAt")
+}
+
+func (es SqlEmojiStore) Save(emoji *model.Emoji) store.StoreChannel {
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ emoji.PreSave()
+ if result.Err = emoji.IsValid(); result.Err != nil {
+ storeChannel <- result
+ close(storeChannel)
+ return
+ }
+
+ if err := es.GetMaster().Insert(emoji); err != nil {
+ result.Err = model.NewAppError("SqlEmojiStore.Save", "store.sql_emoji.save.app_error", nil, "id="+emoji.Id+", "+err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = emoji
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (es SqlEmojiStore) Get(id string, allowFromCache bool) store.StoreChannel {
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ if allowFromCache {
+ if cacheItem, ok := emojiCache.Get(id); ok {
+ if es.metrics != nil {
+ es.metrics.IncrementMemCacheHitCounter("Emoji")
+ }
+ result.Data = cacheItem.(*model.Emoji)
+ storeChannel <- result
+ close(storeChannel)
+ return
+ } else {
+ if es.metrics != nil {
+ es.metrics.IncrementMemCacheMissCounter("Emoji")
+ }
+ }
+ } else {
+ if es.metrics != nil {
+ es.metrics.IncrementMemCacheMissCounter("Emoji")
+ }
+ }
+
+ var emoji *model.Emoji
+
+ if err := es.GetReplica().SelectOne(&emoji,
+ `SELECT
+ *
+ FROM
+ Emoji
+ WHERE
+ Id = :Id
+ AND DeleteAt = 0`, map[string]interface{}{"Id": id}); err != nil {
+ result.Err = model.NewAppError("SqlEmojiStore.Get", "store.sql_emoji.get.app_error", nil, "id="+id+", "+err.Error(), http.StatusNotFound)
+ } else {
+ result.Data = emoji
+
+ if allowFromCache {
+ emojiCache.AddWithExpiresInSecs(id, emoji, EMOJI_CACHE_SEC)
+ }
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (es SqlEmojiStore) GetByName(name string) store.StoreChannel {
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ var emoji *model.Emoji
+
+ if err := es.GetReplica().SelectOne(&emoji,
+ `SELECT
+ *
+ FROM
+ Emoji
+ WHERE
+ Name = :Name
+ AND DeleteAt = 0`, map[string]interface{}{"Name": name}); err != nil {
+ result.Err = model.NewAppError("SqlEmojiStore.GetByName", "store.sql_emoji.get_by_name.app_error", nil, "name="+name+", "+err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = emoji
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (es SqlEmojiStore) GetList(offset, limit int) store.StoreChannel {
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ var emoji []*model.Emoji
+
+ if _, err := es.GetReplica().Select(&emoji,
+ `SELECT
+ *
+ FROM
+ Emoji
+ WHERE
+ DeleteAt = 0
+ LIMIT :Limit OFFSET :Offset`, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
+ result.Err = model.NewAppError("SqlEmojiStore.GetList", "store.sql_emoji.get_all.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = emoji
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (es SqlEmojiStore) Delete(id string, time int64) store.StoreChannel {
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ if sqlResult, err := es.GetMaster().Exec(
+ `Update
+ Emoji
+ SET
+ DeleteAt = :DeleteAt,
+ UpdateAt = :UpdateAt
+ WHERE
+ Id = :Id
+ AND DeleteAt = 0`, map[string]interface{}{"DeleteAt": time, "UpdateAt": time, "Id": id}); err != nil {
+ result.Err = model.NewAppError("SqlEmojiStore.Delete", "store.sql_emoji.delete.app_error", nil, "id="+id+", err="+err.Error(), http.StatusInternalServerError)
+ } else if rows, _ := sqlResult.RowsAffected(); rows == 0 {
+ result.Err = model.NewAppError("SqlEmojiStore.Delete", "store.sql_emoji.delete.no_results", nil, "id="+id+", err="+err.Error(), http.StatusBadRequest)
+ }
+
+ emojiCache.Remove(id)
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}