diff --git a/go.mod b/go.mod index 97579918..e8a2bb98 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.15 replace github.com/TeaOSLab/EdgeCommon => ../EdgeCommon - require ( github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/TeaOSLab/EdgeCommon v0.0.0-00010101000000-000000000000 @@ -16,8 +15,9 @@ require ( github.com/go-sql-driver/mysql v1.5.0 github.com/go-yaml/yaml v2.1.0+incompatible github.com/golang/protobuf v1.5.2 - github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060 + github.com/iwind/TeaGo v0.0.0-20210806054428-5534da0db9d1 github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3 + github.com/json-iterator/go v1.1.11 // indirect github.com/lionsoul2014/ip2region v2.2.0-release+incompatible github.com/mozillazg/go-pinyin v0.18.0 github.com/pkg/sftp v1.12.0 diff --git a/go.sum b/go.sum index a07ba561..f4f924ed 100644 --- a/go.sum +++ b/go.sum @@ -183,6 +183,8 @@ github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhK github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060 h1:qdLtK4PDXxk2vMKkTWl5Fl9xqYuRCukzWAgJbLHdfOo= github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= +github.com/iwind/TeaGo v0.0.0-20210806054428-5534da0db9d1 h1:AZKkwTNEZYrpyv62zIkxpLJsWhfOS7OEFovAcwd0aco= +github.com/iwind/TeaGo v0.0.0-20210806054428-5534da0db9d1/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3 h1:aBSonas7vFcgTj9u96/bWGILGv1ZbUSTLiOzcI1ZT6c= github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3/go.mod h1:H5Q7SXwbx3a97ecJkaS2sD77gspzE7HFUafBO0peEyA= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -193,6 +195,8 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= diff --git a/internal/setup/sql_dump.go b/internal/setup/sql_dump.go index 27218be0..4f19c810 100644 --- a/internal/setup/sql_dump.go +++ b/internal/setup/sql_dump.go @@ -164,7 +164,10 @@ func (this *SQLDump) Apply(db *dbs.DB, newResult *SQLDumpResult, showLog bool) ( } _, err = db.Exec("ALTER TABLE " + newTable.Name + " ADD " + newIndex.Definition) if err != nil { - return nil, err + err = this.tryCreateIndex(err, db, newTable.Name, newIndex.Definition) + if err != nil { + return nil, err + } } } else if oldIndex.Definition != newIndex.Definition { ops = append(ops, "* index "+newTable.Name+" "+newIndex.Name) @@ -177,7 +180,10 @@ func (this *SQLDump) Apply(db *dbs.DB, newResult *SQLDumpResult, showLog bool) ( } _, err = db.Exec("ALTER TABLE " + newTable.Name + " ADD " + newIndex.Definition) if err != nil { - return nil, err + err = this.tryCreateIndex(err, db, newTable.Name, newIndex.Definition) + if err != nil { + return nil, err + } } } } @@ -291,3 +297,34 @@ func (this *SQLDump) findRecordsTable(tableName string) *SQLRecordsTable { } return nil } + +// 创建索引 +func (this *SQLDump) tryCreateIndex(err error, db *dbs.DB, tableName string, indexDefinition string) error { + if err == nil { + return nil + } + + // 处理Duplicate entry + if strings.Index(err.Error(), "Error 1062: Duplicate entry") >= 0 && (strings.HasSuffix(tableName, "Stats") || strings.HasSuffix(tableName, "Values")) { + var tries = 5 // 尝试次数 + for i := 0; i < tries; i++ { + _, err = db.Exec("TRUNCATE TABLE " + tableName) + if err != nil { + if i == tries-1 { + return err + } + continue + } + _, err = db.Exec("ALTER TABLE " + tableName + " ADD " + indexDefinition) + if err != nil { + if i == tries-1 { + return err + } + } else { + return nil + } + } + } + + return err +} diff --git a/internal/setup/sql_executor_test.go b/internal/setup/sql_executor_test.go index dd0e25f3..08b6f996 100644 --- a/internal/setup/sql_executor_test.go +++ b/internal/setup/sql_executor_test.go @@ -11,7 +11,7 @@ func TestSQLExecutor_Run(t *testing.T) { Prefix: "edge", Dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge_new?charset=utf8mb4&multiStatements=true", }) - err := executor.Run() + err := executor.Run(false) if err != nil { t.Fatal(err) } diff --git a/internal/setup/sql_upgrade.go b/internal/setup/sql_upgrade.go index 67599261..c9efc3a3 100644 --- a/internal/setup/sql_upgrade.go +++ b/internal/setup/sql_upgrade.go @@ -6,7 +6,9 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/utils" + "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs" "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/maps" @@ -39,6 +41,9 @@ var upgradeFuncs = []*upgradeVersion{ { "0.2.5", upgradeV0_2_5, }, + { + "0.2.9", upgradeV0_2_9, + }, } // UpgradeSQLData 升级SQL数据 @@ -249,3 +254,30 @@ func upgradeV0_2_5(db *dbs.DB) error { return nil } + +// v0.2.9 +func upgradeV0_2_9(db *dbs.DB) error { + // 访问日志 + { + one, err := db.FindOne("SELECT id FROM edgeSysSettings WHERE code=? LIMIT 1", systemconfigs.SettingCodeNSAccessLogSetting) + if err != nil { + return err + } + if len(one) == 0 { + ref := &dnsconfigs.NSAccessLogRef{ + IsPrior: false, + IsOn: true, + LogMissingDomains: false, + } + refJSON, err := json.Marshal(ref) + if err != nil { + return err + } + _, err = db.Exec("INSERT edgeSysSettings (code, value) VALUES (?, ?)", systemconfigs.SettingCodeNSAccessLogSetting, refJSON) + if err != nil { + return err + } + } + } + return nil +}