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  }