Merge branch 'master' of http://10.10.14.250:3000/huanghai/dsMin
commit
f888ff3abf
@ -0,0 +1,57 @@
|
||||
[Error]2021/03/08 13:48:58 CreateRedisError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:48:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 CreateRedisError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:52:21 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 CreateRedisError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/08 13:53:58 SqlQueryError dial tcp :0: connectex: The requested address is not valid in its context.
|
||||
[Error]2021/03/16 14:18:15 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:18:16 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:22:02 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:22:03 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:27:19 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:27:20 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:31:00 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:31:01 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:31:24 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:31:25 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:31:56 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:31:57 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:34:42 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:34:43 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:35:38 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:35:39 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:42:31 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:42:32 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:43:27 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:43:28 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:44:21 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 14:44:22 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:41:40 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:41:41 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:45:12 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:45:13 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:45:38 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:45:39 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:58:02 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
||||
[Error]2021/03/16 15:58:03 SqlQueryError dial tcp 10.10.14.187:32066: connectex: No connection could be made because the target machine actively refused it.
|
@ -0,0 +1 @@
|
||||
{"success":true,"message":"数据查询成功","result":"{\"groups\":[[\"南关区\",\"宽城区\",\"朝阳区\",\"二道区\",\"绿园区\",\"双阳区\",\"九台区\",\"农安县\",\"榆树市\",\"德惠市\",\"直属代管\",\"新区代管\",\"经开区代管\",\"净月区代管\",\"汽车区代管\",\"莲花山度假区代管\"]],\"datas\":[[\"61\",\"54\",\"81\",\"72\",\"85\",\"69\",\"39\",\"59\",\"41\",\"93\",\"1\",\"27\",\"53\",\"34\",\"56\",\"3\"]],\"datas2\":[null],\"datas3\":[null],\"datas4\":[null],\"datas5\":[null],\"columns\":null,\"rows\":null}"}
|
@ -0,0 +1 @@
|
||||
{"success":true,"message":"dial tcp: address 75432: invalid port","result":"{\"groups\":null,\"datas\":null,\"datas2\":null,\"datas3\":null,\"datas4\":null,\"datas5\":null,\"columns\":null,\"rows\":null}"}
|
@ -0,0 +1 @@
|
||||
{"success":true,"message":"dial tcp: address 75432: invalid port","result":"{\"groups\":null,\"datas\":null,\"datas2\":null,\"datas3\":null,\"datas4\":null,\"datas5\":null,\"columns\":null,\"rows\":null}"}
|
@ -0,0 +1,358 @@
|
||||
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
|
||||
}
|
Loading…
Reference in new issue