sqltemplate.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package xorm
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "github.com/Unknwon/goconfig"
  8. "gopkg.in/flosch/pongo2.v3"
  9. )
  10. type SqlTemplate struct {
  11. SqlTemplateRootDir string
  12. Template map[string]*pongo2.Template
  13. Extension string
  14. Capacity uint
  15. Cipher Cipher
  16. }
  17. type SqlTemplateOptions struct {
  18. Capacity uint
  19. Extension string
  20. Cipher Cipher
  21. }
  22. func (engine *Engine) SetSqlTemplateCipher(cipher Cipher) {
  23. engine.sqlTemplate.Cipher = cipher
  24. }
  25. func (engine *Engine) ClearSqlTemplateCipher() {
  26. engine.sqlTemplate.Cipher = nil
  27. }
  28. func (sqlTemplate *SqlTemplate) checkNilAndInit() {
  29. if sqlTemplate.Template == nil {
  30. if sqlTemplate.Capacity == 0 {
  31. sqlTemplate.Template = make(map[string]*pongo2.Template, 100)
  32. } else {
  33. sqlTemplate.Template = make(map[string]*pongo2.Template, sqlTemplate.Capacity)
  34. }
  35. }
  36. }
  37. func (engine *Engine) InitSqlTemplate(options ...SqlTemplateOptions) error {
  38. var opt SqlTemplateOptions
  39. if len(options) > 0 {
  40. opt = options[0]
  41. }
  42. if len(opt.Extension) == 0 {
  43. opt.Extension = ".stpl"
  44. }
  45. engine.sqlTemplate.Extension = opt.Extension
  46. engine.sqlTemplate.Capacity = opt.Capacity
  47. engine.sqlTemplate.Cipher = opt.Cipher
  48. var err error
  49. if engine.sqlTemplate.SqlTemplateRootDir == "" {
  50. cfg, err := goconfig.LoadConfigFile("./sql/xormcfg.ini")
  51. if err != nil {
  52. return err
  53. }
  54. engine.sqlTemplate.SqlTemplateRootDir, err = cfg.GetValue("", "SqlTemplateRootDir")
  55. if err != nil {
  56. return err
  57. }
  58. }
  59. err = filepath.Walk(engine.sqlTemplate.SqlTemplateRootDir, engine.sqlTemplate.walkFunc)
  60. if err != nil {
  61. return err
  62. }
  63. return nil
  64. }
  65. func (engine *Engine) LoadSqlTemplate(filepath string) error {
  66. if len(engine.sqlTemplate.Extension) == 0 {
  67. engine.sqlTemplate.Extension = ".stpl"
  68. }
  69. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  70. err := engine.loadSqlTemplate(filepath)
  71. if err != nil {
  72. return err
  73. }
  74. }
  75. return nil
  76. }
  77. func (engine *Engine) BatchLoadSqlTemplate(filepathSlice []string) error {
  78. if len(engine.sqlTemplate.Extension) == 0 {
  79. engine.sqlTemplate.Extension = ".stpl"
  80. }
  81. for _, filepath := range filepathSlice {
  82. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  83. err := engine.loadSqlTemplate(filepath)
  84. if err != nil {
  85. return err
  86. }
  87. }
  88. }
  89. return nil
  90. }
  91. func (engine *Engine) ReloadSqlTemplate(filepath string) error {
  92. if len(engine.sqlTemplate.Extension) == 0 {
  93. engine.sqlTemplate.Extension = ".stpl"
  94. }
  95. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  96. err := engine.reloadSqlTemplate(filepath)
  97. if err != nil {
  98. return err
  99. }
  100. }
  101. return nil
  102. }
  103. func (engine *Engine) BatchReloadSqlTemplate(filepathSlice []string) error {
  104. if len(engine.sqlTemplate.Extension) == 0 {
  105. engine.sqlTemplate.Extension = ".stpl"
  106. }
  107. for _, filepath := range filepathSlice {
  108. if strings.HasSuffix(filepath, engine.sqlTemplate.Extension) {
  109. err := engine.loadSqlTemplate(filepath)
  110. if err != nil {
  111. return err
  112. }
  113. }
  114. }
  115. return nil
  116. }
  117. func (engine *Engine) 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 = engine.sqlTemplate.paresSqlTemplate(info.Name(), filepath)
  126. if err != nil {
  127. return err
  128. }
  129. return nil
  130. }
  131. func (engine *Engine) 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 = engine.sqlTemplate.paresSqlTemplate(info.Name(), filepath)
  140. if err != nil {
  141. return err
  142. }
  143. return nil
  144. }
  145. func (sqlTemplate *SqlTemplate) walkFunc(path string, info os.FileInfo, err error) error {
  146. if err != nil {
  147. return err
  148. }
  149. if info.IsDir() {
  150. return nil
  151. }
  152. if strings.HasSuffix(path, sqlTemplate.Extension) {
  153. err = sqlTemplate.paresSqlTemplate(info.Name(), path)
  154. if err != nil {
  155. return err
  156. }
  157. }
  158. return nil
  159. }
  160. func (sqlTemplate *SqlTemplate) paresSqlTemplate(filename string, filepath string) error {
  161. var template *pongo2.Template
  162. var err error
  163. var content []byte
  164. if sqlTemplate.Cipher == nil {
  165. template, err = pongo2.FromFile(filepath)
  166. if err != nil {
  167. return err
  168. }
  169. } else {
  170. content, err = ioutil.ReadFile(filepath)
  171. if err != nil {
  172. return err
  173. }
  174. content, err = sqlTemplate.Cipher.Decrypt(content)
  175. if err != nil {
  176. return err
  177. }
  178. template, err = pongo2.FromString(string(content))
  179. if err != nil {
  180. return err
  181. }
  182. }
  183. sqlTemplate.checkNilAndInit()
  184. sqlTemplate.Template[filename] = template
  185. return nil
  186. }
  187. func (engine *Engine) AddSqlTemplate(key string, sqlTemplateStr string) error {
  188. return engine.sqlTemplate.addSqlTemplate(key, sqlTemplateStr)
  189. }
  190. func (sqlTemplate *SqlTemplate) addSqlTemplate(key string, sqlTemplateStr string) error {
  191. template, err := pongo2.FromString(sqlTemplateStr)
  192. if err != nil {
  193. return err
  194. }
  195. sqlTemplate.checkNilAndInit()
  196. sqlTemplate.Template[key] = template
  197. return nil
  198. }
  199. func (engine *Engine) UpdateSqlTemplate(key string, sqlTemplateStr string) error {
  200. return engine.sqlTemplate.updateSqlTemplate(key, sqlTemplateStr)
  201. }
  202. func (sqlTemplate *SqlTemplate) updateSqlTemplate(key string, sqlTemplateStr string) error {
  203. template, err := pongo2.FromString(sqlTemplateStr)
  204. if err != nil {
  205. return err
  206. }
  207. sqlTemplate.checkNilAndInit()
  208. sqlTemplate.Template[key] = template
  209. return nil
  210. }
  211. func (engine *Engine) RemoveSqlTemplate(key string) {
  212. engine.sqlTemplate.removeSqlTemplate(key)
  213. }
  214. func (sqlTemplate *SqlTemplate) removeSqlTemplate(key string) {
  215. sqlTemplate.checkNilAndInit()
  216. delete(sqlTemplate.Template, key)
  217. }
  218. func (engine *Engine) BatchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  219. return engine.sqlTemplate.batchAddSqlTemplate(key, sqlTemplateStrMap)
  220. }
  221. func (sqlTemplate *SqlTemplate) batchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  222. sqlTemplate.checkNilAndInit()
  223. for k, v := range sqlTemplateStrMap {
  224. template, err := pongo2.FromString(v)
  225. if err != nil {
  226. return err
  227. }
  228. sqlTemplate.Template[k] = template
  229. }
  230. return nil
  231. }
  232. func (engine *Engine) BatchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  233. return engine.sqlTemplate.batchAddSqlTemplate(key, sqlTemplateStrMap)
  234. }
  235. func (sqlTemplate *SqlTemplate) batchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
  236. sqlTemplate.checkNilAndInit()
  237. for k, v := range sqlTemplateStrMap {
  238. template, err := pongo2.FromString(v)
  239. if err != nil {
  240. return err
  241. }
  242. sqlTemplate.Template[k] = template
  243. }
  244. return nil
  245. }
  246. func (engine *Engine) BatchRemoveSqlTemplate(key []string) {
  247. engine.sqlTemplate.batchRemoveSqlTemplate(key)
  248. }
  249. func (sqlTemplate *SqlTemplate) batchRemoveSqlTemplate(key []string) {
  250. sqlTemplate.checkNilAndInit()
  251. for _, v := range key {
  252. delete(sqlTemplate.Template, v)
  253. }
  254. }
  255. func (engine *Engine) GetSqlTemplate(key string) *pongo2.Template {
  256. return engine.sqlTemplate.getSqlTemplate(key)
  257. }
  258. func (sqlTemplate *SqlTemplate) getSqlTemplate(key string) *pongo2.Template {
  259. return sqlTemplate.Template[key]
  260. }
  261. func (engine *Engine) GetSqlTemplates(keys ...interface{}) map[string]*pongo2.Template {
  262. return engine.sqlTemplate.getSqlTemplates(keys...)
  263. }
  264. func (sqlTemplate *SqlTemplate) getSqlTemplates(keys ...interface{}) map[string]*pongo2.Template {
  265. var resultSqlTemplates map[string]*pongo2.Template
  266. i := len(keys)
  267. if i == 0 {
  268. return sqlTemplate.Template
  269. }
  270. if i == 1 {
  271. switch keys[0].(type) {
  272. case string:
  273. resultSqlTemplates = make(map[string]*pongo2.Template, 1)
  274. case []string:
  275. ks := keys[0].([]string)
  276. n := len(ks)
  277. resultSqlTemplates = make(map[string]*pongo2.Template, n)
  278. }
  279. } else {
  280. resultSqlTemplates = make(map[string]*pongo2.Template, i)
  281. }
  282. for k, _ := range keys {
  283. switch keys[k].(type) {
  284. case string:
  285. key := keys[k].(string)
  286. resultSqlTemplates[key] = sqlTemplate.Template[key]
  287. case []string:
  288. ks := keys[k].([]string)
  289. for _, v := range ks {
  290. resultSqlTemplates[v] = sqlTemplate.Template[v]
  291. }
  292. }
  293. }
  294. return resultSqlTemplates
  295. }