github.com/mithrandie/csvq@v1.18.1/lib/file/functions.go (about) 1 package file 2 3 import ( 4 "context" 5 "math/rand" 6 "os" 7 "path/filepath" 8 "sync" 9 "time" 10 ) 11 12 const rlockFileSuffixLen = 12 13 14 var dummyCancelFunc = func() {} 15 16 var ( 17 letterRunes = []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 18 randForLock *rand.Rand 19 getRandForLock sync.Once 20 ) 21 22 func randStrForLock() *rand.Rand { 23 getRandForLock.Do(func() { 24 randForLock = rand.New(rand.NewSource(time.Now().UnixNano())) 25 }) 26 return randForLock 27 } 28 29 func RandomString(length int) string { 30 r := make([]rune, length) 31 for i := 0; i < length; i++ { 32 r[i] = letterRunes[randStrForLock().Intn(len(letterRunes))] 33 } 34 return string(r) 35 } 36 37 func rlockFileSuffix() string { 38 return "." + RandomString(rlockFileSuffixLen) + RLockFileSuffix 39 } 40 41 func GetTimeoutContext(ctx context.Context, waitTimeOut time.Duration) (context.Context, context.CancelFunc) { 42 if ctx.Err() != nil { 43 return ctx, dummyCancelFunc 44 } 45 if _, ok := ctx.Deadline(); ok { 46 return ctx, dummyCancelFunc 47 } 48 49 return context.WithTimeout(ctx, waitTimeOut) 50 } 51 52 func RLockFilePath(path string) string { 53 var fpath string 54 for i := 0; i < 10; i++ { 55 fpath = getFilePath(path, rlockFileSuffix()) 56 if !Exists(fpath) { 57 break 58 } 59 } 60 return fpath 61 } 62 63 func LockFilePath(path string) string { 64 return getFilePath(path, LockFileSuffix) 65 } 66 67 func TempFilePath(path string) string { 68 return getFilePath(path, TempFileSuffix) 69 } 70 71 func getFilePath(path string, suffix string) string { 72 dir := filepath.Dir(path) 73 basename := filepath.Base(path) 74 return filepath.Join(dir, "."+basename+suffix) 75 } 76 77 func RLockExists(path string) bool { 78 dir := filepath.Dir(path) 79 basename := filepath.Base(path) 80 match, _ := filepath.Glob(filepath.Join(dir, "."+basename) + ".*" + RLockFileSuffix) 81 return match != nil 82 } 83 84 func LockExists(path string) bool { 85 return Exists(LockFilePath(path)) 86 } 87 88 func Exists(path string) bool { 89 if _, err := os.Stat(path); err == nil { 90 return true 91 } 92 return false 93 }