sqltemplates_executor.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. package xorm
  2. import (
  3. "database/sql"
  4. "strings"
  5. )
  6. type SqlTemplatesExecutor struct {
  7. session *Session
  8. sqlkeys interface{}
  9. parmas interface{}
  10. err error
  11. }
  12. func (sqlTemplatesExecutor *SqlTemplatesExecutor) Execute() ([][]map[string]interface{}, map[string][]map[string]interface{}, error) {
  13. defer sqlTemplatesExecutor.session.resetStatement()
  14. if sqlTemplatesExecutor.session.IsAutoClose {
  15. defer sqlTemplatesExecutor.session.Close()
  16. }
  17. if sqlTemplatesExecutor.err != nil {
  18. return nil, nil, sqlTemplatesExecutor.err
  19. }
  20. var model_1_results *ResultMap
  21. var model_2_results sql.Result
  22. var err error
  23. sqlModel := 1
  24. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  25. err := sqlTemplatesExecutor.session.Begin()
  26. if err != nil {
  27. return nil, nil, err
  28. }
  29. }
  30. switch sqlTemplatesExecutor.sqlkeys.(type) {
  31. case string:
  32. sqlkey := strings.TrimSpace(sqlTemplatesExecutor.sqlkeys.(string))
  33. if sqlTemplatesExecutor.parmas == nil {
  34. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkey).Execute(nil)
  35. if err != nil {
  36. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  37. err1 := sqlTemplatesExecutor.session.Rollback()
  38. if err1 != nil {
  39. return nil, nil, err1
  40. }
  41. }
  42. return nil, nil, err
  43. }
  44. sqlStr = strings.TrimSpace(sqlStr)
  45. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  46. switch sqlCmd {
  47. case "select":
  48. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey).Query()
  49. sqlModel = 1
  50. case "insert", "delete", "update", "create", "drop":
  51. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey).Execute()
  52. sqlModel = 2
  53. default:
  54. sqlModel = 3
  55. }
  56. } else {
  57. switch sqlTemplatesExecutor.parmas.(type) {
  58. case []map[string]interface{}:
  59. parmaMap, _ := sqlTemplatesExecutor.parmas.([]map[string]interface{})
  60. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkey).Execute(parmaMap[0])
  61. if err != nil {
  62. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  63. err1 := sqlTemplatesExecutor.session.Rollback()
  64. if err1 != nil {
  65. return nil, nil, err1
  66. }
  67. }
  68. return nil, nil, err
  69. }
  70. sqlStr = strings.TrimSpace(sqlStr)
  71. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  72. switch sqlCmd {
  73. case "select":
  74. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap[0]).Query()
  75. sqlModel = 1
  76. case "insert", "delete", "update", "create", "drop":
  77. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap[0]).Execute()
  78. sqlModel = 2
  79. default:
  80. sqlModel = 3
  81. }
  82. case map[string]interface{}:
  83. parmaMap, _ := sqlTemplatesExecutor.parmas.(map[string]interface{})
  84. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkey).Execute(parmaMap)
  85. if err != nil {
  86. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  87. err1 := sqlTemplatesExecutor.session.Rollback()
  88. if err1 != nil {
  89. return nil, nil, err1
  90. }
  91. }
  92. return nil, nil, err
  93. }
  94. sqlStr = strings.TrimSpace(sqlStr)
  95. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  96. switch sqlCmd {
  97. case "select":
  98. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap).Query()
  99. sqlModel = 1
  100. case "insert", "delete", "update", "create", "drop":
  101. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap).Execute()
  102. sqlModel = 2
  103. default:
  104. sqlModel = 3
  105. }
  106. default:
  107. return nil, nil, ErrParamsType
  108. }
  109. }
  110. resultSlice := make([][]map[string]interface{}, 1)
  111. if sqlModel == 1 {
  112. if model_1_results.Error != nil {
  113. return nil, nil, model_1_results.Error
  114. }
  115. resultSlice[0] = model_1_results.Results
  116. return resultSlice, nil, nil
  117. } else if sqlModel == 2 {
  118. if err != nil {
  119. return nil, nil, err
  120. }
  121. resultMap := make([]map[string]interface{}, 1)
  122. resultMap[0] = make(map[string]interface{})
  123. //todo all database support LastInsertId
  124. LastInsertId, _ := model_2_results.LastInsertId()
  125. resultMap[0]["LastInsertId"] = LastInsertId
  126. RowsAffected, err := model_2_results.RowsAffected()
  127. if err != nil {
  128. return nil, nil, err
  129. }
  130. resultMap[0]["RowsAffected"] = RowsAffected
  131. resultSlice[0] = resultMap
  132. return resultSlice, nil, nil
  133. } else {
  134. resultSlice[0] = nil
  135. }
  136. case []string:
  137. sqlkeysSlice := sqlTemplatesExecutor.sqlkeys.([]string)
  138. n := len(sqlkeysSlice)
  139. resultSlice := make([][]map[string]interface{}, n)
  140. parmaSlice := make([]map[string]interface{}, n)
  141. if sqlTemplatesExecutor.parmas == nil {
  142. for i, _ := range sqlkeysSlice {
  143. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkeysSlice[i]).Execute(nil)
  144. if err != nil {
  145. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  146. err1 := sqlTemplatesExecutor.session.Rollback()
  147. if err1 != nil {
  148. return nil, nil, err1
  149. }
  150. }
  151. return nil, nil, err
  152. }
  153. sqlStr = strings.TrimSpace(sqlStr)
  154. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  155. switch sqlCmd {
  156. case "select":
  157. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i]).Query()
  158. sqlModel = 1
  159. case "insert", "delete", "update", "create", "drop":
  160. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i]).Execute()
  161. sqlModel = 2
  162. default:
  163. sqlModel = 3
  164. }
  165. if sqlModel == 1 {
  166. if model_1_results.Error != nil {
  167. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  168. err1 := sqlTemplatesExecutor.session.Rollback()
  169. if err1 != nil {
  170. return nil, nil, err1
  171. }
  172. }
  173. return nil, nil, model_1_results.Error
  174. }
  175. resultSlice[i] = model_1_results.Results
  176. } else if sqlModel == 2 {
  177. if err != nil {
  178. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  179. err1 := sqlTemplatesExecutor.session.Rollback()
  180. if err1 != nil {
  181. return nil, nil, err1
  182. }
  183. }
  184. return nil, nil, err
  185. }
  186. resultMap := make([]map[string]interface{}, 1)
  187. resultMap[0] = make(map[string]interface{})
  188. //todo all database support LastInsertId
  189. LastInsertId, _ := model_2_results.LastInsertId()
  190. resultMap[0]["LastInsertId"] = LastInsertId
  191. RowsAffected, err := model_2_results.RowsAffected()
  192. if err != nil {
  193. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  194. err1 := sqlTemplatesExecutor.session.Rollback()
  195. if err1 != nil {
  196. return nil, nil, err1
  197. }
  198. }
  199. return nil, nil, err
  200. }
  201. resultMap[0]["RowsAffected"] = RowsAffected
  202. resultSlice[i] = make([]map[string]interface{}, 1)
  203. resultSlice[i] = resultMap
  204. } else {
  205. resultSlice[i] = nil
  206. }
  207. }
  208. } else {
  209. switch sqlTemplatesExecutor.parmas.(type) {
  210. case []map[string]interface{}:
  211. parmaSlice = sqlTemplatesExecutor.parmas.([]map[string]interface{})
  212. default:
  213. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  214. err1 := sqlTemplatesExecutor.session.Rollback()
  215. if err1 != nil {
  216. return nil, nil, err1
  217. }
  218. }
  219. return nil, nil, ErrParamsType
  220. }
  221. for i, _ := range sqlkeysSlice {
  222. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkeysSlice[i]).Execute(parmaSlice[i])
  223. if err != nil {
  224. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  225. err1 := sqlTemplatesExecutor.session.Rollback()
  226. if err1 != nil {
  227. return nil, nil, err1
  228. }
  229. }
  230. return nil, nil, err
  231. }
  232. sqlStr = strings.TrimSpace(sqlStr)
  233. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  234. if parmaSlice[i] == nil {
  235. switch sqlCmd {
  236. case "select":
  237. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i]).Query()
  238. sqlModel = 1
  239. case "insert", "delete", "update", "create", "drop":
  240. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i]).Execute()
  241. sqlModel = 2
  242. default:
  243. sqlModel = 3
  244. }
  245. } else {
  246. switch sqlCmd {
  247. case "select":
  248. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i], &parmaSlice[i]).Query()
  249. sqlModel = 1
  250. case "insert", "delete", "update", "create", "drop":
  251. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i], &parmaSlice[i]).Execute()
  252. sqlModel = 2
  253. default:
  254. sqlModel = 3
  255. }
  256. }
  257. if sqlModel == 1 {
  258. if model_1_results.Error != nil {
  259. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  260. err1 := sqlTemplatesExecutor.session.Rollback()
  261. if err1 != nil {
  262. return nil, nil, err1
  263. }
  264. }
  265. return nil, nil, model_1_results.Error
  266. }
  267. resultSlice[i] = model_1_results.Results
  268. } else if sqlModel == 2 {
  269. if err != nil {
  270. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  271. err1 := sqlTemplatesExecutor.session.Rollback()
  272. if err1 != nil {
  273. return nil, nil, err1
  274. }
  275. }
  276. return nil, nil, err
  277. }
  278. resultMap := make([]map[string]interface{}, 1)
  279. resultMap[0] = make(map[string]interface{})
  280. //todo all database support LastInsertId
  281. LastInsertId, _ := model_2_results.LastInsertId()
  282. resultMap[0]["LastInsertId"] = LastInsertId
  283. RowsAffected, err := model_2_results.RowsAffected()
  284. if err != nil {
  285. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  286. err1 := sqlTemplatesExecutor.session.Rollback()
  287. if err1 != nil {
  288. return nil, nil, err1
  289. }
  290. }
  291. return nil, nil, err
  292. }
  293. resultMap[0]["RowsAffected"] = RowsAffected
  294. resultSlice[i] = make([]map[string]interface{}, 1)
  295. resultSlice[i] = resultMap
  296. } else {
  297. resultSlice[i] = nil
  298. }
  299. }
  300. }
  301. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  302. err1 := sqlTemplatesExecutor.session.Commit()
  303. if err1 != nil {
  304. return nil, nil, err1
  305. }
  306. }
  307. return resultSlice, nil, nil
  308. case map[string]string:
  309. sqlkeysMap := sqlTemplatesExecutor.sqlkeys.(map[string]string)
  310. n := len(sqlkeysMap)
  311. resultsMap := make(map[string][]map[string]interface{}, n)
  312. parmasMap := make(map[string]map[string]interface{}, n)
  313. if sqlTemplatesExecutor.parmas == nil {
  314. for k, _ := range sqlkeysMap {
  315. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkeysMap[k]).Execute(nil)
  316. if err != nil {
  317. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  318. err1 := sqlTemplatesExecutor.session.Rollback()
  319. if err1 != nil {
  320. return nil, nil, err1
  321. }
  322. }
  323. return nil, nil, err
  324. }
  325. sqlStr = strings.TrimSpace(sqlStr)
  326. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  327. switch sqlCmd {
  328. case "select":
  329. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k]).Query()
  330. sqlModel = 1
  331. case "insert", "delete", "update", "create", "drop":
  332. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k]).Execute()
  333. sqlModel = 2
  334. default:
  335. sqlModel = 3
  336. }
  337. if sqlModel == 1 {
  338. if model_1_results.Error != nil {
  339. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  340. err1 := sqlTemplatesExecutor.session.Rollback()
  341. if err1 != nil {
  342. return nil, nil, err1
  343. }
  344. }
  345. return nil, nil, model_1_results.Error
  346. }
  347. resultsMap[k] = model_1_results.Results
  348. } else if sqlModel == 2 {
  349. if err != nil {
  350. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  351. err1 := sqlTemplatesExecutor.session.Rollback()
  352. if err1 != nil {
  353. return nil, nil, err1
  354. }
  355. }
  356. return nil, nil, err
  357. }
  358. resultMap := make([]map[string]interface{}, 1)
  359. resultMap[0] = make(map[string]interface{})
  360. //todo all database support LastInsertId
  361. LastInsertId, _ := model_2_results.LastInsertId()
  362. resultMap[0]["LastInsertId"] = LastInsertId
  363. RowsAffected, err := model_2_results.RowsAffected()
  364. if err != nil {
  365. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  366. err1 := sqlTemplatesExecutor.session.Rollback()
  367. if err1 != nil {
  368. return nil, nil, err1
  369. }
  370. }
  371. return nil, nil, err
  372. }
  373. resultMap[0]["RowsAffected"] = RowsAffected
  374. resultsMap[k] = make([]map[string]interface{}, 1)
  375. resultsMap[k] = resultMap
  376. } else {
  377. resultsMap[k] = nil
  378. }
  379. }
  380. } else {
  381. switch sqlTemplatesExecutor.parmas.(type) {
  382. case map[string]map[string]interface{}:
  383. parmasMap = sqlTemplatesExecutor.parmas.(map[string]map[string]interface{})
  384. default:
  385. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  386. err1 := sqlTemplatesExecutor.session.Rollback()
  387. if err1 != nil {
  388. return nil, nil, err1
  389. }
  390. }
  391. return nil, nil, ErrParamsType
  392. }
  393. for k, _ := range sqlkeysMap {
  394. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkeysMap[k]).Execute(parmasMap[k])
  395. if err != nil {
  396. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  397. err1 := sqlTemplatesExecutor.session.Rollback()
  398. if err1 != nil {
  399. return nil, nil, err1
  400. }
  401. }
  402. return nil, nil, err
  403. }
  404. sqlStr = strings.TrimSpace(sqlStr)
  405. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  406. if parmasMap[k] == nil {
  407. switch sqlCmd {
  408. case "select":
  409. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k]).Query()
  410. sqlModel = 1
  411. case "insert", "delete", "update", "create", "drop":
  412. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k]).Execute()
  413. sqlModel = 2
  414. default:
  415. sqlModel = 3
  416. }
  417. } else {
  418. parmaMap := parmasMap[k]
  419. switch sqlCmd {
  420. case "select":
  421. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k], &parmaMap).Query()
  422. sqlModel = 1
  423. case "insert", "delete", "update", "create", "drop":
  424. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k], &parmaMap).Execute()
  425. sqlModel = 2
  426. default:
  427. sqlModel = 3
  428. }
  429. }
  430. if sqlModel == 1 {
  431. if model_1_results.Error != nil {
  432. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  433. err1 := sqlTemplatesExecutor.session.Rollback()
  434. if err1 != nil {
  435. return nil, nil, err1
  436. }
  437. }
  438. return nil, nil, model_1_results.Error
  439. }
  440. resultsMap[k] = model_1_results.Results
  441. } else if sqlModel == 2 {
  442. if err != nil {
  443. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  444. err1 := sqlTemplatesExecutor.session.Rollback()
  445. if err1 != nil {
  446. return nil, nil, err1
  447. }
  448. }
  449. return nil, nil, err
  450. }
  451. resultMap := make([]map[string]interface{}, 1)
  452. resultMap[0] = make(map[string]interface{})
  453. //todo all database support LastInsertId
  454. LastInsertId, _ := model_2_results.LastInsertId()
  455. resultMap[0]["LastInsertId"] = LastInsertId
  456. RowsAffected, err := model_2_results.RowsAffected()
  457. if err != nil {
  458. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  459. err1 := sqlTemplatesExecutor.session.Rollback()
  460. if err1 != nil {
  461. return nil, nil, err1
  462. }
  463. }
  464. return nil, nil, err
  465. }
  466. resultMap[0]["RowsAffected"] = RowsAffected
  467. resultsMap[k] = make([]map[string]interface{}, 1)
  468. resultsMap[k] = resultMap
  469. } else {
  470. resultsMap[k] = nil
  471. }
  472. }
  473. }
  474. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  475. err1 := sqlTemplatesExecutor.session.Commit()
  476. if err1 != nil {
  477. return nil, nil, err1
  478. }
  479. }
  480. return nil, resultsMap, nil
  481. }
  482. return nil, nil, nil
  483. }