| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- package xorm
- import (
- "encoding/xml"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- "github.com/Unknwon/goconfig"
- )
- type SqlMap struct {
- SqlMapRootDir string
- Sql map[string]string
- Extension string
- }
- type SqlMapOptions struct {
- Extension string
- }
- type Result struct {
- Sql []Sql `xml:"sql"`
- }
- type Sql struct {
- Value string `xml:",chardata"`
- Id string `xml:"id,attr"`
- }
- func (sqlMap *SqlMap) checkNilAndInit() {
- if sqlMap.Sql == nil {
- sqlMap.Sql = make(map[string]string, 100)
- }
- }
- 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")
- if err != nil {
- return err
- }
- engine.sqlMap.SqlMapRootDir, err = cfg.GetValue("", "SqlMapRootDir")
- if err != nil {
- return err
- }
- }
- 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 = ".xml"
- }
- if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
- 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 = ".xml"
- }
- for _, filepath := range filepathSlice {
- 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 len(engine.sqlMap.Extension) == 0 {
- engine.sqlMap.Extension = ".xml"
- }
- if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
- 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 = ".xml"
- }
- for _, filepath := range filepathSlice {
- if strings.HasSuffix(filepath, engine.sqlMap.Extension) {
- 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) {
- err = sqlMap.paresSql(path)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (sqlMap *SqlMap) paresSql(filepath string) error {
- content, err := ioutil.ReadFile(filepath)
- if err != nil {
- return err
- }
- sqlMap.checkNilAndInit()
- 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
- }
- 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)
- }
- }
|