chat/server/db.go

73 lines
1.6 KiB
Go
Raw Normal View History

package main
import (
"database/sql"
"log"
"time"
_ "github.com/mattn/go-sqlite3"
)
var db *sql.DB
func InitDB() {
var err error
db, err = sql.Open("sqlite3", "./chat.db")
if err != nil {
log.Fatalf("打开数据库失败: %v", err)
}
createTableSQL := `
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sender TEXT NOT NULL,
receiver TEXT NOT NULL,
content TEXT NOT NULL,
timestamp DATETIME NOT NULL
);
`
_, err = db.Exec(createTableSQL)
if err != nil {
log.Fatalf("创建表失败: %v", err)
}
}
func SaveMessage(sender, receiver, content string) error {
stmt, err := db.Prepare("INSERT INTO messages(sender, receiver, content, timestamp) VALUES (?, ?, ?, ?)")
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(sender, receiver, content, time.Now())
return err
}
func GetMessages(sender, receiver string) ([]Message, error) {
rows, err := db.Query("SELECT sender, receiver, content, timestamp FROM messages WHERE (sender = ? AND receiver = ?) OR (sender = ? AND receiver = ?) ORDER BY timestamp ASC", sender, receiver, receiver, sender)
if err != nil {
return nil, err
}
defer rows.Close()
var messages []Message
for rows.Next() {
var msg Message
var ts string
err = rows.Scan(&msg.Sender, &msg.Receiver, &msg.Content, &ts)
if err != nil {
return nil, err
}
msg.Timestamp, _ = time.Parse(time.RFC3339, ts)
messages = append(messages, msg)
}
return messages, nil
}
type Message struct {
Sender string
Receiver string
Content string
Timestamp time.Time
}