sql_utils.go 26 KB

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