sql_utils.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257
  1. package restful
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. _ "github.com/go-sql-driver/mysql"
  7. "github.com/jmoiron/sqlx"
  8. "github.com/kptyun/KPTCOMM/pkg/setting"
  9. "github.com/patrickmn/go-cache"
  10. "github.com/tealeg/xlsx"
  11. "github.com/xormplus/xorm/schemas"
  12. "math"
  13. "reflect"
  14. "strconv"
  15. "strings"
  16. "time"
  17. "unsafe"
  18. )
  19. var (
  20. Dbs *sqlx.DB
  21. Apisql_cache *cache.Cache
  22. )
  23. // SQLInit 初始化数据库操作句柄,这里要提供:
  24. // driverName string: 数据库类型,例如mysql、sqlite等,参考github.com/go-sql-driver/mysql官方介绍
  25. // dataSourceName string: 数据库地址,参考github.com/go-sql-driver/mysql官方介绍
  26. // MaxOpenConns int: 最大缓存连接数,这个数值包含了MaxIdleConns
  27. // MaxIdleConns int:预备的最大空闲连接数
  28. func SQLInit(driverName, dataSourceName string, maxOpenConns, maxIdleConns int, showlog bool) error {
  29. if Dbs == nil {
  30. var err error
  31. if Dbs, err = sqlx.Open(driverName, dataSourceName); err != nil {
  32. return err
  33. }
  34. Dbs.SetMaxOpenConns(maxOpenConns)
  35. Dbs.SetMaxIdleConns(maxIdleConns)
  36. Dbs.SetConnMaxLifetime(5 * time.Second)
  37. }
  38. if Apisql_cache == nil {
  39. Apisql_cache = cache.New(600*time.Second, 10*time.Second)
  40. SetCacheSql()
  41. }
  42. return nil
  43. }
  44. func value2String(rawValue *reflect.Value) (str string, err error) {
  45. aa := reflect.TypeOf((*rawValue).Interface())
  46. vv := reflect.ValueOf((*rawValue).Interface())
  47. switch aa.Kind() {
  48. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  49. str = strconv.FormatInt(vv.Int(), 10)
  50. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  51. str = strconv.FormatUint(vv.Uint(), 10)
  52. case reflect.Float32, reflect.Float64:
  53. str = strconv.FormatFloat(vv.Float(), 'f', -1, 64)
  54. case reflect.String:
  55. str = vv.String()
  56. case reflect.Array, reflect.Slice:
  57. switch aa.Elem().Kind() {
  58. case reflect.Uint8:
  59. data := rawValue.Interface().([]byte)
  60. str = string(data)
  61. if str == "\x00" {
  62. str = "0"
  63. }
  64. default:
  65. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  66. }
  67. // time type
  68. case reflect.Struct:
  69. if aa.ConvertibleTo(schemas.TimeType) {
  70. str = vv.Convert(schemas.TimeType).Interface().(time.Time).Format(time.RFC3339Nano)
  71. } else {
  72. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  73. }
  74. case reflect.Bool:
  75. str = strconv.FormatBool(vv.Bool())
  76. case reflect.Complex128, reflect.Complex64:
  77. str = fmt.Sprintf("%v", vv.Complex())
  78. /* TODO: unsupported types below
  79. case reflect.Map:
  80. case reflect.Ptr:
  81. case reflect.Uintptr:
  82. case reflect.UnsafePointer:
  83. case reflect.Chan, reflect.Func, reflect.Interface:
  84. */
  85. default:
  86. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  87. }
  88. return
  89. }
  90. func reflect2object(rawValue *reflect.Value) (value interface{}, err error) {
  91. aa := reflect.TypeOf((*rawValue).Interface())
  92. vv := reflect.ValueOf((*rawValue).Interface())
  93. switch aa.Kind() {
  94. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  95. value = vv.Int()
  96. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  97. value = vv.Uint()
  98. case reflect.Float32, reflect.Float64:
  99. value = vv.Float()
  100. case reflect.String:
  101. value = vv.String()
  102. case reflect.Array, reflect.Slice:
  103. switch aa.Elem().Kind() {
  104. case reflect.Uint8:
  105. data := rawValue.Interface().([]byte)
  106. value = string(data)
  107. default:
  108. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  109. }
  110. // time type
  111. case reflect.Struct:
  112. if aa.ConvertibleTo(schemas.TimeType) {
  113. value = vv.Convert(schemas.TimeType).Interface().(time.Time)
  114. } else {
  115. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  116. }
  117. case reflect.Bool:
  118. value = vv.Bool()
  119. case reflect.Complex128, reflect.Complex64:
  120. value = vv.Complex()
  121. /* TODO: unsupported types below
  122. case reflect.Map:
  123. case reflect.Ptr:
  124. case reflect.Uintptr:
  125. case reflect.UnsafePointer:
  126. case reflect.Chan, reflect.Func, reflect.Interface:
  127. */
  128. default:
  129. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  130. }
  131. return
  132. }
  133. func value2Object(rawValue *reflect.Value) (data interface{}, err error) {
  134. data, err = reflect2object(rawValue)
  135. if err != nil {
  136. return
  137. }
  138. return
  139. }
  140. func rows2mapObjects(rows *sqlx.Rows) (resultsSlice []map[string]interface{}, err error) {
  141. fields, err := rows.Columns()
  142. if err != nil {
  143. return nil, err
  144. }
  145. for rows.Next() {
  146. result, err := rows2mapObject(rows, fields)
  147. if err != nil {
  148. return nil, err
  149. }
  150. resultsSlice = append(resultsSlice, result)
  151. }
  152. return resultsSlice, nil
  153. }
  154. func rows2mapObject(rows *sqlx.Rows, fields []string) (resultsMap map[string]interface{}, err error) {
  155. result := make(map[string]interface{})
  156. scanResultContainers := make([]interface{}, len(fields))
  157. for i := 0; i < len(fields); i++ {
  158. var scanResultContainer interface{}
  159. scanResultContainers[i] = &scanResultContainer
  160. }
  161. if err := rows.Scan(scanResultContainers...); err != nil {
  162. return nil, err
  163. }
  164. for ii, key := range fields {
  165. rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
  166. //if row is null then ignore
  167. if rawValue.Interface() == nil {
  168. continue
  169. }
  170. if data, err := value2Object(&rawValue); err == nil {
  171. result[key] = data
  172. } else {
  173. return nil, err // !nashtsai! REVIEW, should return err or just error log?
  174. }
  175. }
  176. return result, nil
  177. }
  178. func row2mapStr(rows *sqlx.Rows, fields []string) (resultsMap map[string]string, err error) {
  179. result := make(map[string]string)
  180. scanResultContainers := make([]interface{}, len(fields))
  181. for i := 0; i < len(fields); i++ {
  182. var scanResultContainer interface{}
  183. scanResultContainers[i] = &scanResultContainer
  184. }
  185. if err := rows.Scan(scanResultContainers...); err != nil {
  186. return nil, err
  187. }
  188. for ii, key := range fields {
  189. rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
  190. // if row is null then as empty string
  191. if rawValue.Interface() == nil {
  192. result[key] = ""
  193. continue
  194. }
  195. if data, err := value2String(&rawValue); err == nil {
  196. result[key] = data
  197. } else {
  198. return nil, err
  199. }
  200. }
  201. return result, nil
  202. }
  203. func rows2Strings(rows *sqlx.Rows) (resultsSlice []map[string]string, err error) {
  204. fields, err := rows.Columns()
  205. if err != nil {
  206. return nil, err
  207. }
  208. for rows.Next() {
  209. result, err := row2mapStr(rows, fields)
  210. if err != nil {
  211. return nil, err
  212. }
  213. resultsSlice = append(resultsSlice, result)
  214. }
  215. return resultsSlice, nil
  216. }
  217. func SetCacheSql() {
  218. rows, err := Dbs.Queryx("SELECT sqlname, CONCAT(sqlstr,'|',IFNULL(params,'')) AS sqlstr FROM apisql WHERE ENABLE>0 ")
  219. if err != nil {
  220. return
  221. }
  222. valuesMap, err := rows2Strings(rows)
  223. if err == nil && len(valuesMap) > 0 {
  224. for _, v := range valuesMap {
  225. Apisql_cache.Set(v["sqlname"], v["sqlstr"], cache.DefaultExpiration)
  226. }
  227. }
  228. }
  229. func sqlCheckParam(param string) error {
  230. /*if strings.Contains(param, "where") {
  231. return errors.New("can not have where")
  232. }
  233. if strings.Contains(param, "and") {
  234. return errors.New("can not have and")
  235. }
  236. if strings.Contains(param, "or") {
  237. return errors.New("can not have or")
  238. }
  239. if strings.Contains(param, "=") {
  240. return errors.New("can not have =")
  241. }*/
  242. if strings.Contains(param, ";") {
  243. return errors.New("can not have ;")
  244. }
  245. return nil
  246. }
  247. func GetSqlByName(name string, tx *sqlx.Tx) (string, string) {
  248. sqls := ""
  249. param := ""
  250. if sql, ok := Apisql_cache.Get(name); ok {
  251. tempstrb := strings.IndexAny(sql.(string), "|")
  252. sqls = sql.(string)[0:tempstrb]
  253. param = sql.(string)[tempstrb+1:]
  254. } else {
  255. rows, err := tx.Queryx("SELECT sqlstr, params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name)
  256. if err != nil {
  257. return err.Error(), "err"
  258. }
  259. valuesMap, err := rows2Strings(rows)
  260. if err == nil && len(valuesMap) > 0 {
  261. sqls = valuesMap[0]["sqlstr"]
  262. param = valuesMap[0]["params"]
  263. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  264. }
  265. }
  266. if setting.DatabaseSetting.ShowGetSqllog {
  267. fmt.Println("==============")
  268. fmt.Println("apisql:" + sqls)
  269. fmt.Println("--------------")
  270. fmt.Println("param:" + param)
  271. fmt.Println("==============")
  272. }
  273. return sqls, param
  274. }
  275. func GetSqlByNameDB(name string) (string, string) {
  276. sqls := ""
  277. param := ""
  278. if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {
  279. tempstrb := strings.IndexAny(sql.(string), "|")
  280. sqls = sql.(string)[0:tempstrb]
  281. param = sql.(string)[tempstrb+1:]
  282. } else {
  283. rows, err := Dbs.Queryx("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name)
  284. if err != nil {
  285. return err.Error(), "err"
  286. }
  287. valuesMap, err := rows2Strings(rows)
  288. if err == nil && len(valuesMap) > 0 {
  289. sqls = valuesMap[0]["sqlstr"]
  290. param = valuesMap[0]["params"]
  291. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  292. }
  293. }
  294. if setting.DatabaseSetting.ShowGetSqllog {
  295. fmt.Println("==============")
  296. fmt.Println("apisql:" + sqls)
  297. fmt.Println("--------------")
  298. fmt.Println("param:" + param)
  299. fmt.Println("==============")
  300. }
  301. return sqls, param
  302. }
  303. // sqlGetValues 根据结构体中指向实际数据的指针获取出数据,并存储到另一张表中返回
  304. func sqlGetValues(pvs []interface{}, columnsType []*sql.ColumnType, columnsLen int) map[string]interface{} {
  305. result := make(map[string]interface{}, columnsLen)
  306. for a := 0; a < columnsLen; a++ {
  307. switch s := pvs[a].(type) {
  308. case *int8:
  309. result[columnsType[a].Name()] = *s
  310. case *int16:
  311. result[columnsType[a].Name()] = *s
  312. case *int32:
  313. result[columnsType[a].Name()] = *s
  314. case *int64:
  315. result[columnsType[a].Name()] = *s
  316. case *float32:
  317. result[columnsType[a].Name()] = *s
  318. case *float64:
  319. result[columnsType[a].Name()] = *s
  320. case *string:
  321. result[columnsType[a].Name()] = *s
  322. case *sql.NullInt64:
  323. result[columnsType[a].Name()] = *s
  324. case *sql.NullString:
  325. result[columnsType[a].Name()] = *s
  326. }
  327. }
  328. return result
  329. }
  330. // 这里返回的是原始数组的基础上加上了字段名标识
  331. func sqlQuery(columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) ([]map[string]interface{}, error) {
  332. jsondata := make([]map[string]interface{}, queryCount)
  333. for k1, v1 := range queryData {
  334. if k1 >= queryCount {
  335. break
  336. }
  337. jsondata[k1] = sqlGetValues(v1, columnsType, columnsLen)
  338. }
  339. return jsondata, nil
  340. }
  341. func sqlQueryByTinyIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int8]map[string]interface{}, error) {
  342. jsondata := make(map[int8]map[string]interface{}, queryCount)
  343. for k1, v1 := range queryData {
  344. if k1 >= queryCount {
  345. break
  346. }
  347. for a := 0; a < columnsLen; a++ {
  348. if columnsType[a].Name() == columnName {
  349. if value, ok := v1[a].(*int8); ok {
  350. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  351. }
  352. break
  353. }
  354. }
  355. }
  356. return jsondata, nil
  357. }
  358. func sqlQueryBySmallIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int16]map[string]interface{}, error) {
  359. jsondata := make(map[int16]map[string]interface{}, queryCount)
  360. for k1, v1 := range queryData {
  361. if k1 >= queryCount {
  362. break
  363. }
  364. for a := 0; a < columnsLen; a++ {
  365. if columnsType[a].Name() == columnName {
  366. if value, ok := v1[a].(*int16); ok {
  367. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  368. }
  369. break
  370. }
  371. }
  372. }
  373. return jsondata, nil
  374. }
  375. func sqlQueryByIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int32]map[string]interface{}, error) {
  376. jsondata := make(map[int32]map[string]interface{}, queryCount)
  377. for k1, v1 := range queryData {
  378. if k1 >= queryCount {
  379. break
  380. }
  381. for a := 0; a < columnsLen; a++ {
  382. if columnsType[a].Name() == columnName {
  383. if value, ok := v1[a].(*int32); ok {
  384. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  385. }
  386. break
  387. }
  388. }
  389. }
  390. return jsondata, nil
  391. }
  392. func sqlQueryByBigIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int64]map[string]interface{}, error) {
  393. jsondata := make(map[int64]map[string]interface{}, queryCount)
  394. for k1, v1 := range queryData {
  395. if k1 >= queryCount {
  396. break
  397. }
  398. for a := 0; a < columnsLen; a++ {
  399. if columnsType[a].Name() == columnName {
  400. if value, ok := v1[a].(*int64); ok {
  401. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  402. }
  403. break
  404. }
  405. }
  406. }
  407. return jsondata, nil
  408. }
  409. func sqlQueryByFloatIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float32]map[string]interface{}, error) {
  410. jsondata := make(map[float32]map[string]interface{}, queryCount)
  411. for k1, v1 := range queryData {
  412. if k1 >= queryCount {
  413. break
  414. }
  415. for a := 0; a < columnsLen; a++ {
  416. if columnsType[a].Name() == columnName {
  417. if value, ok := v1[a].(*float32); ok {
  418. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  419. }
  420. break
  421. }
  422. }
  423. }
  424. return jsondata, nil
  425. }
  426. func sqlQueryByDoubleMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float64]map[string]interface{}, error) {
  427. jsondata := make(map[float64]map[string]interface{}, queryCount)
  428. for k1, v1 := range queryData {
  429. if k1 >= queryCount {
  430. break
  431. }
  432. for a := 0; a < columnsLen; a++ {
  433. if columnsType[a].Name() == columnName {
  434. if value, ok := v1[a].(*float64); ok {
  435. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  436. }
  437. break
  438. }
  439. }
  440. }
  441. return jsondata, nil
  442. }
  443. func sqlQueryByStringMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[string]map[string]interface{}, error) {
  444. jsondata := make(map[string]map[string]interface{}, queryCount)
  445. for k1, v1 := range queryData {
  446. if k1 >= queryCount {
  447. break
  448. }
  449. for a := 0; a < columnsLen; a++ {
  450. if columnsType[a].Name() == columnName {
  451. if value, ok := v1[a].(*string); ok {
  452. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  453. }
  454. break
  455. }
  456. }
  457. }
  458. return jsondata, nil
  459. }
  460. func sqlGetColumnType(columnsType []*sql.ColumnType, columnsLen int, valueName string) string {
  461. for a := 0; a < columnsLen; a++ {
  462. if columnsType[a].Name() == valueName {
  463. return columnsType[a].DatabaseTypeName()
  464. }
  465. }
  466. return ""
  467. }
  468. func round(num float64) int {
  469. return int(num + math.Copysign(0.5, num))
  470. }
  471. func toFixed(num float64, precision int) float64 {
  472. output := math.Pow(10, float64(precision))
  473. return float64(round(num*output)) / output
  474. }
  475. // QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
  476. // columnName string: 作为索引的字段名称
  477. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  478. // where string: 过滤条件,就是where后面跟着的部分
  479. // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
  480. // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  481. // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  482. func QueryByMap(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  483. if err := sqlCheckParam(sqlstr); err != nil {
  484. return 0, err
  485. }
  486. recordcount := int64(0)
  487. if count > 1 {
  488. row := Dbs.QueryRow("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...)
  489. var rowcount int64
  490. err := row.Scan(&rowcount)
  491. //tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  492. if err != nil {
  493. fmt.Println("s1", err)
  494. return nil, err
  495. }
  496. recordcount = rowcount
  497. /* if tt == nil {
  498. recordcount = 0
  499. } else {
  500. recordcount = tt[0]["count"].(int64)
  501. }*/
  502. }
  503. queryData := make([]map[string]interface{}, 1)
  504. var err error
  505. if count == 0 {
  506. rows, err := Dbs.Queryx(sqlstr, params...)
  507. if err != nil {
  508. return err.Error(), err
  509. }
  510. queryData, err = rows2mapObjects(rows)
  511. } else {
  512. if count > 0 && offset > 0 {
  513. offset = offset * count
  514. }
  515. rows, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
  516. if err != nil {
  517. return err.Error(), err
  518. }
  519. queryData, err = rows2mapObjects(rows)
  520. }
  521. //fmt.Println("count, offset==================",count, offset)
  522. if err != nil {
  523. return nil, err
  524. }
  525. if recordcount == 0 {
  526. recordcount = int64(len(queryData))
  527. }
  528. data := make(map[string]interface{})
  529. data["rows"] = queryData
  530. data["total"] = recordcount
  531. data["code"] = 0
  532. data["message"] = "ok"
  533. if count > 0 {
  534. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  535. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  536. }
  537. data["pageSize"] = count
  538. return data, nil
  539. }
  540. // QueryByXlsx 将查询到的数据,按照指定字段的值做为索引构建map并返回
  541. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  542. // params string: 过滤条件,就是where后面跟着的部分
  543. func QueryByXlsx(sqlstr string, params []interface{}) (*xlsx.File, error) {
  544. if err := sqlCheckParam(sqlstr); err != nil {
  545. return nil, err
  546. }
  547. rows, err := Dbs.Queryx(sqlstr, params...)
  548. if err != nil {
  549. return nil, err
  550. }
  551. defer rows.Close()
  552. columnsType, _ := rows.ColumnTypes()
  553. columnsLen := len(columnsType)
  554. columns, _ := rows.Columns()
  555. values := make([]interface{}, columnsLen)
  556. valuePtrs := make([]interface{}, columnsLen)
  557. var sheet *xlsx.Sheet
  558. var row *xlsx.Row
  559. var cell *xlsx.Cell
  560. file := xlsx.NewFile()
  561. sheet, err = file.AddSheet("Sheet1")
  562. if err != nil {
  563. fmt.Printf(err.Error())
  564. }
  565. row = sheet.AddRow()
  566. for _, columnname := range columns {
  567. cell = row.AddCell()
  568. cell.Value = columnname
  569. }
  570. for rows.Next() {
  571. for a := 0; a < columnsLen; a++ {
  572. valuePtrs[a] = &values[a]
  573. }
  574. rows.Scan(valuePtrs...)
  575. row = sheet.AddRow()
  576. for i, _ := range columns {
  577. var v interface{}
  578. val := values[i]
  579. b, ok := val.([]byte)
  580. cell = row.AddCell()
  581. if ok {
  582. v1 := string(b)
  583. switch columnsType[i].DatabaseTypeName() {
  584. case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
  585. {
  586. v, _ = strconv.ParseInt(v1, 10, 32)
  587. cell.Value = fmt.Sprintf("%v", v)
  588. }
  589. case "FLOAT", "DOUBLE", "DECIMAL":
  590. {
  591. cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
  592. v2, _ := strconv.ParseFloat(v1, 32)
  593. v = toFixed(v2, cindex)
  594. cell.Value = fmt.Sprintf("%v", v)
  595. }
  596. case "BOOL":
  597. {
  598. v, _ = strconv.ParseBool(v1)
  599. cell.Value = fmt.Sprintf("%v", v)
  600. }
  601. default:
  602. {
  603. v = v1
  604. cell.Value = fmt.Sprintf("%v", v)
  605. }
  606. }
  607. } else {
  608. v = val
  609. cell.Value = fmt.Sprintf("%v", v)
  610. }
  611. if cell.Value == "<nil>" {
  612. cell.Value = ""
  613. }
  614. }
  615. }
  616. return file, nil
  617. }
  618. // QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
  619. // columnName string: 作为索引的字段名称
  620. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  621. // where string: 过滤条件,就是where后面跟着的部分
  622. // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
  623. // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  624. // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  625. func QueryByMapMenu(sqlstr string, offset, count int, params []interface{}) ([]map[string]interface{}, error) {
  626. if err := sqlCheckParam(sqlstr); err != nil {
  627. return nil, err
  628. }
  629. if offset < 0 {
  630. offset = 0
  631. }
  632. if count <= 0 {
  633. count = 0
  634. }
  635. if count > 0 {
  636. sqlstr += " limit " + strconv.Itoa(offset) + "," + strconv.Itoa(count)
  637. }
  638. rows, err := Dbs.Query(sqlstr, params...)
  639. if err != nil {
  640. return nil, err
  641. }
  642. defer rows.Close()
  643. columnsType, _ := rows.ColumnTypes()
  644. columnsLen := len(columnsType)
  645. columns, _ := rows.Columns()
  646. queryData := make([]map[string]interface{}, 0)
  647. values := make([]interface{}, columnsLen)
  648. valuePtrs := make([]interface{}, columnsLen)
  649. for rows.Next() {
  650. for a := 0; a < columnsLen; a++ {
  651. valuePtrs[a] = &values[a]
  652. }
  653. rows.Scan(valuePtrs...)
  654. entry := make(map[string]interface{})
  655. for i, col := range columns {
  656. entry[col] = getValue(values[i], columnsType[i].DatabaseTypeName())
  657. }
  658. queryData = append(queryData, entry)
  659. }
  660. data := queryData
  661. return data, nil
  662. }
  663. func QueryByList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  664. if err := sqlCheckParam(sqlstr); err != nil {
  665. return 0, err
  666. }
  667. if count == 0 {
  668. count = 1000
  669. }
  670. recordcount := int64(0)
  671. if count > 1 {
  672. trow, err := Dbs.Queryx("SELECT COUNT(1) as count FROM ("+sqlstr+") a", params...)
  673. if err != nil {
  674. return nil, err
  675. }
  676. tt, err := rows2mapObjects(trow)
  677. if err != nil {
  678. return nil, err
  679. }
  680. recordcount = tt[0]["count"].(int64)
  681. }
  682. queryData := make([]map[string]interface{}, 1)
  683. var err error
  684. if count == 0 {
  685. // queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  686. tqueryData, err := Dbs.Queryx(sqlstr, params...)
  687. if err != nil {
  688. return nil, err
  689. }
  690. queryData, err = rows2mapObjects(tqueryData)
  691. } else {
  692. if count > 0 && offset > 0 {
  693. offset = offset * count
  694. }
  695. //queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  696. tqueryData, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
  697. if err != nil {
  698. return nil, err
  699. }
  700. queryData, err = rows2mapObjects(tqueryData)
  701. }
  702. if err != nil {
  703. return nil, err
  704. }
  705. columnsname := make([]string, 0)
  706. listdata := make(map[string][]interface{})
  707. if len(queryData) > 0 {
  708. for i, _ := range queryData {
  709. if i == 0 {
  710. for i, _ := range queryData[0] {
  711. columnsname = append(columnsname, i)
  712. }
  713. }
  714. for _, v := range columnsname {
  715. listdata[v] = append(listdata[v], queryData[i][v])
  716. }
  717. }
  718. recordcount = int64(len(queryData))
  719. }
  720. data := make(map[string]interface{})
  721. data["rows"] = listdata
  722. //data["columnsname"] = columnsname
  723. data["total"] = recordcount
  724. data["code"] = 0
  725. data["message"] = "ok"
  726. if count > 0 {
  727. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  728. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  729. }
  730. data["pageSize"] = count
  731. return data, nil
  732. }
  733. func QueryByOption(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  734. if err := sqlCheckParam(sqlstr); err != nil {
  735. return 0, err
  736. }
  737. if count == 0 {
  738. count = 1000
  739. }
  740. recordcount := int64(0)
  741. if count > 1 {
  742. trow, err := Dbs.Queryx("SELECT COUNT(1) as count FROM ("+sqlstr+") a", params...)
  743. if err != nil {
  744. return nil, err
  745. }
  746. tt, err := rows2mapObjects(trow)
  747. if err != nil {
  748. return nil, err
  749. }
  750. recordcount = tt[0]["count"].(int64)
  751. }
  752. queryData := make([]map[string]interface{}, 1)
  753. var err error
  754. if count == 0 {
  755. // queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  756. tqueryData, err := Dbs.Queryx(sqlstr, params...)
  757. if err != nil {
  758. return nil, err
  759. }
  760. queryData, err = rows2mapObjects(tqueryData)
  761. } else {
  762. if count > 0 && offset > 0 {
  763. offset = offset * count
  764. }
  765. //queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  766. tqueryData, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
  767. if err != nil {
  768. return nil, err
  769. }
  770. queryData, err = rows2mapObjects(tqueryData)
  771. }
  772. if err != nil {
  773. return nil, err
  774. }
  775. columnsname := make([]string, 0)
  776. listdata := make(map[string][]interface{})
  777. if len(queryData) > 0 {
  778. for i, _ := range queryData {
  779. if i == 0 {
  780. for i, _ := range queryData[0] {
  781. columnsname = append(columnsname, i)
  782. }
  783. }
  784. for _, v := range columnsname {
  785. listdata[v] = append(listdata[v], queryData[i][v])
  786. }
  787. }
  788. recordcount = int64(len(queryData))
  789. }
  790. data := make(map[string]interface{})
  791. data["options"] = listdata
  792. //data["columnsname"] = columnsname
  793. data["total"] = recordcount
  794. data["code"] = 0
  795. data["message"] = "ok"
  796. if count > 0 {
  797. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  798. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  799. }
  800. data["pageSize"] = count
  801. return data, nil
  802. }
  803. func QueryByListSqlx(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  804. if err := sqlCheckParam(sqlstr); err != nil {
  805. return 0, err
  806. }
  807. if count == 0 {
  808. count = 1000
  809. }
  810. recordcount := int64(0)
  811. if count > 1 {
  812. trow, err := Dbs.Queryx("SELECT COUNT(1) as count FROM ("+sqlstr+") a", params...)
  813. if err != nil {
  814. return nil, err
  815. }
  816. tt, err := rows2mapObjects(trow)
  817. if err != nil {
  818. return nil, err
  819. }
  820. recordcount = tt[0]["count"].(int64)
  821. }
  822. queryData := make([]map[string]interface{}, 1)
  823. var err error
  824. if count == 0 {
  825. // queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  826. tqueryData, err := Dbs.Queryx(sqlstr, params...)
  827. if err != nil {
  828. return nil, err
  829. }
  830. queryData, err = rows2mapObjects(tqueryData)
  831. } else {
  832. if count > 0 && offset > 0 {
  833. offset = offset * count
  834. }
  835. //queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  836. tqueryData, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
  837. if err != nil {
  838. return nil, err
  839. }
  840. queryData, err = rows2mapObjects(tqueryData)
  841. }
  842. if err != nil {
  843. return nil, err
  844. }
  845. columnsname := make([]string, 0)
  846. listdata := make(map[string][]interface{})
  847. if len(queryData) > 0 {
  848. for i, _ := range queryData {
  849. if i == 0 {
  850. for i, _ := range queryData[0] {
  851. columnsname = append(columnsname, i)
  852. }
  853. }
  854. for _, v := range columnsname {
  855. listdata[v] = append(listdata[v], queryData[i][v])
  856. }
  857. }
  858. recordcount = int64(len(queryData))
  859. }
  860. data := make(map[string]interface{})
  861. data["rows"] = listdata
  862. //data["columnsname"] = columnsname
  863. data["total"] = recordcount
  864. data["code"] = 0
  865. data["message"] = "ok"
  866. if count > 0 {
  867. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  868. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  869. }
  870. data["pageSize"] = count
  871. return data, nil
  872. }
  873. func QueryByListv2Sqlx(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  874. //s := time.Now()
  875. queryData := make([]map[string]interface{}, 1)
  876. var err error
  877. tx, err := Dbs.Beginx()
  878. if err != nil {
  879. fmt.Println("GetT error:", err)
  880. }
  881. defer func() {
  882. switch {
  883. case err != nil:
  884. fmt.Println("__error:", err)
  885. if tx != nil {
  886. tx.Rollback()
  887. }
  888. default:
  889. if tx != nil {
  890. err = tx.Commit()
  891. }
  892. }
  893. }()
  894. //var resultstr string
  895. tqueryData, err := tx.Queryx(sqlstr, params...)
  896. if err != nil {
  897. return nil, err
  898. }
  899. queryData, err = rows2mapObjects(tqueryData)
  900. //rows,_ := Dbs.Query(sqlstr,params...)
  901. //for rows.Next(){
  902. // rows.Scan(&resultstr)
  903. //}
  904. //println("QueryByListv2Sqlx=================",time.Now().Sub(s).Milliseconds())
  905. //fmt.Println(params)
  906. if err != nil {
  907. return nil, err
  908. }
  909. data := make(map[string]interface{})
  910. data["rows"] = queryData
  911. return data, nil
  912. }
  913. func QueryByListv2(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  914. queryData := make([]map[string]interface{}, 1)
  915. var err error
  916. tx, err := Dbs.Beginx()
  917. if err != nil {
  918. fmt.Println("GetT error:", err)
  919. }
  920. defer func() {
  921. switch {
  922. case err != nil:
  923. fmt.Println("__error:", err)
  924. if tx != nil {
  925. tx.Rollback()
  926. }
  927. default:
  928. if tx != nil {
  929. err = tx.Commit()
  930. }
  931. }
  932. }()
  933. tqueryData, err := Dbs.Queryx(sqlstr, params...)
  934. if err != nil {
  935. return nil, err
  936. }
  937. queryData, err = rows2mapObjects(tqueryData)
  938. if err != nil {
  939. return nil, err
  940. }
  941. data := make(map[string]interface{})
  942. data["rows"] = queryData
  943. return data, nil
  944. }
  945. func QueryByListList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  946. if err := sqlCheckParam(sqlstr); err != nil {
  947. return 0, err
  948. }
  949. if count == 0 {
  950. count = 1000
  951. }
  952. recordcount := int64(0)
  953. if count > 1 {
  954. trow, err := Dbs.Queryx("SELECT COUNT(1) as count FROM ("+sqlstr+") a", params...)
  955. if err != nil {
  956. return nil, err
  957. }
  958. tt, err := rows2mapObjects(trow)
  959. if err != nil {
  960. return nil, err
  961. }
  962. recordcount = tt[0]["count"].(int64)
  963. }
  964. queryData := make([]map[string]interface{}, 1)
  965. var err error
  966. if count == 0 {
  967. tqueryData, err := Dbs.Queryx(sqlstr, params...)
  968. if err != nil {
  969. return nil, err
  970. }
  971. queryData, err = rows2mapObjects(tqueryData)
  972. } else {
  973. if count > 0 && offset > 0 {
  974. offset = offset * count
  975. }
  976. tqueryData, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
  977. if err != nil {
  978. return nil, err
  979. }
  980. queryData, err = rows2mapObjects(tqueryData)
  981. }
  982. if err != nil {
  983. return nil, err
  984. }
  985. columnsname := make([]string, 0)
  986. listdata := make([]interface{}, 0)
  987. if len(queryData) > 0 {
  988. for i, _ := range queryData {
  989. if i == 0 {
  990. for i, _ := range queryData[0] {
  991. columnsname = append(columnsname, i)
  992. }
  993. }
  994. listdatarow := make([]interface{}, 0)
  995. for _, v := range columnsname {
  996. listdatarow = append(listdatarow, queryData[i][v])
  997. }
  998. listdata = append(listdata, listdatarow)
  999. }
  1000. recordcount = int64(len(queryData))
  1001. }
  1002. data := make(map[string]interface{})
  1003. data["list"] = listdata
  1004. data["columnsname"] = columnsname
  1005. data["total"] = recordcount
  1006. data["code"] = 0
  1007. data["message"] = "ok"
  1008. if count > 0 {
  1009. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  1010. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  1011. }
  1012. data["pageSize"] = count
  1013. return data, nil
  1014. }
  1015. func ExecQuery(sqlstr string, params []interface{}) (interface{}, error) {
  1016. if err := sqlCheckParam(sqlstr); err != nil {
  1017. return 0, err
  1018. }
  1019. rows, err := Dbs.Exec(sqlstr, params...)
  1020. if err != nil {
  1021. return nil, err
  1022. }
  1023. data := make(map[string]interface{})
  1024. LastInsertId, _ := rows.LastInsertId()
  1025. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  1026. idd16 := *idPointer
  1027. RowsAffected, _ := rows.RowsAffected()
  1028. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  1029. _idd16 := *_idPointer
  1030. data["result"] = rows
  1031. data["LastInsertId"] = idd16
  1032. data["RowsAffected"] = _idd16
  1033. return data, nil
  1034. }
  1035. func ExecQuerySqlx(sqlstr string, params []interface{}) (interface{}, error) {
  1036. if err := sqlCheckParam(sqlstr); err != nil {
  1037. return 0, err
  1038. }
  1039. rows, err := Dbs.Exec(sqlstr, params...)
  1040. if err != nil {
  1041. return nil, err
  1042. }
  1043. data := make(map[string]interface{})
  1044. LastInsertId, _ := rows.LastInsertId()
  1045. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  1046. idd16 := *idPointer
  1047. RowsAffected, _ := rows.RowsAffected()
  1048. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  1049. _idd16 := *_idPointer
  1050. data["result"] = rows
  1051. data["LastInsertId"] = idd16
  1052. data["RowsAffected"] = _idd16
  1053. return data, nil
  1054. }
  1055. func ExecQueryT(sqlstr string, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
  1056. if err := sqlCheckParam(sqlstr); err != nil {
  1057. return 0, err
  1058. }
  1059. rows, err := tx.Exec(sqlstr, params...)
  1060. if err != nil {
  1061. fmt.Println("exe", err)
  1062. return nil, err
  1063. }
  1064. LastInsertId, _ := rows.LastInsertId()
  1065. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  1066. idd16 := *idPointer
  1067. data := make(map[string]interface{})
  1068. RowsAffected, _ := rows.RowsAffected()
  1069. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  1070. _idd16 := *_idPointer
  1071. data["LastInsertId"] = idd16
  1072. data["RowsAffected"] = _idd16
  1073. data["result"] = rows
  1074. return data, nil
  1075. }
  1076. func ExecQuerys(sqlstr string, params []interface{}) (interface{}, error) {
  1077. if err := sqlCheckParam(sqlstr); err != nil {
  1078. return 0, err
  1079. }
  1080. /*for i, v := range params{
  1081. _, err := Dbs.Exec(sqlstr, v[i]...)
  1082. if err != nil {
  1083. return nil, err
  1084. }
  1085. }
  1086. */
  1087. data := make(map[string]interface{})
  1088. data["result"] = nil
  1089. return data, nil
  1090. }
  1091. func getValue(value interface{}, CT string) interface{} {
  1092. var v interface{}
  1093. val := value
  1094. b, ok := val.([]byte)
  1095. if ok {
  1096. v1 := string(b)
  1097. switch CT {
  1098. case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
  1099. {
  1100. v, _ = strconv.ParseInt(v1, 10, 32)
  1101. }
  1102. case "FLOAT", "DOUBLE", "DECIMAL":
  1103. {
  1104. cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
  1105. v2, _ := strconv.ParseFloat(v1, 32)
  1106. v = toFixed(v2, cindex)
  1107. }
  1108. case "BOOL":
  1109. {
  1110. v, _ = strconv.ParseBool(v1)
  1111. }
  1112. default:
  1113. {
  1114. v = v1
  1115. }
  1116. }
  1117. } else {
  1118. v = val
  1119. }
  1120. return v
  1121. }