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

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
}