sqltemplates_executor.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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. if sqlTemplatesExecutor.err != nil {
  14. return nil, nil, sqlTemplatesExecutor.err
  15. }
  16. var model_1_results ResultMap
  17. var model_2_results sql.Result
  18. var err error
  19. sqlModel := 1
  20. switch sqlTemplatesExecutor.sqlkeys.(type) {
  21. case string:
  22. sqlkey := strings.TrimSpace(sqlTemplatesExecutor.sqlkeys.(string))
  23. if sqlTemplatesExecutor.parmas == nil {
  24. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkey).Execute(nil)
  25. if err != nil {
  26. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  27. err = sqlTemplatesExecutor.session.Rollback()
  28. if err != nil {
  29. return nil, nil, err
  30. }
  31. }
  32. return nil, nil, err
  33. }
  34. sqlStr = strings.TrimSpace(sqlStr)
  35. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  36. switch sqlCmd {
  37. case "select", "desc":
  38. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey).Query()
  39. sqlModel = 1
  40. case "insert", "delete", "update", "create":
  41. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey).Execute()
  42. sqlModel = 2
  43. }
  44. } else {
  45. switch sqlTemplatesExecutor.parmas.(type) {
  46. case []map[string]interface{}:
  47. parmaMap, ok := sqlTemplatesExecutor.parmas.([]map[string]interface{})
  48. if !ok {
  49. return nil, nil, ErrParamsType
  50. }
  51. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkey).Execute(parmaMap[0])
  52. if err != nil {
  53. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  54. err = sqlTemplatesExecutor.session.Rollback()
  55. if err != nil {
  56. return nil, nil, err
  57. }
  58. }
  59. return nil, nil, err
  60. }
  61. sqlStr = strings.TrimSpace(sqlStr)
  62. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  63. switch sqlCmd {
  64. case "select", "desc":
  65. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap[0]).Query()
  66. sqlModel = 1
  67. case "insert", "delete", "update", "create":
  68. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap[0]).Execute()
  69. sqlModel = 2
  70. }
  71. case map[string]interface{}:
  72. parmaMap, ok := sqlTemplatesExecutor.parmas.(map[string]interface{})
  73. if !ok {
  74. return nil, nil, ErrParamsType
  75. }
  76. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkey).Execute(parmaMap)
  77. if err != nil {
  78. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  79. err = sqlTemplatesExecutor.session.Rollback()
  80. if err != nil {
  81. return nil, nil, err
  82. }
  83. }
  84. return nil, nil, err
  85. }
  86. sqlStr = strings.TrimSpace(sqlStr)
  87. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  88. switch sqlCmd {
  89. case "select", "desc":
  90. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap).Query()
  91. sqlModel = 1
  92. case "insert", "delete", "update", "create":
  93. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkey, &parmaMap).Execute()
  94. sqlModel = 2
  95. }
  96. default:
  97. return nil, nil, ErrParamsType
  98. }
  99. }
  100. resultSlice := make([][]map[string]interface{}, 1)
  101. if sqlModel == 1 {
  102. if model_1_results.Error != nil {
  103. return nil, nil, model_1_results.Error
  104. }
  105. resultSlice[0] = make([]map[string]interface{}, len(model_1_results.Results))
  106. resultSlice[0] = model_1_results.Results
  107. return resultSlice, nil, nil
  108. } else {
  109. if err != nil {
  110. return nil, nil, err
  111. }
  112. resultMap := make([]map[string]interface{}, 1)
  113. resultMap[0] = make(map[string]interface{})
  114. //todo all database support LastInsertId
  115. LastInsertId, _ := model_2_results.LastInsertId()
  116. resultMap[0]["LastInsertId"] = LastInsertId
  117. RowsAffected, err := model_2_results.RowsAffected()
  118. if err != nil {
  119. return nil, nil, err
  120. }
  121. resultMap[0]["RowsAffected"] = RowsAffected
  122. resultSlice[0] = resultMap
  123. return resultSlice, nil, nil
  124. }
  125. case []string:
  126. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  127. err := sqlTemplatesExecutor.session.Begin()
  128. if err != nil {
  129. return nil, nil, err
  130. }
  131. }
  132. sqlkeysSlice := sqlTemplatesExecutor.sqlkeys.([]string)
  133. n := len(sqlkeysSlice)
  134. resultSlice := make([][]map[string]interface{}, n)
  135. parmaSlice := make([]map[string]interface{}, n)
  136. switch sqlTemplatesExecutor.parmas.(type) {
  137. case []map[string]interface{}:
  138. parmaSlice = sqlTemplatesExecutor.parmas.([]map[string]interface{})
  139. default:
  140. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  141. err = sqlTemplatesExecutor.session.Rollback()
  142. if err != nil {
  143. return nil, nil, err
  144. }
  145. }
  146. return nil, nil, ErrParamsType
  147. }
  148. for i, _ := range sqlkeysSlice {
  149. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkeysSlice[i]).Execute(parmaSlice[i])
  150. if err != nil {
  151. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  152. err = sqlTemplatesExecutor.session.Rollback()
  153. if err != nil {
  154. return nil, nil, err
  155. }
  156. }
  157. return nil, nil, err
  158. }
  159. sqlStr = strings.TrimSpace(sqlStr)
  160. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  161. if parmaSlice[i] == nil {
  162. switch sqlCmd {
  163. case "select", "desc":
  164. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i]).Query()
  165. sqlModel = 1
  166. case "insert", "delete", "update", "create":
  167. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i]).Execute()
  168. sqlModel = 2
  169. }
  170. } else {
  171. switch sqlCmd {
  172. case "select", "desc":
  173. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i], &parmaSlice[i]).Query()
  174. sqlModel = 1
  175. case "insert", "delete", "update", "create":
  176. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysSlice[i], &parmaSlice[i]).Execute()
  177. sqlModel = 2
  178. }
  179. }
  180. if sqlModel == 1 {
  181. if model_1_results.Error != nil {
  182. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  183. err = sqlTemplatesExecutor.session.Rollback()
  184. if err != nil {
  185. return nil, nil, err
  186. }
  187. }
  188. return nil, nil, model_1_results.Error
  189. }
  190. resultSlice[i] = make([]map[string]interface{}, len(model_1_results.Results))
  191. resultSlice[i] = model_1_results.Results
  192. } else {
  193. if err != nil {
  194. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  195. err = sqlTemplatesExecutor.session.Rollback()
  196. if err != nil {
  197. return nil, nil, err
  198. }
  199. }
  200. return nil, nil, err
  201. }
  202. resultMap := make([]map[string]interface{}, 1)
  203. resultMap[0] = make(map[string]interface{})
  204. //todo all database support LastInsertId
  205. LastInsertId, _ := model_2_results.LastInsertId()
  206. resultMap[0]["LastInsertId"] = LastInsertId
  207. RowsAffected, err := model_2_results.RowsAffected()
  208. if err != nil {
  209. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  210. err = sqlTemplatesExecutor.session.Commit()
  211. if err != nil {
  212. return nil, nil, err
  213. }
  214. }
  215. return nil, nil, err
  216. }
  217. resultMap[0]["RowsAffected"] = RowsAffected
  218. resultSlice[i] = make([]map[string]interface{}, 1)
  219. resultSlice[i] = resultMap
  220. }
  221. }
  222. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  223. err = sqlTemplatesExecutor.session.Commit()
  224. if err != nil {
  225. return nil, nil, err
  226. }
  227. }
  228. return resultSlice, nil, nil
  229. case map[string]string:
  230. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  231. err = sqlTemplatesExecutor.session.Begin()
  232. if err != nil {
  233. return nil, nil, err
  234. }
  235. }
  236. sqlkeysMap := sqlTemplatesExecutor.sqlkeys.(map[string]string)
  237. n := len(sqlkeysMap)
  238. resultsMap := make(map[string][]map[string]interface{}, n)
  239. parmasMap := make(map[string]map[string]interface{}, n)
  240. switch sqlTemplatesExecutor.parmas.(type) {
  241. case map[string]map[string]interface{}:
  242. parmasMap = sqlTemplatesExecutor.parmas.(map[string]map[string]interface{})
  243. default:
  244. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  245. err = sqlTemplatesExecutor.session.Rollback()
  246. if err != nil {
  247. return nil, nil, err
  248. }
  249. }
  250. return nil, nil, ErrParamsType
  251. }
  252. for k, _ := range sqlkeysMap {
  253. sqlStr, err := sqlTemplatesExecutor.session.Engine.GetSqlTemplate(sqlkeysMap[k]).Execute(parmasMap[k])
  254. if err != nil {
  255. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  256. err = sqlTemplatesExecutor.session.Rollback()
  257. if err != nil {
  258. return nil, nil, err
  259. }
  260. }
  261. return nil, nil, err
  262. }
  263. sqlStr = strings.TrimSpace(sqlStr)
  264. sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
  265. if parmasMap[k] == nil {
  266. switch sqlCmd {
  267. case "select", "desc":
  268. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k]).Query()
  269. sqlModel = 1
  270. case "insert", "delete", "update", "create":
  271. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k]).Execute()
  272. sqlModel = 2
  273. }
  274. } else {
  275. parmaMap := parmasMap[k]
  276. switch sqlCmd {
  277. case "select", "desc":
  278. model_1_results = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k], &parmaMap).Query()
  279. sqlModel = 1
  280. case "insert", "delete", "update", "create":
  281. model_2_results, err = sqlTemplatesExecutor.session.SqlTemplateClient(sqlkeysMap[k], &parmaMap).Execute()
  282. sqlModel = 2
  283. }
  284. }
  285. if sqlModel == 1 {
  286. if model_1_results.Error != nil {
  287. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  288. err = sqlTemplatesExecutor.session.Rollback()
  289. if err != nil {
  290. return nil, nil, err
  291. }
  292. }
  293. return nil, nil, model_1_results.Error
  294. }
  295. resultsMap[k] = make([]map[string]interface{}, len(model_1_results.Results))
  296. resultsMap[k] = model_1_results.Results
  297. } else {
  298. if err != nil {
  299. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  300. err = sqlTemplatesExecutor.session.Rollback()
  301. if err != nil {
  302. return nil, nil, err
  303. }
  304. }
  305. return nil, nil, err
  306. }
  307. resultMap := make([]map[string]interface{}, 1)
  308. resultMap[0] = make(map[string]interface{})
  309. //todo all database support LastInsertId
  310. LastInsertId, _ := model_2_results.LastInsertId()
  311. resultMap[0]["LastInsertId"] = LastInsertId
  312. RowsAffected, err := model_2_results.RowsAffected()
  313. if err != nil {
  314. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  315. err = sqlTemplatesExecutor.session.Rollback()
  316. if err != nil {
  317. return nil, nil, err
  318. }
  319. }
  320. return nil, nil, err
  321. }
  322. resultMap[0]["RowsAffected"] = RowsAffected
  323. resultsMap[k] = make([]map[string]interface{}, 1)
  324. resultsMap[k] = resultMap
  325. }
  326. }
  327. if sqlTemplatesExecutor.session.IsSqlFuc == true {
  328. err = sqlTemplatesExecutor.session.Commit()
  329. if err != nil {
  330. return nil, nil, err
  331. }
  332. }
  333. return nil, resultsMap, nil
  334. }
  335. return nil, nil, nil
  336. }