123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- package xorm
- import (
- "io/ioutil"
- "os"
- "strings"
- "gopkg.in/flosch/pongo2.v3"
- )
- type Pongo2Template struct {
- SqlTemplateRootDir string
- Template map[string]*pongo2.Template
- extension string
- Capacity uint
- Cipher Cipher
- Type int
- Funcs map[string]FuncMap
- }
- func (sqlTemplate *Pongo2Template) RootDir() string {
- return sqlTemplate.SqlTemplateRootDir
- }
- func (sqlTemplate *Pongo2Template) SetFuncs(key string, funcMap FuncMap) {
- sqlTemplate.Funcs[key] = funcMap
- }
- func (sqlTemplate *Pongo2Template) Extension() string {
- return sqlTemplate.extension
- }
- func (sqlTemplate *Pongo2Template) SetSqlTemplateCipher(cipher Cipher) {
- sqlTemplate.Cipher = cipher
- }
- func (sqlTemplate *Pongo2Template) WalkFunc(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if info.IsDir() {
- return nil
- }
- if strings.HasSuffix(path, sqlTemplate.extension) {
- err = sqlTemplate.paresSqlTemplate(info.Name(), path)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) paresSqlTemplate(filename string, filepath string) error {
- var sqlt *pongo2.Template
- var err error
- var content []byte
- if sqlTemplate.Cipher == nil {
- sqlt, err = pongo2.FromFile(filepath)
- if err != nil {
- return err
- }
- } else {
- content, err = sqlTemplate.ReadTemplate(filepath)
- if err != nil {
- return err
- }
- sqlt, err = pongo2.FromString(string(content))
- if err != nil {
- return err
- }
- }
- sqlTemplate.checkNilAndInit()
- sqlTemplate.Template[filename] = sqlt
- return nil
- }
- func (sqlTemplate *Pongo2Template) ReadTemplate(filepath string) ([]byte, error) {
- content, err := ioutil.ReadFile(filepath)
- if err != nil {
- return nil, err
- }
- content, err = sqlTemplate.Cipher.Decrypt(content)
- if err != nil {
- return nil, err
- }
- return content, nil
- }
- //-------------------------------------------------------------------------------------------------------------
- func (sqlTemplate *Pongo2Template) LoadSqlTemplate(filepath string) error {
- if strings.HasSuffix(filepath, sqlTemplate.extension) {
- err := sqlTemplate.loadSqlTemplate(filepath)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) BatchLoadSqlTemplate(filepathSlice []string) error {
- for _, filepath := range filepathSlice {
- if strings.HasSuffix(filepath, sqlTemplate.extension) {
- err := sqlTemplate.loadSqlTemplate(filepath)
- if err != nil {
- return err
- }
- }
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) ReloadSqlTemplate(filepath string) error {
- if strings.HasSuffix(filepath, sqlTemplate.extension) {
- err := sqlTemplate.reloadSqlTemplate(filepath)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) BatchReloadSqlTemplate(filepathSlice []string) error {
- for _, filepath := range filepathSlice {
- if strings.HasSuffix(filepath, sqlTemplate.extension) {
- err := sqlTemplate.loadSqlTemplate(filepath)
- if err != nil {
- return err
- }
- }
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) loadSqlTemplate(filepath string) error {
- info, err := os.Lstat(filepath)
- if err != nil {
- return err
- }
- if info.IsDir() {
- return nil
- }
- err = sqlTemplate.paresSqlTemplate(info.Name(), filepath)
- if err != nil {
- return err
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) reloadSqlTemplate(filepath string) error {
- info, err := os.Lstat(filepath)
- if err != nil {
- return err
- }
- if info.IsDir() {
- return nil
- }
- err = sqlTemplate.paresSqlTemplate(info.Name(), filepath)
- if err != nil {
- return err
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) checkNilAndInit() {
- if sqlTemplate.Template == nil {
- sqlTemplate.Template = make(map[string]*pongo2.Template, 100)
- }
- }
- func (sqlTemplate *Pongo2Template) AddSqlTemplate(key string, sqlTemplateStr string) error {
- template, err := pongo2.FromString(sqlTemplateStr)
- if err != nil {
- return err
- }
- sqlTemplate.checkNilAndInit()
- sqlTemplate.Template[key] = template
- return nil
- }
- func (sqlTemplate *Pongo2Template) UpdateSqlTemplate(key string, sqlTemplateStr string) error {
- template, err := pongo2.FromString(sqlTemplateStr)
- if err != nil {
- return err
- }
- sqlTemplate.checkNilAndInit()
- sqlTemplate.Template[key] = template
- return nil
- }
- func (sqlTemplate *Pongo2Template) RemoveSqlTemplate(key string) {
- sqlTemplate.checkNilAndInit()
- delete(sqlTemplate.Template, key)
- }
- func (sqlTemplate *Pongo2Template) BatchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
- sqlTemplate.checkNilAndInit()
- for k, v := range sqlTemplateStrMap {
- template, err := pongo2.FromString(v)
- if err != nil {
- return err
- }
- sqlTemplate.Template[k] = template
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) BatchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
- sqlTemplate.checkNilAndInit()
- for k, v := range sqlTemplateStrMap {
- template, err := pongo2.FromString(v)
- if err != nil {
- return err
- }
- sqlTemplate.Template[k] = template
- }
- return nil
- }
- func (sqlTemplate *Pongo2Template) BatchRemoveSqlTemplate(key []string) {
- sqlTemplate.checkNilAndInit()
- for _, v := range key {
- delete(sqlTemplate.Template, v)
- }
- }
- func (sqlTemplate *Pongo2Template) GetSqlTemplate(key string) *pongo2.Template {
- return sqlTemplate.Template[key]
- }
- func (sqlTemplate *Pongo2Template) GetSqlTemplates(keys ...interface{}) map[string]*pongo2.Template {
- var resultSqlTemplates map[string]*pongo2.Template
- i := len(keys)
- if i == 0 {
- return sqlTemplate.Template
- }
- if i == 1 {
- switch keys[0].(type) {
- case string:
- resultSqlTemplates = make(map[string]*pongo2.Template, 1)
- case []string:
- ks := keys[0].([]string)
- n := len(ks)
- resultSqlTemplates = make(map[string]*pongo2.Template, n)
- }
- } else {
- resultSqlTemplates = make(map[string]*pongo2.Template, i)
- }
- for k, _ := range keys {
- switch keys[k].(type) {
- case string:
- key := keys[k].(string)
- resultSqlTemplates[key] = sqlTemplate.Template[key]
- case []string:
- ks := keys[k].([]string)
- for _, v := range ks {
- resultSqlTemplates[v] = sqlTemplate.Template[v]
- }
- }
- }
- return resultSqlTemplates
- }
- func (sqlTemplate *Pongo2Template) Execute(key string, args ...interface{}) (string, error) {
- if sqlTemplate.Template[key] == nil {
- return "", nil
- }
- if len(args) == 0 {
- parmap := &pongo2.Context{"1": 1}
- sql, err := sqlTemplate.Template[key].Execute(*parmap)
- return sql, err
- } else {
- map1 := args[0].(*map[string]interface{})
- sql, err := sqlTemplate.Template[key].Execute(*map1)
- return sql, err
- }
- }
|