sqlmap.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. package xorm
  2. import (
  3. "encoding/json"
  4. "encoding/xml"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. )
  11. type SqlMap struct {
  12. SqlMapRootDir string
  13. Sql map[string]string
  14. Extension map[string]string
  15. Capacity uint
  16. Cipher Cipher
  17. }
  18. type Result struct {
  19. Sql []Sql `xml:"sql"`
  20. }
  21. type Sql struct {
  22. Value string `xml:",chardata"`
  23. Id string `xml:"id,attr"`
  24. }
  25. func (engine *Engine) SetSqlMapCipher(cipher Cipher) {
  26. engine.SqlMap.Cipher = cipher
  27. }
  28. func (engine *Engine) ClearSqlMapCipher() {
  29. engine.SqlMap.Cipher = nil
  30. }
  31. func (sqlMap *SqlMap) checkNilAndInit() {
  32. if sqlMap.Sql == nil {
  33. if sqlMap.Capacity == 0 {
  34. sqlMap.Sql = make(map[string]string, 100)
  35. } else {
  36. sqlMap.Sql = make(map[string]string, sqlMap.Capacity)
  37. }
  38. }
  39. }
  40. type SqlM interface {
  41. RootDir() string
  42. Extension() string
  43. }
  44. type XmlSqlMap struct {
  45. sqlMapRootDir string
  46. extension string
  47. }
  48. type JsonSqlMap struct {
  49. sqlMapRootDir string
  50. extension string
  51. }
  52. func Xml(directory, extension string) *XmlSqlMap {
  53. return &XmlSqlMap{
  54. sqlMapRootDir: directory,
  55. extension: extension,
  56. }
  57. }
  58. func Json(directory, extension string) *JsonSqlMap {
  59. return &JsonSqlMap{
  60. sqlMapRootDir: directory,
  61. extension: extension,
  62. }
  63. }
  64. func (sqlMap *XmlSqlMap) RootDir() string {
  65. return sqlMap.sqlMapRootDir
  66. }
  67. func (sqlMap *JsonSqlMap) RootDir() string {
  68. return sqlMap.sqlMapRootDir
  69. }
  70. func (sqlMap *XmlSqlMap) Extension() string {
  71. return sqlMap.extension
  72. }
  73. func (sqlMap *JsonSqlMap) Extension() string {
  74. return sqlMap.extension
  75. }
  76. func (engine *Engine) RegisterSqlMap(sqlm SqlM, Cipher ...Cipher) error {
  77. switch sqlm.(type) {
  78. case *XmlSqlMap:
  79. if len(engine.SqlMap.Extension) == 0 {
  80. engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
  81. }
  82. engine.SqlMap.Extension["xml"] = sqlm.Extension()
  83. case *JsonSqlMap:
  84. if len(engine.SqlMap.Extension) == 0 {
  85. engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
  86. }
  87. engine.SqlMap.Extension["json"] = sqlm.Extension()
  88. default:
  89. return ErrParamsType
  90. }
  91. if len(Cipher) > 0 {
  92. engine.SqlMap.Cipher = Cipher[0]
  93. }
  94. engine.SqlMap.SqlMapRootDir = sqlm.RootDir()
  95. err := filepath.Walk(engine.SqlMap.SqlMapRootDir, engine.SqlMap.walkFunc)
  96. if err != nil {
  97. return err
  98. }
  99. return nil
  100. }
  101. func (engine *Engine) LoadSqlMap(filepath string) error {
  102. if len(engine.SqlMap.Extension) == 0 {
  103. engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
  104. } else {
  105. if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
  106. engine.SqlMap.Extension["xml"] = ".xml"
  107. }
  108. if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
  109. engine.SqlMap.Extension["json"] = ".json"
  110. }
  111. }
  112. if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
  113. err := engine.loadSqlMap(filepath)
  114. if err != nil {
  115. return err
  116. }
  117. }
  118. return nil
  119. }
  120. func (engine *Engine) BatchLoadSqlMap(filepathSlice []string) error {
  121. if len(engine.SqlMap.Extension) == 0 {
  122. engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
  123. } else {
  124. if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
  125. engine.SqlMap.Extension["xml"] = ".xml"
  126. }
  127. if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
  128. engine.SqlMap.Extension["json"] = ".json"
  129. }
  130. }
  131. for _, filepath := range filepathSlice {
  132. if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
  133. err := engine.loadSqlMap(filepath)
  134. if err != nil {
  135. return err
  136. }
  137. }
  138. }
  139. return nil
  140. }
  141. func (engine *Engine) ReloadSqlMap(filepath string) error {
  142. if len(engine.SqlMap.Extension) == 0 {
  143. engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
  144. } else {
  145. if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
  146. engine.SqlMap.Extension["xml"] = ".xml"
  147. }
  148. if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
  149. engine.SqlMap.Extension["json"] = ".json"
  150. }
  151. }
  152. if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
  153. err := engine.reloadSqlMap(filepath)
  154. if err != nil {
  155. return err
  156. }
  157. }
  158. return nil
  159. }
  160. func (engine *Engine) BatchReloadSqlMap(filepathSlice []string) error {
  161. if len(engine.SqlMap.Extension) == 0 {
  162. engine.SqlMap.Extension = map[string]string{"xml": ".xml", "json": ".json"}
  163. } else {
  164. if engine.SqlMap.Extension["xml"] == "" || len(engine.SqlMap.Extension["xml"]) == 0 {
  165. engine.SqlMap.Extension["xml"] = ".xml"
  166. }
  167. if engine.SqlMap.Extension["json"] == "" || len(engine.SqlMap.Extension["json"]) == 0 {
  168. engine.SqlMap.Extension["json"] = ".json"
  169. }
  170. }
  171. for _, filepath := range filepathSlice {
  172. if strings.HasSuffix(filepath, engine.SqlMap.Extension["xml"]) || strings.HasSuffix(filepath, engine.SqlMap.Extension["json"]) {
  173. err := engine.loadSqlMap(filepath)
  174. if err != nil {
  175. return err
  176. }
  177. }
  178. }
  179. return nil
  180. }
  181. func (engine *Engine) loadSqlMap(filepath string) error {
  182. info, err := os.Lstat(filepath)
  183. if err != nil {
  184. return err
  185. }
  186. if info.IsDir() {
  187. return nil
  188. }
  189. err = engine.SqlMap.paresSql(filepath)
  190. if err != nil {
  191. return err
  192. }
  193. return nil
  194. }
  195. func (engine *Engine) reloadSqlMap(filepath string) error {
  196. info, err := os.Lstat(filepath)
  197. if err != nil {
  198. return err
  199. }
  200. if info.IsDir() {
  201. return nil
  202. }
  203. err = engine.SqlMap.paresSql(filepath)
  204. if err != nil {
  205. return err
  206. }
  207. return nil
  208. }
  209. func (sqlMap *SqlMap) walkFunc(path string, info os.FileInfo, err error) error {
  210. if err != nil {
  211. return err
  212. }
  213. if info.IsDir() {
  214. return nil
  215. }
  216. if strings.HasSuffix(path, sqlMap.Extension["xml"]) || strings.HasSuffix(path, sqlMap.Extension["json"]) {
  217. err = sqlMap.paresSql(path)
  218. if err != nil {
  219. return err
  220. }
  221. }
  222. return nil
  223. }
  224. func (sqlMap *SqlMap) paresSql(filepath string) error {
  225. content, err := ioutil.ReadFile(filepath)
  226. fmt.Println("filepath:", filepath)
  227. if err != nil {
  228. return err
  229. }
  230. enc := sqlMap.Cipher
  231. if enc != nil {
  232. content, err = enc.Decrypt(content)
  233. if err != nil {
  234. return err
  235. }
  236. }
  237. sqlMap.checkNilAndInit()
  238. if strings.HasSuffix(filepath, sqlMap.Extension["xml"]) {
  239. var result Result
  240. err = xml.Unmarshal(content, &result)
  241. if err != nil {
  242. return err
  243. }
  244. for _, sql := range result.Sql {
  245. sqlMap.Sql[sql.Id] = sql.Value
  246. }
  247. return nil
  248. }
  249. if strings.HasSuffix(filepath, sqlMap.Extension["json"]) {
  250. var result map[string]string
  251. err = json.Unmarshal(content, &result)
  252. if err != nil {
  253. return err
  254. }
  255. for k := range result {
  256. sqlMap.Sql[k] = result[k]
  257. }
  258. return nil
  259. }
  260. return nil
  261. }
  262. func (engine *Engine) AddSql(key string, sql string) {
  263. engine.SqlMap.addSql(key, sql)
  264. }
  265. func (sqlMap *SqlMap) addSql(key string, sql string) {
  266. sqlMap.checkNilAndInit()
  267. sqlMap.Sql[key] = sql
  268. }
  269. func (engine *Engine) UpdateSql(key string, sql string) {
  270. engine.SqlMap.updateSql(key, sql)
  271. }
  272. func (sqlMap *SqlMap) updateSql(key string, sql string) {
  273. sqlMap.checkNilAndInit()
  274. sqlMap.Sql[key] = sql
  275. }
  276. func (engine *Engine) RemoveSql(key string) {
  277. engine.SqlMap.removeSql(key)
  278. }
  279. func (sqlMap *SqlMap) removeSql(key string) {
  280. sqlMap.checkNilAndInit()
  281. delete(sqlMap.Sql, key)
  282. }
  283. func (engine *Engine) BatchAddSql(sqlStrMap map[string]string) {
  284. engine.SqlMap.batchAddSql(sqlStrMap)
  285. }
  286. func (sqlMap *SqlMap) batchAddSql(sqlStrMap map[string]string) {
  287. sqlMap.checkNilAndInit()
  288. for k, v := range sqlStrMap {
  289. sqlMap.Sql[k] = v
  290. }
  291. }
  292. func (engine *Engine) BatchUpdateSql(sqlStrMap map[string]string) {
  293. engine.SqlMap.batchUpdateSql(sqlStrMap)
  294. }
  295. func (sqlMap *SqlMap) batchUpdateSql(sqlStrMap map[string]string) {
  296. sqlMap.checkNilAndInit()
  297. for k, v := range sqlStrMap {
  298. sqlMap.Sql[k] = v
  299. }
  300. }
  301. func (engine *Engine) BatchRemoveSql(key []string) {
  302. engine.SqlMap.batchRemoveSql(key)
  303. }
  304. func (sqlMap *SqlMap) batchRemoveSql(key []string) {
  305. sqlMap.checkNilAndInit()
  306. for _, v := range key {
  307. delete(sqlMap.Sql, v)
  308. }
  309. }
  310. func (engine *Engine) GetSql(key string) string {
  311. return engine.SqlMap.getSql(key)
  312. }
  313. func (sqlMap *SqlMap) getSql(key string) string {
  314. return sqlMap.Sql[key]
  315. }
  316. func (engine *Engine) GetSqlMap(keys ...interface{}) map[string]string {
  317. return engine.SqlMap.getSqlMap(keys...)
  318. }
  319. func (sqlMap *SqlMap) getSqlMap(keys ...interface{}) map[string]string {
  320. var resultSqlMap map[string]string
  321. i := len(keys)
  322. if i == 0 {
  323. return sqlMap.Sql
  324. }
  325. if i == 1 {
  326. switch keys[0].(type) {
  327. case string:
  328. resultSqlMap = make(map[string]string, 1)
  329. case []string:
  330. ks := keys[0].([]string)
  331. n := len(ks)
  332. resultSqlMap = make(map[string]string, n)
  333. }
  334. } else {
  335. resultSqlMap = make(map[string]string, i)
  336. }
  337. for k, _ := range keys {
  338. switch keys[k].(type) {
  339. case string:
  340. key := keys[k].(string)
  341. resultSqlMap[key] = sqlMap.Sql[key]
  342. case []string:
  343. ks := keys[k].([]string)
  344. for _, v := range ks {
  345. resultSqlMap[v] = sqlMap.Sql[v]
  346. }
  347. }
  348. }
  349. return resultSqlMap
  350. }