You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
358 lines
9.8 KiB
358 lines
9.8 KiB
package FileCacheUtil
|
|
|
|
import (
|
|
"dsDataex/MyReport/GPSql/GPSqlService"
|
|
"dsDataex/MyReport/MySwagger"
|
|
"dsDataex/Utils/ConfigUtil"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
/**
|
|
* @title PathExists
|
|
* @Description 文件/路径是否存在
|
|
* @Author wangshuai
|
|
* @Date 2021-03-01
|
|
* @Param path string 路径
|
|
* @Return bool 是否存在
|
|
* @Return error 错误信息
|
|
*/
|
|
func PathExists(path string) (bool, error) {
|
|
_, err := os.Stat(path)
|
|
if err == nil {
|
|
return true, nil
|
|
}
|
|
if os.IsNotExist(err) {
|
|
return false, nil
|
|
}
|
|
|
|
return false, err
|
|
}
|
|
|
|
/**
|
|
* @title WriteFile
|
|
* @Description 写入文件
|
|
* @Author wangshuai
|
|
* @Date 2021-03-01
|
|
* @Param filename string 文件
|
|
* @Param data []byte 内容
|
|
* @Param perm os.FileMode 模式(0666,0600)
|
|
* @Return bool 是否成功
|
|
* @Return error 错误信息
|
|
*/
|
|
func WriteFile(filename string, data []byte, perm os.FileMode) (bool, error) {
|
|
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
n, err := f.Write(data)
|
|
if err == nil && n < len(data) {
|
|
err = io.ErrShortWrite
|
|
}
|
|
if err1 := f.Close(); err == nil {
|
|
err = err1
|
|
}
|
|
|
|
return true, err
|
|
}
|
|
|
|
/**
|
|
* @title ReadFile
|
|
* @Description 读取文件
|
|
* @Author wangshuai
|
|
* @Date 2021-03-01
|
|
* @Param filename string 文件
|
|
* @Param perm os.FileMode 模式(0666,0600)
|
|
* @Return bool 是否成功
|
|
* @Return string 内容
|
|
* @Return error 错误信息
|
|
*/
|
|
func ReadFile(filename string, perm os.FileMode) (bool, string, error) {
|
|
f, err := os.OpenFile(filename, os.O_RDONLY,perm)
|
|
defer f.Close()
|
|
if err != nil {
|
|
return false, "", err
|
|
} else {
|
|
contentByte, err := ioutil.ReadAll(f)
|
|
if err == nil && len(contentByte) > 0 {
|
|
return true, string(contentByte), err
|
|
}
|
|
}
|
|
|
|
return false, "", err
|
|
}
|
|
|
|
/**
|
|
* @title ReadDir
|
|
* @Description 读取目录所有文件
|
|
* @Author wangshuai
|
|
* @Date 2021-03-01
|
|
* @Param path string 路径
|
|
* @Return bool 是否成功
|
|
* @Return []string 文件名列表
|
|
* @Return error 错误信息
|
|
*/
|
|
func ReadDir(path string) (bool, []string, error) {
|
|
var data []string
|
|
dirs, e := ioutil.ReadDir(path)
|
|
if e != nil {
|
|
return false, nil, e
|
|
}
|
|
for _, v := range dirs {
|
|
data = append(data, v.Name())
|
|
}
|
|
|
|
return true, data, e
|
|
}
|
|
|
|
/**
|
|
* @title LatestCacheDate
|
|
* @Description 最新缓存文件日期
|
|
* @Author wangshuai
|
|
* @Date 2021-03-01
|
|
* @Param path string 路径
|
|
* @Param filenamePrefix string 文件名前缀
|
|
* @Return bool 是否成功
|
|
* @Return string 最新缓存文件日期
|
|
* @Return error 错误信息
|
|
*/
|
|
func LatestCacheDate(path, filenamePrefix string) (bool, string, error) {
|
|
var data []string
|
|
_, dirs, err := ReadDir(path)
|
|
if err != nil {
|
|
return false, "", err
|
|
}
|
|
for _, v := range dirs {
|
|
prefix := strings.LastIndex(v, filenamePrefix)
|
|
start := strings.LastIndex(v, "-")
|
|
end := strings.LastIndex(v, ".")
|
|
if prefix != -1 && start != -1 && end != -1 {
|
|
cacheDate := v[start + 1 : end]
|
|
data = append(data, cacheDate)
|
|
}
|
|
}
|
|
|
|
if len(data) > 0 {
|
|
sort.Sort(sort.Reverse(sort.StringSlice(data)))
|
|
return true, data[0], nil
|
|
} else {
|
|
return false, "", nil
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title SimpleGPCycleCache
|
|
* @Description 周期缓存
|
|
* @Author wangshuai
|
|
* @Date 2021-03-04
|
|
* @Param input string 路径
|
|
* @Return bool 是否成功
|
|
* @Return string 提示信息
|
|
* @Return string 缓存内容
|
|
*/
|
|
func SimpleGPCycleCache(input MySwagger.QuerySimpleGP) (bool, string, string) {
|
|
var queryID string
|
|
var queryParam string
|
|
var queryGroup string
|
|
var queryCount string
|
|
var queryFormat string
|
|
var timeLayout string = "20060102150405"
|
|
var filename string
|
|
var filenamePrefix string
|
|
var exists bool = false
|
|
var res bool
|
|
var msg string
|
|
var data string
|
|
var DataResult MySwagger.DataResult
|
|
|
|
strTime := time.Now().Format(timeLayout)
|
|
queryID = input.Query.QueryID
|
|
queryParam = strings.Join(input.Query.QueryParam , "@")
|
|
queryGroup = strings.Join(input.QueryGroup , "@")
|
|
queryCount = strings.Join(input.QueryCount , "@")
|
|
queryFormat = input.QueryFormat
|
|
// 文件名
|
|
filename = ConfigUtil.FCPathDay + queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat + "-" + strTime + ConfigUtil.FCExtension
|
|
// 文件名前缀
|
|
filenamePrefix = queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat
|
|
// 最新缓存日期
|
|
result, latestCacheDate, _ := LatestCacheDate(ConfigUtil.FCPathDay, filenamePrefix)
|
|
if result == true {
|
|
// 转成时间戳
|
|
startUnix, _ := time.Parse(timeLayout, strTime)
|
|
endUnix, _ := time.Parse(timeLayout, latestCacheDate)
|
|
startTime := startUnix.Unix()
|
|
endTime := endUnix.Unix()
|
|
// 求相差天数
|
|
timeSub := (startTime - endTime) / 86400
|
|
if input.QueryCache == 1 { // 按日缓存
|
|
//exists, _ = FileCacheUtil.PathExists(filename)
|
|
if timeSub < 1 {
|
|
exists = true
|
|
filename = filenamePrefix + "-" + latestCacheDate + ConfigUtil.FCExtension
|
|
}
|
|
} else { // 按月缓存
|
|
if timeSub < 30 {
|
|
exists = true
|
|
filename = filenamePrefix + "-" + latestCacheDate + ConfigUtil.FCExtension
|
|
}
|
|
}
|
|
}
|
|
if exists {
|
|
// 读取缓存文件
|
|
fmt.Println("开始读取缓存...")
|
|
result, cache, _ := ReadFile(filename, 0600)
|
|
if result == false {
|
|
return false, "读取文件失败, 无法打开", ""
|
|
}
|
|
fmt.Println("缓存读取成功, 缓存文件: " + filename)
|
|
err := json.Unmarshal([]byte(cache), &DataResult)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return false, "JSON反序列化失败", ""
|
|
}
|
|
res, msg, data = DataResult.Success, DataResult.Message, DataResult.Result
|
|
return res, msg, data
|
|
} else {
|
|
res, msg, data = GPSqlService.QuerySimple(input.Query.QueryID, input.Query.QueryParam, input.QueryGroup, input.QueryCount, input.QueryFormat)
|
|
fmt.Println("开始写入缓存...")
|
|
DataResult = MySwagger.DataResult{
|
|
Success: true,
|
|
Message: msg,
|
|
Result: data,
|
|
}
|
|
byteData, err1 := json.Marshal(DataResult)
|
|
if err1 != nil {
|
|
fmt.Println("JSON ERR:", err1)
|
|
return false, "JSON序列化失败", ""
|
|
}
|
|
// 写入缓存文件
|
|
fmt.Println("filename=", filename, "<<")
|
|
result, err := WriteFile(filename, byteData, 0666)
|
|
if result == false {
|
|
fmt.Println(err)
|
|
return false, "写入失败", ""
|
|
}
|
|
fmt.Println("缓存写入成功, 缓存文件: " + filename)
|
|
return res, msg, data
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title SimpleGPCalendarCache
|
|
* @Description 自然日/月缓存
|
|
* @Author wangshuai
|
|
* @Date 2021-03-04
|
|
* @Param input string 路径
|
|
* @Return bool 是否成功
|
|
* @Return string 提示信息
|
|
* @Return string 缓存内容
|
|
*/
|
|
func SimpleGPCalendarCache(input MySwagger.QuerySimpleGP) (bool, string, string) {
|
|
var queryID string
|
|
var queryParam string
|
|
var queryGroup string
|
|
var queryCount string
|
|
var queryFormat string
|
|
var dayTimeLayout string = "20060102"
|
|
var monthTimeLayout string = "200601"
|
|
var filename string
|
|
var exists bool = false
|
|
var res bool
|
|
var msg string
|
|
var data string
|
|
var DataResult MySwagger.DataResult
|
|
|
|
strDayTime := time.Now().Format(dayTimeLayout)
|
|
strMonthTime := time.Now().Format(monthTimeLayout)
|
|
queryID = input.Query.QueryID
|
|
queryParam = strings.Join(input.Query.QueryParam , "@")
|
|
queryGroup = strings.Join(input.QueryGroup , "@")
|
|
queryCount = strings.Join(input.QueryCount , "@")
|
|
queryFormat = input.QueryFormat
|
|
|
|
// 最新缓存日期
|
|
if input.QueryCache == 1 { // 按日缓存
|
|
// 文件名
|
|
filename = ConfigUtil.FCPathDay + queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat + "-" + strDayTime + ConfigUtil.FCExtension
|
|
} else { // 按月缓存
|
|
// 文件名
|
|
filename = ConfigUtil.FCPathMonth + queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat + "-" + strMonthTime + ConfigUtil.FCExtension
|
|
}
|
|
|
|
exists, _ = PathExists(filename)
|
|
if exists {
|
|
// 读取缓存文件
|
|
fmt.Println("开始读取缓存...")
|
|
result, cache, _ := ReadFile(filename, 0600)
|
|
if result == false {
|
|
return false, "读取文件失败, 无法打开", ""
|
|
}
|
|
fmt.Println("缓存读取成功, 缓存文件: " + filename)
|
|
err := json.Unmarshal([]byte(cache), &DataResult)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return false, "JSON反序列化失败", ""
|
|
}
|
|
res, msg, data = DataResult.Success, DataResult.Message, DataResult.Result
|
|
return res, msg, data
|
|
} else {
|
|
res, msg, data = GPSqlService.QuerySimple(input.Query.QueryID, input.Query.QueryParam, input.QueryGroup, input.QueryCount, input.QueryFormat)
|
|
fmt.Println("开始写入缓存...")
|
|
DataResult = MySwagger.DataResult{
|
|
Success: true,
|
|
Message: msg,
|
|
Result: data,
|
|
}
|
|
byteData, err1 := json.Marshal(DataResult)
|
|
if err1 != nil {
|
|
fmt.Println("JSON ERR:", err1)
|
|
return false, "JSON序列化失败", ""
|
|
}
|
|
// 写入缓存文件
|
|
result, err := WriteFile(filename, byteData, 0666)
|
|
if result == false {
|
|
fmt.Println(err)
|
|
return false, "写入失败", ""
|
|
}
|
|
fmt.Println("缓存写入成功, 缓存文件: " + filename)
|
|
return res, msg, data
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title LatestCacheFilename
|
|
* @Description 所有缓存文件名
|
|
* @Author wangshuai
|
|
* @Date 2021-03-01
|
|
* @Param path string 路径
|
|
* @Param filenamePrefix string 文件名前缀
|
|
* @Return bool 是否成功
|
|
* @Return string 最新缓存文件名
|
|
* @Return error 错误信息
|
|
*/
|
|
func LatestCacheFilename(path, filenamePrefix string) (bool, string, error) {
|
|
var data []string
|
|
_, dirs, err := ReadDir(path)
|
|
if err != nil {
|
|
return false, "", err
|
|
}
|
|
for _, v := range dirs {
|
|
start := strings.LastIndex(v, "-")
|
|
end := strings.LastIndex(v, ".")
|
|
if start != -1 && end != -1 {
|
|
cacheDate := v[start + 1 : end]
|
|
data = append(data, cacheDate)
|
|
}
|
|
}
|
|
sort.Sort(sort.Reverse(sort.StringSlice(data)))
|
|
filename := filenamePrefix + "-" + data[0] + ConfigUtil.FCExtension
|
|
|
|
return true, filename, err
|
|
} |