mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 06:03:51 +03:00
Refactor deletion (#28610)
Introduce the new generic deletion methods - `func DeleteByID[T any](ctx context.Context, id int64) (int64, error)` - `func DeleteByIDs[T any](ctx context.Context, ids ...int64) error` - `func Delete[T any](ctx context.Context, opts FindOptions) (int64, error)` So, we no longer need any specific deletion method and can just use the generic ones instead. Replacement of #28450 Closes #28450 --------- Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
b41925cee3
commit
778ad795fd
31 changed files with 89 additions and 169 deletions
|
@ -90,19 +90,6 @@ func getArtifactByNameAndPath(ctx context.Context, runID int64, name, fpath stri
|
||||||
return &art, nil
|
return &art, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetArtifactByID returns an artifact by id
|
|
||||||
func GetArtifactByID(ctx context.Context, id int64) (*ActionArtifact, error) {
|
|
||||||
var art ActionArtifact
|
|
||||||
has, err := db.GetEngine(ctx).ID(id).Get(&art)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else if !has {
|
|
||||||
return nil, util.ErrNotExist
|
|
||||||
}
|
|
||||||
|
|
||||||
return &art, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateArtifactByID updates an artifact by id
|
// UpdateArtifactByID updates an artifact by id
|
||||||
func UpdateArtifactByID(ctx context.Context, id int64, art *ActionArtifact) error {
|
func UpdateArtifactByID(ctx context.Context, id int64, art *ActionArtifact) error {
|
||||||
art.ID = id
|
art.ID = id
|
||||||
|
|
|
@ -254,7 +254,7 @@ func DeleteRunner(ctx context.Context, id int64) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := db.GetEngine(ctx).Delete(&ActionRunner{ID: id})
|
_, err := db.DeleteByID[ActionRunner](ctx, id)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,16 +227,6 @@ func UpdatePublicKeyUpdated(ctx context.Context, id int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeletePublicKeys does the actual key deletion but does not update authorized_keys file.
|
|
||||||
func DeletePublicKeys(ctx context.Context, keyIDs ...int64) error {
|
|
||||||
if len(keyIDs) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := db.GetEngine(ctx).In("id", keyIDs).Delete(new(PublicKey))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicKeysAreExternallyManaged returns whether the provided KeyID represents an externally managed Key
|
// PublicKeysAreExternallyManaged returns whether the provided KeyID represents an externally managed Key
|
||||||
func PublicKeysAreExternallyManaged(ctx context.Context, keys []*PublicKey) ([]bool, error) {
|
func PublicKeysAreExternallyManaged(ctx context.Context, keys []*PublicKey) ([]bool, error) {
|
||||||
sources := make([]*auth.Source, 0, 5)
|
sources := make([]*auth.Source, 0, 5)
|
||||||
|
@ -322,8 +312,8 @@ func deleteKeysMarkedForDeletion(ctx context.Context, keys []string) (bool, erro
|
||||||
log.Error("SearchPublicKeyByContent: %v", err)
|
log.Error("SearchPublicKeyByContent: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err = DeletePublicKeys(ctx, key.ID); err != nil {
|
if _, err = db.DeleteByID[PublicKey](ctx, key.ID); err != nil {
|
||||||
log.Error("deletePublicKeys: %v", err)
|
log.Error("DeleteByID[PublicKey]: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
sshKeysNeedUpdate = true
|
sshKeysNeedUpdate = true
|
||||||
|
|
|
@ -175,7 +175,7 @@ func Exec(ctx context.Context, sqlAndArgs ...any) (sql.Result, error) {
|
||||||
|
|
||||||
func Get[T any](ctx context.Context, cond builder.Cond) (object *T, exist bool, err error) {
|
func Get[T any](ctx context.Context, cond builder.Cond) (object *T, exist bool, err error) {
|
||||||
if !cond.IsValid() {
|
if !cond.IsValid() {
|
||||||
return nil, false, ErrConditionRequired{}
|
panic("cond is invalid in db.Get(ctx, cond). This should not be possible.")
|
||||||
}
|
}
|
||||||
|
|
||||||
var bean T
|
var bean T
|
||||||
|
@ -201,7 +201,7 @@ func GetByID[T any](ctx context.Context, id int64) (object *T, exist bool, err e
|
||||||
|
|
||||||
func Exist[T any](ctx context.Context, cond builder.Cond) (bool, error) {
|
func Exist[T any](ctx context.Context, cond builder.Cond) (bool, error) {
|
||||||
if !cond.IsValid() {
|
if !cond.IsValid() {
|
||||||
return false, ErrConditionRequired{}
|
panic("cond is invalid in db.Exist(ctx, cond). This should not be possible.")
|
||||||
}
|
}
|
||||||
|
|
||||||
var bean T
|
var bean T
|
||||||
|
@ -213,16 +213,36 @@ func ExistByID[T any](ctx context.Context, id int64) (bool, error) {
|
||||||
return GetEngine(ctx).ID(id).NoAutoCondition().Exist(&bean)
|
return GetEngine(ctx).ID(id).NoAutoCondition().Exist(&bean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteByID deletes the given bean with the given ID
|
||||||
|
func DeleteByID[T any](ctx context.Context, id int64) (int64, error) {
|
||||||
|
var bean T
|
||||||
|
return GetEngine(ctx).ID(id).NoAutoCondition().NoAutoTime().Delete(&bean)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteByIDs[T any](ctx context.Context, ids ...int64) error {
|
||||||
|
if len(ids) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var bean T
|
||||||
|
_, err := GetEngine(ctx).In("id", ids).NoAutoCondition().NoAutoTime().Delete(&bean)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Delete[T any](ctx context.Context, opts FindOptions) (int64, error) {
|
||||||
|
if opts == nil || !opts.ToConds().IsValid() {
|
||||||
|
panic("opts are empty or invalid in db.Delete(ctx, opts). This should not be possible.")
|
||||||
|
}
|
||||||
|
|
||||||
|
var bean T
|
||||||
|
return GetEngine(ctx).Where(opts.ToConds()).NoAutoCondition().NoAutoTime().Delete(&bean)
|
||||||
|
}
|
||||||
|
|
||||||
// DeleteByBean deletes all records according non-empty fields of the bean as conditions.
|
// DeleteByBean deletes all records according non-empty fields of the bean as conditions.
|
||||||
func DeleteByBean(ctx context.Context, bean any) (int64, error) {
|
func DeleteByBean(ctx context.Context, bean any) (int64, error) {
|
||||||
return GetEngine(ctx).Delete(bean)
|
return GetEngine(ctx).Delete(bean)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteByID deletes the given bean with the given ID
|
|
||||||
func DeleteByID(ctx context.Context, id int64, bean any) (int64, error) {
|
|
||||||
return GetEngine(ctx).ID(id).NoAutoCondition().NoAutoTime().Delete(bean)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindIDs finds the IDs for the given table name satisfying the given condition
|
// FindIDs finds the IDs for the given table name satisfying the given condition
|
||||||
// By passing a different value than "id" for "idCol", you can query for foreign IDs, i.e. the repo IDs which satisfy the condition
|
// By passing a different value than "id" for "idCol", you can query for foreign IDs, i.e. the repo IDs which satisfy the condition
|
||||||
func FindIDs(ctx context.Context, tableName, idCol string, cond builder.Cond) ([]int64, error) {
|
func FindIDs(ctx context.Context, tableName, idCol string, cond builder.Cond) ([]int64, error) {
|
||||||
|
|
|
@ -72,21 +72,3 @@ func (err ErrNotExist) Error() string {
|
||||||
func (err ErrNotExist) Unwrap() error {
|
func (err ErrNotExist) Unwrap() error {
|
||||||
return util.ErrNotExist
|
return util.ErrNotExist
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrConditionRequired represents an error which require condition.
|
|
||||||
type ErrConditionRequired struct{}
|
|
||||||
|
|
||||||
// IsErrConditionRequired checks if an error is an ErrConditionRequired
|
|
||||||
func IsErrConditionRequired(err error) bool {
|
|
||||||
_, ok := err.(ErrConditionRequired)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func (err ErrConditionRequired) Error() string {
|
|
||||||
return "condition is required"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unwrap unwraps this as a ErrNotExist err
|
|
||||||
func (err ErrConditionRequired) Unwrap() error {
|
|
||||||
return util.ErrInvalidArgument
|
|
||||||
}
|
|
||||||
|
|
|
@ -249,11 +249,11 @@ func TestIssue_InsertIssue(t *testing.T) {
|
||||||
|
|
||||||
// there are 5 issues and max index is 5 on repository 1, so this one should 6
|
// there are 5 issues and max index is 5 on repository 1, so this one should 6
|
||||||
issue := testInsertIssue(t, "my issue1", "special issue's comments?", 6)
|
issue := testInsertIssue(t, "my issue1", "special issue's comments?", 6)
|
||||||
_, err := db.GetEngine(db.DefaultContext).ID(issue.ID).Delete(new(issues_model.Issue))
|
_, err := db.DeleteByID[issues_model.Issue](db.DefaultContext, issue.ID)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
issue = testInsertIssue(t, `my issue2, this is my son's love \n \r \ `, "special issue's '' comments?", 7)
|
issue = testInsertIssue(t, `my issue2, this is my son's love \n \r \ `, "special issue's '' comments?", 7)
|
||||||
_, err = db.GetEngine(db.DefaultContext).ID(issue.ID).Delete(new(issues_model.Issue))
|
_, err = db.DeleteByID[issues_model.Issue](db.DefaultContext, issue.ID)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -256,7 +256,7 @@ func DeleteLabel(ctx context.Context, id, labelID int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = sess.ID(labelID).Delete(new(Label)); err != nil {
|
if _, err = db.DeleteByID[Label](ctx, labelID); err != nil {
|
||||||
return err
|
return err
|
||||||
} else if _, err = sess.
|
} else if _, err = sess.
|
||||||
Where("label_id = ?", labelID).
|
Where("label_id = ?", labelID).
|
||||||
|
|
|
@ -289,9 +289,7 @@ func DeleteMilestoneByRepoID(ctx context.Context, repoID, id int64) error {
|
||||||
}
|
}
|
||||||
defer committer.Close()
|
defer committer.Close()
|
||||||
|
|
||||||
sess := db.GetEngine(ctx)
|
if _, err = db.DeleteByID[Milestone](ctx, m.ID); err != nil {
|
||||||
|
|
||||||
if _, err = sess.ID(m.ID).Delete(new(Milestone)); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,7 +309,7 @@ func DeleteMilestoneByRepoID(ctx context.Context, repoID, id int64) error {
|
||||||
repo.NumMilestones = int(numMilestones)
|
repo.NumMilestones = int(numMilestones)
|
||||||
repo.NumClosedMilestones = int(numClosedMilestones)
|
repo.NumClosedMilestones = int(numClosedMilestones)
|
||||||
|
|
||||||
if _, err = sess.ID(repo.ID).Cols("num_milestones, num_closed_milestones").Update(repo); err != nil {
|
if _, err = db.GetEngine(ctx).ID(repo.ID).Cols("num_milestones, num_closed_milestones").Update(repo); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -446,7 +446,7 @@ func SubmitReview(ctx context.Context, doer *user_model.User, issue *Issue, revi
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := sess.ID(teamReviewRequest.ID).NoAutoCondition().Delete(teamReviewRequest); err != nil {
|
if _, err := db.DeleteByID[Review](ctx, teamReviewRequest.ID); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -869,7 +869,6 @@ func DeleteReview(ctx context.Context, r *Review) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer committer.Close()
|
defer committer.Close()
|
||||||
sess := db.GetEngine(ctx)
|
|
||||||
|
|
||||||
if r.ID == 0 {
|
if r.ID == 0 {
|
||||||
return fmt.Errorf("review is not allowed to be 0")
|
return fmt.Errorf("review is not allowed to be 0")
|
||||||
|
@ -885,7 +884,7 @@ func DeleteReview(ctx context.Context, r *Review) error {
|
||||||
ReviewID: r.ID,
|
ReviewID: r.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := sess.Where(opts.ToConds()).Delete(new(Comment)); err != nil {
|
if _, err := db.Delete[Comment](ctx, opts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -895,7 +894,7 @@ func DeleteReview(ctx context.Context, r *Review) error {
|
||||||
ReviewID: r.ID,
|
ReviewID: r.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := sess.Where(opts.ToConds()).Delete(new(Comment)); err != nil {
|
if _, err := db.Delete[Comment](ctx, opts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -905,11 +904,11 @@ func DeleteReview(ctx context.Context, r *Review) error {
|
||||||
ReviewID: r.ID,
|
ReviewID: r.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := sess.Where(opts.ToConds()).Delete(new(Comment)); err != nil {
|
if _, err := db.Delete[Comment](ctx, opts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := sess.ID(r.ID).Delete(new(Review)); err != nil {
|
if _, err := db.DeleteByID[Review](ctx, r.ID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ func RemoveOrgUser(ctx context.Context, orgID, userID int64) error {
|
||||||
}
|
}
|
||||||
defer committer.Close()
|
defer committer.Close()
|
||||||
|
|
||||||
if _, err := db.GetEngine(ctx).ID(ou.ID).Delete(ou); err != nil {
|
if _, err := db.DeleteByID[organization.OrgUser](ctx, ou.ID); err != nil {
|
||||||
return err
|
return err
|
||||||
} else if _, err = db.Exec(ctx, "UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil {
|
} else if _, err = db.Exec(ctx, "UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -344,9 +344,7 @@ func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := db.DeleteByBean(ctx, &asymkey_model.DeployKey{
|
if _, err := db.DeleteByID[asymkey_model.DeployKey](ctx, key.ID); err != nil {
|
||||||
ID: key.ID,
|
|
||||||
}); err != nil {
|
|
||||||
return fmt.Errorf("delete deploy key [%d]: %w", key.ID, err)
|
return fmt.Errorf("delete deploy key [%d]: %w", key.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,7 +353,7 @@ func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if !has {
|
} else if !has {
|
||||||
if err = asymkey_model.DeletePublicKeys(ctx, key.KeyID); err != nil {
|
if _, err = db.DeleteByID[asymkey_model.PublicKey](ctx, key.KeyID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,14 +68,6 @@ func repoArchiverForRelativePath(relativePath string) (*RepoArchiver, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var delRepoArchiver = new(RepoArchiver)
|
|
||||||
|
|
||||||
// DeleteRepoArchiver delete archiver
|
|
||||||
func DeleteRepoArchiver(ctx context.Context, archiver *RepoArchiver) error {
|
|
||||||
_, err := db.GetEngine(ctx).ID(archiver.ID).Delete(delRepoArchiver)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRepoArchiver get an archiver
|
// GetRepoArchiver get an archiver
|
||||||
func GetRepoArchiver(ctx context.Context, repoID int64, tp git.ArchiveType, commitID string) (*RepoArchiver, error) {
|
func GetRepoArchiver(ctx context.Context, repoID int64, tp git.ArchiveType, commitID string) (*RepoArchiver, error) {
|
||||||
var archiver RepoArchiver
|
var archiver RepoArchiver
|
||||||
|
@ -100,12 +92,6 @@ func ExistsRepoArchiverWithStoragePath(ctx context.Context, storagePath string)
|
||||||
return db.GetEngine(ctx).Exist(archiver)
|
return db.GetEngine(ctx).Exist(archiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddRepoArchiver adds an archiver
|
|
||||||
func AddRepoArchiver(ctx context.Context, archiver *RepoArchiver) error {
|
|
||||||
_, err := db.GetEngine(ctx).Insert(archiver)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateRepoArchiverStatus updates archiver's status
|
// UpdateRepoArchiverStatus updates archiver's status
|
||||||
func UpdateRepoArchiverStatus(ctx context.Context, archiver *RepoArchiver) error {
|
func UpdateRepoArchiverStatus(ctx context.Context, archiver *RepoArchiver) error {
|
||||||
_, err := db.GetEngine(ctx).ID(archiver.ID).Cols("status").Update(archiver)
|
_, err := db.GetEngine(ctx).ID(archiver.ID).Cols("status").Update(archiver)
|
||||||
|
@ -114,6 +100,7 @@ func UpdateRepoArchiverStatus(ctx context.Context, archiver *RepoArchiver) error
|
||||||
|
|
||||||
// DeleteAllRepoArchives deletes all repo archives records
|
// DeleteAllRepoArchives deletes all repo archives records
|
||||||
func DeleteAllRepoArchives(ctx context.Context) error {
|
func DeleteAllRepoArchives(ctx context.Context) error {
|
||||||
|
// 1=1 to enforce delete all data, otherwise it will delete nothing
|
||||||
_, err := db.GetEngine(ctx).Where("1=1").Delete(new(RepoArchiver))
|
_, err := db.GetEngine(ctx).Where("1=1").Delete(new(RepoArchiver))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,12 +34,13 @@ type PushMirror struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type PushMirrorOptions struct {
|
type PushMirrorOptions struct {
|
||||||
|
db.ListOptions
|
||||||
ID int64
|
ID int64
|
||||||
RepoID int64
|
RepoID int64
|
||||||
RemoteName string
|
RemoteName string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (opts *PushMirrorOptions) toConds() builder.Cond {
|
func (opts PushMirrorOptions) ToConds() builder.Cond {
|
||||||
cond := builder.NewCond()
|
cond := builder.NewCond()
|
||||||
if opts.RepoID > 0 {
|
if opts.RepoID > 0 {
|
||||||
cond = cond.And(builder.Eq{"repo_id": opts.RepoID})
|
cond = cond.And(builder.Eq{"repo_id": opts.RepoID})
|
||||||
|
@ -75,12 +76,6 @@ func (m *PushMirror) GetRemoteName() string {
|
||||||
return m.RemoteName
|
return m.RemoteName
|
||||||
}
|
}
|
||||||
|
|
||||||
// InsertPushMirror inserts a push-mirror to database
|
|
||||||
func InsertPushMirror(ctx context.Context, m *PushMirror) error {
|
|
||||||
_, err := db.GetEngine(ctx).Insert(m)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdatePushMirror updates the push-mirror
|
// UpdatePushMirror updates the push-mirror
|
||||||
func UpdatePushMirror(ctx context.Context, m *PushMirror) error {
|
func UpdatePushMirror(ctx context.Context, m *PushMirror) error {
|
||||||
_, err := db.GetEngine(ctx).ID(m.ID).AllCols().Update(m)
|
_, err := db.GetEngine(ctx).ID(m.ID).AllCols().Update(m)
|
||||||
|
@ -95,23 +90,12 @@ func UpdatePushMirrorInterval(ctx context.Context, m *PushMirror) error {
|
||||||
|
|
||||||
func DeletePushMirrors(ctx context.Context, opts PushMirrorOptions) error {
|
func DeletePushMirrors(ctx context.Context, opts PushMirrorOptions) error {
|
||||||
if opts.RepoID > 0 {
|
if opts.RepoID > 0 {
|
||||||
_, err := db.GetEngine(ctx).Where(opts.toConds()).Delete(&PushMirror{})
|
_, err := db.Delete[PushMirror](ctx, opts)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return util.NewInvalidArgumentErrorf("repoID required and must be set")
|
return util.NewInvalidArgumentErrorf("repoID required and must be set")
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPushMirror(ctx context.Context, opts PushMirrorOptions) (*PushMirror, error) {
|
|
||||||
mirror := &PushMirror{}
|
|
||||||
exist, err := db.GetEngine(ctx).Where(opts.toConds()).Get(mirror)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else if !exist {
|
|
||||||
return nil, ErrPushMirrorNotExist
|
|
||||||
}
|
|
||||||
return mirror, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPushMirrorsByRepoID returns push-mirror information of a repository.
|
// GetPushMirrorsByRepoID returns push-mirror information of a repository.
|
||||||
func GetPushMirrorsByRepoID(ctx context.Context, repoID int64, listOptions db.ListOptions) ([]*PushMirror, int64, error) {
|
func GetPushMirrorsByRepoID(ctx context.Context, repoID int64, listOptions db.ListOptions) ([]*PushMirror, int64, error) {
|
||||||
sess := db.GetEngine(ctx).Where("repo_id = ?", repoID)
|
sess := db.GetEngine(ctx).Where("repo_id = ?", repoID)
|
||||||
|
|
|
@ -20,20 +20,20 @@ func TestPushMirrorsIterate(t *testing.T) {
|
||||||
|
|
||||||
now := timeutil.TimeStampNow()
|
now := timeutil.TimeStampNow()
|
||||||
|
|
||||||
repo_model.InsertPushMirror(db.DefaultContext, &repo_model.PushMirror{
|
db.Insert(db.DefaultContext, &repo_model.PushMirror{
|
||||||
RemoteName: "test-1",
|
RemoteName: "test-1",
|
||||||
LastUpdateUnix: now,
|
LastUpdateUnix: now,
|
||||||
Interval: 1,
|
Interval: 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
long, _ := time.ParseDuration("24h")
|
long, _ := time.ParseDuration("24h")
|
||||||
repo_model.InsertPushMirror(db.DefaultContext, &repo_model.PushMirror{
|
db.Insert(db.DefaultContext, &repo_model.PushMirror{
|
||||||
RemoteName: "test-2",
|
RemoteName: "test-2",
|
||||||
LastUpdateUnix: now,
|
LastUpdateUnix: now,
|
||||||
Interval: long,
|
Interval: long,
|
||||||
})
|
})
|
||||||
|
|
||||||
repo_model.InsertPushMirror(db.DefaultContext, &repo_model.PushMirror{
|
db.Insert(db.DefaultContext, &repo_model.PushMirror{
|
||||||
RemoteName: "test-3",
|
RemoteName: "test-3",
|
||||||
LastUpdateUnix: now,
|
LastUpdateUnix: now,
|
||||||
Interval: 0,
|
Interval: 0,
|
||||||
|
|
|
@ -450,12 +450,6 @@ func SortReleases(rels []*Release) {
|
||||||
sort.Sort(sorter)
|
sort.Sort(sorter)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteReleaseByID deletes a release from database by given ID.
|
|
||||||
func DeleteReleaseByID(ctx context.Context, id int64) error {
|
|
||||||
_, err := db.GetEngine(ctx).ID(id).Delete(new(Release))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateReleasesMigrationsByType updates all migrated repositories' releases from gitServiceType to replace originalAuthorID to posterID
|
// UpdateReleasesMigrationsByType updates all migrated repositories' releases from gitServiceType to replace originalAuthorID to posterID
|
||||||
func UpdateReleasesMigrationsByType(ctx context.Context, gitServiceType structs.GitServiceType, originalAuthorID string, posterID int64) error {
|
func UpdateReleasesMigrationsByType(ctx context.Context, gitServiceType structs.GitServiceType, originalAuthorID string, posterID int64) error {
|
||||||
_, err := db.GetEngine(ctx).Table("release").
|
_, err := db.GetEngine(ctx).Table("release").
|
||||||
|
@ -509,7 +503,7 @@ func PushUpdateDeleteTag(ctx context.Context, repo *Repository, tagName string)
|
||||||
return fmt.Errorf("GetRelease: %w", err)
|
return fmt.Errorf("GetRelease: %w", err)
|
||||||
}
|
}
|
||||||
if rel.IsTag {
|
if rel.IsTag {
|
||||||
if _, err = db.GetEngine(ctx).ID(rel.ID).Delete(new(Release)); err != nil {
|
if _, err = db.DeleteByID[Release](ctx, rel.ID); err != nil {
|
||||||
return fmt.Errorf("Delete: %w", err)
|
return fmt.Errorf("Delete: %w", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -131,9 +131,7 @@ func DeleteUploads(ctx context.Context, uploads ...*Upload) (err error) {
|
||||||
for i := 0; i < len(uploads); i++ {
|
for i := 0; i < len(uploads); i++ {
|
||||||
ids[i] = uploads[i].ID
|
ids[i] = uploads[i].ID
|
||||||
}
|
}
|
||||||
if _, err = db.GetEngine(ctx).
|
if err = db.DeleteByIDs[Upload](ctx, ids...); err != nil {
|
||||||
In("id", ids).
|
|
||||||
Delete(new(Upload)); err != nil {
|
|
||||||
return fmt.Errorf("delete uploads: %w", err)
|
return fmt.Errorf("delete uploads: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,23 +85,21 @@ func watchRepoMode(ctx context.Context, watch Watch, mode WatchMode) (err error)
|
||||||
|
|
||||||
watch.Mode = mode
|
watch.Mode = mode
|
||||||
|
|
||||||
e := db.GetEngine(ctx)
|
|
||||||
|
|
||||||
if !hadrec && needsrec {
|
if !hadrec && needsrec {
|
||||||
watch.Mode = mode
|
watch.Mode = mode
|
||||||
if _, err = e.Insert(watch); err != nil {
|
if err = db.Insert(ctx, watch); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if needsrec {
|
} else if needsrec {
|
||||||
watch.Mode = mode
|
watch.Mode = mode
|
||||||
if _, err := e.ID(watch.ID).AllCols().Update(watch); err != nil {
|
if _, err := db.GetEngine(ctx).ID(watch.ID).AllCols().Update(watch); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if _, err = e.Delete(Watch{ID: watch.ID}); err != nil {
|
} else if _, err = db.DeleteByID[Watch](ctx, watch.ID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if repodiff != 0 {
|
if repodiff != 0 {
|
||||||
_, err = e.Exec("UPDATE `repository` SET num_watches = num_watches + ? WHERE id = ?", repodiff, watch.RepoID)
|
_, err = db.GetEngine(ctx).Exec("UPDATE `repository` SET num_watches = num_watches + ? WHERE id = ?", repodiff, watch.RepoID)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,12 +102,6 @@ func Notices(ctx context.Context, page, pageSize int) ([]*Notice, error) {
|
||||||
Find(¬ices)
|
Find(¬ices)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteNotice deletes a system notice by given ID.
|
|
||||||
func DeleteNotice(ctx context.Context, id int64) error {
|
|
||||||
_, err := db.GetEngine(ctx).ID(id).Delete(new(Notice))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNotices deletes all notices with ID from start to end (inclusive).
|
// DeleteNotices deletes all notices with ID from start to end (inclusive).
|
||||||
func DeleteNotices(ctx context.Context, start, end int64) error {
|
func DeleteNotices(ctx context.Context, start, end int64) error {
|
||||||
if start == 0 && end == 0 {
|
if start == 0 && end == 0 {
|
||||||
|
@ -123,17 +117,6 @@ func DeleteNotices(ctx context.Context, start, end int64) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteNoticesByIDs deletes notices by given IDs.
|
|
||||||
func DeleteNoticesByIDs(ctx context.Context, ids []int64) error {
|
|
||||||
if len(ids) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
_, err := db.GetEngine(ctx).
|
|
||||||
In("id", ids).
|
|
||||||
Delete(new(Notice))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteOldSystemNotices deletes all old system notices from database.
|
// DeleteOldSystemNotices deletes all old system notices from database.
|
||||||
func DeleteOldSystemNotices(ctx context.Context, olderThan time.Duration) (err error) {
|
func DeleteOldSystemNotices(ctx context.Context, olderThan time.Duration) (err error) {
|
||||||
if olderThan <= 0 {
|
if olderThan <= 0 {
|
||||||
|
|
|
@ -69,14 +69,6 @@ func TestNotices(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteNotice(t *testing.T) {
|
|
||||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
||||||
|
|
||||||
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 3})
|
|
||||||
assert.NoError(t, system.DeleteNotice(db.DefaultContext, 3))
|
|
||||||
unittest.AssertNotExistsBean(t, &system.Notice{ID: 3})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDeleteNotices(t *testing.T) {
|
func TestDeleteNotices(t *testing.T) {
|
||||||
// delete a non-empty range
|
// delete a non-empty range
|
||||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
@ -109,7 +101,8 @@ func TestDeleteNoticesByIDs(t *testing.T) {
|
||||||
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 1})
|
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 1})
|
||||||
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 2})
|
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 2})
|
||||||
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 3})
|
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 3})
|
||||||
assert.NoError(t, system.DeleteNoticesByIDs(db.DefaultContext, []int64{1, 3}))
|
err := db.DeleteByIDs[system.Notice](db.DefaultContext, 1, 3)
|
||||||
|
assert.NoError(t, err)
|
||||||
unittest.AssertNotExistsBean(t, &system.Notice{ID: 1})
|
unittest.AssertNotExistsBean(t, &system.Notice{ID: 1})
|
||||||
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 2})
|
unittest.AssertExistsAndLoadBean(t, &system.Notice{ID: 2})
|
||||||
unittest.AssertNotExistsBean(t, &system.Notice{ID: 3})
|
unittest.AssertNotExistsBean(t, &system.Notice{ID: 3})
|
||||||
|
|
|
@ -471,7 +471,7 @@ func DeleteWebhookByID(ctx context.Context, id int64) (err error) {
|
||||||
}
|
}
|
||||||
defer committer.Close()
|
defer committer.Close()
|
||||||
|
|
||||||
if count, err := db.DeleteByID(ctx, id, new(Webhook)); err != nil {
|
if count, err := db.DeleteByID[Webhook](ctx, id); err != nil {
|
||||||
return err
|
return err
|
||||||
} else if count == 0 {
|
} else if count == 0 {
|
||||||
return ErrWebhookNotExist{ID: id}
|
return ErrWebhookNotExist{ID: id}
|
||||||
|
|
|
@ -63,7 +63,6 @@ package actions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -423,15 +422,15 @@ func (ar artifactRoutes) downloadArtifact(ctx *ArtifactContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
artifactID := ctx.ParamsInt64("artifact_id")
|
artifactID := ctx.ParamsInt64("artifact_id")
|
||||||
artifact, err := actions.GetArtifactByID(ctx, artifactID)
|
artifact, exist, err := db.GetByID[actions.ActionArtifact](ctx, artifactID)
|
||||||
if errors.Is(err, util.ErrNotExist) {
|
if err != nil {
|
||||||
log.Error("Error getting artifact: %v", err)
|
|
||||||
ctx.Error(http.StatusNotFound, err.Error())
|
|
||||||
return
|
|
||||||
} else if err != nil {
|
|
||||||
log.Error("Error getting artifact: %v", err)
|
log.Error("Error getting artifact: %v", err)
|
||||||
ctx.Error(http.StatusInternalServerError, err.Error())
|
ctx.Error(http.StatusInternalServerError, err.Error())
|
||||||
return
|
return
|
||||||
|
} else if !exist {
|
||||||
|
log.Error("artifact with ID %d does not exist", artifactID)
|
||||||
|
ctx.Error(http.StatusNotFound, fmt.Sprintf("artifact with ID %d does not exist", artifactID))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
if artifact.RunID != runID {
|
if artifact.RunID != runID {
|
||||||
log.Error("Error dismatch runID and artifactID, task: %v, artifact: %v", runID, artifactID)
|
log.Error("Error dismatch runID and artifactID, task: %v, artifact: %v", runID, artifactID)
|
||||||
|
|
|
@ -227,11 +227,18 @@ func GetPushMirrorByName(ctx *context.APIContext) {
|
||||||
|
|
||||||
mirrorName := ctx.Params(":name")
|
mirrorName := ctx.Params(":name")
|
||||||
// Get push mirror of a specific repo by remoteName
|
// Get push mirror of a specific repo by remoteName
|
||||||
pushMirror, err := repo_model.GetPushMirror(ctx, repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: mirrorName})
|
pushMirror, exist, err := db.Get[repo_model.PushMirror](ctx, repo_model.PushMirrorOptions{
|
||||||
|
RepoID: ctx.Repo.Repository.ID,
|
||||||
|
RemoteName: mirrorName,
|
||||||
|
}.ToConds())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Error(http.StatusNotFound, "GetPushMirrors", err)
|
ctx.Error(http.StatusInternalServerError, "GetPushMirrors", err)
|
||||||
|
return
|
||||||
|
} else if !exist {
|
||||||
|
ctx.Error(http.StatusNotFound, "GetPushMirrors", nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
m, err := convert.ToPushMirror(ctx, pushMirror)
|
m, err := convert.ToPushMirror(ctx, pushMirror)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetPushMirrorByRemoteName", err)
|
ctx.ServerError("GetPushMirrorByRemoteName", err)
|
||||||
|
@ -368,7 +375,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro
|
||||||
RemoteAddress: remoteAddress,
|
RemoteAddress: remoteAddress,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = repo_model.InsertPushMirror(ctx, pushMirror); err != nil {
|
if err = db.Insert(ctx, pushMirror); err != nil {
|
||||||
ctx.ServerError("InsertPushMirror", err)
|
ctx.ServerError("InsertPushMirror", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
system_model "code.gitea.io/gitea/models/system"
|
system_model "code.gitea.io/gitea/models/system"
|
||||||
"code.gitea.io/gitea/modules/base"
|
"code.gitea.io/gitea/modules/base"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
|
@ -55,7 +56,7 @@ func DeleteNotices(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := system_model.DeleteNoticesByIDs(ctx, ids); err != nil {
|
if err := db.DeleteByIDs[system_model.Notice](ctx, ids...); err != nil {
|
||||||
ctx.Flash.Error("DeleteNoticesByIDs: " + err.Error())
|
ctx.Flash.Error("DeleteNoticesByIDs: " + err.Error())
|
||||||
ctx.Status(http.StatusInternalServerError)
|
ctx.Status(http.StatusInternalServerError)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -418,7 +418,7 @@ func SettingsPost(ctx *context.Context) {
|
||||||
Interval: interval,
|
Interval: interval,
|
||||||
RemoteAddress: remoteAddress,
|
RemoteAddress: remoteAddress,
|
||||||
}
|
}
|
||||||
if err := repo_model.InsertPushMirror(ctx, m); err != nil {
|
if err := db.Insert(ctx, m); err != nil {
|
||||||
ctx.ServerError("InsertPushMirror", err)
|
ctx.ServerError("InsertPushMirror", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ func DeletePublicKey(ctx context.Context, doer *user_model.User, id int64) (err
|
||||||
}
|
}
|
||||||
defer committer.Close()
|
defer committer.Close()
|
||||||
|
|
||||||
if err = asymkey_model.DeletePublicKeys(dbCtx, id); err != nil {
|
if _, err = db.DeleteByID[asymkey_model.PublicKey](dbCtx, id); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/lfs"
|
"code.gitea.io/gitea/modules/lfs"
|
||||||
|
@ -93,8 +94,9 @@ func SyncPushMirror(ctx context.Context, mirrorID int64) bool {
|
||||||
log.Error("PANIC whilst syncPushMirror[%d] Panic: %v\nStacktrace: %s", mirrorID, err, log.Stack(2))
|
log.Error("PANIC whilst syncPushMirror[%d] Panic: %v\nStacktrace: %s", mirrorID, err, log.Stack(2))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
m, err := repo_model.GetPushMirror(ctx, repo_model.PushMirrorOptions{ID: mirrorID})
|
// TODO: Handle "!exist" better
|
||||||
if err != nil {
|
m, exist, err := db.GetByID[repo_model.PushMirror](ctx, mirrorID)
|
||||||
|
if err != nil || !exist {
|
||||||
log.Error("GetPushMirrorByID [%d]: %v", mirrorID, err)
|
log.Error("GetPushMirrorByID [%d]: %v", mirrorID, err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,7 +339,7 @@ func DeleteReleaseByID(ctx context.Context, repo *repo_model.Repository, rel *re
|
||||||
}, repository.NewPushCommits())
|
}, repository.NewPushCommits())
|
||||||
notify_service.DeleteRef(ctx, doer, repo, refName)
|
notify_service.DeleteRef(ctx, doer, repo, refName)
|
||||||
|
|
||||||
if err := repo_model.DeleteReleaseByID(ctx, rel.ID); err != nil {
|
if _, err := db.DeleteByID[repo_model.Release](ctx, rel.ID); err != nil {
|
||||||
return fmt.Errorf("DeleteReleaseByID: %w", err)
|
return fmt.Errorf("DeleteReleaseByID: %w", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -177,7 +177,7 @@ func doArchive(ctx context.Context, r *ArchiveRequest) (*repo_model.RepoArchiver
|
||||||
CommitID: r.CommitID,
|
CommitID: r.CommitID,
|
||||||
Status: repo_model.ArchiverGenerating,
|
Status: repo_model.ArchiverGenerating,
|
||||||
}
|
}
|
||||||
if err := repo_model.AddRepoArchiver(ctx, archiver); err != nil {
|
if err := db.Insert(ctx, archiver); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,7 +309,7 @@ func StartArchive(request *ArchiveRequest) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteOldRepoArchiver(ctx context.Context, archiver *repo_model.RepoArchiver) error {
|
func deleteOldRepoArchiver(ctx context.Context, archiver *repo_model.RepoArchiver) error {
|
||||||
if err := repo_model.DeleteRepoArchiver(ctx, archiver); err != nil {
|
if _, err := db.DeleteByID[repo_model.RepoArchiver](ctx, archiver.ID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
p := archiver.RelativePath()
|
p := archiver.RelativePath()
|
||||||
|
|
|
@ -76,7 +76,7 @@ func DeleteSecretByName(ctx context.Context, ownerID, repoID int64, name string)
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteSecret(ctx context.Context, s *secret_model.Secret) error {
|
func deleteSecret(ctx context.Context, s *secret_model.Secret) error {
|
||||||
if _, err := db.DeleteByID(ctx, s.ID, s); err != nil {
|
if _, err := db.DeleteByID[secret_model.Secret](ctx, s.ID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -185,7 +185,7 @@ func deleteUser(ctx context.Context, u *user_model.User, purge bool) (err error)
|
||||||
}
|
}
|
||||||
// ***** END: ExternalLoginUser *****
|
// ***** END: ExternalLoginUser *****
|
||||||
|
|
||||||
if _, err = db.DeleteByID(ctx, u.ID, new(user_model.User)); err != nil {
|
if _, err = db.DeleteByID[user_model.User](ctx, u.ID); err != nil {
|
||||||
return fmt.Errorf("delete: %w", err)
|
return fmt.Errorf("delete: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ func TestCreateNewTagProtected(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
for _, release := range releases {
|
for _, release := range releases {
|
||||||
err = repo_model.DeleteReleaseByID(db.DefaultContext, release.ID)
|
_, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue