mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-04-27 07:13:10 +08:00
137 lines
3.7 KiB
TypeScript
137 lines
3.7 KiB
TypeScript
/**
|
|
* 导入模块工具函数
|
|
* 提供通用的工具函数供各导入模块共享
|
|
*/
|
|
|
|
import Database from 'better-sqlite3'
|
|
import * as fs from 'fs'
|
|
import * as path from 'path'
|
|
import { parentPort } from 'worker_threads'
|
|
import { getDbDir } from '../core'
|
|
import type { ParseProgress } from '../../parser'
|
|
|
|
/**
|
|
* 发送进度到主进程
|
|
*/
|
|
export function sendProgress(requestId: string, progress: ParseProgress): void {
|
|
parentPort?.postMessage({
|
|
id: requestId,
|
|
type: 'progress',
|
|
payload: progress,
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 生成唯一的会话ID
|
|
*/
|
|
export function generateSessionId(): string {
|
|
const timestamp = Date.now()
|
|
const random = Math.random().toString(36).substring(2, 8)
|
|
return `chat_${timestamp}_${random}`
|
|
}
|
|
|
|
/**
|
|
* 获取数据库文件路径
|
|
*/
|
|
export function getDbPath(sessionId: string): string {
|
|
return path.join(getDbDir(), `${sessionId}.db`)
|
|
}
|
|
|
|
/**
|
|
* 创建数据库并初始化表结构(不含索引,用于快速导入)
|
|
*/
|
|
export function createDatabaseWithoutIndexes(sessionId: string): Database.Database {
|
|
const dbDir = getDbDir()
|
|
if (!fs.existsSync(dbDir)) {
|
|
fs.mkdirSync(dbDir, { recursive: true })
|
|
}
|
|
|
|
const dbPath = getDbPath(sessionId)
|
|
const db = new Database(dbPath)
|
|
|
|
db.pragma('journal_mode = WAL')
|
|
db.pragma('synchronous = NORMAL')
|
|
// 增加缓存大小以提高写入性能
|
|
db.pragma('cache_size = -64000') // 64MB 缓存
|
|
|
|
// 创建表结构(不创建索引,导入完成后再创建)
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS meta (
|
|
name TEXT NOT NULL,
|
|
platform TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
imported_at INTEGER NOT NULL,
|
|
group_id TEXT,
|
|
group_avatar TEXT,
|
|
owner_id TEXT,
|
|
schema_version INTEGER DEFAULT 3,
|
|
session_gap_threshold INTEGER
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS member (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
platform_id TEXT NOT NULL UNIQUE,
|
|
account_name TEXT,
|
|
group_nickname TEXT,
|
|
aliases TEXT DEFAULT '[]',
|
|
avatar TEXT,
|
|
roles TEXT DEFAULT '[]'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS member_name_history (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
member_id INTEGER NOT NULL,
|
|
name_type TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
start_ts INTEGER NOT NULL,
|
|
end_ts INTEGER,
|
|
FOREIGN KEY(member_id) REFERENCES member(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS message (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
sender_id INTEGER NOT NULL,
|
|
sender_account_name TEXT,
|
|
sender_group_nickname TEXT,
|
|
ts INTEGER NOT NULL,
|
|
type INTEGER NOT NULL,
|
|
content TEXT,
|
|
reply_to_message_id TEXT DEFAULT NULL,
|
|
platform_message_id TEXT DEFAULT NULL,
|
|
FOREIGN KEY(sender_id) REFERENCES member(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS chat_session (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
start_ts INTEGER NOT NULL,
|
|
end_ts INTEGER NOT NULL,
|
|
message_count INTEGER DEFAULT 0,
|
|
is_manual INTEGER DEFAULT 0,
|
|
summary TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS message_context (
|
|
message_id INTEGER PRIMARY KEY,
|
|
session_id INTEGER NOT NULL,
|
|
topic_id INTEGER
|
|
);
|
|
`)
|
|
|
|
return db
|
|
}
|
|
|
|
/**
|
|
* 导入完成后创建索引
|
|
*/
|
|
export function createIndexes(db: Database.Database): void {
|
|
db.exec(`
|
|
CREATE INDEX IF NOT EXISTS idx_message_ts ON message(ts);
|
|
CREATE INDEX IF NOT EXISTS idx_message_sender ON message(sender_id);
|
|
CREATE INDEX IF NOT EXISTS idx_message_platform_id ON message(platform_message_id);
|
|
CREATE INDEX IF NOT EXISTS idx_member_name_history_member_id ON member_name_history(member_id);
|
|
CREATE INDEX IF NOT EXISTS idx_session_time ON chat_session(start_ts, end_ts);
|
|
CREATE INDEX IF NOT EXISTS idx_context_session ON message_context(session_id);
|
|
`)
|
|
}
|
|
|