sessionplus.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  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. // "fmt"
  11. "reflect"
  12. "regexp"
  13. "strings"
  14. "time"
  15. "github.com/Chronokeeper/anyxml"
  16. "github.com/xormplus/core"
  17. )
  18. type ResultBean struct {
  19. Has bool
  20. Result interface{}
  21. Error error
  22. }
  23. func (resultBean ResultBean) Json() (bool, string, error) {
  24. if resultBean.Error != nil {
  25. return resultBean.Has, "", resultBean.Error
  26. }
  27. if !resultBean.Has {
  28. return resultBean.Has, "", nil
  29. }
  30. result, err := JSONString(resultBean.Result, true)
  31. return resultBean.Has, result, err
  32. }
  33. func (session *Session) GetFirst(bean interface{}) ResultBean {
  34. has, err := session.Get(bean)
  35. r := ResultBean{Has: has, Result: bean, Error: err}
  36. return r
  37. }
  38. func (resultBean ResultBean) Xml() (bool, string, error) {
  39. if resultBean.Error != nil {
  40. return false, "", resultBean.Error
  41. }
  42. if !resultBean.Has {
  43. return resultBean.Has, "", nil
  44. }
  45. has, result, err := resultBean.Json()
  46. if err != nil {
  47. return false, "", err
  48. }
  49. if !has {
  50. return has, "", nil
  51. }
  52. var anydata = []byte(result)
  53. var i interface{}
  54. err = json.Unmarshal(anydata, &i)
  55. if err != nil {
  56. return false, "", err
  57. }
  58. resultByte, err := anyxml.Xml(i)
  59. if err != nil {
  60. return false, "", err
  61. }
  62. return resultBean.Has, string(resultByte), err
  63. }
  64. func (resultBean ResultBean) XmlIndent(prefix string, indent string, recordTag string) (bool, string, error) {
  65. if resultBean.Error != nil {
  66. return false, "", resultBean.Error
  67. }
  68. if !resultBean.Has {
  69. return resultBean.Has, "", nil
  70. }
  71. has, result, err := resultBean.Json()
  72. if err != nil {
  73. return false, "", err
  74. }
  75. if !has {
  76. return has, "", nil
  77. }
  78. var anydata = []byte(result)
  79. var i interface{}
  80. err = json.Unmarshal(anydata, &i)
  81. if err != nil {
  82. return false, "", err
  83. }
  84. resultByte, err := anyxml.XmlIndent(i, prefix, indent, recordTag)
  85. if err != nil {
  86. return false, "", err
  87. }
  88. return resultBean.Has, string(resultByte), err
  89. }
  90. type ResultMap struct {
  91. Result []map[string]interface{}
  92. Error error
  93. }
  94. func (resultMap ResultMap) Json() (string, error) {
  95. if resultMap.Error != nil {
  96. return "", resultMap.Error
  97. }
  98. return JSONString(resultMap.Result, true)
  99. }
  100. func (resultMap ResultMap) Xml() (string, error) {
  101. if resultMap.Error != nil {
  102. return "", resultMap.Error
  103. }
  104. results, err := anyxml.Xml(resultMap.Result)
  105. if err != nil {
  106. return "", err
  107. }
  108. return string(results), nil
  109. }
  110. func (resultMap ResultMap) XmlIndent(prefix string, indent string, recordTag string) (string, error) {
  111. if resultMap.Error != nil {
  112. return "", resultMap.Error
  113. }
  114. results, err := anyxml.XmlIndent(resultMap.Result, prefix, indent, recordTag)
  115. if err != nil {
  116. return "", err
  117. }
  118. return string(results), nil
  119. }
  120. type ResultStructs struct {
  121. Result interface{}
  122. Error error
  123. }
  124. func (resultStructs ResultStructs) Json() (string, error) {
  125. if resultStructs.Error != nil {
  126. return "", resultStructs.Error
  127. }
  128. return JSONString(resultStructs.Result, true)
  129. }
  130. func (resultStructs ResultStructs) Xml() (string, error) {
  131. if resultStructs.Error != nil {
  132. return "", resultStructs.Error
  133. }
  134. result, err := resultStructs.Json()
  135. if err != nil {
  136. return "", err
  137. }
  138. var anydata = []byte(result)
  139. var i interface{}
  140. err = json.Unmarshal(anydata, &i)
  141. if err != nil {
  142. return "", err
  143. }
  144. resultByte, err := anyxml.Xml(i)
  145. if err != nil {
  146. return "", err
  147. }
  148. return string(resultByte), nil
  149. }
  150. func (resultStructs ResultStructs) XmlIndent(prefix string, indent string, recordTag string) (string, error) {
  151. if resultStructs.Error != nil {
  152. return "", resultStructs.Error
  153. }
  154. result, err := resultStructs.Json()
  155. if err != nil {
  156. return "", err
  157. }
  158. var anydata = []byte(result)
  159. var i interface{}
  160. err = json.Unmarshal(anydata, &i)
  161. if err != nil {
  162. return "", err
  163. }
  164. resultByte, err := anyxml.XmlIndent(i, prefix, indent, recordTag)
  165. if err != nil {
  166. return "", err
  167. }
  168. return string(resultByte), nil
  169. }
  170. func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) ResultStructs {
  171. err := session.find(rowsSlicePtr, condiBean...)
  172. r := ResultStructs{Result: rowsSlicePtr, Error: err}
  173. return r
  174. }
  175. // Exec a raw sql and return records as []map[string]interface{}
  176. func (session *Session) Query() ResultMap {
  177. sql := session.Statement.RawSQL
  178. params := session.Statement.RawParams
  179. result, err := session.queryAll(sql, params...)
  180. r := ResultMap{Result: result, Error: err}
  181. return r
  182. }
  183. // Exec a raw sql and return records as []map[string]interface{}
  184. func (session *Session) QueryWithDateFormat(dateFormat string) ResultMap {
  185. sql := session.Statement.RawSQL
  186. params := session.Statement.RawParams
  187. result, err := session.queryAllWithDateFormat(dateFormat, sql, params...)
  188. r := ResultMap{Result: result, Error: err}
  189. return r
  190. }
  191. // Exec a raw sql and return records as []map[string]interface{}
  192. func (session *Session) QueryByParamMap() ResultMap {
  193. sql := session.Statement.RawSQL
  194. params := session.Statement.RawParams
  195. result, err := session.queryAllByMap(sql, params[0])
  196. r := ResultMap{Result: result, Error: err}
  197. return r
  198. }
  199. func (session *Session) QueryByParamMapWithDateFormat(dateFormat string) ResultMap {
  200. sql := session.Statement.RawSQL
  201. params := session.Statement.RawParams
  202. results, err := session.queryAllByMapWithDateFormat(dateFormat, sql, params[0])
  203. r := ResultMap{Result: results, Error: err}
  204. return r
  205. }
  206. // =============================
  207. // for Object
  208. // =============================
  209. func (session *Session) queryAll(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  210. session.queryPreprocess(&sqlStr, paramStr...)
  211. if session.IsAutoCommit {
  212. return query3(session.DB(), sqlStr, paramStr...)
  213. }
  214. return txQuery3(session.Tx, sqlStr, paramStr...)
  215. }
  216. func (session *Session) queryAllByMap(sqlStr string, paramMap interface{}) (resultsSlice []map[string]interface{}, err error) {
  217. sqlStr1, param, _ := core.MapToSlice(sqlStr, paramMap)
  218. session.queryPreprocess(&sqlStr1, param...)
  219. if session.IsAutoCommit {
  220. return query3(session.DB(), sqlStr1, param...)
  221. }
  222. return txQuery3(session.Tx, sqlStr1, param...)
  223. }
  224. func (session *Session) queryAllByMapWithDateFormat(dateFormat string, sqlStr string, paramMap interface{}) (resultsSlice []map[string]interface{}, err error) {
  225. sqlStr1, param, _ := core.MapToSlice(sqlStr, paramMap)
  226. session.queryPreprocess(&sqlStr1, param...)
  227. if session.IsAutoCommit {
  228. return query3WithDateFormat(session.DB(), dateFormat, sqlStr1, param...)
  229. }
  230. return txQuery3WithDateFormat(session.Tx, dateFormat, sqlStr1, param...)
  231. }
  232. func (session *Session) queryAllWithDateFormat(dateFormat string, sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  233. session.queryPreprocess(&sqlStr, paramStr...)
  234. if session.IsAutoCommit {
  235. return query3WithDateFormat(session.DB(), dateFormat, sqlStr, paramStr...)
  236. }
  237. return txQuery3WithDateFormat(session.Tx, dateFormat, sqlStr, paramStr...)
  238. }
  239. func (session *Session) queryAllToJsonString(sql string, paramStr ...interface{}) (string, error) {
  240. results, err := session.queryAll(sql, paramStr...)
  241. if err != nil {
  242. return "", err
  243. }
  244. return JSONString(results, true)
  245. }
  246. func (session *Session) queryAllToXmlString(sql string, paramStr ...interface{}) (string, error) {
  247. resultMap, err := session.queryAll(sql, paramStr...)
  248. if err != nil {
  249. return "", err
  250. }
  251. results, err := anyxml.Xml(resultMap)
  252. if err != nil {
  253. return "", err
  254. }
  255. return string(results), nil
  256. }
  257. func (session *Session) queryAllToXmlIndentString(sql string, prefix string, indent string, paramStr ...interface{}) (string, error) {
  258. resultSlice, err := session.queryAll(sql, paramStr...)
  259. if err != nil {
  260. return "", err
  261. }
  262. results, err := anyxml.XmlIndent(resultSlice, prefix, indent, "result")
  263. if err != nil {
  264. return "", err
  265. }
  266. return string(results), nil
  267. }
  268. func (session *Session) queryAllToXmlStringWithDateFormat(dateFormat string, sql string, paramStr ...interface{}) (string, error) {
  269. resultSlice, err := session.queryAll(sql, paramStr...)
  270. if err != nil {
  271. return "", err
  272. }
  273. results, err := anyxml.XmlWithDateFormat(dateFormat, resultSlice)
  274. if err != nil {
  275. return "", err
  276. }
  277. return string(results), nil
  278. }
  279. func (session *Session) queryAllToXmlIndentStringWithDateFormat(dateFormat string, sql string, prefix string, indent string, paramStr ...interface{}) (string, error) {
  280. resultSlice, err := session.queryAll(sql, paramStr...)
  281. if err != nil {
  282. return "", err
  283. }
  284. results, err := anyxml.XmlIndentWithDateFormat(dateFormat, resultSlice, prefix, indent, "results")
  285. if err != nil {
  286. return "", err
  287. }
  288. return string(results), nil
  289. }
  290. func (session *Session) queryAllByMapToJsonString(sql string, paramMap interface{}) (string, error) {
  291. results, err := session.queryAllByMap(sql, paramMap)
  292. if err != nil {
  293. return "", err
  294. }
  295. return JSONString(results, true)
  296. }
  297. func (session *Session) queryAllByMapToJsonStringWithDateFormat(dateFormat string, sql string, paramMap interface{}) (string, error) {
  298. results, err := session.queryAllByMapWithDateFormat(dateFormat, sql, paramMap)
  299. if err != nil {
  300. return "", err
  301. }
  302. return JSONString(results, true)
  303. }
  304. func (session *Session) queryAllToJsonStringWithDateFormat(dateFormat string, sql string, paramStr ...interface{}) (string, error) {
  305. results, err := session.queryAllWithDateFormat(dateFormat, sql, paramStr...)
  306. if err != nil {
  307. return "", err
  308. }
  309. return JSONString(results, true)
  310. }
  311. func (session *Session) row2BeanWithDateFormat(dateFormat string, rows *core.Rows, fields []string, fieldsCount int, bean interface{}) error {
  312. dataStruct := rValue(bean)
  313. if dataStruct.Kind() != reflect.Struct {
  314. return errors.New("Expected a pointer to a struct")
  315. }
  316. table := session.Engine.autoMapType(dataStruct)
  317. return session._row2BeanWithDateFormat(dateFormat, rows, fields, fieldsCount, bean, &dataStruct, table)
  318. }
  319. func (session *Session) _row2BeanWithDateFormat(dateFormat string, rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) error {
  320. scanResults := make([]interface{}, fieldsCount)
  321. for i := 0; i < len(fields); i++ {
  322. var cell interface{}
  323. scanResults[i] = &cell
  324. }
  325. if err := rows.Scan(scanResults...); err != nil {
  326. return err
  327. }
  328. if b, hasBeforeSet := bean.(BeforeSetProcessor); hasBeforeSet {
  329. for ii, key := range fields {
  330. b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
  331. }
  332. }
  333. defer func() {
  334. if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet {
  335. for ii, key := range fields {
  336. b.AfterSet(key, Cell(scanResults[ii].(*interface{})))
  337. }
  338. }
  339. }()
  340. var tempMap = make(map[string]int)
  341. for ii, key := range fields {
  342. var idx int
  343. var ok bool
  344. if idx, ok = tempMap[strings.ToLower(key)]; !ok {
  345. idx = 0
  346. } else {
  347. idx = idx + 1
  348. }
  349. tempMap[strings.ToLower(key)] = idx
  350. if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil {
  351. rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii]))
  352. //if row is null then ignore
  353. if rawValue.Interface() == nil {
  354. continue
  355. }
  356. if fieldValue.CanAddr() {
  357. if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok {
  358. if data, err := value2Bytes(&rawValue); err == nil {
  359. structConvert.FromDB(data)
  360. } else {
  361. session.Engine.LogError(err)
  362. }
  363. continue
  364. }
  365. }
  366. if _, ok := fieldValue.Interface().(core.Conversion); ok {
  367. if data, err := value2Bytes(&rawValue); err == nil {
  368. if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() {
  369. fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
  370. }
  371. fieldValue.Interface().(core.Conversion).FromDB(data)
  372. } else {
  373. session.Engine.LogError(err)
  374. }
  375. continue
  376. }
  377. rawValueType := reflect.TypeOf(rawValue.Interface())
  378. vv := reflect.ValueOf(rawValue.Interface())
  379. fieldType := fieldValue.Type()
  380. hasAssigned := false
  381. switch fieldType.Kind() {
  382. case reflect.Complex64, reflect.Complex128:
  383. if rawValueType.Kind() == reflect.String {
  384. hasAssigned = true
  385. x := reflect.New(fieldType)
  386. err := json.Unmarshal([]byte(vv.String()), x.Interface())
  387. if err != nil {
  388. session.Engine.LogError(err)
  389. return err
  390. }
  391. fieldValue.Set(x.Elem())
  392. } else if rawValueType.Kind() == reflect.Slice {
  393. hasAssigned = true
  394. x := reflect.New(fieldType)
  395. err := json.Unmarshal(vv.Bytes(), x.Interface())
  396. if err != nil {
  397. session.Engine.LogError(err)
  398. return err
  399. }
  400. fieldValue.Set(x.Elem())
  401. }
  402. case reflect.Slice, reflect.Array:
  403. switch rawValueType.Kind() {
  404. case reflect.Slice, reflect.Array:
  405. switch rawValueType.Elem().Kind() {
  406. case reflect.Uint8:
  407. if fieldType.Elem().Kind() == reflect.Uint8 {
  408. hasAssigned = true
  409. fieldValue.Set(vv)
  410. }
  411. }
  412. }
  413. case reflect.String:
  414. if rawValueType.Kind() == reflect.String {
  415. hasAssigned = true
  416. fieldValue.SetString(vv.String())
  417. }
  418. case reflect.Bool:
  419. if rawValueType.Kind() == reflect.Bool {
  420. hasAssigned = true
  421. fieldValue.SetBool(vv.Bool())
  422. }
  423. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  424. switch rawValueType.Kind() {
  425. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  426. hasAssigned = true
  427. fieldValue.SetInt(vv.Int())
  428. }
  429. case reflect.Float32, reflect.Float64:
  430. switch rawValueType.Kind() {
  431. case reflect.Float32, reflect.Float64:
  432. hasAssigned = true
  433. fieldValue.SetFloat(vv.Float())
  434. }
  435. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
  436. switch rawValueType.Kind() {
  437. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
  438. hasAssigned = true
  439. fieldValue.SetUint(vv.Uint())
  440. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  441. hasAssigned = true
  442. fieldValue.SetUint(uint64(vv.Int()))
  443. }
  444. case reflect.Struct:
  445. col := table.GetColumn(key)
  446. if fieldType.ConvertibleTo(core.TimeType) {
  447. if rawValueType == core.TimeType {
  448. hasAssigned = true
  449. t := vv.Convert(core.TimeType).Interface().(time.Time)
  450. z, _ := t.Zone()
  451. if len(z) == 0 || t.Year() == 0 { // !nashtsai! HACK tmp work around for lib/pq doesn't properly time with location
  452. session.Engine.LogDebugf("empty zone key[%v] : %v | zone: %v | location: %+v\n", key, t, z, *t.Location())
  453. t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(),
  454. t.Minute(), t.Second(), t.Nanosecond(), time.Local)
  455. }
  456. // !nashtsai! convert to engine location
  457. t = t.In(session.Engine.TZLocation)
  458. // dateFormat to string
  459. loc, _ := time.LoadLocation("Local") //重要:获取时区 rawValue.Interface().(time.Time).Format(dateFormat)
  460. t, _ = time.ParseInLocation(dateFormat, t.Format(dateFormat), loc)
  461. // fieldValue.Set(reflect.ValueOf(t).Convert(core.StringType))
  462. fieldValue.Set(reflect.ValueOf(t).Convert(fieldType))
  463. // t = fieldValue.Interface().(time.Time)
  464. // z, _ = t.Zone()
  465. // session.Engine.LogDebug("fieldValue key[%v]: %v | zone: %v | location: %+v\n", key, t, z, *t.Location())
  466. } else if rawValueType == core.IntType || rawValueType == core.Int64Type ||
  467. rawValueType == core.Int32Type {
  468. hasAssigned = true
  469. t := time.Unix(vv.Int(), 0).In(session.Engine.TZLocation)
  470. vv = reflect.ValueOf(t)
  471. fieldValue.Set(vv)
  472. }
  473. } else if nulVal, ok := fieldValue.Addr().Interface().(sql.Scanner); ok {
  474. // !<winxxp>! 增加支持sql.Scanner接口的结构,如sql.NullString
  475. hasAssigned = true
  476. if err := nulVal.Scan(vv.Interface()); err != nil {
  477. //fmt.Println("sql.Sanner error:", err.Error())
  478. session.Engine.LogError("sql.Sanner error:", err.Error())
  479. hasAssigned = false
  480. }
  481. } else if col.SQLType.IsJson() {
  482. if rawValueType.Kind() == reflect.String {
  483. hasAssigned = true
  484. x := reflect.New(fieldType)
  485. err := json.Unmarshal([]byte(vv.String()), x.Interface())
  486. if err != nil {
  487. session.Engine.LogError(err)
  488. return err
  489. }
  490. fieldValue.Set(x.Elem())
  491. } else if rawValueType.Kind() == reflect.Slice {
  492. hasAssigned = true
  493. x := reflect.New(fieldType)
  494. err := json.Unmarshal(vv.Bytes(), x.Interface())
  495. if err != nil {
  496. session.Engine.LogError(err)
  497. return err
  498. }
  499. fieldValue.Set(x.Elem())
  500. }
  501. } else if session.Statement.UseCascade {
  502. table := session.Engine.autoMapType(*fieldValue)
  503. if table != nil {
  504. if len(table.PrimaryKeys) != 1 {
  505. panic("unsupported non or composited primary key cascade")
  506. }
  507. var pk = make(core.PK, len(table.PrimaryKeys))
  508. switch rawValueType.Kind() {
  509. case reflect.Int64:
  510. pk[0] = vv.Int()
  511. case reflect.Int:
  512. pk[0] = int(vv.Int())
  513. case reflect.Int32:
  514. pk[0] = int32(vv.Int())
  515. case reflect.Int16:
  516. pk[0] = int16(vv.Int())
  517. case reflect.Int8:
  518. pk[0] = int8(vv.Int())
  519. case reflect.Uint64:
  520. pk[0] = vv.Uint()
  521. case reflect.Uint:
  522. pk[0] = uint(vv.Uint())
  523. case reflect.Uint32:
  524. pk[0] = uint32(vv.Uint())
  525. case reflect.Uint16:
  526. pk[0] = uint16(vv.Uint())
  527. case reflect.Uint8:
  528. pk[0] = uint8(vv.Uint())
  529. case reflect.String:
  530. pk[0] = vv.String()
  531. default:
  532. panic("unsupported primary key type cascade")
  533. }
  534. if !isPKZero(pk) {
  535. // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch
  536. // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne
  537. // property to be fetched lazily
  538. structInter := reflect.New(fieldValue.Type())
  539. newsession := session.Engine.NewSession()
  540. defer newsession.Close()
  541. has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface())
  542. if err != nil {
  543. return err
  544. }
  545. if has {
  546. v := structInter.Elem().Interface()
  547. fieldValue.Set(reflect.ValueOf(v))
  548. } else {
  549. return errors.New("cascade obj is not exist!")
  550. }
  551. }
  552. } else {
  553. session.Engine.LogError("unsupported struct type in Scan: ", fieldValue.Type().String())
  554. }
  555. }
  556. case reflect.Ptr:
  557. // !nashtsai! TODO merge duplicated codes above
  558. //typeStr := fieldType.String()
  559. switch fieldType {
  560. // following types case matching ptr's native type, therefore assign ptr directly
  561. case core.PtrStringType:
  562. if rawValueType.Kind() == reflect.String {
  563. x := vv.String()
  564. hasAssigned = true
  565. fieldValue.Set(reflect.ValueOf(&x))
  566. }
  567. case core.PtrBoolType:
  568. if rawValueType.Kind() == reflect.Bool {
  569. x := vv.Bool()
  570. hasAssigned = true
  571. fieldValue.Set(reflect.ValueOf(&x))
  572. }
  573. case core.PtrTimeType:
  574. if rawValueType == core.PtrTimeType {
  575. hasAssigned = true
  576. var x time.Time = rawValue.Interface().(time.Time)
  577. fieldValue.Set(reflect.ValueOf(&x))
  578. }
  579. case core.PtrFloat64Type:
  580. if rawValueType.Kind() == reflect.Float64 {
  581. x := vv.Float()
  582. hasAssigned = true
  583. fieldValue.Set(reflect.ValueOf(&x))
  584. }
  585. case core.PtrUint64Type:
  586. if rawValueType.Kind() == reflect.Int64 {
  587. var x uint64 = uint64(vv.Int())
  588. hasAssigned = true
  589. fieldValue.Set(reflect.ValueOf(&x))
  590. }
  591. case core.PtrInt64Type:
  592. if rawValueType.Kind() == reflect.Int64 {
  593. x := vv.Int()
  594. hasAssigned = true
  595. fieldValue.Set(reflect.ValueOf(&x))
  596. }
  597. case core.PtrFloat32Type:
  598. if rawValueType.Kind() == reflect.Float64 {
  599. var x float32 = float32(vv.Float())
  600. hasAssigned = true
  601. fieldValue.Set(reflect.ValueOf(&x))
  602. }
  603. case core.PtrIntType:
  604. if rawValueType.Kind() == reflect.Int64 {
  605. var x int = int(vv.Int())
  606. hasAssigned = true
  607. fieldValue.Set(reflect.ValueOf(&x))
  608. }
  609. case core.PtrInt32Type:
  610. if rawValueType.Kind() == reflect.Int64 {
  611. var x int32 = int32(vv.Int())
  612. hasAssigned = true
  613. fieldValue.Set(reflect.ValueOf(&x))
  614. }
  615. case core.PtrInt8Type:
  616. if rawValueType.Kind() == reflect.Int64 {
  617. var x int8 = int8(vv.Int())
  618. hasAssigned = true
  619. fieldValue.Set(reflect.ValueOf(&x))
  620. }
  621. case core.PtrInt16Type:
  622. if rawValueType.Kind() == reflect.Int64 {
  623. var x int16 = int16(vv.Int())
  624. hasAssigned = true
  625. fieldValue.Set(reflect.ValueOf(&x))
  626. }
  627. case core.PtrUintType:
  628. if rawValueType.Kind() == reflect.Int64 {
  629. var x uint = uint(vv.Int())
  630. hasAssigned = true
  631. fieldValue.Set(reflect.ValueOf(&x))
  632. }
  633. case core.PtrUint32Type:
  634. if rawValueType.Kind() == reflect.Int64 {
  635. var x uint32 = uint32(vv.Int())
  636. hasAssigned = true
  637. fieldValue.Set(reflect.ValueOf(&x))
  638. }
  639. case core.Uint8Type:
  640. if rawValueType.Kind() == reflect.Int64 {
  641. var x uint8 = uint8(vv.Int())
  642. hasAssigned = true
  643. fieldValue.Set(reflect.ValueOf(&x))
  644. }
  645. case core.Uint16Type:
  646. if rawValueType.Kind() == reflect.Int64 {
  647. var x uint16 = uint16(vv.Int())
  648. hasAssigned = true
  649. fieldValue.Set(reflect.ValueOf(&x))
  650. }
  651. case core.Complex64Type:
  652. var x complex64
  653. err := json.Unmarshal([]byte(vv.String()), &x)
  654. if err != nil {
  655. session.Engine.LogError(err)
  656. } else {
  657. fieldValue.Set(reflect.ValueOf(&x))
  658. }
  659. hasAssigned = true
  660. case core.Complex128Type:
  661. var x complex128
  662. err := json.Unmarshal([]byte(vv.String()), &x)
  663. if err != nil {
  664. session.Engine.LogError(err)
  665. } else {
  666. fieldValue.Set(reflect.ValueOf(&x))
  667. }
  668. hasAssigned = true
  669. } // switch fieldType
  670. // default:
  671. // session.Engine.LogError("unsupported type in Scan: ", reflect.TypeOf(v).String())
  672. } // switch fieldType.Kind()
  673. // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value
  674. if !hasAssigned {
  675. data, err := value2Bytes(&rawValue)
  676. if err == nil {
  677. session.bytes2Value(table.GetColumn(key), fieldValue, data)
  678. } else {
  679. session.Engine.LogError(err.Error())
  680. }
  681. }
  682. }
  683. }
  684. return nil
  685. }
  686. func (session *Session) queryPreprocessByMap(sqlStr *string, paramMap interface{}) {
  687. re := regexp.MustCompile(`[?](\w+)`)
  688. query := *sqlStr
  689. names := make(map[string]int)
  690. var i int
  691. query = re.ReplaceAllStringFunc(query, func(src string) string {
  692. names[src[1:]] = i
  693. i += 1
  694. return "?"
  695. })
  696. for _, filter := range session.Engine.dialect.Filters() {
  697. query = filter.Do(query, session.Engine.dialect, session.Statement.RefTable)
  698. }
  699. *sqlStr = query
  700. session.Engine.logSQL(*sqlStr, paramMap)
  701. }