sqltemplate.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package xorm
  2. import (
  3. "os"
  4. "path/filepath"
  5. "strings"
  6. "github.com/Unknwon/goconfig"
  7. "gopkg.in/flosch/pongo2.v3"
  8. )
  9. type SqlTemplate struct {
  10. SqlTemplateRootDir string
  11. Template map[string]*pongo2.Template
  12. Extension string
  13. }
  14. type SqlTemplateOptions struct {
  15. Extension string
  16. }
  17. func (sqlTemplate *SqlTemplate) checkNilAndInit() {
  18. if sqlTemplate.Template == nil {
  19. sqlTemplate.Template = make(map[string]*pongo2.Template, 100)
  20. }
  21. }
  22. func (engine *Engine) InitSqlTemplate(options ...SqlTemplateOptions) error {
  23. var opt SqlTemplateOptions
  24. if len(options) > 0 {
  25. opt = options[0]
  26. }
  27. if len(opt.Extension) == 0 {
  28. opt.Extension = ".stpl"
  29. }
  30. var err error
  31. if engine.sqlTemplate.SqlTemplateRootDir == "" {
  32. cfg, err := goconfig.LoadConfigFile("./sql/xormcfg.ini")
  33. if err != nil {
  34. return err
  35. }
  36. engine.sqlTemplate.SqlTemplateRootDir, err = cfg.GetValue("", "SqlTemplateRootDir")
  37. if err != nil {
  38. return err
  39. }
  40. }
  41. err = filepath.Walk(engine.sqlTemplate.SqlTemplateRootDir, engine.sqlTemplate.walkFunc)
  42. if err != nil {
  43. return err
  44. }
  45. return nil
  46. }
  47. func (engine *Engine) LoadSqlTemplate(filepath string) error {
  48. if len(engine.sqlTemplate.Extension) == 0 {
  49. engine.sqlTemplate.Extension = ".stpl"
  50. }
  51. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  52. err := engine.loadSqlTemplate(filepath)
  53. if err != nil {
  54. return err
  55. }
  56. }
  57. return nil
  58. }
  59. func (engine *Engine) BatchLoadSqlTemplate(filepathSlice []string) error {
  60. if len(engine.sqlTemplate.Extension) == 0 {
  61. engine.sqlTemplate.Extension = ".stpl"
  62. }
  63. for _, filepath := range filepathSlice {
  64. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  65. err := engine.loadSqlTemplate(filepath)
  66. if err != nil {
  67. return err
  68. }
  69. }
  70. }
  71. return nil
  72. }
  73. func (engine *Engine) ReloadSqlTemplate(filepath string) error {
  74. if len(engine.sqlTemplate.Extension) == 0 {
  75. engine.sqlTemplate.Extension = ".stpl"
  76. }
  77. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  78. err := engine.reloadSqlTemplate(filepath)
  79. if err != nil {
  80. return err
  81. }
  82. }
  83. return nil
  84. }
  85. func (engine *Engine) BatchReloadSqlTemplate(filepathSlice []string) error {
  86. if len(engine.sqlTemplate.Extension) == 0 {
  87. engine.sqlTemplate.Extension = ".stpl"
  88. }
  89. for _, filepath := range filepathSlice {
  90. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  91. err := engine.loadSqlTemplate(filepath)
  92. if err != nil {
  93. return err
  94. }
  95. }
  96. }
  97. return nil
  98. }
  99. func (engine *Engine) loadSqlTemplate(filepath string) error {
  100. info, err := os.Lstat(filepath)
  101. if err != nil {
  102. return err
  103. }
  104. if info.IsDir() {
  105. return nil
  106. }
  107. err = engine.sqlTemplate.paresSqlTemplate(info.Name(), filepath)
  108. if err != nil {
  109. return err
  110. }
  111. return nil
  112. }
  113. func (engine *Engine) reloadSqlTemplate(filepath string) error {
  114. info, err := os.Lstat(filepath)
  115. if err != nil {
  116. return err
  117. }
  118. if info.IsDir() {
  119. return nil
  120. }
  121. err = engine.sqlTemplate.paresSqlTemplate(info.Name(), filepath)
  122. if err != nil {
  123. return err
  124. }
  125. return nil
  126. }
  127. func (sqlTemplate *SqlTemplate) walkFunc(path string, info os.FileInfo, err error) error {
  128. if err != nil {
  129. return err
  130. }
  131. if info.IsDir() {
  132. return nil
  133. }
  134. if strings.HasSuffix(path, sqlTemplate.Extension) {
  135. err = sqlTemplate.paresSqlTemplate(info.Name(), path)
  136. if err != nil {
  137. return err
  138. }
  139. }
  140. return nil
  141. }
  142. func (sqlTemplate *SqlTemplate) paresSqlTemplate(filename string, filepath string) error {
  143. template, err := pongo2.FromFile(filepath)
  144. if err != nil {
  145. return err
  146. }
  147. sqlTemplate.checkNilAndInit()
  148. sqlTemplate.Template[filename] = template
  149. return nil
  150. }
  151. func (engine *Engine) AddSqlTemplate(key string, sqlTemplateStr string) error {
  152. return engine.sqlTemplate.addSqlTemplate(key, sqlTemplateStr)
  153. }
  154. func (sqlTemplate *SqlTemplate) addSqlTemplate(key string, sqlTemplateStr string) error {
  155. template, err := pongo2.FromString(sqlTemplateStr)
  156. if err != nil {
  157. return err
  158. }
  159. sqlTemplate.checkNilAndInit()
  160. sqlTemplate.Template[key] = template
  161. return nil
  162. }
  163. func (engine *Engine) UpdateSqlTemplate(key string, sqlTemplateStr string) error {
  164. return engine.sqlTemplate.updateSqlTemplate(key, sqlTemplateStr)
  165. }
  166. func (sqlTemplate *SqlTemplate) updateSqlTemplate(key string, sqlTemplateStr string) error {
  167. template, err := pongo2.FromString(sqlTemplateStr)
  168. if err != nil {
  169. return err
  170. }
  171. sqlTemplate.checkNilAndInit()
  172. sqlTemplate.Template[key] = template
  173. return nil
  174. }
  175. func (engine *Engine) RemoveSqlTemplate(key string) {
  176. engine.sqlTemplate.removeSqlTemplate(key)
  177. }
  178. func (sqlTemplate *SqlTemplate) removeSqlTemplate(key string) {
  179. sqlTemplate.checkNilAndInit()
  180. delete(sqlTemplate.Template, key)
  181. }
  182. func (engine *Engine) BatchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  183. return engine.sqlTemplate.batchAddSqlTemplate(key, sqlTemplateStrMap)
  184. }
  185. func (sqlTemplate *SqlTemplate) batchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  186. sqlTemplate.checkNilAndInit()
  187. for k, v := range sqlTemplateStrMap {
  188. template, err := pongo2.FromString(v)
  189. if err != nil {
  190. return err
  191. }
  192. sqlTemplate.Template[k] = template
  193. }
  194. return nil
  195. }
  196. func (engine *Engine) BatchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  197. return engine.sqlTemplate.batchAddSqlTemplate(key, sqlTemplateStrMap)
  198. }
  199. func (sqlTemplate *SqlTemplate) batchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  200. sqlTemplate.checkNilAndInit()
  201. for k, v := range sqlTemplateStrMap {
  202. template, err := pongo2.FromString(v)
  203. if err != nil {
  204. return err
  205. }
  206. sqlTemplate.Template[k] = template
  207. }
  208. return nil
  209. }
  210. func (engine *Engine) BatchRemoveSqlTemplate(key []string) {
  211. engine.sqlTemplate.batchRemoveSqlTemplate(key)
  212. }
  213. func (sqlTemplate *SqlTemplate) batchRemoveSqlTemplate(key []string) {
  214. sqlTemplate.checkNilAndInit()
  215. for _, v := range key {
  216. delete(sqlTemplate.Template, v)
  217. }
  218. }