| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026 | package restfulimport (	"database/sql"	"errors"	"fmt"	"math"	"strconv"	"strings"	"time"	"unsafe"	"tmr-watch/conf/setting"	_ "github.com/denisenkom/go-mssqldb"	_ "github.com/go-sql-driver/mysql"	"github.com/patrickmn/go-cache"	"github.com/tealeg/xlsx"	"github.com/xormplus/xorm")var (	Engine          *xorm.Engine	SqlServerEngine *xorm.Engine	Apisql_cache    *cache.Cache)func SQLT() *xorm.Session {	tx := Engine.NewSession()	return tx}// SQLInit 初始化数据库操作句柄,这里要提供:// driverName string: 数据库类型,例如mysql、sqlite等,参考github.com/go-sql-driver/mysql官方介绍// dataSourceName string: 数据库地址,参考github.com/go-sql-driver/mysql官方介绍// MaxOpenConns int: 最大缓存连接数,这个数值包含了MaxIdleConns// MaxIdleConns int:预备的最大空闲连接数func SQLInit(driverName, dataSourceName string, maxOpenConns, maxIdleConns int, showlog bool) error {	if Engine == nil {		var err error		if Engine, err = xorm.NewEngine(driverName, dataSourceName); err != nil {			return err		}		if showlog {			Engine.ShowSQL(true)		}		Engine.SetMaxIdleConns(maxIdleConns)		Engine.SetMaxOpenConns(maxOpenConns)	}	if Apisql_cache == nil {		Apisql_cache = cache.New(600*time.Second, 10*time.Second)		SetCacheSql()	}	if SqlServerEngine == nil && setting.SQlserverSetting.Host != "" {		// setting.SQlserverSetting.Host = "server=192.168.1.152\\MYSQL;user id=sa;password=1;database=SysData;encrypt=disable"		sqlserverSourceName := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;encrypt=disable", setting.SQlserverSetting.Host,			setting.SQlserverSetting.User, setting.SQlserverSetting.Password, setting.SQlserverSetting.Name)		var err error		fmt.Println(1, sqlserverSourceName)		SqlServerEngine, err = xorm.NewEngine("mssql", sqlserverSourceName)		if err != nil {			fmt.Println(err, 3, sqlserverSourceName)			return err		}		if err = SqlServerEngine.Ping(); err != nil {			panic(err)		}		fmt.Println(2, sqlserverSourceName)		if showlog {			SqlServerEngine.ShowSQL(true)		}		SqlServerEngine.SetMaxIdleConns(maxIdleConns)		SqlServerEngine.SetMaxOpenConns(maxOpenConns)		// count1, err := SqlServerEngine.Table("PFGL").QueryString()		// fmt.Println(err, 4, count1)	}	return nil}func SetCacheSql() {	valuesMap, err := Engine.SQL("SELECT sqlname, CONCAT(sqlstr,'|',IFNULL(params,'')) AS sqlstr FROM apisql WHERE ENABLE>0 ").QueryString()	if err == nil && len(valuesMap) > 0 {		for _, v := range valuesMap {			Apisql_cache.Set(v["sqlname"], v["sqlstr"], cache.DefaultExpiration)		}	}}func sqlCheckParam(param string) error {	/*if strings.Contains(param, "where") {		return errors.New("can not have where")	}	if strings.Contains(param, "and") {		return errors.New("can not have and")	}	if strings.Contains(param, "or") {		return errors.New("can not have or")	}	if strings.Contains(param, "=") {		return errors.New("can not have =")	}*/	if strings.Contains(param, ";") {		return errors.New("can not have ;")	}	return nil}func GetSqlByName(name string, tx *xorm.Session) (string, string) {	sqls := ""	param := ""	if sql, ok := Apisql_cache.Get(name); ok {		tempstrb := strings.IndexAny(sql.(string), "|")		sqls = sql.(string)[0:tempstrb]		param = sql.(string)[tempstrb+1:]	} else {		valuesMap, err := tx.SQL("SELECT sqlstr, params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()		if err == nil && len(valuesMap) > 0 {			sqls = valuesMap[0]["sqlstr"]			param = valuesMap[0]["params"]			Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)		}	}	if setting.DatabaseSetting.ShowGetSqllog {		fmt.Println("apisql:" + sqls)		fmt.Println("param:" + param)	}	return sqls, param}func GetSqlByNameDB(name string) (string, string) {	sqls := ""	param := ""	if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {		tempstrb := strings.IndexAny(sql.(string), "|")		sqls = sql.(string)[0:tempstrb]		param = sql.(string)[tempstrb+1:]	} else {		valuesMap, err := Engine.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()		if err == nil && len(valuesMap) > 0 {			sqls = valuesMap[0]["sqlstr"]			param = valuesMap[0]["params"]			Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)		}	}	if setting.DatabaseSetting.ShowGetSqllog {		fmt.Println("apisql:" + sqls)		fmt.Println("param:" + param)	}	return sqls, param}func GetSqlByNameDBT(name string, tx *xorm.Session) (string, string) {	sqls := ""	param := ""	if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {		tempstrb := strings.IndexAny(sql.(string), "|")		sqls = sql.(string)[0:tempstrb]		param = sql.(string)[tempstrb+1:]	} else {		valuesMap, err := tx.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()		if err == nil && len(valuesMap) > 0 {			sqls = valuesMap[0]["sqlstr"]			param = valuesMap[0]["params"]			Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)		}	}	if setting.DatabaseSetting.ShowGetSqllog {		fmt.Println("apisql:" + sqls)		fmt.Println("param:" + param)	}	return sqls, param}// sqlGetValues 根据结构体中指向实际数据的指针获取出数据,并存储到另一张表中返回func sqlGetValues(pvs []interface{}, columnsType []*sql.ColumnType, columnsLen int) map[string]interface{} {	result := make(map[string]interface{}, columnsLen)	for a := 0; a < columnsLen; a++ {		switch s := pvs[a].(type) {		case *int8:			result[columnsType[a].Name()] = *s		case *int16:			result[columnsType[a].Name()] = *s		case *int32:			result[columnsType[a].Name()] = *s		case *int64:			result[columnsType[a].Name()] = *s		case *float32:			result[columnsType[a].Name()] = *s		case *float64:			result[columnsType[a].Name()] = *s		case *string:			result[columnsType[a].Name()] = *s		case *sql.NullInt64:			result[columnsType[a].Name()] = *s		case *sql.NullString:			result[columnsType[a].Name()] = *s		}	}	return result}// 这里返回的是原始数组的基础上加上了字段名标识func sqlQuery(columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) ([]map[string]interface{}, error) {	jsondata := make([]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		jsondata[k1] = sqlGetValues(v1, columnsType, columnsLen)	}	return jsondata, nil}func sqlQueryByTinyIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int8]map[string]interface{}, error) {	jsondata := make(map[int8]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*int8); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlQueryBySmallIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int16]map[string]interface{}, error) {	jsondata := make(map[int16]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*int16); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlQueryByIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int32]map[string]interface{}, error) {	jsondata := make(map[int32]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*int32); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlQueryByBigIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int64]map[string]interface{}, error) {	jsondata := make(map[int64]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*int64); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlQueryByFloatIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float32]map[string]interface{}, error) {	jsondata := make(map[float32]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*float32); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlQueryByDoubleMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float64]map[string]interface{}, error) {	jsondata := make(map[float64]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*float64); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlQueryByStringMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[string]map[string]interface{}, error) {	jsondata := make(map[string]map[string]interface{}, queryCount)	for k1, v1 := range queryData {		if k1 >= queryCount {			break		}		for a := 0; a < columnsLen; a++ {			if columnsType[a].Name() == columnName {				if value, ok := v1[a].(*string); ok {					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)				}				break			}		}	}	return jsondata, nil}func sqlGetColumnType(columnsType []*sql.ColumnType, columnsLen int, valueName string) string {	for a := 0; a < columnsLen; a++ {		if columnsType[a].Name() == valueName {			return columnsType[a].DatabaseTypeName()		}	}	return ""}func round(num float64) int {	return int(num + math.Copysign(0.5, num))}func toFixed(num float64, precision int) float64 {	output := math.Pow(10, float64(precision))	return float64(round(num*output)) / output}// QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回// columnName string: 作为索引的字段名称// sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"// where string: 过滤条件,就是where后面跟着的部分// order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序// offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count// count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是countfunc QueryByMap(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	recordcount := int64(0)	if count > 1 {		tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()		if err != nil {			fmt.Println("s1", err)			return nil, err		}		if tt == nil {			recordcount = 0		} else {			recordcount = tt[0]["count"].(int64)		}	}	queryData := make([]map[string]interface{}, 1)	var err error	if count == 0 {		queryData, err = Engine.SQL(sqlstr, params...).Query().List()	} else {		if count > 0 && offset > 0 {			offset = offset * count		}		queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()	}	//fmt.Println("count, offset==================",count, offset)	if err != nil {		return nil, err	}	if recordcount == 0 {		recordcount = int64(len(queryData))	}	data := make(map[string]interface{})	data["list"] = queryData	data["total"] = recordcount	data["code"] = 0	data["message"] = "ok"	if count > 0 {		data["pages"] = math.Ceil(float64(recordcount) / float64(count))		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))	}	data["pageSize"] = count	return data, nil}func QueryByMapT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	recordcount := int64(0)	if count > 1 {		tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()		if err != nil {			fmt.Println("s1", err)			return nil, err		}		if tt == nil {			recordcount = 0		} else {			switch tt[0]["count"].(type) {			case int64:				recordcount = tt[0]["count"].(int64)			case string:				temp, _ := strconv.Atoi(tt[0]["count"].(string))				recordcount = int64(temp)			}		}	}	queryData := make([]map[string]interface{}, 1)	var err error	if count == 0 {		queryData, err = tx.SQL(sqlstr, params...).Query().List()	} else {		if count > 0 && offset > 0 {			offset = offset * count		}		queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()	}	//fmt.Println("count, offset==================",count, offset)	if err != nil {		return nil, err	}	if recordcount == 0 {		recordcount = int64(len(queryData))	}	data := make(map[string]interface{})	data["list"] = queryData	data["total"] = recordcount	data["code"] = 0	data["message"] = "ok"	if count > 0 {		data["pages"] = math.Ceil(float64(recordcount) / float64(count))		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))	}	data["pageSize"] = count	return data, nil}// QueryByXlsx 将查询到的数据,按照指定字段的值做为索引构建map并返回// sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"// params string: 过滤条件,就是where后面跟着的部分func QueryByXlsx(sqlstr string, params []interface{}) (*xlsx.File, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return nil, err	}	rows, err := Engine.SQL(sqlstr, params...).QueryRows()	if err != nil {		return nil, err	}	defer rows.Close()	columnsType, _ := rows.ColumnTypes()	columnsLen := len(columnsType)	columns, _ := rows.Columns()	values := make([]interface{}, columnsLen)	valuePtrs := make([]interface{}, columnsLen)	var sheet *xlsx.Sheet	var row *xlsx.Row	var cell *xlsx.Cell	file := xlsx.NewFile()	sheet, err = file.AddSheet("Sheet1")	if err != nil {		fmt.Printf(err.Error())	}	row = sheet.AddRow()	for _, columnname := range columns {		cell = row.AddCell()		cell.Value = columnname	}	for rows.Next() {		for a := 0; a < columnsLen; a++ {			valuePtrs[a] = &values[a]		}		rows.Scan(valuePtrs...)		row = sheet.AddRow()		for i, _ := range columns {			var v interface{}			val := values[i]			b, ok := val.([]byte)			cell = row.AddCell()			if ok {				v1 := string(b)				switch columnsType[i].DatabaseTypeName() {				case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":					{						v, _ = strconv.ParseInt(v1, 10, 32)						cell.Value = fmt.Sprintf("%v", v)					}				case "FLOAT", "DOUBLE", "DECIMAL":					{						cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1						v2, _ := strconv.ParseFloat(v1, 32)						v = toFixed(v2, cindex)						cell.Value = fmt.Sprintf("%v", v)					}				case "BOOL":					{						v, _ = strconv.ParseBool(v1)						cell.Value = fmt.Sprintf("%v", v)					}				default:					{						v = v1						cell.Value = fmt.Sprintf("%v", v)					}				}			} else {				v = val				cell.Value = fmt.Sprintf("%v", v)			}			if cell.Value == "<nil>" {				cell.Value = ""			}		}	}	return file, nil}// QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回// columnName string: 作为索引的字段名称// sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"// where string: 过滤条件,就是where后面跟着的部分// order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序// offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count// count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是countfunc QueryByMapMenu(sqlstr string, offset, count int, params []interface{}) ([]map[string]interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return nil, err	}	if offset < 0 {		offset = 0	}	if count <= 0 {		count = 0	}	if count > 0 {		sqlstr += " limit " + strconv.Itoa(offset) + "," + strconv.Itoa(count)	}	rows, err := Engine.SQL(sqlstr, params...).QueryRows()	if err != nil {		return nil, err	}	defer rows.Close()	columnsType, _ := rows.ColumnTypes()	columnsLen := len(columnsType)	columns, _ := rows.Columns()	queryData := make([]map[string]interface{}, 0)	values := make([]interface{}, columnsLen)	valuePtrs := make([]interface{}, columnsLen)	for rows.Next() {		for a := 0; a < columnsLen; a++ {			valuePtrs[a] = &values[a]		}		rows.Scan(valuePtrs...)		entry := make(map[string]interface{})		for i, col := range columns {			entry[col] = getValue(values[i], columnsType[i].DatabaseTypeName())		}		queryData = append(queryData, entry)	}	data := queryData	return data, nil	//return Engine.SQL(sqlstr, params...).Query().List()}func QueryByList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	if count == 0 {		count = 1000	}	recordcount := int64(0)	if count > 1 {		tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()		if err != nil {			return nil, err		}		recordcount = tt[0]["count"].(int64)	}	queryData := make([]map[string]interface{}, 1)	var err error	if count == 0 {		queryData, err = Engine.SQL(sqlstr, params...).Query().List()	} else {		if count > 0 && offset > 0 {			offset = offset * count		}		queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()	}	if err != nil {		return nil, err	}	columnsname := make([]string, 0)	listdata := make(map[string][]interface{})	if len(queryData) > 0 {		for i, _ := range queryData {			if i == 0 {				for i, _ := range queryData[0] {					columnsname = append(columnsname, i)				}			}			for _, v := range columnsname {				listdata[v] = append(listdata[v], queryData[i][v])			}		}		recordcount = int64(len(queryData))	}	data := make(map[string]interface{})	data["lists"] = listdata	//data["columnsname"] = columnsname	data["total"] = recordcount	data["code"] = 0	data["message"] = "ok"	if count > 0 {		data["pages"] = math.Ceil(float64(recordcount) / float64(count))		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))	}	data["pageSize"] = count	return data, nil}func QueryByListList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	if count == 0 {		count = 1000	}	recordcount := int64(0)	if count > 1 {		tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()		if err != nil {			return nil, err		}		recordcount = tt[0]["count"].(int64)	}	queryData := make([]map[string]interface{}, 1)	var err error	if count == 0 {		queryData, err = Engine.SQL(sqlstr, params...).Query().List()	} else {		if count > 0 && offset > 0 {			offset = offset * count		}		queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()	}	if err != nil {		return nil, err	}	columnsname := make([]string, 0)	listdata := make([]interface{}, 0)	if len(queryData) > 0 {		for i, _ := range queryData {			if i == 0 {				for i, _ := range queryData[0] {					columnsname = append(columnsname, i)				}			}			listdatarow := make([]interface{}, 0)			for _, v := range columnsname {				listdatarow = append(listdatarow, queryData[i][v])			}			listdata = append(listdata, listdatarow)		}		recordcount = int64(len(queryData))	}	data := make(map[string]interface{})	data["list"] = listdata	data["columnsname"] = columnsname	data["total"] = recordcount	data["code"] = 0	data["message"] = "ok"	if count > 0 {		data["pages"] = math.Ceil(float64(recordcount) / float64(count))		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))	}	data["pageSize"] = count	return data, nil}func QueryByListT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	if count == 0 {		count = 1000	}	recordcount := int64(0)	if count > 1 {		tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()		if err != nil {			return nil, err		}		switch tt[0]["count"].(type) {		case int64:			recordcount = tt[0]["count"].(int64)		case string:			temp, _ := strconv.Atoi(tt[0]["count"].(string))			recordcount = int64(temp)		}	}	queryData := make([]map[string]interface{}, 1)	var err error	if count == 0 {		queryData, err = tx.SQL(sqlstr, params...).Query().List()	} else {		if count > 0 && offset > 0 {			offset = offset * count		}		queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()	}	if err != nil {		return nil, err	}	columnsname := make([]string, 0)	listdata := make(map[string][]interface{})	if len(queryData) > 0 {		for i, _ := range queryData {			if i == 0 {				for i, _ := range queryData[0] {					columnsname = append(columnsname, i)				}			}			for _, v := range columnsname {				listdata[v] = append(listdata[v], queryData[i][v])			}		}		recordcount = int64(len(queryData))	}	data := make(map[string]interface{})	data["lists"] = listdata	//data["columnsname"] = columnsname	data["total"] = recordcount	data["code"] = 0	data["message"] = "ok"	if count > 0 {		data["pages"] = math.Ceil(float64(recordcount) / float64(count))		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))	}	data["pageSize"] = count	return data, nil}func QueryByListListT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	if count == 0 {		count = 1000	}	recordcount := int64(0)	if count > 1 {		tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()		if err != nil {			return nil, err		}		switch tt[0]["count"].(type) {		case int64:			recordcount = tt[0]["count"].(int64)		case string:			temp, _ := strconv.Atoi(tt[0]["count"].(string))			recordcount = int64(temp)		}	}	queryData := make([]map[string]interface{}, 1)	var err error	if count == 0 {		queryData, err = tx.SQL(sqlstr, params...).Query().List()	} else {		if count > 0 && offset > 0 {			offset = offset * count		}		queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()	}	if err != nil {		return nil, err	}	columnsname := make([]string, 0)	listdata := make([]interface{}, 0)	if len(queryData) > 0 {		for i, _ := range queryData {			if i == 0 {				for i, _ := range queryData[0] {					columnsname = append(columnsname, i)				}			}			listdatarow := make([]interface{}, 0)			for _, v := range columnsname {				listdatarow = append(listdatarow, queryData[i][v])			}			listdata = append(listdata, listdatarow)		}		recordcount = int64(len(queryData))	}	data := make(map[string]interface{})	data["list"] = listdata	data["columnsname"] = columnsname	data["total"] = recordcount	data["code"] = 0	data["message"] = "ok"	if count > 0 {		data["pages"] = math.Ceil(float64(recordcount) / float64(count))		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))	}	data["pageSize"] = count	return data, nil}func ExecQuery(sqlstr string, params []interface{}) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	rows, err := Engine.SQL(sqlstr, params...).Execute()	if err != nil {		return nil, err	}	data := make(map[string]interface{})	LastInsertId, _ := rows.LastInsertId()	idPointer := (*int)(unsafe.Pointer(&LastInsertId))	idd16 := *idPointer	RowsAffected, _ := rows.RowsAffected()	_idPointer := (*int)(unsafe.Pointer(&RowsAffected))	_idd16 := *_idPointer	data["result"] = rows	data["LastInsertId"] = idd16	data["RowsAffected"] = _idd16	return data, nil}func ExecQueryT(sqlstr string, params []interface{}, tx *xorm.Session) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	rows, err := tx.SQL(sqlstr, params...).Execute()	if err != nil {		fmt.Println("exe", err)		return nil, err	}	LastInsertId, err := rows.LastInsertId()	idPointer := (*int)(unsafe.Pointer(&LastInsertId))	idd16 := *idPointer	data := make(map[string]interface{})	RowsAffected, _ := rows.RowsAffected()	_idPointer := (*int)(unsafe.Pointer(&RowsAffected))	_idd16 := *_idPointer	data["LastInsertId"] = strconv.Itoa(idd16)	data["LastInsertIdStr"] = idd16	data["RowsAffected"] = _idd16	data["result"] = rows	return data, nil}func ExecQuerys(sqlstr string, params []interface{}) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	/*for i, v := range params{		_, err := dbs.Exec(sqlstr, v[i]...)		if err != nil {			return nil, err		}	}	*/	data := make(map[string]interface{})	data["result"] = nil	return data, nil}func getValue(value interface{}, CT string) interface{} {	var v interface{}	val := value	b, ok := val.([]byte)	if ok {		v1 := string(b)		switch CT {		case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":			{				v, _ = strconv.ParseInt(v1, 10, 32)			}		case "FLOAT", "DOUBLE", "DECIMAL":			{				cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1				v2, _ := strconv.ParseFloat(v1, 32)				v = toFixed(v2, cindex)			}		case "BOOL":			{				v, _ = strconv.ParseBool(v1)			}		default:			{				v = v1			}		}	} else {		v = val	}	return v}func ExecQueryList(sqlstr string, params []interface{}) (interface{}, error) {	if err := sqlCheckParam(sqlstr); err != nil {		return 0, err	}	rows, err := Engine.SQL(sqlstr, params...).QueryString()	if err != nil {		return nil, err	}	data := make(map[string]interface{})	for _, item := range rows {		data["result"] = item	}	return data, nil}
 |