From 961c87a313255a1124a7d78786d1a38f7add0e55 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Sun, 4 Dec 2022 11:03:50 +0000 Subject: [PATCH] add primary key to foreignreference Signed-off-by: Andrew Thornton --- models/foreignreference/foreignreference.go | 2 ++ .../foreign_reference.yml | 25 ++++++++++++++ models/migrations/migrations.go | 2 ++ models/migrations/v1_19/v236.go | 21 ++++++++++++ models/migrations/v1_19/v236_test.go | 34 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 models/migrations/fixtures/Test_AddPrimaryKeyToForeignReference/foreign_reference.yml create mode 100644 models/migrations/v1_19/v236.go create mode 100644 models/migrations/v1_19/v236_test.go diff --git a/models/foreignreference/foreignreference.go b/models/foreignreference/foreignreference.go index 2d2ad04c5a14..93f7879fd992 100644 --- a/models/foreignreference/foreignreference.go +++ b/models/foreignreference/foreignreference.go @@ -19,6 +19,8 @@ const ( // ForeignReference represents external references type ForeignReference struct { + ID int64 `xorm:"pk autoincr"` + // RepoID is the first column in all indices. now we only need 2 indices: (repo, local) and (repo, foreign, type) RepoID int64 `xorm:"UNIQUE(repo_foreign_type) INDEX(repo_local)" ` LocalIndex int64 `xorm:"INDEX(repo_local)"` // the resource key inside Gitea, it can be IssueIndex, or some model ID. diff --git a/models/migrations/fixtures/Test_AddPrimaryKeyToForeignReference/foreign_reference.yml b/models/migrations/fixtures/Test_AddPrimaryKeyToForeignReference/foreign_reference.yml new file mode 100644 index 000000000000..4512cef7964c --- /dev/null +++ b/models/migrations/fixtures/Test_AddPrimaryKeyToForeignReference/foreign_reference.yml @@ -0,0 +1,25 @@ +- + repo_id: 1 + local_index: 1 + foreign_index: "foo" + type: "foo" +- + repo_id: 1 + local_index: 2 + foreign_index: "bar" + type: "foo" +- + repo_id: 2 + local_index: 2 + foreign_index: "foo" + type: "foo" +- + repo_id: 3 + local_index: 1024 + foreign_index: "1" + type: "normal" +- + repo_id: 2 + local_index: 1 + foreign_index: "bar" + type: "foo" diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index e718355f8349..5f6eda0fd50b 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -442,6 +442,8 @@ var migrations = []Migration{ NewMigration("Add package cleanup rule table", v1_19.CreatePackageCleanupRuleTable), // v235 -> v236 NewMigration("Add index for access_token", v1_19.AddIndexForAccessToken), + // v236 -> v237 + NewMigration("Add primary key to foreign reference", v1_19.AddPrimaryKeyToForeignReference), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v1_19/v236.go b/models/migrations/v1_19/v236.go new file mode 100644 index 000000000000..4271217a4a99 --- /dev/null +++ b/models/migrations/v1_19/v236.go @@ -0,0 +1,21 @@ +// Copyright 2022 Gitea. All rights reserved. +// SPDX-License-Identifier: MIT + +package v1_19 //nolint + +import "xorm.io/xorm" + +func AddPrimaryKeyToForeignReference(x *xorm.Engine) error { + // ForeignReference represents external references + type ForeignReference struct { + ID int64 `xorm:"pk autoincr"` + + // RepoID is the first column in all indices. now we only need 2 indices: (repo, local) and (repo, foreign, type) + RepoID int64 `xorm:"UNIQUE(repo_foreign_type) INDEX(repo_local)" ` + LocalIndex int64 `xorm:"INDEX(repo_local)"` // the resource key inside Gitea, it can be IssueIndex, or some model ID. + ForeignIndex string `xorm:"INDEX UNIQUE(repo_foreign_type)"` + Type string `xorm:"VARCHAR(16) INDEX UNIQUE(repo_foreign_type)"` + } + + return x.Sync(new(ForeignReference)) +} diff --git a/models/migrations/v1_19/v236_test.go b/models/migrations/v1_19/v236_test.go new file mode 100644 index 000000000000..d3f1098458d0 --- /dev/null +++ b/models/migrations/v1_19/v236_test.go @@ -0,0 +1,34 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package v1_19 //nolint + +import ( + "testing" + + "code.gitea.io/gitea/models/migrations/base" + "github.com/stretchr/testify/assert" +) + +func Test_AddPrimaryKeyToForeignReference(t *testing.T) { + // ForeignReference represents external references + type ForeignReference struct { + // RepoID is the first column in all indices. now we only need 2 indices: (repo, local) and (repo, foreign, type) + RepoID int64 `xorm:"UNIQUE(repo_foreign_type) INDEX(repo_local)" ` + LocalIndex int64 `xorm:"INDEX(repo_local)"` // the resource key inside Gitea, it can be IssueIndex, or some model ID. + ForeignIndex string `xorm:"INDEX UNIQUE(repo_foreign_type)"` + Type string `xorm:"VARCHAR(16) INDEX UNIQUE(repo_foreign_type)"` + } + + // Prepare and load the testing database + x, deferable := base.PrepareTestEnv(t, 0, new(ForeignReference)) + defer deferable() + if x == nil || t.Failed() { + return + } + + if err := AddPrimaryKeyToForeignReference(x); err != nil { + assert.NoError(t, err) + return + } +}