sql_utils.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. package restful
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "math"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "unsafe"
  11. "tmr-watch/conf/setting"
  12. _ "github.com/denisenkom/go-mssqldb"
  13. _ "github.com/go-sql-driver/mysql"
  14. "github.com/patrickmn/go-cache"
  15. "github.com/tealeg/xlsx"
  16. "github.com/xormplus/xorm"
  17. )
  18. var (
  19. Engine *xorm.Engine
  20. SqlServerEngine *xorm.Engine
  21. Apisql_cache *cache.Cache
  22. )
  23. func SQLT() *xorm.Session {
  24. tx := Engine.NewSession()
  25. return tx
  26. }
  27. // SQLInit 初始化数据库操作句柄,这里要提供:
  28. // driverName string: 数据库类型,例如mysql、sqlite等,参考github.com/go-sql-driver/mysql官方介绍
  29. // dataSourceName string: 数据库地址,参考github.com/go-sql-driver/mysql官方介绍
  30. // MaxOpenConns int: 最大缓存连接数,这个数值包含了MaxIdleConns
  31. // MaxIdleConns int:预备的最大空闲连接数
  32. func SQLInit(driverName, dataSourceName string, maxOpenConns, maxIdleConns int, showlog bool) error {
  33. if Engine == nil {
  34. var err error
  35. if Engine, err = xorm.NewEngine(driverName, dataSourceName); err != nil {
  36. return err
  37. }
  38. if showlog {
  39. Engine.ShowSQL(true)
  40. }
  41. Engine.SetMaxIdleConns(maxIdleConns)
  42. Engine.SetMaxOpenConns(maxOpenConns)
  43. }
  44. if Apisql_cache == nil {
  45. Apisql_cache = cache.New(600*time.Second, 10*time.Second)
  46. SetCacheSql()
  47. }
  48. if SqlServerEngine == nil && setting.SQlserverSetting.Host != "" {
  49. // setting.SQlserverSetting.Host = "server=192.168.1.152\\MYSQL;user id=sa;password=1;database=SysData;encrypt=disable"
  50. sqlserverSourceName := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;encrypt=disable", setting.SQlserverSetting.Host,
  51. setting.SQlserverSetting.User, setting.SQlserverSetting.Password, setting.SQlserverSetting.Name)
  52. var err error
  53. fmt.Println(1, sqlserverSourceName)
  54. SqlServerEngine, err = xorm.NewEngine("mssql", sqlserverSourceName)
  55. if err != nil {
  56. fmt.Println(err, 3, sqlserverSourceName)
  57. return err
  58. }
  59. if err = SqlServerEngine.Ping(); err != nil {
  60. panic(err)
  61. }
  62. fmt.Println(2, sqlserverSourceName)
  63. if showlog {
  64. SqlServerEngine.ShowSQL(true)
  65. }
  66. SqlServerEngine.SetMaxIdleConns(maxIdleConns)
  67. SqlServerEngine.SetMaxOpenConns(maxOpenConns)
  68. // count1, err := SqlServerEngine.Table("PFGL").QueryString()
  69. // fmt.Println(err, 4, count1)
  70. }
  71. return nil
  72. }
  73. func SetCacheSql() {
  74. valuesMap, err := Engine.SQL("SELECT sqlname, CONCAT(sqlstr,'|',IFNULL(params,'')) AS sqlstr FROM apisql WHERE ENABLE>0 ").QueryString()
  75. if err == nil && len(valuesMap) > 0 {
  76. for _, v := range valuesMap {
  77. Apisql_cache.Set(v["sqlname"], v["sqlstr"], cache.DefaultExpiration)
  78. }
  79. }
  80. }
  81. func sqlCheckParam(param string) error {
  82. /*if strings.Contains(param, "where") {
  83. return errors.New("can not have where")
  84. }
  85. if strings.Contains(param, "and") {
  86. return errors.New("can not have and")
  87. }
  88. if strings.Contains(param, "or") {
  89. return errors.New("can not have or")
  90. }
  91. if strings.Contains(param, "=") {
  92. return errors.New("can not have =")
  93. }*/
  94. if strings.Contains(param, ";") {
  95. return errors.New("can not have ;")
  96. }
  97. return nil
  98. }
  99. func GetSqlByName(name string, tx *xorm.Session) (string, string) {
  100. sqls := ""
  101. param := ""
  102. if sql, ok := Apisql_cache.Get(name); ok {
  103. tempstrb := strings.IndexAny(sql.(string), "|")
  104. sqls = sql.(string)[0:tempstrb]
  105. param = sql.(string)[tempstrb+1:]
  106. } else {
  107. valuesMap, err := tx.SQL("SELECT sqlstr, params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()
  108. if err == nil && len(valuesMap) > 0 {
  109. sqls = valuesMap[0]["sqlstr"]
  110. param = valuesMap[0]["params"]
  111. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  112. }
  113. }
  114. if setting.DatabaseSetting.ShowGetSqllog {
  115. fmt.Println("apisql:" + sqls)
  116. fmt.Println("param:" + param)
  117. }
  118. return sqls, param
  119. }
  120. func GetSqlByNameDB(name string) (string, string) {
  121. sqls := ""
  122. param := ""
  123. if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {
  124. tempstrb := strings.IndexAny(sql.(string), "|")
  125. sqls = sql.(string)[0:tempstrb]
  126. param = sql.(string)[tempstrb+1:]
  127. } else {
  128. valuesMap, err := Engine.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()
  129. if err == nil && len(valuesMap) > 0 {
  130. sqls = valuesMap[0]["sqlstr"]
  131. param = valuesMap[0]["params"]
  132. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  133. }
  134. }
  135. if setting.DatabaseSetting.ShowGetSqllog {
  136. fmt.Println("apisql:" + sqls)
  137. fmt.Println("param:" + param)
  138. }
  139. return sqls, param
  140. }
  141. func GetSqlByNameDBT(name string, tx *xorm.Session) (string, string) {
  142. sqls := ""
  143. param := ""
  144. if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {
  145. tempstrb := strings.IndexAny(sql.(string), "|")
  146. sqls = sql.(string)[0:tempstrb]
  147. param = sql.(string)[tempstrb+1:]
  148. } else {
  149. valuesMap, err := tx.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()
  150. if err == nil && len(valuesMap) > 0 {
  151. sqls = valuesMap[0]["sqlstr"]
  152. param = valuesMap[0]["params"]
  153. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  154. }
  155. }
  156. if setting.DatabaseSetting.ShowGetSqllog {
  157. fmt.Println("apisql:" + sqls)
  158. fmt.Println("param:" + param)
  159. }
  160. return sqls, param
  161. }
  162. // sqlGetValues 根据结构体中指向实际数据的指针获取出数据,并存储到另一张表中返回
  163. func sqlGetValues(pvs []interface{}, columnsType []*sql.ColumnType, columnsLen int) map[string]interface{} {
  164. result := make(map[string]interface{}, columnsLen)
  165. for a := 0; a < columnsLen; a++ {
  166. switch s := pvs[a].(type) {
  167. case *int8:
  168. result[columnsType[a].Name()] = *s
  169. case *int16:
  170. result[columnsType[a].Name()] = *s
  171. case *int32:
  172. result[columnsType[a].Name()] = *s
  173. case *int64:
  174. result[columnsType[a].Name()] = *s
  175. case *float32:
  176. result[columnsType[a].Name()] = *s
  177. case *float64:
  178. result[columnsType[a].Name()] = *s
  179. case *string:
  180. result[columnsType[a].Name()] = *s
  181. case *sql.NullInt64:
  182. result[columnsType[a].Name()] = *s
  183. case *sql.NullString:
  184. result[columnsType[a].Name()] = *s
  185. }
  186. }
  187. return result
  188. }
  189. // 这里返回的是原始数组的基础上加上了字段名标识
  190. func sqlQuery(columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) ([]map[string]interface{}, error) {
  191. jsondata := make([]map[string]interface{}, queryCount)
  192. for k1, v1 := range queryData {
  193. if k1 >= queryCount {
  194. break
  195. }
  196. jsondata[k1] = sqlGetValues(v1, columnsType, columnsLen)
  197. }
  198. return jsondata, nil
  199. }
  200. func sqlQueryByTinyIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int8]map[string]interface{}, error) {
  201. jsondata := make(map[int8]map[string]interface{}, queryCount)
  202. for k1, v1 := range queryData {
  203. if k1 >= queryCount {
  204. break
  205. }
  206. for a := 0; a < columnsLen; a++ {
  207. if columnsType[a].Name() == columnName {
  208. if value, ok := v1[a].(*int8); ok {
  209. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  210. }
  211. break
  212. }
  213. }
  214. }
  215. return jsondata, nil
  216. }
  217. func sqlQueryBySmallIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int16]map[string]interface{}, error) {
  218. jsondata := make(map[int16]map[string]interface{}, queryCount)
  219. for k1, v1 := range queryData {
  220. if k1 >= queryCount {
  221. break
  222. }
  223. for a := 0; a < columnsLen; a++ {
  224. if columnsType[a].Name() == columnName {
  225. if value, ok := v1[a].(*int16); ok {
  226. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  227. }
  228. break
  229. }
  230. }
  231. }
  232. return jsondata, nil
  233. }
  234. func sqlQueryByIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int32]map[string]interface{}, error) {
  235. jsondata := make(map[int32]map[string]interface{}, queryCount)
  236. for k1, v1 := range queryData {
  237. if k1 >= queryCount {
  238. break
  239. }
  240. for a := 0; a < columnsLen; a++ {
  241. if columnsType[a].Name() == columnName {
  242. if value, ok := v1[a].(*int32); ok {
  243. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  244. }
  245. break
  246. }
  247. }
  248. }
  249. return jsondata, nil
  250. }
  251. func sqlQueryByBigIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int64]map[string]interface{}, error) {
  252. jsondata := make(map[int64]map[string]interface{}, queryCount)
  253. for k1, v1 := range queryData {
  254. if k1 >= queryCount {
  255. break
  256. }
  257. for a := 0; a < columnsLen; a++ {
  258. if columnsType[a].Name() == columnName {
  259. if value, ok := v1[a].(*int64); ok {
  260. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  261. }
  262. break
  263. }
  264. }
  265. }
  266. return jsondata, nil
  267. }
  268. func sqlQueryByFloatIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float32]map[string]interface{}, error) {
  269. jsondata := make(map[float32]map[string]interface{}, queryCount)
  270. for k1, v1 := range queryData {
  271. if k1 >= queryCount {
  272. break
  273. }
  274. for a := 0; a < columnsLen; a++ {
  275. if columnsType[a].Name() == columnName {
  276. if value, ok := v1[a].(*float32); ok {
  277. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  278. }
  279. break
  280. }
  281. }
  282. }
  283. return jsondata, nil
  284. }
  285. func sqlQueryByDoubleMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float64]map[string]interface{}, error) {
  286. jsondata := make(map[float64]map[string]interface{}, queryCount)
  287. for k1, v1 := range queryData {
  288. if k1 >= queryCount {
  289. break
  290. }
  291. for a := 0; a < columnsLen; a++ {
  292. if columnsType[a].Name() == columnName {
  293. if value, ok := v1[a].(*float64); ok {
  294. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  295. }
  296. break
  297. }
  298. }
  299. }
  300. return jsondata, nil
  301. }
  302. func sqlQueryByStringMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[string]map[string]interface{}, error) {
  303. jsondata := make(map[string]map[string]interface{}, queryCount)
  304. for k1, v1 := range queryData {
  305. if k1 >= queryCount {
  306. break
  307. }
  308. for a := 0; a < columnsLen; a++ {
  309. if columnsType[a].Name() == columnName {
  310. if value, ok := v1[a].(*string); ok {
  311. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  312. }
  313. break
  314. }
  315. }
  316. }
  317. return jsondata, nil
  318. }
  319. func sqlGetColumnType(columnsType []*sql.ColumnType, columnsLen int, valueName string) string {
  320. for a := 0; a < columnsLen; a++ {
  321. if columnsType[a].Name() == valueName {
  322. return columnsType[a].DatabaseTypeName()
  323. }
  324. }
  325. return ""
  326. }
  327. func round(num float64) int {
  328. return int(num + math.Copysign(0.5, num))
  329. }
  330. func toFixed(num float64, precision int) float64 {
  331. output := math.Pow(10, float64(precision))
  332. return float64(round(num*output)) / output
  333. }
  334. // QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
  335. // columnName string: 作为索引的字段名称
  336. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  337. // where string: 过滤条件,就是where后面跟着的部分
  338. // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
  339. // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  340. // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  341. func QueryByMap(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  342. if err := sqlCheckParam(sqlstr); err != nil {
  343. return 0, err
  344. }
  345. recordcount := int64(0)
  346. if count > 1 {
  347. tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  348. if err != nil {
  349. fmt.Println("s1", err)
  350. return nil, err
  351. }
  352. if tt == nil {
  353. recordcount = 0
  354. } else {
  355. recordcount = tt[0]["count"].(int64)
  356. }
  357. }
  358. queryData := make([]map[string]interface{}, 1)
  359. var err error
  360. if count == 0 {
  361. queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  362. } else {
  363. if count > 0 && offset > 0 {
  364. offset = offset * count
  365. }
  366. queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  367. }
  368. //fmt.Println("count, offset==================",count, offset)
  369. if err != nil {
  370. return nil, err
  371. }
  372. if recordcount == 0 {
  373. recordcount = int64(len(queryData))
  374. }
  375. data := make(map[string]interface{})
  376. data["list"] = queryData
  377. data["total"] = recordcount
  378. data["code"] = 0
  379. data["message"] = "ok"
  380. if count > 0 {
  381. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  382. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  383. }
  384. data["pageSize"] = count
  385. return data, nil
  386. }
  387. func QueryByMapT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {
  388. if err := sqlCheckParam(sqlstr); err != nil {
  389. return 0, err
  390. }
  391. recordcount := int64(0)
  392. firstPos := strings.IndexByte(sqlstr, '?')
  393. if count > 1 {
  394. var params1 []interface{}
  395. if firstPos != -1 {
  396. for i, a :=range params{
  397. if i== 2 {
  398. params1 = append(params1,0)
  399. } else if i == 3 {
  400. params1 = append(params1,99999)
  401. }else{
  402. params1 = append(params1,a)
  403. }
  404. }
  405. tt, err := tx.SQL("select count(1) count from bar where pastureid = ? and enable=1 ", params1[0]).Query().List()
  406. if err != nil {
  407. fmt.Println("s1", err)
  408. return nil, err
  409. }
  410. if tt == nil {
  411. recordcount = 0
  412. } else {
  413. switch tt[0]["count"].(type) {
  414. case int64:
  415. recordcount = tt[0]["count"].(int64)
  416. case string:
  417. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  418. recordcount = int64(temp)
  419. }
  420. }
  421. }else{
  422. // params1 = append(params1, params...)
  423. tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  424. if err != nil {
  425. fmt.Println("s1", err)
  426. return nil, err
  427. }
  428. if tt == nil {
  429. recordcount = 0
  430. } else {
  431. switch tt[0]["count"].(type) {
  432. case int64:
  433. recordcount = tt[0]["count"].(int64)
  434. case string:
  435. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  436. recordcount = int64(temp)
  437. }
  438. }
  439. }
  440. }
  441. queryData := make([]map[string]interface{}, 1)
  442. var err error
  443. if count == 0 ||firstPos > 0 {
  444. queryData, err = tx.SQL(sqlstr, params...).Query().List()
  445. } else {
  446. if count > 0 && offset > 0 {
  447. offset = offset * count
  448. }
  449. queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  450. }
  451. //fmt.Println("count, offset==================",count, offset)
  452. if err != nil {
  453. return nil, err
  454. }
  455. if recordcount == 0 {
  456. recordcount = int64(len(queryData))
  457. }
  458. data := make(map[string]interface{})
  459. data["list"] = queryData
  460. data["total"] = recordcount
  461. data["code"] = 0
  462. data["message"] = "ok"
  463. if count > 0 {
  464. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  465. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  466. }
  467. data["pageSize"] = count
  468. return data, nil
  469. }
  470. // QueryByXlsx 将查询到的数据,按照指定字段的值做为索引构建map并返回
  471. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  472. // params string: 过滤条件,就是where后面跟着的部分
  473. func QueryByXlsx(sqlstr string, params []interface{}) (*xlsx.File, error) {
  474. if err := sqlCheckParam(sqlstr); err != nil {
  475. return nil, err
  476. }
  477. rows, err := Engine.SQL(sqlstr, params...).QueryRows()
  478. if err != nil {
  479. return nil, err
  480. }
  481. defer rows.Close()
  482. columnsType, _ := rows.ColumnTypes()
  483. columnsLen := len(columnsType)
  484. columns, _ := rows.Columns()
  485. values := make([]interface{}, columnsLen)
  486. valuePtrs := make([]interface{}, columnsLen)
  487. var sheet *xlsx.Sheet
  488. var row *xlsx.Row
  489. var cell *xlsx.Cell
  490. file := xlsx.NewFile()
  491. sheet, err = file.AddSheet("Sheet1")
  492. if err != nil {
  493. fmt.Printf(err.Error())
  494. }
  495. row = sheet.AddRow()
  496. for _, columnname := range columns {
  497. cell = row.AddCell()
  498. cell.Value = columnname
  499. }
  500. for rows.Next() {
  501. for a := 0; a < columnsLen; a++ {
  502. valuePtrs[a] = &values[a]
  503. }
  504. rows.Scan(valuePtrs...)
  505. row = sheet.AddRow()
  506. for i, _ := range columns {
  507. var v interface{}
  508. val := values[i]
  509. b, ok := val.([]byte)
  510. cell = row.AddCell()
  511. if ok {
  512. v1 := string(b)
  513. switch columnsType[i].DatabaseTypeName() {
  514. case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
  515. {
  516. v, _ = strconv.ParseInt(v1, 10, 32)
  517. cell.Value = fmt.Sprintf("%v", v)
  518. }
  519. case "FLOAT", "DOUBLE", "DECIMAL":
  520. {
  521. cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
  522. v2, _ := strconv.ParseFloat(v1, 32)
  523. v = toFixed(v2, cindex)
  524. cell.Value = fmt.Sprintf("%v", v)
  525. }
  526. case "BOOL":
  527. {
  528. v, _ = strconv.ParseBool(v1)
  529. cell.Value = fmt.Sprintf("%v", v)
  530. }
  531. default:
  532. {
  533. v = v1
  534. cell.Value = fmt.Sprintf("%v", v)
  535. }
  536. }
  537. } else {
  538. v = val
  539. cell.Value = fmt.Sprintf("%v", v)
  540. }
  541. if cell.Value == "<nil>" {
  542. cell.Value = ""
  543. }
  544. }
  545. }
  546. return file, nil
  547. }
  548. // QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
  549. // columnName string: 作为索引的字段名称
  550. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  551. // where string: 过滤条件,就是where后面跟着的部分
  552. // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
  553. // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  554. // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  555. func QueryByMapMenu(sqlstr string, offset, count int, params []interface{}) ([]map[string]interface{}, error) {
  556. if err := sqlCheckParam(sqlstr); err != nil {
  557. return nil, err
  558. }
  559. if offset < 0 {
  560. offset = 0
  561. }
  562. if count <= 0 {
  563. count = 0
  564. }
  565. if count > 0 {
  566. sqlstr += " limit " + strconv.Itoa(offset) + "," + strconv.Itoa(count)
  567. }
  568. rows, err := Engine.SQL(sqlstr, params...).QueryRows()
  569. if err != nil {
  570. return nil, err
  571. }
  572. defer rows.Close()
  573. columnsType, _ := rows.ColumnTypes()
  574. columnsLen := len(columnsType)
  575. columns, _ := rows.Columns()
  576. queryData := make([]map[string]interface{}, 0)
  577. values := make([]interface{}, columnsLen)
  578. valuePtrs := make([]interface{}, columnsLen)
  579. for rows.Next() {
  580. for a := 0; a < columnsLen; a++ {
  581. valuePtrs[a] = &values[a]
  582. }
  583. rows.Scan(valuePtrs...)
  584. entry := make(map[string]interface{})
  585. for i, col := range columns {
  586. entry[col] = getValue(values[i], columnsType[i].DatabaseTypeName())
  587. }
  588. queryData = append(queryData, entry)
  589. }
  590. data := queryData
  591. return data, nil
  592. //return Engine.SQL(sqlstr, params...).Query().List()
  593. }
  594. func QueryByList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  595. if err := sqlCheckParam(sqlstr); err != nil {
  596. return 0, err
  597. }
  598. if count == 0 {
  599. count = 1000
  600. }
  601. recordcount := int64(0)
  602. if count > 1 {
  603. tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  604. if err != nil {
  605. return nil, err
  606. }
  607. recordcount = tt[0]["count"].(int64)
  608. }
  609. queryData := make([]map[string]interface{}, 1)
  610. var err error
  611. if count == 0 {
  612. queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  613. } else {
  614. if count > 0 && offset > 0 {
  615. offset = offset * count
  616. }
  617. queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  618. }
  619. if err != nil {
  620. return nil, err
  621. }
  622. columnsname := make([]string, 0)
  623. listdata := make(map[string][]interface{})
  624. if len(queryData) > 0 {
  625. for i, _ := range queryData {
  626. if i == 0 {
  627. for i, _ := range queryData[0] {
  628. columnsname = append(columnsname, i)
  629. }
  630. }
  631. for _, v := range columnsname {
  632. listdata[v] = append(listdata[v], queryData[i][v])
  633. }
  634. }
  635. recordcount = int64(len(queryData))
  636. }
  637. data := make(map[string]interface{})
  638. data["lists"] = listdata
  639. //data["columnsname"] = columnsname
  640. data["total"] = recordcount
  641. data["code"] = 0
  642. data["message"] = "ok"
  643. if count > 0 {
  644. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  645. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  646. }
  647. data["pageSize"] = count
  648. return data, nil
  649. }
  650. func QueryByListList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  651. if err := sqlCheckParam(sqlstr); err != nil {
  652. return 0, err
  653. }
  654. if count == 0 {
  655. count = 1000
  656. }
  657. recordcount := int64(0)
  658. if count > 1 {
  659. tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  660. if err != nil {
  661. return nil, err
  662. }
  663. recordcount = tt[0]["count"].(int64)
  664. }
  665. queryData := make([]map[string]interface{}, 1)
  666. var err error
  667. if count == 0 {
  668. queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  669. } else {
  670. if count > 0 && offset > 0 {
  671. offset = offset * count
  672. }
  673. queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  674. }
  675. if err != nil {
  676. return nil, err
  677. }
  678. columnsname := make([]string, 0)
  679. listdata := make([]interface{}, 0)
  680. if len(queryData) > 0 {
  681. for i, _ := range queryData {
  682. if i == 0 {
  683. for i, _ := range queryData[0] {
  684. columnsname = append(columnsname, i)
  685. }
  686. }
  687. listdatarow := make([]interface{}, 0)
  688. for _, v := range columnsname {
  689. listdatarow = append(listdatarow, queryData[i][v])
  690. }
  691. listdata = append(listdata, listdatarow)
  692. }
  693. recordcount = int64(len(queryData))
  694. }
  695. data := make(map[string]interface{})
  696. data["list"] = listdata
  697. data["columnsname"] = columnsname
  698. data["total"] = recordcount
  699. data["code"] = 0
  700. data["message"] = "ok"
  701. if count > 0 {
  702. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  703. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  704. }
  705. data["pageSize"] = count
  706. return data, nil
  707. }
  708. func QueryByListT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {
  709. if err := sqlCheckParam(sqlstr); err != nil {
  710. return 0, err
  711. }
  712. if count == 0 {
  713. count = 1000
  714. }
  715. recordcount := int64(0)
  716. if count > 1 {
  717. tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  718. if err != nil {
  719. return nil, err
  720. }
  721. switch tt[0]["count"].(type) {
  722. case int64:
  723. recordcount = tt[0]["count"].(int64)
  724. case string:
  725. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  726. recordcount = int64(temp)
  727. }
  728. }
  729. queryData := make([]map[string]interface{}, 1)
  730. var err error
  731. if count == 0 {
  732. queryData, err = tx.SQL(sqlstr, params...).Query().List()
  733. } else {
  734. if count > 0 && offset > 0 {
  735. offset = offset * count
  736. }
  737. queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  738. }
  739. if err != nil {
  740. return nil, err
  741. }
  742. columnsname := make([]string, 0)
  743. listdata := make(map[string][]interface{})
  744. if len(queryData) > 0 {
  745. for i, _ := range queryData {
  746. if i == 0 {
  747. for i, _ := range queryData[0] {
  748. columnsname = append(columnsname, i)
  749. }
  750. }
  751. for _, v := range columnsname {
  752. listdata[v] = append(listdata[v], queryData[i][v])
  753. }
  754. }
  755. recordcount = int64(len(queryData))
  756. }
  757. data := make(map[string]interface{})
  758. data["lists"] = listdata
  759. //data["columnsname"] = columnsname
  760. data["total"] = recordcount
  761. data["code"] = 0
  762. data["message"] = "ok"
  763. if count > 0 {
  764. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  765. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  766. }
  767. data["pageSize"] = count
  768. return data, nil
  769. }
  770. func QueryByListListT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {
  771. if err := sqlCheckParam(sqlstr); err != nil {
  772. return 0, err
  773. }
  774. if count == 0 {
  775. count = 1000
  776. }
  777. recordcount := int64(0)
  778. if count > 1 {
  779. tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  780. if err != nil {
  781. return nil, err
  782. }
  783. switch tt[0]["count"].(type) {
  784. case int64:
  785. recordcount = tt[0]["count"].(int64)
  786. case string:
  787. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  788. recordcount = int64(temp)
  789. }
  790. }
  791. queryData := make([]map[string]interface{}, 1)
  792. var err error
  793. if count == 0 {
  794. queryData, err = tx.SQL(sqlstr, params...).Query().List()
  795. } else {
  796. if count > 0 && offset > 0 {
  797. offset = offset * count
  798. }
  799. queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  800. }
  801. if err != nil {
  802. return nil, err
  803. }
  804. columnsname := make([]string, 0)
  805. listdata := make([]interface{}, 0)
  806. if len(queryData) > 0 {
  807. for i, _ := range queryData {
  808. if i == 0 {
  809. for i, _ := range queryData[0] {
  810. columnsname = append(columnsname, i)
  811. }
  812. }
  813. listdatarow := make([]interface{}, 0)
  814. for _, v := range columnsname {
  815. listdatarow = append(listdatarow, queryData[i][v])
  816. }
  817. listdata = append(listdata, listdatarow)
  818. }
  819. recordcount = int64(len(queryData))
  820. }
  821. data := make(map[string]interface{})
  822. data["list"] = listdata
  823. data["columnsname"] = columnsname
  824. data["total"] = recordcount
  825. data["code"] = 0
  826. data["message"] = "ok"
  827. if count > 0 {
  828. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  829. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  830. }
  831. data["pageSize"] = count
  832. return data, nil
  833. }
  834. func ExecQuery(sqlstr string, params []interface{}) (interface{}, error) {
  835. if err := sqlCheckParam(sqlstr); err != nil {
  836. return 0, err
  837. }
  838. rows, err := Engine.SQL(sqlstr, params...).Execute()
  839. if err != nil {
  840. return nil, err
  841. }
  842. data := make(map[string]interface{})
  843. LastInsertId, _ := rows.LastInsertId()
  844. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  845. idd16 := *idPointer
  846. RowsAffected, _ := rows.RowsAffected()
  847. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  848. _idd16 := *_idPointer
  849. data["result"] = rows
  850. data["LastInsertId"] = idd16
  851. data["RowsAffected"] = _idd16
  852. return data, nil
  853. }
  854. func ExecQueryT(sqlstr string, params []interface{}, tx *xorm.Session) (interface{}, error) {
  855. if err := sqlCheckParam(sqlstr); err != nil {
  856. return 0, err
  857. }
  858. rows, err := tx.SQL(sqlstr, params...).Execute()
  859. if err != nil {
  860. fmt.Println("exe", err)
  861. return nil, err
  862. }
  863. LastInsertId, err := rows.LastInsertId()
  864. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  865. idd16 := *idPointer
  866. data := make(map[string]interface{})
  867. RowsAffected, _ := rows.RowsAffected()
  868. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  869. _idd16 := *_idPointer
  870. data["LastInsertId"] = strconv.Itoa(idd16)
  871. data["LastInsertIdStr"] = idd16
  872. data["RowsAffected"] = _idd16
  873. data["result"] = rows
  874. return data, nil
  875. }
  876. func ExecQuerys(sqlstr string, params []interface{}) (interface{}, error) {
  877. if err := sqlCheckParam(sqlstr); err != nil {
  878. return 0, err
  879. }
  880. /*for i, v := range params{
  881. _, err := dbs.Exec(sqlstr, v[i]...)
  882. if err != nil {
  883. return nil, err
  884. }
  885. }
  886. */
  887. data := make(map[string]interface{})
  888. data["result"] = nil
  889. return data, nil
  890. }
  891. func getValue(value interface{}, CT string) interface{} {
  892. var v interface{}
  893. val := value
  894. b, ok := val.([]byte)
  895. if ok {
  896. v1 := string(b)
  897. switch CT {
  898. case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
  899. {
  900. v, _ = strconv.ParseInt(v1, 10, 32)
  901. }
  902. case "FLOAT", "DOUBLE", "DECIMAL":
  903. {
  904. cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
  905. v2, _ := strconv.ParseFloat(v1, 32)
  906. v = toFixed(v2, cindex)
  907. }
  908. case "BOOL":
  909. {
  910. v, _ = strconv.ParseBool(v1)
  911. }
  912. default:
  913. {
  914. v = v1
  915. }
  916. }
  917. } else {
  918. v = val
  919. }
  920. return v
  921. }
  922. func ExecQueryList(sqlstr string, params []interface{}) (interface{}, error) {
  923. if err := sqlCheckParam(sqlstr); err != nil {
  924. return 0, err
  925. }
  926. rows, err := Engine.SQL(sqlstr, params...).QueryString()
  927. if err != nil {
  928. return nil, err
  929. }
  930. data := make(map[string]interface{})
  931. for _, item := range rows {
  932. data["result"] = item
  933. }
  934. return data, nil
  935. }