sqlmap.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package xorm
  2. import (
  3. "encoding/xml"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/Unknwon/goconfig"
  9. )
  10. type SqlMap struct {
  11. SqlMapRootDir string
  12. Sql map[string]string
  13. Extension string
  14. Capacity uint
  15. }
  16. type SqlMapOptions struct {
  17. Capacity uint
  18. Extension string
  19. }
  20. type Result struct {
  21. Sql []Sql `xml:"sql"`
  22. }
  23. type Sql struct {
  24. Value string `xml:",chardata"`
  25. Id string `xml:"id,attr"`
  26. }
  27. func (sqlMap *SqlMap) checkNilAndInit() {
  28. if sqlMap.Sql == nil {
  29. if sqlMap.Capacity == 0 {
  30. sqlMap.Sql = make(map[string]string, 100)
  31. } else {
  32. sqlMap.Sql = make(map[string]string, sqlMap.Capacity)
  33. }
  34. }
  35. }
  36. func (engine *Engine) InitSqlMap(options ...SqlMapOptions) error {
  37. var opt SqlMapOptions
  38. if len(options) > 0 {
  39. opt = options[0]
  40. }
  41. if len(opt.Extension) == 0 {
  42. opt.Extension = ".xml"
  43. }
  44. engine.sqlMap.Extension = opt.Extension
  45. engine.sqlMap.Capacity = opt.Capacity
  46. var err error
  47. if engine.sqlMap.SqlMapRootDir == "" {
  48. cfg, err := goconfig.LoadConfigFile("./sql/xormcfg.ini")
  49. if err != nil {
  50. return err
  51. }
  52. engine.sqlMap.SqlMapRootDir, err = cfg.GetValue("", "SqlMapRootDir")
  53. if err != nil {
  54. return err
  55. }
  56. }
  57. err = filepath.Walk(engine.sqlMap.SqlMapRootDir, engine.sqlMap.walkFunc)
  58. if err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. func (engine *Engine) LoadSqlMap(filepath string) error {
  64. if len(engine.sqlMap.Extension) == 0 {
  65. engine.sqlMap.Extension = ".xml"
  66. }
  67. if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
  68. err := engine.loadSqlMap(filepath)
  69. if err != nil {
  70. return err
  71. }
  72. }
  73. return nil
  74. }
  75. func (engine *Engine) BatchLoadSqlMap(filepathSlice []string) error {
  76. if len(engine.sqlMap.Extension) == 0 {
  77. engine.sqlMap.Extension = ".xml"
  78. }
  79. for _, filepath := range filepathSlice {
  80. if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
  81. err := engine.loadSqlMap(filepath)
  82. if err != nil {
  83. return err
  84. }
  85. }
  86. }
  87. return nil
  88. }
  89. func (engine *Engine) ReloadSqlMap(filepath string) error {
  90. if len(engine.sqlMap.Extension) == 0 {
  91. engine.sqlMap.Extension = ".xml"
  92. }
  93. if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
  94. err := engine.reloadSqlMap(filepath)
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. return nil
  100. }
  101. func (engine *Engine) BatchReloadSqlMap(filepathSlice []string) error {
  102. if len(engine.sqlMap.Extension) == 0 {
  103. engine.sqlMap.Extension = ".xml"
  104. }
  105. for _, filepath := range filepathSlice {
  106. if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
  107. err := engine.loadSqlMap(filepath)
  108. if err != nil {
  109. return err
  110. }
  111. }
  112. }
  113. return nil
  114. }
  115. func (engine *Engine) loadSqlMap(filepath string) error {
  116. info, err := os.Lstat(filepath)
  117. if err != nil {
  118. return err
  119. }
  120. if info.IsDir() {
  121. return nil
  122. }
  123. err = engine.sqlMap.paresSql(filepath)
  124. if err != nil {
  125. return err
  126. }
  127. return nil
  128. }
  129. func (engine *Engine) reloadSqlMap(filepath string) error {
  130. info, err := os.Lstat(filepath)
  131. if err != nil {
  132. return err
  133. }
  134. if info.IsDir() {
  135. return nil
  136. }
  137. err = engine.sqlMap.paresSql(filepath)
  138. if err != nil {
  139. return err
  140. }
  141. return nil
  142. }
  143. func (sqlMap *SqlMap) walkFunc(path string, info os.FileInfo, err error) error {
  144. if err != nil {
  145. return err
  146. }
  147. if info.IsDir() {
  148. return nil
  149. }
  150. if strings.HasSuffix(path, sqlMap.Extension) {
  151. err = sqlMap.paresSql(path)
  152. if err != nil {
  153. return err
  154. }
  155. }
  156. return nil
  157. }
  158. func (sqlMap *SqlMap) paresSql(filepath string) error {
  159. content, err := ioutil.ReadFile(filepath)
  160. if err != nil {
  161. return err
  162. }
  163. sqlMap.checkNilAndInit()
  164. var result Result
  165. err = xml.Unmarshal(content, &result)
  166. if err != nil {
  167. return err
  168. }
  169. for _, sql := range result.Sql {
  170. sqlMap.Sql[sql.Id] = sql.Value
  171. }
  172. return nil
  173. }
  174. func (engine *Engine) AddSql(key string, sql string) {
  175. engine.sqlMap.addSql(key, sql)
  176. }
  177. func (sqlMap *SqlMap) addSql(key string, sql string) {
  178. sqlMap.checkNilAndInit()
  179. sqlMap.Sql[key] = sql
  180. }
  181. func (engine *Engine) UpdateSql(key string, sql string) {
  182. engine.sqlMap.updateSql(key, sql)
  183. }
  184. func (sqlMap *SqlMap) updateSql(key string, sql string) {
  185. sqlMap.checkNilAndInit()
  186. sqlMap.Sql[key] = sql
  187. }
  188. func (engine *Engine) RemoveSql(key string) {
  189. engine.sqlMap.removeSql(key)
  190. }
  191. func (sqlMap *SqlMap) removeSql(key string) {
  192. sqlMap.checkNilAndInit()
  193. delete(sqlMap.Sql, key)
  194. }
  195. func (engine *Engine) BatchAddSql(sqlStrMap map[string]string) {
  196. engine.sqlMap.batchAddSql(sqlStrMap)
  197. }
  198. func (sqlMap *SqlMap) batchAddSql(sqlStrMap map[string]string) {
  199. sqlMap.checkNilAndInit()
  200. for k, v := range sqlStrMap {
  201. sqlMap.Sql[k] = v
  202. }
  203. }
  204. func (engine *Engine) BatchUpdateSql(sqlStrMap map[string]string) {
  205. engine.sqlMap.batchUpdateSql(sqlStrMap)
  206. }
  207. func (sqlMap *SqlMap) batchUpdateSql(sqlStrMap map[string]string) {
  208. sqlMap.checkNilAndInit()
  209. for k, v := range sqlStrMap {
  210. sqlMap.Sql[k] = v
  211. }
  212. }
  213. func (engine *Engine) BatchRemoveSql(key []string) {
  214. engine.sqlMap.batchRemoveSql(key)
  215. }
  216. func (sqlMap *SqlMap) batchRemoveSql(key []string) {
  217. sqlMap.checkNilAndInit()
  218. for _, v := range key {
  219. delete(sqlMap.Sql, v)
  220. }
  221. }
  222. func (engine *Engine) GetSql(key string) string {
  223. return engine.sqlMap.getSql(key)
  224. }
  225. func (sqlMap *SqlMap) getSql(key string) string {
  226. return sqlMap.Sql[key]
  227. }
  228. func (engine *Engine) GetSqlMap(keys ...interface{}) map[string]string {
  229. return engine.sqlMap.getSqlMap(keys...)
  230. }
  231. func (sqlMap *SqlMap) getSqlMap(keys ...interface{}) map[string]string {
  232. var resultSqlMap map[string]string
  233. i := len(keys)
  234. if i == 0 {
  235. return sqlMap.Sql
  236. }
  237. if i == 1 {
  238. switch keys[0].(type) {
  239. case string:
  240. resultSqlMap = make(map[string]string, 1)
  241. case []string:
  242. ks := keys[0].([]string)
  243. n := len(ks)
  244. resultSqlMap = make(map[string]string, n)
  245. }
  246. } else {
  247. resultSqlMap = make(map[string]string, i)
  248. }
  249. for k, _ := range keys {
  250. switch keys[k].(type) {
  251. case string:
  252. key := keys[k].(string)
  253. resultSqlMap[key] = sqlMap.Sql[key]
  254. case []string:
  255. ks := keys[k].([]string)
  256. for _, v := range ks {
  257. resultSqlMap[v] = sqlMap.Sql[v]
  258. }
  259. }
  260. }
  261. return resultSqlMap
  262. }