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  }