sqltemplate_jet.go 6.7 KB

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