Explorar el Código

支持模板引擎无参数的SQL嵌套模板,新增批量处理SqlMap和SqlTemplate的相关方法

xormplus hace 9 años
padre
commit
5a6ad38eba
Se han modificado 4 ficheros con 116 adiciones y 9 borrados
  1. 26 6
      engineplus.go
  2. 8 1
      sessionplus.go
  3. 31 1
      sqlmap.go
  4. 51 1
      sqltemplate.go

+ 26 - 6
engineplus.go

@@ -2,6 +2,8 @@ package xorm
 
 import (
 	"encoding/json"
+
+	"gopkg.in/flosch/pongo2.v3"
 )
 
 func (engine *Engine) SqlMapClient(sqlTagName string, args ...interface{}) *Session {
@@ -13,16 +15,34 @@ func (engine *Engine) SqlMapClient(sqlTagName string, args ...interface{}) *Sess
 func (engine *Engine) SqlTemplateClient(sqlTagName string, args ...interface{}) *Session {
 	session := engine.NewSession()
 	session.IsAutoClose = true
-	map1 := args[0].(map[string]interface{})
+
 	if engine.SqlTemplate.Template[sqlTagName] == nil {
-		return session.Sql("", &map1)
+		if len(args) == 0 {
+			return session.Sql("")
+		} else {
+			map1 := args[0].(map[string]interface{})
+			return session.Sql("", &map1)
+		}
 	}
-	sql, err := engine.SqlTemplate.Template[sqlTagName].Execute(map1)
-	if err != nil {
-		engine.logger.Error(err)
+
+	if len(args) == 0 {
+		parmap := &pongo2.Context{"1": 1}
+		sql, err := engine.SqlTemplate.Template[sqlTagName].Execute(*parmap)
+		if err != nil {
+			engine.logger.Error(err)
+
+		}
+		return session.Sql(sql)
+	} else {
+		map1 := args[0].(map[string]interface{})
+		sql, err := engine.SqlTemplate.Template[sqlTagName].Execute(map1)
+		if err != nil {
+			engine.logger.Error(err)
+
+		}
+		return session.Sql(sql, &map1)
 	}
 
-	return session.Sql(sql, &map1)
 }
 
 // Get retrieve one record from table, bean's non-empty fields

+ 8 - 1
sessionplus.go

@@ -14,6 +14,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	//	"unsafe"
 
 	"github.com/Chronokeeper/anyxml"
 	"github.com/xormplus/core"
@@ -57,7 +58,7 @@ func (resultBean ResultBean) Xml() (bool, string, error) {
 	if !has {
 		return has, "", nil
 	}
-	var anydata = []byte(result)
+	var anydata = []byte(result) //str2byte(result)
 	var i interface{}
 	err = json.Unmarshal(anydata, &i)
 	if err != nil {
@@ -71,6 +72,12 @@ func (resultBean ResultBean) Xml() (bool, string, error) {
 	return resultBean.Has, string(resultByte), err
 }
 
+//func str2byte(s string) []byte {
+//    x := (*[2]uintptr)unsafe.Pointer(&s)
+//    h := [3]uintptr{x[0],x[1],x[1]}
+//    return *(*[]byte)(unsafe.Pointer(&h))
+//}
+
 func (resultBean ResultBean) XmlIndent(prefix string, indent string, recordTag string) (bool, string, error) {
 	if resultBean.Error != nil {
 		return false, "", resultBean.Error

+ 31 - 1
sqlmap.go

@@ -31,6 +31,7 @@ type Sql struct {
 
 func (engine *Engine) InitSqlMap(options ...SqlMapOptions) error {
 	var opt SqlMapOptions
+	engine.SqlMap.Sql = make(map[string]string)
 	if len(options) > 0 {
 		opt = options[0]
 	}
@@ -53,7 +54,6 @@ func (engine *Engine) InitSqlMap(options ...SqlMapOptions) error {
 		}
 	}
 
-	engine.SqlMap.Sql = make(map[string]string)
 	err = filepath.Walk(engine.SqlMap.SqlMapRootDir, engine.SqlMap.walkFunc)
 	if err != nil {
 		return err
@@ -182,3 +182,33 @@ func (engine *Engine) RemoveSql(key string) {
 func (sqlMap *SqlMap) removeSql(key string) {
 	delete(sqlMap.Sql, key)
 }
+
+func (engine *Engine) BatchAddSql(sqlStrMap map[string]string) {
+	engine.SqlMap.batchAddSql(sqlStrMap)
+}
+
+func (sqlMap *SqlMap) batchAddSql(sqlStrMap map[string]string) {
+	for k, v := range sqlStrMap {
+		sqlMap.Sql[k] = v
+	}
+}
+
+func (engine *Engine) BatchUpdateSql(sqlStrMap map[string]string) {
+	engine.SqlMap.batchUpdateSql(sqlStrMap)
+}
+
+func (sqlMap *SqlMap) batchUpdateSql(sqlStrMap map[string]string) {
+	for k, v := range sqlStrMap {
+		sqlMap.Sql[k] = v
+	}
+}
+
+func (engine *Engine) BatchRemoveSql(key []string) {
+	engine.SqlMap.batchRemoveSql(key)
+}
+
+func (sqlMap *SqlMap) batchRemoveSql(key []string) {
+	for _, v := range key {
+		delete(sqlMap.Sql, v)
+	}
+}

+ 51 - 1
sqltemplate.go

@@ -21,6 +21,7 @@ type SqlTemplateOptions struct {
 
 func (engine *Engine) InitSqlTemplate(options ...SqlTemplateOptions) error {
 	var opt SqlTemplateOptions
+	engine.SqlTemplate.Template = make(map[string]*pongo2.Template)
 	if len(options) > 0 {
 		opt = options[0]
 	}
@@ -41,7 +42,6 @@ func (engine *Engine) InitSqlTemplate(options ...SqlTemplateOptions) error {
 		}
 	}
 
-	engine.SqlTemplate.Template = make(map[string]*pongo2.Template)
 	err = filepath.Walk(engine.SqlTemplate.SqlTemplateRootDir, engine.SqlTemplate.walkFunc)
 	if err != nil {
 		return err
@@ -179,3 +179,53 @@ func (engine *Engine) RemoveSqlTemplate(key string) {
 func (sqlTemplate *SqlTemplate) removeSqlTemplate(key string) {
 	delete(sqlTemplate.Template, key)
 }
+
+func (engine *Engine) BatchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
+	return engine.SqlTemplate.batchAddSqlTemplate(key, sqlTemplateStrMap)
+
+}
+
+func (sqlTemplate *SqlTemplate) batchAddSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
+
+	for k, v := range sqlTemplateStrMap {
+		template, err := pongo2.FromString(v)
+		if err != nil {
+			return err
+		}
+
+		sqlTemplate.Template[k] = template
+	}
+
+	return nil
+
+}
+
+func (engine *Engine) BatchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
+	return engine.SqlTemplate.batchAddSqlTemplate(key, sqlTemplateStrMap)
+
+}
+
+func (sqlTemplate *SqlTemplate) batchUpdateSqlTemplate(key string, sqlTemplateStrMap map[string]string) error {
+
+	for k, v := range sqlTemplateStrMap {
+		template, err := pongo2.FromString(v)
+		if err != nil {
+			return err
+		}
+
+		sqlTemplate.Template[k] = template
+	}
+
+	return nil
+
+}
+
+func (engine *Engine) BatchRemoveSqlTemplate(key []string) {
+	engine.SqlTemplate.batchRemoveSqlTemplate(key)
+}
+
+func (sqlTemplate *SqlTemplate) batchRemoveSqlTemplate(key []string) {
+	for _, v := range key {
+		delete(sqlTemplate.Template, v)
+	}
+}