186a1cf6af5486cf1e61fee5ca6d1f6e0e79d976.svn-base 19 KB

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