73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
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
|
|
}
|