sessionplus.go 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264
  1. // Copyright 2015 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "database/sql"
  7. "encoding/json"
  8. "errors"
  9. "fmt"
  10. "os"
  11. "reflect"
  12. "regexp"
  13. "strconv"
  14. "strings"
  15. "time"
  16. "github.com/Chronokeeper/anyxml"
  17. "github.com/xormplus/core"
  18. "gopkg.in/flosch/pongo2.v3"
  19. )
  20. type ResultBean struct {
  21. Has bool
  22. Result interface{}
  23. Error error
  24. }
  25. func (resultBean *ResultBean) Json() (bool, string, error) {
  26. if resultBean.Error != nil {
  27. return resultBean.Has, "", resultBean.Error
  28. }
  29. if !resultBean.Has {
  30. return resultBean.Has, "", nil
  31. }
  32. result, err := JSONString(resultBean.Result, true)
  33. return resultBean.Has, result, err
  34. }
  35. func (resultBean *ResultBean) GetResult() (bool, interface{}, error) {
  36. return resultBean.Has, resultBean.Result, resultBean.Error
  37. }
  38. func (session *Session) GetFirst(bean interface{}) *ResultBean {
  39. has, err := session.Get(bean)
  40. r := &ResultBean{Has: has, Result: bean, Error: err}
  41. return r
  42. }
  43. func (resultBean *ResultBean) Xml() (bool, string, error) {
  44. if resultBean.Error != nil {
  45. return false, "", resultBean.Error
  46. }
  47. if !resultBean.Has {
  48. return resultBean.Has, "", nil
  49. }
  50. has, result, err := resultBean.Json()
  51. if err != nil {
  52. return false, "", err
  53. }
  54. if !has {
  55. return has, "", nil
  56. }
  57. var anydata = []byte(result)
  58. var i interface{}
  59. err = json.Unmarshal(anydata, &i)
  60. if err != nil {
  61. return false, "", err
  62. }
  63. resultByte, err := anyxml.Xml(i)
  64. if err != nil {
  65. return false, "", err
  66. }
  67. return resultBean.Has, string(resultByte), err
  68. }
  69. func (resultBean *ResultBean) XmlIndent(prefix string, indent string, recordTag string) (bool, string, error) {
  70. if resultBean.Error != nil {
  71. return false, "", resultBean.Error
  72. }
  73. if !resultBean.Has {
  74. return resultBean.Has, "", nil
  75. }
  76. has, result, err := resultBean.Json()
  77. if err != nil {
  78. return false, "", err
  79. }
  80. if !has {
  81. return has, "", nil
  82. }
  83. var anydata = []byte(result)
  84. var i interface{}
  85. err = json.Unmarshal(anydata, &i)
  86. if err != nil {
  87. return false, "", err
  88. }
  89. resultByte, err := anyxml.XmlIndent(i, prefix, indent, recordTag)
  90. if err != nil {
  91. return false, "", err
  92. }
  93. return resultBean.Has, string(resultByte), err
  94. }
  95. type ResultMap struct {
  96. Results []map[string]interface{}
  97. Error error
  98. }
  99. func (resultMap *ResultMap) List() ([]map[string]interface{}, error) {
  100. return resultMap.Results, resultMap.Error
  101. }
  102. func (resultMap *ResultMap) Count() (int, error) {
  103. if resultMap.Error != nil {
  104. return 0, resultMap.Error
  105. }
  106. if resultMap.Results == nil {
  107. return 0, nil
  108. }
  109. return len(resultMap.Results), nil
  110. }
  111. func (resultMap *ResultMap) ListPage(firstResult int, maxResults int) ([]map[string]interface{}, error) {
  112. if resultMap.Error != nil {
  113. return nil, resultMap.Error
  114. }
  115. if resultMap.Results == nil {
  116. return nil, nil
  117. }
  118. if firstResult > maxResults {
  119. return nil, ErrParamsFormat
  120. }
  121. if firstResult < 0 {
  122. return nil, ErrParamsFormat
  123. }
  124. if maxResults < 0 {
  125. return nil, ErrParamsFormat
  126. }
  127. if maxResults > len(resultMap.Results) {
  128. return nil, ErrParamsFormat
  129. }
  130. return resultMap.Results[(firstResult - 1):maxResults], resultMap.Error
  131. }
  132. func (resultMap *ResultMap) Json() (string, error) {
  133. if resultMap.Error != nil {
  134. return "", resultMap.Error
  135. }
  136. return JSONString(resultMap.Results, true)
  137. }
  138. func (resultMap *ResultMap) Xml() (string, error) {
  139. if resultMap.Error != nil {
  140. return "", resultMap.Error
  141. }
  142. results, err := anyxml.Xml(resultMap.Results)
  143. if err != nil {
  144. return "", err
  145. }
  146. return string(results), nil
  147. }
  148. func (resultMap *ResultMap) XmlIndent(prefix string, indent string, recordTag string) (string, error) {
  149. if resultMap.Error != nil {
  150. return "", resultMap.Error
  151. }
  152. results, err := anyxml.XmlIndent(resultMap.Results, prefix, indent, recordTag)
  153. if err != nil {
  154. return "", err
  155. }
  156. return string(results), nil
  157. }
  158. func (resultMap *ResultMap) SaveAsCSV(filename string, headers []string, perm os.FileMode) error {
  159. if resultMap.Error != nil {
  160. return resultMap.Error
  161. }
  162. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  163. if err != nil {
  164. return err
  165. }
  166. csv, err := dataset.CSV()
  167. if err != nil {
  168. return err
  169. }
  170. return csv.WriteFile(filename, perm)
  171. }
  172. func (resultMap *ResultMap) SaveAsTSV(filename string, headers []string, perm os.FileMode) error {
  173. if resultMap.Error != nil {
  174. return resultMap.Error
  175. }
  176. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  177. if err != nil {
  178. return err
  179. }
  180. tsv, err := dataset.TSV()
  181. if err != nil {
  182. return err
  183. }
  184. return tsv.WriteFile(filename, perm)
  185. }
  186. func (resultMap *ResultMap) SaveAsHTML(filename string, headers []string, perm os.FileMode) error {
  187. if resultMap.Error != nil {
  188. return resultMap.Error
  189. }
  190. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  191. if err != nil {
  192. return err
  193. }
  194. html := dataset.HTML()
  195. return html.WriteFile(filename, perm)
  196. }
  197. func (resultMap *ResultMap) SaveAsXML(filename string, headers []string, perm os.FileMode) error {
  198. if resultMap.Error != nil {
  199. return resultMap.Error
  200. }
  201. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  202. if err != nil {
  203. return err
  204. }
  205. xml, err := dataset.XML()
  206. if err != nil {
  207. return err
  208. }
  209. return xml.WriteFile(filename, perm)
  210. }
  211. func (resultMap *ResultMap) SaveAsXMLWithTagNamePrefixIndent(tagName string, prifix string, indent string, filename string, headers []string, perm os.FileMode) error {
  212. if resultMap.Error != nil {
  213. return resultMap.Error
  214. }
  215. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  216. if err != nil {
  217. return err
  218. }
  219. xml, err := dataset.XMLWithTagNamePrefixIndent(tagName, prifix, indent)
  220. if err != nil {
  221. return err
  222. }
  223. return xml.WriteFile(filename, perm)
  224. }
  225. func (resultMap *ResultMap) SaveAsYAML(filename string, headers []string, perm os.FileMode) error {
  226. if resultMap.Error != nil {
  227. return resultMap.Error
  228. }
  229. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  230. if err != nil {
  231. return err
  232. }
  233. yaml, err := dataset.YAML()
  234. if err != nil {
  235. return err
  236. }
  237. return yaml.WriteFile(filename, perm)
  238. }
  239. func (resultMap *ResultMap) SaveAsJSON(filename string, headers []string, perm os.FileMode) error {
  240. if resultMap.Error != nil {
  241. return resultMap.Error
  242. }
  243. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  244. if err != nil {
  245. return err
  246. }
  247. json, err := dataset.JSON()
  248. if err != nil {
  249. return err
  250. }
  251. return json.WriteFile(filename, perm)
  252. }
  253. func (resultMap *ResultMap) SaveAsXLSX(filename string, headers []string, perm os.FileMode) error {
  254. if resultMap.Error != nil {
  255. return resultMap.Error
  256. }
  257. dataset, err := NewDatasetWithData(headers, resultMap.Results)
  258. if err != nil {
  259. return err
  260. }
  261. xlsx, err := dataset.XLSX()
  262. if err != nil {
  263. return err
  264. }
  265. return xlsx.WriteFile(filename, perm)
  266. }
  267. type ResultStructs struct {
  268. Result interface{}
  269. Error error
  270. }
  271. func (resultStructs *ResultStructs) Json() (string, error) {
  272. if resultStructs.Error != nil {
  273. return "", resultStructs.Error
  274. }
  275. return JSONString(resultStructs.Result, true)
  276. }
  277. func (resultStructs *ResultStructs) Xml() (string, error) {
  278. if resultStructs.Error != nil {
  279. return "", resultStructs.Error
  280. }
  281. result, err := resultStructs.Json()
  282. if err != nil {
  283. return "", err
  284. }
  285. var anydata = []byte(result)
  286. var i interface{}
  287. err = json.Unmarshal(anydata, &i)
  288. if err != nil {
  289. return "", err
  290. }
  291. resultByte, err := anyxml.Xml(i)
  292. if err != nil {
  293. return "", err
  294. }
  295. return string(resultByte), nil
  296. }
  297. func (resultStructs *ResultStructs) XmlIndent(prefix string, indent string, recordTag string) (string, error) {
  298. if resultStructs.Error != nil {
  299. return "", resultStructs.Error
  300. }
  301. result, err := resultStructs.Json()
  302. if err != nil {
  303. return "", err
  304. }
  305. var anydata = []byte(result)
  306. var i interface{}
  307. err = json.Unmarshal(anydata, &i)
  308. if err != nil {
  309. return "", err
  310. }
  311. resultByte, err := anyxml.XmlIndent(i, prefix, indent, recordTag)
  312. if err != nil {
  313. return "", err
  314. }
  315. return string(resultByte), nil
  316. }
  317. func (session *Session) SqlMapClient(sqlTagName string, args ...interface{}) *Session {
  318. return session.Sql(session.Engine.sqlMap.Sql[sqlTagName], args...)
  319. }
  320. func (session *Session) SqlTemplateClient(sqlTagName string, args ...interface{}) *Session {
  321. session.IsSqlFuc = true
  322. if session.Engine.sqlTemplate.Template[sqlTagName] == nil {
  323. if len(args) == 0 {
  324. return session.Sql("")
  325. } else {
  326. map1 := args[0].(*map[string]interface{})
  327. return session.Sql("", map1)
  328. }
  329. }
  330. if len(args) == 0 {
  331. parmap := &pongo2.Context{"1": 1}
  332. sql, err := session.Engine.sqlTemplate.Template[sqlTagName].Execute(*parmap)
  333. if err != nil {
  334. session.Engine.logger.Error(err)
  335. }
  336. return session.Sql(sql)
  337. } else {
  338. map1 := args[0].(*map[string]interface{})
  339. sql, err := session.Engine.sqlTemplate.Template[sqlTagName].Execute(*map1)
  340. if err != nil {
  341. session.Engine.logger.Error(err)
  342. }
  343. return session.Sql(sql, map1)
  344. }
  345. }
  346. func (session *Session) Search(rowsSlicePtr interface{}, condiBean ...interface{}) *ResultStructs {
  347. err := session.Find(rowsSlicePtr, condiBean...)
  348. r := &ResultStructs{Result: rowsSlicePtr, Error: err}
  349. return r
  350. }
  351. // Exec a raw sql and return records as ResultMap
  352. func (session *Session) Query() *ResultMap {
  353. defer session.resetStatement()
  354. if session.IsAutoClose {
  355. defer session.Close()
  356. }
  357. sql := session.Statement.RawSQL
  358. params := session.Statement.RawParams
  359. i := len(params)
  360. var result []map[string]interface{}
  361. var err error
  362. if i == 1 {
  363. vv := reflect.ValueOf(params[0])
  364. if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map {
  365. result, err = session.queryAll(sql, params...)
  366. } else {
  367. result, err = session.queryAllByMap(sql, params[0])
  368. }
  369. } else {
  370. result, err = session.queryAll(sql, params...)
  371. }
  372. r := &ResultMap{Results: result, Error: err}
  373. return r
  374. }
  375. // Exec a raw sql and return records as ResultMap
  376. func (session *Session) QueryWithDateFormat(dateFormat string) *ResultMap {
  377. defer session.resetStatement()
  378. if session.IsAutoClose {
  379. defer session.Close()
  380. }
  381. sql := session.Statement.RawSQL
  382. params := session.Statement.RawParams
  383. i := len(params)
  384. var result []map[string]interface{}
  385. var err error
  386. if i == 1 {
  387. vv := reflect.ValueOf(params[0])
  388. if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map {
  389. result, err = session.queryAllWithDateFormat(dateFormat, sql, params...)
  390. } else {
  391. result, err = session.queryAllByMapWithDateFormat(dateFormat, sql, params[0])
  392. }
  393. } else {
  394. result, err = session.queryAllWithDateFormat(dateFormat, sql, params...)
  395. }
  396. r := &ResultMap{Results: result, Error: err}
  397. return r
  398. }
  399. // Execute raw sql
  400. func (session *Session) Execute() (sql.Result, error) {
  401. defer session.resetStatement()
  402. if session.IsAutoClose {
  403. defer session.Close()
  404. }
  405. sqlStr := session.Statement.RawSQL
  406. params := session.Statement.RawParams
  407. i := len(params)
  408. if i == 1 {
  409. vv := reflect.ValueOf(params[0])
  410. if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map {
  411. return session.exec(sqlStr, params...)
  412. } else {
  413. sqlStr1, args, _ := core.MapToSlice(sqlStr, params[0])
  414. return session.exec(sqlStr1, args...)
  415. }
  416. } else {
  417. return session.exec(sqlStr, params...)
  418. }
  419. }
  420. // =============================
  421. // for Object
  422. // =============================
  423. func (session *Session) queryAll(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  424. session.queryPreprocess(&sqlStr, paramStr...)
  425. if session.IsAutoCommit {
  426. return query3(session.DB(), sqlStr, paramStr...)
  427. }
  428. return txQuery3(session.Tx, sqlStr, paramStr...)
  429. }
  430. func (session *Session) queryAllByMap(sqlStr string, paramMap interface{}) (resultsSlice []map[string]interface{}, err error) {
  431. sqlStr1, param, _ := core.MapToSlice(sqlStr, paramMap)
  432. session.queryPreprocess(&sqlStr1, param...)
  433. if session.IsAutoCommit {
  434. return query3(session.DB(), sqlStr1, param...)
  435. }
  436. return txQuery3(session.Tx, sqlStr1, param...)
  437. }
  438. func (session *Session) queryAllByMapWithDateFormat(dateFormat string, sqlStr string, paramMap interface{}) (resultsSlice []map[string]interface{}, err error) {
  439. sqlStr1, param, _ := core.MapToSlice(sqlStr, paramMap)
  440. session.queryPreprocess(&sqlStr1, param...)
  441. if session.IsAutoCommit {
  442. return query3WithDateFormat(session.DB(), dateFormat, sqlStr1, param...)
  443. }
  444. return txQuery3WithDateFormat(session.Tx, dateFormat, sqlStr1, param...)
  445. }
  446. func (session *Session) queryAllWithDateFormat(dateFormat string, sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  447. session.queryPreprocess(&sqlStr, paramStr...)
  448. if session.IsAutoCommit {
  449. return query3WithDateFormat(session.DB(), dateFormat, sqlStr, paramStr...)
  450. }
  451. return txQuery3WithDateFormat(session.Tx, dateFormat, sqlStr, paramStr...)
  452. }
  453. func (session *Session) queryAllToJsonString(sql string, paramStr ...interface{}) (string, error) {
  454. results, err := session.queryAll(sql, paramStr...)
  455. if err != nil {
  456. return "", err
  457. }
  458. return JSONString(results, true)
  459. }
  460. func (session *Session) queryAllToXmlString(sql string, paramStr ...interface{}) (string, error) {
  461. resultMap, err := session.queryAll(sql, paramStr...)
  462. if err != nil {
  463. return "", err
  464. }
  465. results, err := anyxml.Xml(resultMap)
  466. if err != nil {
  467. return "", err
  468. }
  469. return string(results), nil
  470. }
  471. func (session *Session) queryAllToXmlIndentString(sql string, prefix string, indent string, paramStr ...interface{}) (string, error) {
  472. resultSlice, err := session.queryAll(sql, paramStr...)
  473. if err != nil {
  474. return "", err
  475. }
  476. results, err := anyxml.XmlIndent(resultSlice, prefix, indent, "result")
  477. if err != nil {
  478. return "", err
  479. }
  480. return string(results), nil
  481. }
  482. func (session *Session) queryAllToXmlStringWithDateFormat(dateFormat string, sql string, paramStr ...interface{}) (string, error) {
  483. resultSlice, err := session.queryAll(sql, paramStr...)
  484. if err != nil {
  485. return "", err
  486. }
  487. results, err := anyxml.XmlWithDateFormat(dateFormat, resultSlice)
  488. if err != nil {
  489. return "", err
  490. }
  491. return string(results), nil
  492. }
  493. func (session *Session) queryAllToXmlIndentStringWithDateFormat(dateFormat string, sql string, prefix string, indent string, paramStr ...interface{}) (string, error) {
  494. resultSlice, err := session.queryAll(sql, paramStr...)
  495. if err != nil {
  496. return "", err
  497. }
  498. results, err := anyxml.XmlIndentWithDateFormat(dateFormat, resultSlice, prefix, indent, "results")
  499. if err != nil {
  500. return "", err
  501. }
  502. return string(results), nil
  503. }
  504. func (session *Session) queryAllByMapToJsonString(sql string, paramMap interface{}) (string, error) {
  505. results, err := session.queryAllByMap(sql, paramMap)
  506. if err != nil {
  507. return "", err
  508. }
  509. return JSONString(results, true)
  510. }
  511. func (session *Session) queryAllByMapToJsonStringWithDateFormat(dateFormat string, sql string, paramMap interface{}) (string, error) {
  512. results, err := session.queryAllByMapWithDateFormat(dateFormat, sql, paramMap)
  513. if err != nil {
  514. return "", err
  515. }
  516. return JSONString(results, true)
  517. }
  518. func (session *Session) queryAllToJsonStringWithDateFormat(dateFormat string, sql string, paramStr ...interface{}) (string, error) {
  519. results, err := session.queryAllWithDateFormat(dateFormat, sql, paramStr...)
  520. if err != nil {
  521. return "", err
  522. }
  523. return JSONString(results, true)
  524. }
  525. func (session *Session) row2BeanWithDateFormat(dateFormat string, rows *core.Rows, fields []string, fieldsCount int, bean interface{}) error {
  526. dataStruct := rValue(bean)
  527. if dataStruct.Kind() != reflect.Struct {
  528. return errors.New("Expected a pointer to a struct")
  529. }
  530. session.Statement.setRefValue(dataStruct)
  531. return session._row2BeanWithDateFormat(dateFormat, rows, fields, fieldsCount, bean, &dataStruct, session.Statement.RefTable)
  532. }
  533. func (session *Session) _row2BeanWithDateFormat(dateFormat string, rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) error {
  534. scanResults := make([]interface{}, fieldsCount)
  535. for i := 0; i < len(fields); i++ {
  536. var cell interface{}
  537. scanResults[i] = &cell
  538. }
  539. if err := rows.Scan(scanResults...); err != nil {
  540. return err
  541. }
  542. if b, hasBeforeSet := bean.(BeforeSetProcessor); hasBeforeSet {
  543. for ii, key := range fields {
  544. b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
  545. }
  546. }
  547. defer func() {
  548. if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet {
  549. for ii, key := range fields {
  550. b.AfterSet(key, Cell(scanResults[ii].(*interface{})))
  551. }
  552. }
  553. }()
  554. var tempMap = make(map[string]int)
  555. for ii, key := range fields {
  556. var idx int
  557. var ok bool
  558. var lKey = strings.ToLower(key)
  559. if idx, ok = tempMap[lKey]; !ok {
  560. idx = 0
  561. } else {
  562. idx = idx + 1
  563. }
  564. tempMap[lKey] = idx
  565. if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil {
  566. rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii]))
  567. // if row is null then ignore
  568. if rawValue.Interface() == nil {
  569. continue
  570. }
  571. if fieldValue.CanAddr() {
  572. if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok {
  573. if data, err := value2Bytes(&rawValue); err == nil {
  574. structConvert.FromDB(data)
  575. } else {
  576. session.Engine.logger.Error(err)
  577. }
  578. continue
  579. }
  580. }
  581. if _, ok := fieldValue.Interface().(core.Conversion); ok {
  582. if data, err := value2Bytes(&rawValue); err == nil {
  583. if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() {
  584. fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
  585. }
  586. fieldValue.Interface().(core.Conversion).FromDB(data)
  587. } else {
  588. session.Engine.logger.Error(err)
  589. }
  590. continue
  591. }
  592. rawValueType := reflect.TypeOf(rawValue.Interface())
  593. vv := reflect.ValueOf(rawValue.Interface())
  594. fieldType := fieldValue.Type()
  595. hasAssigned := false
  596. col := table.GetColumnIdx(key, idx)
  597. if col.SQLType.IsJson() {
  598. var bs []byte
  599. if rawValueType.Kind() == reflect.String {
  600. bs = []byte(vv.String())
  601. } else if rawValueType.ConvertibleTo(core.BytesType) {
  602. bs = vv.Bytes()
  603. } else {
  604. return fmt.Errorf("unsupported database data type: %s %v", key, rawValueType.Kind())
  605. }
  606. hasAssigned = true
  607. if len(bs) > 0 {
  608. if fieldValue.CanAddr() {
  609. err := json.Unmarshal(bs, fieldValue.Addr().Interface())
  610. if err != nil {
  611. session.Engine.logger.Error(key, err)
  612. return err
  613. }
  614. } else {
  615. x := reflect.New(fieldType)
  616. err := json.Unmarshal(bs, x.Interface())
  617. if err != nil {
  618. session.Engine.logger.Error(key, err)
  619. return err
  620. }
  621. fieldValue.Set(x.Elem())
  622. }
  623. }
  624. continue
  625. }
  626. switch fieldType.Kind() {
  627. case reflect.Complex64, reflect.Complex128:
  628. // TODO: reimplement this
  629. var bs []byte
  630. if rawValueType.Kind() == reflect.String {
  631. bs = []byte(vv.String())
  632. } else if rawValueType.ConvertibleTo(core.BytesType) {
  633. bs = vv.Bytes()
  634. }
  635. hasAssigned = true
  636. if len(bs) > 0 {
  637. if fieldValue.CanAddr() {
  638. err := json.Unmarshal(bs, fieldValue.Addr().Interface())
  639. if err != nil {
  640. session.Engine.logger.Error(err)
  641. return err
  642. }
  643. } else {
  644. x := reflect.New(fieldType)
  645. err := json.Unmarshal(bs, x.Interface())
  646. if err != nil {
  647. session.Engine.logger.Error(err)
  648. return err
  649. }
  650. fieldValue.Set(x.Elem())
  651. }
  652. }
  653. case reflect.Slice, reflect.Array:
  654. switch rawValueType.Kind() {
  655. case reflect.Slice, reflect.Array:
  656. switch rawValueType.Elem().Kind() {
  657. case reflect.Uint8:
  658. if fieldType.Elem().Kind() == reflect.Uint8 {
  659. hasAssigned = true
  660. fieldValue.Set(vv)
  661. }
  662. }
  663. }
  664. case reflect.String:
  665. if rawValueType.Kind() == reflect.String {
  666. hasAssigned = true
  667. fieldValue.SetString(vv.String())
  668. }
  669. case reflect.Bool:
  670. if rawValueType.Kind() == reflect.Bool {
  671. hasAssigned = true
  672. fieldValue.SetBool(vv.Bool())
  673. }
  674. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  675. switch rawValueType.Kind() {
  676. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  677. hasAssigned = true
  678. fieldValue.SetInt(vv.Int())
  679. }
  680. case reflect.Float32, reflect.Float64:
  681. switch rawValueType.Kind() {
  682. case reflect.Float32, reflect.Float64:
  683. hasAssigned = true
  684. fieldValue.SetFloat(vv.Float())
  685. }
  686. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
  687. switch rawValueType.Kind() {
  688. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
  689. hasAssigned = true
  690. fieldValue.SetUint(vv.Uint())
  691. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  692. hasAssigned = true
  693. fieldValue.SetUint(uint64(vv.Int()))
  694. }
  695. case reflect.Struct:
  696. if fieldType.ConvertibleTo(core.TimeType) {
  697. if rawValueType == core.TimeType {
  698. hasAssigned = true
  699. t := vv.Convert(core.TimeType).Interface().(time.Time)
  700. z, _ := t.Zone()
  701. dbTZ := session.Engine.DatabaseTZ
  702. if dbTZ == nil {
  703. if session.Engine.dialect.DBType() == core.SQLITE {
  704. dbTZ = time.UTC
  705. } else {
  706. dbTZ = time.Local
  707. }
  708. }
  709. // set new location if database don't save timezone or give an incorrect timezone
  710. if len(z) == 0 || t.Year() == 0 || t.Location().String() != dbTZ.String() { // !nashtsai! HACK tmp work around for lib/pq doesn't properly time with location
  711. session.Engine.logger.Debugf("empty zone key[%v] : %v | zone: %v | location: %+v\n", key, t, z, *t.Location())
  712. t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(),
  713. t.Minute(), t.Second(), t.Nanosecond(), dbTZ)
  714. }
  715. // !nashtsai! convert to engine location
  716. var tz *time.Location
  717. if col.TimeZone == nil {
  718. t = t.In(session.Engine.TZLocation)
  719. tz = session.Engine.TZLocation
  720. } else {
  721. t = t.In(col.TimeZone)
  722. tz = col.TimeZone
  723. }
  724. // dateFormat to string
  725. //loc, _ := time.LoadLocation("Local") //重要:获取时区 rawValue.Interface().(time.Time).Format(dateFormat)
  726. t, _ = time.ParseInLocation(dateFormat, t.Format(dateFormat), tz)
  727. fieldValue.Set(reflect.ValueOf(t).Convert(fieldType))
  728. } else if rawValueType == core.IntType || rawValueType == core.Int64Type ||
  729. rawValueType == core.Int32Type {
  730. hasAssigned = true
  731. var tz *time.Location
  732. if col.TimeZone == nil {
  733. tz = session.Engine.TZLocation
  734. } else {
  735. tz = col.TimeZone
  736. }
  737. t := time.Unix(vv.Int(), 0).In(tz)
  738. //vv = reflect.ValueOf(t)
  739. fieldValue.Set(reflect.ValueOf(t).Convert(fieldType))
  740. } else {
  741. if d, ok := vv.Interface().([]uint8); ok {
  742. hasAssigned = true
  743. t, err := session.byte2Time(col, d)
  744. if err != nil {
  745. session.Engine.logger.Error("byte2Time error:", err.Error())
  746. hasAssigned = false
  747. } else {
  748. fieldValue.Set(reflect.ValueOf(t).Convert(fieldType))
  749. }
  750. } else if d, ok := vv.Interface().(string); ok {
  751. hasAssigned = true
  752. t, err := session.str2Time(col, d)
  753. if err != nil {
  754. session.Engine.logger.Error("byte2Time error:", err.Error())
  755. hasAssigned = false
  756. } else {
  757. fieldValue.Set(reflect.ValueOf(t).Convert(fieldType))
  758. }
  759. } else {
  760. panic(fmt.Sprintf("rawValueType is %v, value is %v", rawValueType, vv.Interface()))
  761. }
  762. }
  763. } else if nulVal, ok := fieldValue.Addr().Interface().(sql.Scanner); ok {
  764. // !<winxxp>! 增加支持sql.Scanner接口的结构,如sql.NullString
  765. hasAssigned = true
  766. if err := nulVal.Scan(vv.Interface()); err != nil {
  767. session.Engine.logger.Error("sql.Sanner error:", err.Error())
  768. hasAssigned = false
  769. }
  770. } else if col.SQLType.IsJson() {
  771. if rawValueType.Kind() == reflect.String {
  772. hasAssigned = true
  773. x := reflect.New(fieldType)
  774. if len([]byte(vv.String())) > 0 {
  775. err := json.Unmarshal([]byte(vv.String()), x.Interface())
  776. if err != nil {
  777. session.Engine.logger.Error(err)
  778. return err
  779. }
  780. fieldValue.Set(x.Elem())
  781. }
  782. } else if rawValueType.Kind() == reflect.Slice {
  783. hasAssigned = true
  784. x := reflect.New(fieldType)
  785. if len(vv.Bytes()) > 0 {
  786. err := json.Unmarshal(vv.Bytes(), x.Interface())
  787. if err != nil {
  788. session.Engine.logger.Error(err)
  789. return err
  790. }
  791. fieldValue.Set(x.Elem())
  792. }
  793. }
  794. } else if session.Statement.UseCascade {
  795. table := session.Engine.autoMapType(*fieldValue)
  796. if table != nil {
  797. hasAssigned = true
  798. if len(table.PrimaryKeys) != 1 {
  799. panic("unsupported non or composited primary key cascade")
  800. }
  801. var pk = make(core.PK, len(table.PrimaryKeys))
  802. switch rawValueType.Kind() {
  803. case reflect.Int64:
  804. pk[0] = vv.Int()
  805. case reflect.Int:
  806. pk[0] = int(vv.Int())
  807. case reflect.Int32:
  808. pk[0] = int32(vv.Int())
  809. case reflect.Int16:
  810. pk[0] = int16(vv.Int())
  811. case reflect.Int8:
  812. pk[0] = int8(vv.Int())
  813. case reflect.Uint64:
  814. pk[0] = vv.Uint()
  815. case reflect.Uint:
  816. pk[0] = uint(vv.Uint())
  817. case reflect.Uint32:
  818. pk[0] = uint32(vv.Uint())
  819. case reflect.Uint16:
  820. pk[0] = uint16(vv.Uint())
  821. case reflect.Uint8:
  822. pk[0] = uint8(vv.Uint())
  823. case reflect.String:
  824. pk[0] = vv.String()
  825. case reflect.Slice:
  826. pk[0], _ = strconv.ParseInt(string(rawValue.Interface().([]byte)), 10, 64)
  827. default:
  828. panic(fmt.Sprintf("unsupported primary key type: %v, %v", rawValueType, fieldValue))
  829. }
  830. if !isPKZero(pk) {
  831. // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch
  832. // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne
  833. // property to be fetched lazily
  834. structInter := reflect.New(fieldValue.Type())
  835. newsession := session.Engine.NewSession()
  836. defer newsession.Close()
  837. has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface())
  838. if err != nil {
  839. return err
  840. }
  841. if has {
  842. //v := structInter.Elem().Interface()
  843. //fieldValue.Set(reflect.ValueOf(v))
  844. fieldValue.Set(structInter.Elem())
  845. } else {
  846. return errors.New("cascade obj is not exist")
  847. }
  848. }
  849. } else {
  850. session.Engine.logger.Error("unsupported struct type in Scan: ", fieldValue.Type().String())
  851. }
  852. }
  853. case reflect.Ptr:
  854. // !nashtsai! TODO merge duplicated codes above
  855. //typeStr := fieldType.String()
  856. switch fieldType {
  857. // following types case matching ptr's native type, therefore assign ptr directly
  858. case core.PtrStringType:
  859. if rawValueType.Kind() == reflect.String {
  860. x := vv.String()
  861. hasAssigned = true
  862. fieldValue.Set(reflect.ValueOf(&x))
  863. }
  864. case core.PtrBoolType:
  865. if rawValueType.Kind() == reflect.Bool {
  866. x := vv.Bool()
  867. hasAssigned = true
  868. fieldValue.Set(reflect.ValueOf(&x))
  869. }
  870. case core.PtrTimeType:
  871. if rawValueType == core.PtrTimeType {
  872. hasAssigned = true
  873. var x = rawValue.Interface().(time.Time)
  874. fieldValue.Set(reflect.ValueOf(&x))
  875. }
  876. case core.PtrFloat64Type:
  877. if rawValueType.Kind() == reflect.Float64 {
  878. x := vv.Float()
  879. hasAssigned = true
  880. fieldValue.Set(reflect.ValueOf(&x))
  881. }
  882. case core.PtrUint64Type:
  883. if rawValueType.Kind() == reflect.Int64 {
  884. var x = uint64(vv.Int())
  885. hasAssigned = true
  886. fieldValue.Set(reflect.ValueOf(&x))
  887. }
  888. case core.PtrInt64Type:
  889. if rawValueType.Kind() == reflect.Int64 {
  890. x := vv.Int()
  891. hasAssigned = true
  892. fieldValue.Set(reflect.ValueOf(&x))
  893. }
  894. case core.PtrFloat32Type:
  895. if rawValueType.Kind() == reflect.Float64 {
  896. var x = float32(vv.Float())
  897. hasAssigned = true
  898. fieldValue.Set(reflect.ValueOf(&x))
  899. }
  900. case core.PtrIntType:
  901. if rawValueType.Kind() == reflect.Int64 {
  902. var x = int(vv.Int())
  903. hasAssigned = true
  904. fieldValue.Set(reflect.ValueOf(&x))
  905. }
  906. case core.PtrInt32Type:
  907. if rawValueType.Kind() == reflect.Int64 {
  908. var x = int32(vv.Int())
  909. hasAssigned = true
  910. fieldValue.Set(reflect.ValueOf(&x))
  911. }
  912. case core.PtrInt8Type:
  913. if rawValueType.Kind() == reflect.Int64 {
  914. var x = int8(vv.Int())
  915. hasAssigned = true
  916. fieldValue.Set(reflect.ValueOf(&x))
  917. }
  918. case core.PtrInt16Type:
  919. if rawValueType.Kind() == reflect.Int64 {
  920. var x = int16(vv.Int())
  921. hasAssigned = true
  922. fieldValue.Set(reflect.ValueOf(&x))
  923. }
  924. case core.PtrUintType:
  925. if rawValueType.Kind() == reflect.Int64 {
  926. var x = uint(vv.Int())
  927. hasAssigned = true
  928. fieldValue.Set(reflect.ValueOf(&x))
  929. }
  930. case core.PtrUint32Type:
  931. if rawValueType.Kind() == reflect.Int64 {
  932. var x = uint32(vv.Int())
  933. hasAssigned = true
  934. fieldValue.Set(reflect.ValueOf(&x))
  935. }
  936. case core.Uint8Type:
  937. if rawValueType.Kind() == reflect.Int64 {
  938. var x = uint8(vv.Int())
  939. hasAssigned = true
  940. fieldValue.Set(reflect.ValueOf(&x))
  941. }
  942. case core.Uint16Type:
  943. if rawValueType.Kind() == reflect.Int64 {
  944. var x = uint16(vv.Int())
  945. hasAssigned = true
  946. fieldValue.Set(reflect.ValueOf(&x))
  947. }
  948. case core.Complex64Type:
  949. var x complex64
  950. if len([]byte(vv.String())) > 0 {
  951. err := json.Unmarshal([]byte(vv.String()), &x)
  952. if err != nil {
  953. session.Engine.logger.Error(err)
  954. } else {
  955. fieldValue.Set(reflect.ValueOf(&x))
  956. }
  957. }
  958. hasAssigned = true
  959. case core.Complex128Type:
  960. var x complex128
  961. if len([]byte(vv.String())) > 0 {
  962. err := json.Unmarshal([]byte(vv.String()), &x)
  963. if err != nil {
  964. session.Engine.logger.Error(err)
  965. } else {
  966. fieldValue.Set(reflect.ValueOf(&x))
  967. }
  968. }
  969. hasAssigned = true
  970. } // switch fieldType
  971. // default:
  972. // session.Engine.LogError("unsupported type in Scan: ", reflect.TypeOf(v).String())
  973. } // switch fieldType.Kind()
  974. // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value
  975. if !hasAssigned {
  976. data, err := value2Bytes(&rawValue)
  977. if err == nil {
  978. session.bytes2Value(col, fieldValue, data)
  979. } else {
  980. session.Engine.logger.Error(err.Error())
  981. }
  982. }
  983. }
  984. }
  985. return nil
  986. }
  987. func (session *Session) queryPreprocessByMap(sqlStr *string, paramMap interface{}) {
  988. re := regexp.MustCompile(`[?](\w+)`)
  989. query := *sqlStr
  990. names := make(map[string]int)
  991. var i int
  992. query = re.ReplaceAllStringFunc(query, func(src string) string {
  993. names[src[1:]] = i
  994. i += 1
  995. return "?"
  996. })
  997. for _, filter := range session.Engine.dialect.Filters() {
  998. query = filter.Do(query, session.Engine.dialect, session.Statement.RefTable)
  999. }
  1000. *sqlStr = query
  1001. session.Engine.logSQL(*sqlStr, paramMap)
  1002. }
  1003. func (session *Session) Sqls(sqls interface{}, parmas ...interface{}) *SqlsExecutor {
  1004. sqlsExecutor := new(SqlsExecutor)
  1005. switch sqls.(type) {
  1006. case string:
  1007. sqlsExecutor.sqls = sqls.(string)
  1008. case []string:
  1009. sqlsExecutor.sqls = sqls.([]string)
  1010. case map[string]string:
  1011. sqlsExecutor.sqls = sqls.(map[string]string)
  1012. default:
  1013. sqlsExecutor.sqls = nil
  1014. sqlsExecutor.err = ErrParamsType
  1015. }
  1016. if len(parmas) == 0 {
  1017. sqlsExecutor.parmas = nil
  1018. }
  1019. if len(parmas) > 1 {
  1020. sqlsExecutor.parmas = nil
  1021. sqlsExecutor.err = ErrParamsType
  1022. }
  1023. if len(parmas) == 1 {
  1024. switch parmas[0].(type) {
  1025. case map[string]interface{}:
  1026. sqlsExecutor.parmas = parmas[0].(map[string]interface{})
  1027. case []map[string]interface{}:
  1028. sqlsExecutor.parmas = parmas[0].([]map[string]interface{})
  1029. case map[string]map[string]interface{}:
  1030. sqlsExecutor.parmas = parmas[0].(map[string]map[string]interface{})
  1031. default:
  1032. sqlsExecutor.parmas = nil
  1033. sqlsExecutor.err = ErrParamsType
  1034. }
  1035. }
  1036. sqlsExecutor.session = session
  1037. return sqlsExecutor
  1038. }
  1039. func (session *Session) SqlMapsClient(sqlkeys interface{}, parmas ...interface{}) *SqlMapsExecutor {
  1040. sqlMapsExecutor := new(SqlMapsExecutor)
  1041. switch sqlkeys.(type) {
  1042. case string:
  1043. sqlMapsExecutor.sqlkeys = sqlkeys.(string)
  1044. case []string:
  1045. sqlMapsExecutor.sqlkeys = sqlkeys.([]string)
  1046. case map[string]string:
  1047. sqlMapsExecutor.sqlkeys = sqlkeys.(map[string]string)
  1048. default:
  1049. sqlMapsExecutor.sqlkeys = nil
  1050. sqlMapsExecutor.err = ErrParamsType
  1051. }
  1052. if len(parmas) == 0 {
  1053. sqlMapsExecutor.parmas = nil
  1054. }
  1055. if len(parmas) > 1 {
  1056. sqlMapsExecutor.parmas = nil
  1057. sqlMapsExecutor.err = ErrParamsType
  1058. }
  1059. if len(parmas) == 1 {
  1060. switch parmas[0].(type) {
  1061. case map[string]interface{}:
  1062. sqlMapsExecutor.parmas = parmas[0].(map[string]interface{})
  1063. case []map[string]interface{}:
  1064. sqlMapsExecutor.parmas = parmas[0].([]map[string]interface{})
  1065. case map[string]map[string]interface{}:
  1066. sqlMapsExecutor.parmas = parmas[0].(map[string]map[string]interface{})
  1067. default:
  1068. sqlMapsExecutor.parmas = nil
  1069. sqlMapsExecutor.err = ErrParamsType
  1070. }
  1071. }
  1072. sqlMapsExecutor.session = session
  1073. return sqlMapsExecutor
  1074. }
  1075. func (session *Session) SqlTemplatesClient(sqlkeys interface{}, parmas ...interface{}) *SqlTemplatesExecutor {
  1076. sqlTemplatesExecutor := new(SqlTemplatesExecutor)
  1077. switch sqlkeys.(type) {
  1078. case string:
  1079. sqlTemplatesExecutor.sqlkeys = sqlkeys.(string)
  1080. case []string:
  1081. sqlTemplatesExecutor.sqlkeys = sqlkeys.([]string)
  1082. case map[string]string:
  1083. sqlTemplatesExecutor.sqlkeys = sqlkeys.(map[string]string)
  1084. default:
  1085. sqlTemplatesExecutor.sqlkeys = nil
  1086. sqlTemplatesExecutor.err = ErrParamsType
  1087. }
  1088. if len(parmas) == 0 {
  1089. sqlTemplatesExecutor.parmas = nil
  1090. }
  1091. if len(parmas) > 1 {
  1092. sqlTemplatesExecutor.parmas = nil
  1093. sqlTemplatesExecutor.err = ErrParamsType
  1094. }
  1095. if len(parmas) == 1 {
  1096. switch parmas[0].(type) {
  1097. case map[string]interface{}:
  1098. sqlTemplatesExecutor.parmas = parmas[0].(map[string]interface{})
  1099. case []map[string]interface{}:
  1100. sqlTemplatesExecutor.parmas = parmas[0].([]map[string]interface{})
  1101. case map[string]map[string]interface{}:
  1102. sqlTemplatesExecutor.parmas = parmas[0].(map[string]map[string]interface{})
  1103. default:
  1104. sqlTemplatesExecutor.parmas = nil
  1105. sqlTemplatesExecutor.err = ErrParamsType
  1106. }
  1107. }
  1108. sqlTemplatesExecutor.session = session
  1109. return sqlTemplatesExecutor
  1110. }