mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-25 02:00:09 +08:00
- 完善慢查询采集、聚合、迁移与跨进程持久化 - 加固只读诊断边界并补齐多数据库执行计划解析 - 优化慢 SQL 面板、计划图、响应式布局与交互体验 - 补充后端、前端及 SQL Server 会话回归测试
53 lines
936 B
Go
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)
|
|
}
|