update.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package commands
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "os"
  8. "github.com/astaxie/beego"
  9. "github.com/lifei6671/godoc/conf"
  10. "github.com/astaxie/beego/orm"
  11. "strings"
  12. )
  13. //系统升级.
  14. func Update() {
  15. if len(os.Args) >= 2 && os.Args[1] == "update" {
  16. adapter := beego.AppConfig.String("db_adapter")
  17. if adapter == "mysql" {
  18. mysqlUpdate()
  19. }else if adapter == "sqlite3" {
  20. sqliteUpdate()
  21. }
  22. o := orm.NewOrm()
  23. b,err := ioutil.ReadFile("./data/data.sql")
  24. if err != nil {
  25. panic(err.Error())
  26. os.Exit(1)
  27. }
  28. sqls := string(b)
  29. if sqls != "" {
  30. items := strings.Split(sqls,"\r\n")
  31. for _,sql := range items {
  32. if sql != "" {
  33. _,err = o.Raw(sql).Exec()
  34. if err != nil && err != orm.ErrNoRows{
  35. panic("SITE_NAME => " + err.Error())
  36. os.Exit(1)
  37. }
  38. }
  39. }
  40. }
  41. fmt.Println("update successed.")
  42. os.Exit(0)
  43. }
  44. }
  45. //检查最新版本.
  46. func CheckUpdate() {
  47. if len(os.Args) >= 2 && os.Args[1] == "version" {
  48. resp, err := http.Get("https://api.github.com/repos/lifei6671/godoc/tags")
  49. if err != nil {
  50. beego.Error("CheckUpdate => ", err)
  51. os.Exit(1)
  52. }
  53. defer resp.Body.Close()
  54. body, err := ioutil.ReadAll(resp.Body)
  55. if err != nil {
  56. beego.Error("CheckUpdate => ", err)
  57. os.Exit(1)
  58. }
  59. var result []*struct {
  60. Name string `json:"name"`
  61. }
  62. err = json.Unmarshal(body, &result)
  63. if err != nil {
  64. beego.Error("CheckUpdate => ", err)
  65. os.Exit(1)
  66. }
  67. fmt.Println("MinDoc current version => ", conf.VERSION)
  68. fmt.Println("MinDoc last version => ", result[0].Name)
  69. os.Exit(0)
  70. }
  71. }
  72. //MySQL 数据库更新表结构.
  73. func mysqlUpdate() {
  74. db_name := beego.AppConfig.String("db_database")
  75. o := orm.NewOrm()
  76. var total_count int
  77. err := o.Raw("SELECT COUNT(*) AS total_count FROM information_schema.columns WHERE table_schema= ? AND table_name = 'md_members' AND column_name = 'auth_method'",db_name).QueryRow(&total_count)
  78. if err != nil {
  79. panic(fmt.Sprintf("error : 6001 => %s",err.Error()))
  80. os.Exit(1)
  81. }
  82. _,err = o.Raw("ALTER TABLE md_members ADD auth_method VARCHAR(50) DEFAULT 'local' NULL").Exec()
  83. }
  84. //sqlite 数据库更新表结构.
  85. func sqliteUpdate() {
  86. o := orm.NewOrm()
  87. var sqlite_master struct{
  88. Name string
  89. }
  90. err := o.Raw("select * from sqlite_master where name='md_members' and sql like '%auth_method%' limit 1").QueryRow(&sqlite_master)
  91. //查询是否已经存在 auth_method 列
  92. if err == orm.ErrNoRows{
  93. _,err = o.Raw("ALTER TABLE md_members ADD auth_method VARCHAR(50) DEFAULT 'local' NULL;").Exec()
  94. if err != nil {
  95. panic(fmt.Sprintf("error : 6001 => %s",err.Error()))
  96. os.Exit(1)
  97. }
  98. }
  99. }