Bläddra i källkod

新增SqlMap配置文件和SqlTemplate模板更新监控功能

xormplus 9 år sedan
förälder
incheckning
8691dd96bd
3 ändrade filer med 219 tillägg och 4 borttagningar
  1. 2 0
      engine.go
  2. 99 2
      sqlmap.go
  3. 118 2
      sqltemplate.go

+ 2 - 0
engine.go

@@ -19,6 +19,7 @@ import (
 	"sync"
 	"time"
 
+	"github.com/fsnotify/fsnotify"
 	"github.com/xormplus/core"
 )
 
@@ -34,6 +35,7 @@ type Engine struct {
 	Tables        map[reflect.Type]*core.Table
 	SqlMap        SqlMap
 	SqlTemplate   SqlTemplate
+	watcher       *fsnotify.Watcher
 	mutex         *sync.RWMutex
 	Cacher        core.Cacher
 

+ 99 - 2
sqlmap.go

@@ -13,6 +13,11 @@ import (
 type SqlMap struct {
 	SqlMapRootDir string
 	Sql           map[string]string
+	Extension     string
+}
+
+type SqlMapOptions struct {
+	Extension string
 }
 
 type Result struct {
@@ -24,7 +29,18 @@ type Sql struct {
 	Id    string `xml:"id,attr"`
 }
 
-func (engine *Engine) InitSqlMap() error {
+func (engine *Engine) InitSqlMap(options ...SqlMapOptions) error {
+	var opt SqlMapOptions
+	if len(options) > 0 {
+		opt = options[0]
+	}
+
+	if len(opt.Extension) == 0 {
+		opt.Extension = ".xml"
+	}
+
+	engine.SqlMap.Extension = opt.Extension
+
 	var err error
 	if engine.SqlMap.SqlMapRootDir == "" {
 		cfg, err := goconfig.LoadConfigFile("./sql/xormcfg.ini")
@@ -46,6 +62,63 @@ func (engine *Engine) InitSqlMap() error {
 	return nil
 }
 
+func (engine *Engine) LoadSqlMap(filepath string) error {
+	if strings.HasSuffix(filepath, engine.SqlMap.Extension) {
+		err := engine.loadSqlMap(filepath)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (engine *Engine) ReloadSqlMap(filepath string) error {
+	if strings.HasSuffix(filepath, engine.SqlMap.Extension) {
+		err := engine.reloadSqlMap(filepath)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (engine *Engine) loadSqlMap(filepath string) error {
+	info, err := os.Lstat(filepath)
+	if err != nil {
+		return err
+	}
+
+	if info.IsDir() {
+		return nil
+	}
+
+	err = engine.SqlMap.paresSql(filepath)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (engine *Engine) reloadSqlMap(filepath string) error {
+	info, err := os.Lstat(filepath)
+	if err != nil {
+		return err
+	}
+
+	if info.IsDir() {
+		return nil
+	}
+	err = engine.SqlMap.paresSql(filepath)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func (sqlMap *SqlMap) walkFunc(path string, info os.FileInfo, err error) error {
 	if err != nil {
 		return err
@@ -55,7 +128,7 @@ func (sqlMap *SqlMap) walkFunc(path string, info os.FileInfo, err error) error {
 		return nil
 	}
 
-	if strings.HasSuffix(path, ".xml") {
+	if strings.HasSuffix(path, sqlMap.Extension) {
 		err = sqlMap.paresSql(path)
 		if err != nil {
 			return err
@@ -85,3 +158,27 @@ func (sqlMap *SqlMap) paresSql(filepath string) error {
 
 	return nil
 }
+
+func (engine *Engine) AddSql(key string, sql string) {
+	engine.SqlMap.addSql(key, sql)
+}
+
+func (sqlMap *SqlMap) addSql(key string, sql string) {
+	sqlMap.Sql[key] = sql
+}
+
+func (engine *Engine) UpdateSql(key string, sql string) {
+	engine.SqlMap.updateSql(key, sql)
+}
+
+func (sqlMap *SqlMap) updateSql(key string, sql string) {
+	sqlMap.Sql[key] = sql
+}
+
+func (engine *Engine) RemoveSql(key string) {
+	engine.SqlMap.removeSql(key)
+}
+
+func (sqlMap *SqlMap) removeSql(key string) {
+	delete(sqlMap.Sql, key)
+}

+ 118 - 2
sqltemplate.go

@@ -12,9 +12,23 @@ import (
 type SqlTemplate struct {
 	SqlTemplateRootDir string
 	Template           map[string]*pongo2.Template
+	Extension          string
 }
 
-func (engine *Engine) InitSqlTemplate() error {
+type SqlTemplateOptions struct {
+	Extension string
+}
+
+func (engine *Engine) InitSqlTemplate(options ...SqlTemplateOptions) error {
+	var opt SqlTemplateOptions
+	if len(options) > 0 {
+		opt = options[0]
+	}
+
+	if len(opt.Extension) == 0 {
+		opt.Extension = ".stpl"
+	}
+
 	var err error
 	if engine.SqlTemplate.SqlTemplateRootDir == "" {
 		cfg, err := goconfig.LoadConfigFile("./sql/xormcfg.ini")
@@ -36,6 +50,64 @@ func (engine *Engine) InitSqlTemplate() error {
 	return nil
 }
 
+func (engine *Engine) LoadSqlTemplate(filepath string) error {
+	if strings.HasSuffix(filepath, engine.SqlTemplate.Extension) {
+		err := engine.loadSqlTemplate(filepath)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (engine *Engine) ReloadSqlTemplate(filepath string) error {
+	if strings.HasSuffix(filepath, engine.SqlTemplate.Extension) {
+		err := engine.reloadSqlTemplate(filepath)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (engine *Engine) loadSqlTemplate(filepath string) error {
+	info, err := os.Lstat(filepath)
+	if err != nil {
+		return err
+	}
+
+	if info.IsDir() {
+		return nil
+	}
+
+	err = engine.SqlTemplate.paresSqlTemplate(info.Name(), filepath)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (engine *Engine) reloadSqlTemplate(filepath string) error {
+	info, err := os.Lstat(filepath)
+	if err != nil {
+		return err
+	}
+
+	if info.IsDir() {
+		return nil
+	}
+
+	err = engine.SqlTemplate.paresSqlTemplate(info.Name(), filepath)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func (sqlTemplate *SqlTemplate) walkFunc(path string, info os.FileInfo, err error) error {
 	if err != nil {
 		return err
@@ -45,7 +117,7 @@ func (sqlTemplate *SqlTemplate) walkFunc(path string, info os.FileInfo, err erro
 		return nil
 	}
 
-	if strings.HasSuffix(path, ".stpl") {
+	if strings.HasSuffix(path, sqlTemplate.Extension) {
 		err = sqlTemplate.paresSqlTemplate(info.Name(), path)
 		if err != nil {
 			return err
@@ -61,5 +133,49 @@ func (sqlTemplate *SqlTemplate) paresSqlTemplate(filename string, filepath strin
 	}
 
 	sqlTemplate.Template[filename] = template
+
 	return nil
 }
+
+func (engine *Engine) AddSqlTemplate(key string, sqlTemplateStr string) error {
+	return engine.SqlTemplate.addSqlTemplate(key, sqlTemplateStr)
+
+}
+
+func (sqlTemplate *SqlTemplate) addSqlTemplate(key string, sqlTemplateStr string) error {
+
+	template, err := pongo2.FromString(sqlTemplateStr)
+	if err != nil {
+		return err
+	}
+
+	sqlTemplate.Template[key] = template
+
+	return nil
+
+}
+
+func (engine *Engine) UpdateSqlTemplate(key string, sqlTemplateStr string) error {
+	return engine.SqlTemplate.updateSqlTemplate(key, sqlTemplateStr)
+}
+
+func (sqlTemplate *SqlTemplate) updateSqlTemplate(key string, sqlTemplateStr string) error {
+
+	template, err := pongo2.FromString(sqlTemplateStr)
+	if err != nil {
+		return err
+	}
+
+	sqlTemplate.Template[key] = template
+
+	return nil
+
+}
+
+func (engine *Engine) RemoveSqlTemplate(key string) {
+	engine.SqlTemplate.removeSqlTemplate(key)
+}
+
+func (sqlTemplate *SqlTemplate) removeSqlTemplate(key string) {
+	delete(sqlTemplate.Template, key)
+}