sql_executor.go 14 KB

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