代码优化
This commit is contained in:
		
							parent
							
								
									ba035974b5
								
							
						
					
					
						commit
						e45788427e
					
				@ -12,6 +12,7 @@ import (
 | 
				
			|||||||
	"github.com/1340691923/xwl_bi/engine/logs"
 | 
						"github.com/1340691923/xwl_bi/engine/logs"
 | 
				
			||||||
	"github.com/1340691923/xwl_bi/middleware"
 | 
						"github.com/1340691923/xwl_bi/middleware"
 | 
				
			||||||
	"github.com/1340691923/xwl_bi/model"
 | 
						"github.com/1340691923/xwl_bi/model"
 | 
				
			||||||
 | 
						"github.com/1340691923/xwl_bi/platform-basic-libs/sinker"
 | 
				
			||||||
	_ "github.com/ClickHouse/clickhouse-go"
 | 
						_ "github.com/ClickHouse/clickhouse-go"
 | 
				
			||||||
	"github.com/buaazp/fasthttprouter"
 | 
						"github.com/buaazp/fasthttprouter"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
@ -72,6 +73,7 @@ func main() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
						go sinker.ClearDimsCacheByTime(time.Minute * 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	router := fasthttprouter.New()
 | 
						router := fasthttprouter.New()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -212,10 +212,13 @@ func AddTableColumn(kafkaData model.KafkaData, failFunc func(data consumer_data.
 | 
				
			|||||||
			redisConn := db.RedisPool.Get()
 | 
								redisConn := db.RedisPool.Get()
 | 
				
			||||||
			defer redisConn.Close()
 | 
								defer redisConn.Close()
 | 
				
			||||||
			dimsCachekey := sinker.GetDimsCachekey(model.GlobConfig.Comm.ClickHouse.DbName, tableName)
 | 
								dimsCachekey := sinker.GetDimsCachekey(model.GlobConfig.Comm.ClickHouse.DbName, tableName)
 | 
				
			||||||
			_, err = redisConn.Do("del", dimsCachekey)
 | 
								_, err = redisConn.Do("unlink", dimsCachekey)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
 | 
									redisConn.Do("del", dimsCachekey)
 | 
				
			||||||
				logs.Logger.Error("err", zap.Error(err))
 | 
									logs.Logger.Error("err", zap.Error(err))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								sinker.ClearDimsCacheByKey(dimsCachekey)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}()
 | 
							}()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@ import (
 | 
				
			|||||||
	_ "net/http/pprof"
 | 
						_ "net/http/pprof"
 | 
				
			||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@ -108,6 +109,7 @@ func main() {
 | 
				
			|||||||
	realTimeDataSarama := sinker.NewKafkaSarama()
 | 
						realTimeDataSarama := sinker.NewKafkaSarama()
 | 
				
			||||||
	reportData2CKSarama := realTimeDataSarama.Clone()
 | 
						reportData2CKSarama := realTimeDataSarama.Clone()
 | 
				
			||||||
	go action.MysqlConsumer()
 | 
						go action.MysqlConsumer()
 | 
				
			||||||
 | 
						go sinker.ClearDimsCacheByTime(time.Minute * 2)
 | 
				
			||||||
	var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
						var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
				
			||||||
	pp, err := parser.NewParserPool()
 | 
						pp, err := parser.NewParserPool()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ func ClearCacheByAppid(key string) (err error) {
 | 
				
			|||||||
	defer conn.Close()
 | 
						defer conn.Close()
 | 
				
			||||||
	_, err = conn.Do("unlink", key)
 | 
						_, err = conn.Do("unlink", key)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		_, err = conn.Do("del", key)
 | 
							conn.Do("del", key)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	model2 "github.com/1340691923/xwl_bi/platform-basic-libs/sinker/model"
 | 
						model2 "github.com/1340691923/xwl_bi/platform-basic-libs/sinker/model"
 | 
				
			||||||
	parser "github.com/1340691923/xwl_bi/platform-basic-libs/sinker/parse"
 | 
						parser "github.com/1340691923/xwl_bi/platform-basic-libs/sinker/parse"
 | 
				
			||||||
	"go.uber.org/zap"
 | 
						"go.uber.org/zap"
 | 
				
			||||||
	"log"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
@ -20,6 +19,7 @@ type ReportData2CK struct {
 | 
				
			|||||||
	bufferMutex   *sync.RWMutex
 | 
						bufferMutex   *sync.RWMutex
 | 
				
			||||||
	batchSize     int
 | 
						batchSize     int
 | 
				
			||||||
	flushInterval int
 | 
						flushInterval int
 | 
				
			||||||
 | 
						pool sync.Pool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewReportData2CK(batchSize int, flushInterval int) *ReportData2CK {
 | 
					func NewReportData2CK(batchSize int, flushInterval int) *ReportData2CK {
 | 
				
			||||||
@ -37,6 +37,19 @@ func NewReportData2CK(batchSize int, flushInterval int) *ReportData2CK {
 | 
				
			|||||||
	return reportData2CK
 | 
						return reportData2CK
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func(this *ReportData2CK)GetBuffer()*bytes.Buffer{
 | 
				
			||||||
 | 
						v := this.pool.Get()
 | 
				
			||||||
 | 
						if v == nil {
 | 
				
			||||||
 | 
							return new(bytes.Buffer)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return v.(*bytes.Buffer)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func(this *ReportData2CK)PutBuffer(buff *bytes.Buffer){
 | 
				
			||||||
 | 
						buff.Reset()
 | 
				
			||||||
 | 
						this.pool.Put(buff)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *ReportData2CK) Flush() (err error) {
 | 
					func (this *ReportData2CK) Flush() (err error) {
 | 
				
			||||||
	this.bufferMutex.Lock()
 | 
						this.bufferMutex.Lock()
 | 
				
			||||||
	if len(this.buffer)==0{
 | 
						if len(this.buffer)==0{
 | 
				
			||||||
@ -46,8 +59,8 @@ func (this *ReportData2CK) Flush() (err error) {
 | 
				
			|||||||
	startNow := time.Now()
 | 
						startNow := time.Now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rowsMap := map[string][][]interface{}{}
 | 
						rowsMap := map[string][][]interface{}{}
 | 
				
			||||||
	for _, data := range this.buffer {
 | 
						for bufferIndex := range this.buffer {
 | 
				
			||||||
		for tableName, metric := range data {
 | 
							for tableName := range this.buffer[bufferIndex] {
 | 
				
			||||||
			rows := [][]interface{}{}
 | 
								rows := [][]interface{}{}
 | 
				
			||||||
			if _, haveKey := rowsMap[tableName]; haveKey {
 | 
								if _, haveKey := rowsMap[tableName]; haveKey {
 | 
				
			||||||
				rows = rowsMap[tableName]
 | 
									rows = rowsMap[tableName]
 | 
				
			||||||
@ -58,7 +71,7 @@ func (this *ReportData2CK) Flush() (err error) {
 | 
				
			|||||||
			dims := v.([]*model2.ColumnWithType)
 | 
								dims := v.([]*model2.ColumnWithType)
 | 
				
			||||||
			var rowArr []interface{}
 | 
								var rowArr []interface{}
 | 
				
			||||||
			for _, dim := range dims {
 | 
								for _, dim := range dims {
 | 
				
			||||||
				val := parser.GetValueByType(metric, dim)
 | 
									val := parser.GetValueByType(this.buffer[bufferIndex][tableName], dim)
 | 
				
			||||||
				rowArr = append(rowArr, val)
 | 
									rowArr = append(rowArr, val)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			rows = append(rows, rowArr)
 | 
								rows = append(rows, rowArr)
 | 
				
			||||||
@ -66,7 +79,8 @@ func (this *ReportData2CK) Flush() (err error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buffer := bytes.Buffer{}
 | 
						bytesbuffer:=this.GetBuffer()
 | 
				
			||||||
 | 
						defer this.PutBuffer(bytesbuffer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TableColumnMap.Range(func(key, value interface{}) bool {
 | 
						TableColumnMap.Range(func(key, value interface{}) bool {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -77,22 +91,27 @@ func (this *ReportData2CK) Flush() (err error) {
 | 
				
			|||||||
			seriesDims := value.([]*model2.ColumnWithType)
 | 
								seriesDims := value.([]*model2.ColumnWithType)
 | 
				
			||||||
			serDimsQuoted := make([]string, len(seriesDims))
 | 
								serDimsQuoted := make([]string, len(seriesDims))
 | 
				
			||||||
			params := make([]string, len(seriesDims))
 | 
								params := make([]string, len(seriesDims))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for i, serDim := range seriesDims {
 | 
								for i, serDim := range seriesDims {
 | 
				
			||||||
				serDimsQuoted[i] = "`" + serDim.Name + "`"
 | 
									bytesbuffer.WriteString("`")
 | 
				
			||||||
 | 
									bytesbuffer.WriteString(serDim.Name)
 | 
				
			||||||
 | 
									bytesbuffer.WriteString("`")
 | 
				
			||||||
 | 
									serDimsQuoted[i] = bytesbuffer.String()
 | 
				
			||||||
 | 
									bytesbuffer.Reset()
 | 
				
			||||||
				params[i] = "?"
 | 
									params[i] = "?"
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			buffer.WriteString("INSERT INTO ")
 | 
								bytesbuffer.WriteString("INSERT INTO ")
 | 
				
			||||||
			buffer.WriteString(tableName)
 | 
								bytesbuffer.WriteString(tableName)
 | 
				
			||||||
			buffer.WriteString(" (")
 | 
								bytesbuffer.WriteString(" (")
 | 
				
			||||||
			buffer.WriteString(strings.Join(serDimsQuoted, ","))
 | 
								bytesbuffer.WriteString(strings.Join(serDimsQuoted, ","))
 | 
				
			||||||
			buffer.WriteString(") ")
 | 
								bytesbuffer.WriteString(") ")
 | 
				
			||||||
			buffer.WriteString("VALUES (")
 | 
								bytesbuffer.WriteString("VALUES (")
 | 
				
			||||||
			buffer.WriteString(strings.Join(params, ","))
 | 
								bytesbuffer.WriteString(strings.Join(params, ","))
 | 
				
			||||||
			buffer.WriteString(")")
 | 
								bytesbuffer.WriteString(")")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			insertSql := buffer.String()
 | 
								insertSql := bytesbuffer.String()
 | 
				
			||||||
			buffer.Reset()
 | 
								bytesbuffer.Reset()
 | 
				
			||||||
			tx, err := db.ClickHouseSqlx.Begin()
 | 
								tx, err := db.ClickHouseSqlx.Begin()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				logs.Logger.Error("CK入库失败", zap.Error(err))
 | 
									logs.Logger.Error("CK入库失败", zap.Error(err))
 | 
				
			||||||
@ -106,7 +125,6 @@ func (this *ReportData2CK) Flush() (err error) {
 | 
				
			|||||||
			defer stmt.Close()
 | 
								defer stmt.Close()
 | 
				
			||||||
			haveFail := false
 | 
								haveFail := false
 | 
				
			||||||
			for _, row := range rowsMap[tableName] {
 | 
								for _, row := range rowsMap[tableName] {
 | 
				
			||||||
				log.Println("row",row)
 | 
					 | 
				
			||||||
				if _, err := stmt.Exec(row...); err != nil {
 | 
									if _, err := stmt.Exec(row...); err != nil {
 | 
				
			||||||
					logs.Logger.Error("CK入库失败", zap.Error(err))
 | 
										logs.Logger.Error("CK入库失败", zap.Error(err))
 | 
				
			||||||
					haveFail = true
 | 
										haveFail = true
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ import (
 | 
				
			|||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@ -38,27 +39,64 @@ func GetDimsCachekey(database, table string) string {
 | 
				
			|||||||
	return dimsCachekey
 | 
						return dimsCachekey
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var dimsCacheMap sync.Map
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ClearDimsCacheByTime(clearTime time.Duration){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
						for{
 | 
				
			||||||
 | 
							time.Sleep(clearTime)
 | 
				
			||||||
 | 
							dimsCacheMap.Range(func(key, value interface{}) bool {
 | 
				
			||||||
 | 
								ClearDimsCacheByRedis(key.(string))
 | 
				
			||||||
 | 
								dimsCacheMap.Delete(key)
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ClearDimsCacheByRedis(key string){
 | 
				
			||||||
 | 
						redisConn := db.RedisPool.Get()
 | 
				
			||||||
 | 
						defer redisConn.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := redisConn.Do("unlink", key)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							redisConn.Do("del", key)
 | 
				
			||||||
 | 
							logs.Logger.Error("err", zap.Error(err))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ClearDimsCacheByKey(key string){
 | 
				
			||||||
 | 
						dimsCacheMap.Delete(key)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetDims(database, table string, excludedColumns []string, conn *sqlx.DB) (dims []*model2.ColumnWithType, err error) {
 | 
					func GetDims(database, table string, excludedColumns []string, conn *sqlx.DB) (dims []*model2.ColumnWithType, err error) {
 | 
				
			||||||
	var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
					 | 
				
			||||||
	dimsCachekey := GetDimsCachekey(database, table)
 | 
						dimsCachekey := GetDimsCachekey(database, table)
 | 
				
			||||||
 | 
						cache,load := dimsCacheMap.Load(dimsCachekey)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if load {
 | 
				
			||||||
 | 
							return cache.([]*model2.ColumnWithType),nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	redisConn := db.RedisPool.Get()
 | 
						redisConn := db.RedisPool.Get()
 | 
				
			||||||
	defer redisConn.Close()
 | 
						defer redisConn.Close()
 | 
				
			||||||
	dimsBytes, redisErr := redis.Bytes(redisConn.Do("get", dimsCachekey))
 | 
						dimsBytes, redisErr := redis.Bytes(redisConn.Do("get", dimsCachekey))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if redisErr == nil && len(dimsBytes) != 0 {
 | 
						if redisErr == nil && len(dimsBytes) != 0 {
 | 
				
			||||||
		jsonErr := json.Unmarshal(dimsBytes, &dims)
 | 
							dimsCache,err:=util.GzipUnCompressByte(dimsBytes)
 | 
				
			||||||
		if jsonErr == nil {
 | 
							if err==nil{
 | 
				
			||||||
			return
 | 
								jsonErr := json.Unmarshal(dimsCache, &dims)
 | 
				
			||||||
		} else {
 | 
								if jsonErr == nil {
 | 
				
			||||||
			logs.Logger.Error("jsonErr", zap.Error(jsonErr))
 | 
									dimsCacheMap.Store(dimsCachekey,dims)
 | 
				
			||||||
 | 
									return dims,err
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									logs.Logger.Error("jsonErr", zap.Error(jsonErr))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								logs.Logger.Error("GzipUnCompressByte Err", zap.Error(err))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		logs.Logger.Error("redisErr", zap.Error(redisErr))
 | 
							logs.Logger.Error("redisErr", zap.Error(redisErr))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -66,7 +104,7 @@ func GetDims(database, table string, excludedColumns []string, conn *sqlx.DB) (d
 | 
				
			|||||||
	var rs *sql.Rows
 | 
						var rs *sql.Rows
 | 
				
			||||||
	if rs, err = conn.Query(fmt.Sprintf(selectSQLTemplate, database, table)); err != nil {
 | 
						if rs, err = conn.Query(fmt.Sprintf(selectSQLTemplate, database, table)); err != nil {
 | 
				
			||||||
		err = errors.Wrapf(err, "")
 | 
							err = errors.Wrapf(err, "")
 | 
				
			||||||
		return
 | 
							return dims,err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer rs.Close()
 | 
						defer rs.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -74,7 +112,7 @@ func GetDims(database, table string, excludedColumns []string, conn *sqlx.DB) (d
 | 
				
			|||||||
	for rs.Next() {
 | 
						for rs.Next() {
 | 
				
			||||||
		if err = rs.Scan(&name, &typ, &defaultKind); err != nil {
 | 
							if err = rs.Scan(&name, &typ, &defaultKind); err != nil {
 | 
				
			||||||
			err = errors.Wrapf(err, "")
 | 
								err = errors.Wrapf(err, "")
 | 
				
			||||||
			return
 | 
								return dims,err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		typ = lowCardinalityRegexp.ReplaceAllString(typ, "$1")
 | 
							typ = lowCardinalityRegexp.ReplaceAllString(typ, "$1")
 | 
				
			||||||
		if !util.InstrArr(excludedColumns, name) && defaultKind != "MATERIALIZED" {
 | 
							if !util.InstrArr(excludedColumns, name) && defaultKind != "MATERIALIZED" {
 | 
				
			||||||
@ -84,14 +122,18 @@ func GetDims(database, table string, excludedColumns []string, conn *sqlx.DB) (d
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	if len(dims) == 0 {
 | 
						if len(dims) == 0 {
 | 
				
			||||||
		err = errors.Wrapf(ErrTblNotExist, "%s.%s", database, table)
 | 
							err = errors.Wrapf(ErrTblNotExist, "%s.%s", database, table)
 | 
				
			||||||
		return
 | 
							return dims,err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						dimsCacheMap.Store(dimsCachekey,dims)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res, _ := json.Marshal(dims)
 | 
						res, _ := json.Marshal(dims)
 | 
				
			||||||
 | 
						s,err:=util.GzipCompressByte(res)
 | 
				
			||||||
 | 
						if err!=nil{
 | 
				
			||||||
 | 
							return dims,err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err = redisConn.Do("SETEX", dimsCachekey, 60*60*6, s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err = redisConn.Do("SETEX", dimsCachekey, 60*60*6, res)
 | 
						return dims,err
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetSourceName(name string) (sourcename string) {
 | 
					func GetSourceName(name string) (sourcename string) {
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,17 @@ import (
 | 
				
			|||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GzipCompressByte(data []byte) ([]byte, error) {
 | 
				
			||||||
 | 
						buf := bytes.NewBuffer(nil)
 | 
				
			||||||
 | 
						gzW := gzip.NewWriter(buf)
 | 
				
			||||||
 | 
						_, err := gzW.Write(data)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						gzW.Close()
 | 
				
			||||||
 | 
						return buf.Bytes(), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GzipCompress(data string) ([]byte, error) {
 | 
					func GzipCompress(data string) ([]byte, error) {
 | 
				
			||||||
	buf := bytes.NewBuffer(nil)
 | 
						buf := bytes.NewBuffer(nil)
 | 
				
			||||||
	gzW := gzip.NewWriter(buf)
 | 
						gzW := gzip.NewWriter(buf)
 | 
				
			||||||
@ -25,3 +36,12 @@ func GzipUnCompress(data []byte) (string, error) {
 | 
				
			|||||||
	b, err := ioutil.ReadAll(gzR)
 | 
						b, err := ioutil.ReadAll(gzR)
 | 
				
			||||||
	return Bytes2str(b), err
 | 
						return Bytes2str(b), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GzipUnCompressByte(data []byte) ([]byte, error) {
 | 
				
			||||||
 | 
						gzR, err := gzip.NewReader(bytes.NewReader(data))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b, err := ioutil.ReadAll(gzR)
 | 
				
			||||||
 | 
						return b, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user