mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-04-22 18:56:35 +02:00
143 lines
3.5 KiB
Go
143 lines
3.5 KiB
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// SkillStats Skills统计信息
|
|
type SkillStats struct {
|
|
SkillName string
|
|
TotalCalls int
|
|
SuccessCalls int
|
|
FailedCalls int
|
|
LastCallTime *time.Time
|
|
}
|
|
|
|
// SaveSkillStats 保存Skills统计信息
|
|
func (db *DB) SaveSkillStats(skillName string, stats *SkillStats) error {
|
|
var lastCallTime sql.NullTime
|
|
if stats.LastCallTime != nil {
|
|
lastCallTime = sql.NullTime{Time: *stats.LastCallTime, Valid: true}
|
|
}
|
|
|
|
query := `
|
|
INSERT OR REPLACE INTO skill_stats
|
|
(skill_name, total_calls, success_calls, failed_calls, last_call_time, updated_at)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
`
|
|
|
|
_, err := db.Exec(query,
|
|
skillName,
|
|
stats.TotalCalls,
|
|
stats.SuccessCalls,
|
|
stats.FailedCalls,
|
|
lastCallTime,
|
|
time.Now(),
|
|
)
|
|
|
|
if err != nil {
|
|
db.logger.Error("保存Skills统计信息失败", zap.Error(err), zap.String("skillName", skillName))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// LoadSkillStats 加载所有Skills统计信息
|
|
func (db *DB) LoadSkillStats() (map[string]*SkillStats, error) {
|
|
query := `
|
|
SELECT skill_name, total_calls, success_calls, failed_calls, last_call_time
|
|
FROM skill_stats
|
|
`
|
|
|
|
rows, err := db.Query(query)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
stats := make(map[string]*SkillStats)
|
|
for rows.Next() {
|
|
var stat SkillStats
|
|
var lastCallTime sql.NullTime
|
|
|
|
err := rows.Scan(
|
|
&stat.SkillName,
|
|
&stat.TotalCalls,
|
|
&stat.SuccessCalls,
|
|
&stat.FailedCalls,
|
|
&lastCallTime,
|
|
)
|
|
if err != nil {
|
|
db.logger.Warn("加载Skills统计信息失败", zap.Error(err))
|
|
continue
|
|
}
|
|
|
|
if lastCallTime.Valid {
|
|
stat.LastCallTime = &lastCallTime.Time
|
|
}
|
|
|
|
stats[stat.SkillName] = &stat
|
|
}
|
|
|
|
return stats, nil
|
|
}
|
|
|
|
// UpdateSkillStats 更新Skills统计信息(累加模式)
|
|
func (db *DB) UpdateSkillStats(skillName string, totalCalls, successCalls, failedCalls int, lastCallTime *time.Time) error {
|
|
var lastCallTimeSQL sql.NullTime
|
|
if lastCallTime != nil {
|
|
lastCallTimeSQL = sql.NullTime{Time: *lastCallTime, Valid: true}
|
|
}
|
|
|
|
query := `
|
|
INSERT INTO skill_stats (skill_name, total_calls, success_calls, failed_calls, last_call_time, updated_at)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
ON CONFLICT(skill_name) DO UPDATE SET
|
|
total_calls = total_calls + ?,
|
|
success_calls = success_calls + ?,
|
|
failed_calls = failed_calls + ?,
|
|
last_call_time = COALESCE(?, last_call_time),
|
|
updated_at = ?
|
|
`
|
|
|
|
_, err := db.Exec(query,
|
|
skillName, totalCalls, successCalls, failedCalls, lastCallTimeSQL, time.Now(),
|
|
totalCalls, successCalls, failedCalls, lastCallTimeSQL, time.Now(),
|
|
)
|
|
|
|
if err != nil {
|
|
db.logger.Error("更新Skills统计信息失败", zap.Error(err), zap.String("skillName", skillName))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ClearSkillStats 清空所有Skills统计信息
|
|
func (db *DB) ClearSkillStats() error {
|
|
query := `DELETE FROM skill_stats`
|
|
_, err := db.Exec(query)
|
|
if err != nil {
|
|
db.logger.Error("清空Skills统计信息失败", zap.Error(err))
|
|
return err
|
|
}
|
|
db.logger.Info("已清空所有Skills统计信息")
|
|
return nil
|
|
}
|
|
|
|
// ClearSkillStatsByName 清空指定skill的统计信息
|
|
func (db *DB) ClearSkillStatsByName(skillName string) error {
|
|
query := `DELETE FROM skill_stats WHERE skill_name = ?`
|
|
_, err := db.Exec(query, skillName)
|
|
if err != nil {
|
|
db.logger.Error("清空指定skill统计信息失败", zap.Error(err), zap.String("skillName", skillName))
|
|
return err
|
|
}
|
|
db.logger.Info("已清空指定skill统计信息", zap.String("skillName", skillName))
|
|
return nil
|
|
}
|