44a7b5cfe2073ef863e555265f86ccd974d31fd4.svn-base 20 KB

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