github.com/glide-im/glide@v1.6.0/internal/message_store_db/message_store.go (about) 1 package message_store_db 2 3 import ( 4 "database/sql" 5 "fmt" 6 "github.com/glide-im/glide/config" 7 "github.com/glide-im/glide/pkg/messages" 8 "github.com/glide-im/glide/pkg/store" 9 _ "github.com/go-sql-driver/mysql" 10 "strconv" 11 "time" 12 ) 13 14 var _ store.MessageStore = &ChatMessageStore{} 15 16 type ChatMessageStore struct { 17 db *sql.DB 18 } 19 20 func New(conf *config.MySqlConf) (*ChatMessageStore, error) { 21 mysqlUrl := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", conf.Username, conf.Password, conf.Host, conf.Port, conf.Db) 22 db, err := sql.Open("mysql", mysqlUrl) 23 if err != nil { 24 return nil, err 25 } 26 err = db.Ping() 27 if err != nil { 28 return nil, err 29 } 30 m := &ChatMessageStore{ 31 db: db, 32 } 33 return m, nil 34 } 35 36 func (D *ChatMessageStore) StoreOffline(message *messages.ChatMessage) error { 37 //TODO implement me 38 panic("implement me") 39 } 40 41 func (D *ChatMessageStore) StoreMessage(m *messages.ChatMessage) error { 42 43 from, err := strconv.ParseInt(m.From, 10, 64) 44 if err != nil { 45 return nil 46 } 47 to, err := strconv.ParseInt(m.To, 10, 64) 48 if err != nil { 49 return nil 50 } 51 52 lg := from 53 sm := to 54 if lg < sm { 55 lg, sm = sm, lg 56 } 57 sid := fmt.Sprintf("%d_%d", lg, sm) 58 59 // todo update the type of user id to string 60 //mysql only 61 s, e := D.db.Exec( 62 "INSERT INTO im_chat_message (`session_id`, `from`, `to`, `type`, `content`, `send_at`, `create_at`, `cli_seq`, `status`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)ON DUPLICATE KEY UPDATE send_at=?", 63 sid, from, to, m.Type, m.Content, m.SendAt, time.Now().Unix(), 0, 0, m.SendAt) 64 if e != nil { 65 return e 66 } 67 m.Mid, _ = s.LastInsertId() 68 return nil 69 } 70 71 var _ store.MessageStore = &IdleChatMessageStore{} 72 73 type IdleChatMessageStore struct { 74 } 75 76 func (i *IdleChatMessageStore) StoreOffline(message *messages.ChatMessage) error { 77 return nil 78 } 79 80 func (i *IdleChatMessageStore) StoreMessage(message *messages.ChatMessage) error { 81 message.Mid = time.Now().Unix() 82 return nil 83 }