Files
MyGoNavi/internal/app/query_history_file_lock_windows.go
Syngnat 034e968888 feat(sql-analysis): 完善慢 SQL 监控与执行计划诊断
- 完善慢查询采集、聚合、迁移与跨进程持久化

- 加固只读诊断边界并补齐多数据库执行计划解析

- 优化慢 SQL 面板、计划图、响应式布局与交互体验

- 补充后端、前端及 SQL Server 会话回归测试
2026-07-11 16:25:07 +08:00

53 lines
936 B
Go

//go:build windows
package app
import (
"errors"
"os"
"golang.org/x/sys/windows"
)
type queryHistoryFileLock struct {
file *os.File
overlapped windows.Overlapped
}
func acquireQueryHistoryFileLock(path string) (*queryHistoryFileLock, error) {
file, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o600)
if err != nil {
return nil, err
}
lock := &queryHistoryFileLock{file: file}
if err := windows.LockFileEx(
windows.Handle(file.Fd()),
windows.LOCKFILE_EXCLUSIVE_LOCK,
0,
1,
0,
&lock.overlapped,
); err != nil {
_ = file.Close()
return nil, err
}
_ = file.Chmod(0o600)
return lock, nil
}
func (lock *queryHistoryFileLock) Close() error {
if lock == nil || lock.file == nil {
return nil
}
unlockErr := windows.UnlockFileEx(
windows.Handle(lock.file.Fd()),
0,
1,
0,
&lock.overlapped,
)
closeErr := lock.file.Close()
lock.file = nil
return errors.Join(unlockErr, closeErr)
}