| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- package xorm
- import (
- "encoding/json"
- "encoding/xml"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- )
- type SqlMap struct {
- SqlMapRootDir string
- Sql map[string]string
- Extension map[string]string
- Capacity uint
- Cipher Cipher
- }
- type Result struct {
- Sql []Sql `xml:"sql"`
- }
- type Sql struct {
- Value string `xml:",chardata"`
- Id string `xml:"id,attr"`
- }
- func (engine *Engine) SetSqlMapCipher(cipher Cipher) {
- engine.SqlMap.Cipher = cipher
- }
- func (engine *Engine) ClearSqlMapCipher() {
- engine.SqlMap.Cipher = nil
- }
- func (sqlMap *SqlMap) checkNilAndInit() {
- if sqlMap.Sql == nil {
- if sqlMap.Capacity == 0 {
- sqlMap.Sql = make(map[string]string, 100)
- } else {
- sqlMap.Sql = make(map[string]string, sqlMap.Capacity)
- }
- }
- }
- type SqlM interface {
- RootDir() string
- Extension() string
- }
- type XmlSqlMap struct {
- sqlMapRootDir string
- extension string
- }
- type JsonSqlMap struct {
- sqlMapRootDir string
- extension string
- }
- func Xml(directory, extension string) *XmlSqlMap {
- return &XmlSqlMap{
- sqlMapRootDir: directory,
- extension: extension,
- }
- }
- func Json(directory, extension string) *JsonSqlMap {
- return &JsonSqlMap{
- sqlMapRootDir: directory,
- extension: extension,
- }
- }
- func (sqlMap *XmlSqlMap) RootDir() string {
- return sqlMap.sqlMapRootDir
- }
- func (sqlMap *JsonSqlMap) RootDir() string {
- return sqlMap.sqlMapRootDir
- }
- func (sqlMap *XmlSqlMap) Extension() string {
- return sqlMap.extension
- }
- func (sqlMap *JsonSqlMap) Extension() string {
- return sqlMap.extension
- }
- func (engine *Engine) RegisterSqlMap(sqlm SqlM, Cipher ...Cipher) error {
- switch sqlm.(type) {
- case *XmlSqlMap:
- if len(engine.SqlMap.Extension) == 0 {
- engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
- }
- engine.SqlMap.Extension["xml"] = sqlm.Extension()
- case *JsonSqlMap:
- if len(engine.SqlMap.Extension) == 0 {
- engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
- }
- engine.SqlMap.Extension["json"] = sqlm.Extension()
- default:
- return ErrParamsType
- }
- if len(Cipher) > 0 {
- engine.SqlMap.Cipher = Cipher[0]
- }
- engine.SqlMap.SqlMapRootDir = sqlm.RootDir()
- err := filepath.Walk(engine.SqlMap.SqlMapRootDir, engine.SqlMap.walkFunc)
- if err != nil {
- return err
- }
- return nil
- }
- func (engine *Engine) LoadSqlMap(filepath string) error {
- if len(engine.SqlMap.Extension) == 0 {
- engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
- } else {
- if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
- engine.SqlMap.Extension["xml"] = ".xml"
- }
- if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
- engine.SqlMap.Extension["json"] = ".json"
- }
- }
- if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
- err := engine.loadSqlMap(filepath)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (engine *Engine) BatchLoadSqlMap(filepathSlice []string) error {
- if len(engine.SqlMap.Extension) == 0 {
- engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
- } else {
- if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
- engine.SqlMap.Extension["xml"] = ".xml"
- }
- if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
- engine.SqlMap.Extension["json"] = ".json"
- }
- }
- for _, filepath := range filepathSlice {
- if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
- err := engine.loadSqlMap(filepath)
- if err != nil {
- return err
- }
- }
- }
- return nil
- }
- func (engine *Engine) ReloadSqlMap(filepath string) error {
- if len(engine.SqlMap.Extension) == 0 {
- engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
- } else {
- if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
- engine.SqlMap.Extension["xml"] = ".xml"
- }
- if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
- engine.SqlMap.Extension["json"] = ".json"
- }
- }
- if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
- err := engine.reloadSqlMap(filepath)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (engine *Engine) BatchReloadSqlMap(filepathSlice []string) error {
- if len(engine.SqlMap.Extension) == 0 {
- engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
- } else {
- if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
- engine.SqlMap.Extension["xml"] = ".xml"
- }
- if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
- engine.SqlMap.Extension["json"] = ".json"
- }
- }
- for _, filepath := range filepathSlice {
- if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
- err := engine.loadSqlMap(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
- }
- if info.IsDir() {
- return nil
- }
- if strings.HasSuffix(path, sqlMap.Extension["xml"]) || strings.HasSuffix(path, sqlMap.Extension["json"]) {
- err = sqlMap.paresSql(path)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (sqlMap *SqlMap) paresSql(filepath string) error {
- content, err := ioutil.ReadFile(filepath)
- fmt.Println("filepath:", filepath)
- if err != nil {
- return err
- }
- enc := sqlMap.Cipher
- if enc != nil {
- content, err = enc.Decrypt(content)
- if err != nil {
- return err
- }
- }
- sqlMap.checkNilAndInit()
- if strings.HasSuffix(filepath, sqlMap.Extension["xml"]) {
- var result Result
- err = xml.Unmarshal(content, &result)
- if err != nil {
- return err
- }
- for _, sql := range result.Sql {
- sqlMap.Sql[sql.Id] = sql.Value
- }
- return nil
- }
- if strings.HasSuffix(filepath, sqlMap.Extension["json"]) {
- var result map[string]string
- err = json.Unmarshal(content, &result)
- if err != nil {
- return err
- }
- for k := range result {
- sqlMap.Sql[k] = result[k]
- }
- return nil
- }
- return nil
- }
- func (engine *Engine) AddSql(key string, sql string) {
- engine.SqlMap.addSql(key, sql)
- }
- func (sqlMap *SqlMap) addSql(key string, sql string) {
- sqlMap.checkNilAndInit()
- 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.checkNilAndInit()
- sqlMap.Sql[key] = sql
- }
- func (engine *Engine) RemoveSql(key string) {
- engine.SqlMap.removeSql(key)
- }
- func (sqlMap *SqlMap) removeSql(key string) {
- sqlMap.checkNilAndInit()
- delete(sqlMap.Sql, key)
- }
- func (engine *Engine) BatchAddSql(sqlStrMap map[string]string) {
- engine.SqlMap.batchAddSql(sqlStrMap)
- }
- func (sqlMap *SqlMap) batchAddSql(sqlStrMap map[string]string) {
- sqlMap.checkNilAndInit()
- 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) {
- sqlMap.checkNilAndInit()
- 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) {
- sqlMap.checkNilAndInit()
- for _, v := range key {
- delete(sqlMap.Sql, v)
- }
- }
- func (engine *Engine) GetSql(key string) string {
- return engine.SqlMap.getSql(key)
- }
- func (sqlMap *SqlMap) getSql(key string) string {
- return sqlMap.Sql[key]
- }
- func (engine *Engine) GetSqlMap(keys ...interface{}) map[string]string {
- return engine.SqlMap.getSqlMap(keys...)
- }
- func (sqlMap *SqlMap) getSqlMap(keys ...interface{}) map[string]string {
- var resultSqlMap map[string]string
- i := len(keys)
- if i == 0 {
- return sqlMap.Sql
- }
- if i == 1 {
- switch keys[0].(type) {
- case string:
- resultSqlMap = make(map[string]string, 1)
- case []string:
- ks := keys[0].([]string)
- n := len(ks)
- resultSqlMap = make(map[string]string, n)
- }
- } else {
- resultSqlMap = make(map[string]string, i)
- }
- for k, _ := range keys {
- switch keys[k].(type) {
- case string:
- key := keys[k].(string)
- resultSqlMap[key] = sqlMap.Sql[key]
- case []string:
- ks := keys[k].([]string)
- for _, v := range ks {
- resultSqlMap[v] = sqlMap.Sql[v]
- }
- }
- }
- return resultSqlMap
- }
|