sqltemplates_executor.go 16 KB

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