sqltemplate_pongo2.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package xorm
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "strings"
  6. "gopkg.in/flosch/pongo2.v3"
  7. )
  8. type Pongo2Template struct {
  9. SqlTemplateRootDir string
  10. Template map[string]*pongo2.Template
  11. extension string
  12. Capacity uint
  13. Cipher Cipher
  14. Type int
  15. }
  16. func (sqlTemplate *Pongo2Template) RootDir() string {
  17. return sqlTemplate.SqlTemplateRootDir
  18. }
  19. func (sqlTemplate *Pongo2Template) Extension() string {
  20. return sqlTemplate.extension
  21. }
  22. func (sqlTemplate *Pongo2Template) SetSqlTemplateCipher(cipher Cipher) {
  23. sqlTemplate.Cipher = cipher
  24. }
  25. func (sqlTemplate *Pongo2Template) WalkFunc(path string, info os.FileInfo, err error) error {
  26. if err != nil {
  27. return err
  28. }
  29. if info.IsDir() {
  30. return nil
  31. }
  32. if strings.HasSuffix(path, sqlTemplate.extension) {
  33. err = sqlTemplate.paresSqlTemplate(info.Name(), path)
  34. if err != nil {
  35. return err
  36. }
  37. }
  38. return nil
  39. }
  40. func (sqlTemplate *Pongo2Template) paresSqlTemplate(filename string, filepath string) error {
  41. var sqlt *pongo2.Template
  42. var err error
  43. var content []byte
  44. if sqlTemplate.Cipher == nil {
  45. sqlt, err = pongo2.FromFile(filepath)
  46. if err != nil {
  47. return err
  48. }
  49. } else {
  50. content, err = sqlTemplate.ReadTemplate(filepath)
  51. if err != nil {
  52. return err
  53. }
  54. sqlt, err = pongo2.FromString(string(content))
  55. if err != nil {
  56. return err
  57. }
  58. }
  59. sqlTemplate.checkNilAndInit()
  60. sqlTemplate.Template[filename] = sqlt
  61. return nil
  62. }
  63. func (sqlTemplate *Pongo2Template) ReadTemplate(filepath string) ([]byte, error) {
  64. content, err := ioutil.ReadFile(filepath)
  65. if err != nil {
  66. return nil, err
  67. }
  68. content, err = sqlTemplate.Cipher.Decrypt(content)
  69. if err != nil {
  70. return nil, err
  71. }
  72. return content, nil
  73. }
  74. //-------------------------------------------------------------------------------------------------------------
  75. func (sqlTemplate *Pongo2Template) LoadSqlTemplate(filepath string) error {
  76. if strings.HasSuffix(filepath, sqlTemplate.extension) {
  77. err := sqlTemplate.loadSqlTemplate(filepath)
  78. if err != nil {
  79. return err
  80. }
  81. }
  82. return nil
  83. }
  84. func (sqlTemplate *Pongo2Template) BatchLoadSqlTemplate(filepathSlice []string) error {
  85. for _, filepath := range filepathSlice {
  86. if strings.HasSuffix(filepath, sqlTemplate.extension) {
  87. err := sqlTemplate.loadSqlTemplate(filepath)
  88. if err != nil {
  89. return err
  90. }
  91. }
  92. }
  93. return nil
  94. }
  95. func (sqlTemplate *Pongo2Template) ReloadSqlTemplate(filepath string) error {
  96. if strings.HasSuffix(filepath, sqlTemplate.extension) {
  97. err := sqlTemplate.reloadSqlTemplate(filepath)
  98. if err != nil {
  99. return err
  100. }
  101. }
  102. return nil
  103. }
  104. func (sqlTemplate *Pongo2Template) BatchReloadSqlTemplate(filepathSlice []string) error {
  105. for _, filepath := range filepathSlice {
  106. if strings.HasSuffix(filepath, sqlTemplate.extension) {
  107. err := sqlTemplate.loadSqlTemplate(filepath)
  108. if err != nil {
  109. return err
  110. }
  111. }
  112. }
  113. return nil
  114. }
  115. func (sqlTemplate *Pongo2Template) loadSqlTemplate(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 = sqlTemplate.paresSqlTemplate(info.Name(), filepath)
  124. if err != nil {
  125. return err
  126. }
  127. return nil
  128. }
  129. func (sqlTemplate *Pongo2Template) reloadSqlTemplate(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 = sqlTemplate.paresSqlTemplate(info.Name(), filepath)
  138. if err != nil {
  139. return err
  140. }
  141. return nil
  142. }
  143. func (sqlTemplate *Pongo2Template) checkNilAndInit() {
  144. if sqlTemplate.Template == nil {
  145. sqlTemplate.Template = make(map[string]*pongo2.Template, 100)
  146. }
  147. }
  148. func (sqlTemplate *Pongo2Template) AddSqlTemplate(key string, sqlTemplateStr string) error {
  149. template, err := pongo2.FromString(sqlTemplateStr)
  150. if err != nil {
  151. return err
  152. }
  153. sqlTemplate.checkNilAndInit()
  154. sqlTemplate.Template[key] = template
  155. return nil
  156. }
  157. func (sqlTemplate *Pongo2Template) UpdateSqlTemplate(key string, sqlTemplateStr string) error {
  158. template, err := pongo2.FromString(sqlTemplateStr)
  159. if err != nil {
  160. return err
  161. }
  162. sqlTemplate.checkNilAndInit()
  163. sqlTemplate.Template[key] = template
  164. return nil
  165. }
  166. func (sqlTemplate *Pongo2Template) RemoveSqlTemplate(key string) {
  167. sqlTemplate.checkNilAndInit()
  168. delete(sqlTemplate.Template, key)
  169. }
  170. func (sqlTemplate *Pongo2Template) BatchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  171. sqlTemplate.checkNilAndInit()
  172. for k, v := range sqlTemplateStrMap {
  173. template, err := pongo2.FromString(v)
  174. if err != nil {
  175. return err
  176. }
  177. sqlTemplate.Template[k] = template
  178. }
  179. return nil
  180. }
  181. func (sqlTemplate *Pongo2Template) BatchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  182. sqlTemplate.checkNilAndInit()
  183. for k, v := range sqlTemplateStrMap {
  184. template, err := pongo2.FromString(v)
  185. if err != nil {
  186. return err
  187. }
  188. sqlTemplate.Template[k] = template
  189. }
  190. return nil
  191. }
  192. func (sqlTemplate *Pongo2Template) BatchRemoveSqlTemplate(key []string) {
  193. sqlTemplate.checkNilAndInit()
  194. for _, v := range key {
  195. delete(sqlTemplate.Template, v)
  196. }
  197. }
  198. func (sqlTemplate *Pongo2Template) GetSqlTemplate(key string) *pongo2.Template {
  199. return sqlTemplate.Template[key]
  200. }
  201. func (sqlTemplate *Pongo2Template) GetSqlTemplates(keys ...interface{}) map[string]*pongo2.Template {
  202. var resultSqlTemplates map[string]*pongo2.Template
  203. i := len(keys)
  204. if i == 0 {
  205. return sqlTemplate.Template
  206. }
  207. if i == 1 {
  208. switch keys[0].(type) {
  209. case string:
  210. resultSqlTemplates = make(map[string]*pongo2.Template, 1)
  211. case []string:
  212. ks := keys[0].([]string)
  213. n := len(ks)
  214. resultSqlTemplates = make(map[string]*pongo2.Template, n)
  215. }
  216. } else {
  217. resultSqlTemplates = make(map[string]*pongo2.Template, i)
  218. }
  219. for k, _ := range keys {
  220. switch keys[k].(type) {
  221. case string:
  222. key := keys[k].(string)
  223. resultSqlTemplates[key] = sqlTemplate.Template[key]
  224. case []string:
  225. ks := keys[k].([]string)
  226. for _, v := range ks {
  227. resultSqlTemplates[v] = sqlTemplate.Template[v]
  228. }
  229. }
  230. }
  231. return resultSqlTemplates
  232. }
  233. func (sqlTemplate *Pongo2Template) Execute(key string, args ...interface{}) (string, error) {
  234. if sqlTemplate.Template[key] == nil {
  235. return "", nil
  236. }
  237. if len(args) == 0 {
  238. parmap := &pongo2.Context{"1": 1}
  239. sql, err := sqlTemplate.Template[key].Execute(*parmap)
  240. return sql, err
  241. } else {
  242. map1 := args[0].(*map[string]interface{})
  243. sql, err := sqlTemplate.Template[key].Execute(*map1)
  244. return sql, err
  245. }
  246. }