Skip to content

Commit caf2274

Browse files
authored
Merge branch 'main' into patch-mail-templates-1
2 parents 78c45ad + dca375a commit caf2274

File tree

15 files changed

+73
-81
lines changed

15 files changed

+73
-81
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ require (
107107
github.com/stretchr/testify v1.10.0
108108
github.com/syndtr/goleveldb v1.0.0
109109
github.com/tstranex/u2f v1.0.0
110-
github.com/ulikunitz/xz v0.5.12
110+
github.com/ulikunitz/xz v0.5.15
111111
github.com/urfave/cli-docs/v3 v3.0.0-alpha6
112112
github.com/urfave/cli/v3 v3.3.3
113113
github.com/wneessen/go-mail v0.6.2

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,8 +684,8 @@ github.com/tstranex/u2f v1.0.0/go.mod h1:eahSLaqAS0zsIEv80+vXT7WanXs7MQQDg3j3wGB
684684
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
685685
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
686686
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
687-
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
688-
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
687+
github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
688+
github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
689689
github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
690690
github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
691691
github.com/urfave/cli-docs/v3 v3.0.0-alpha6 h1:w/l/N0xw1rO/aHRIGXJ0lDwwYFOzilup1qGvIytP3BI=

models/auth/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func RegenerateSession(ctx context.Context, oldKey, newKey string) (*Session, er
8686
}
8787
}
8888

89-
if _, err := db.Exec(ctx, "UPDATE "+db.TableName(&Session{})+" SET `key` = ? WHERE `key`=?", newKey, oldKey); err != nil {
89+
if _, err := db.Exec(ctx, "UPDATE `session` SET `key` = ? WHERE `key`=?", newKey, oldKey); err != nil {
9090
return nil, err
9191
}
9292

models/auth/source_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"testing"
99

1010
auth_model "code.gitea.io/gitea/models/auth"
11-
"code.gitea.io/gitea/models/db"
1211
"code.gitea.io/gitea/models/unittest"
1312
"code.gitea.io/gitea/modules/json"
1413

@@ -40,7 +39,7 @@ func (source *TestSource) ToDB() ([]byte, error) {
4039
func TestDumpAuthSource(t *testing.T) {
4140
assert.NoError(t, unittest.PrepareTestDatabase())
4241

43-
authSourceSchema, err := db.TableInfo(new(auth_model.Source))
42+
authSourceSchema, err := unittest.GetXORMEngine().TableInfo(new(auth_model.Source))
4443
assert.NoError(t, err)
4544

4645
auth_model.RegisterTypeConfig(auth_model.OAuth2, new(TestSource))

models/db/context.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,19 @@ func contextSafetyCheck(e Engine) {
6161
callerNum := runtime.Callers(3, callers) // skip 3: runtime.Callers, contextSafetyCheck, GetEngine
6262
for i := range callerNum {
6363
if slices.Contains(contextSafetyDeniedFuncPCs, callers[i]) {
64-
panic(errors.New("using database context in an iterator would cause corrupted results"))
64+
panic(errors.New("using session context in an iterator would cause corrupted results"))
6565
}
6666
}
6767
}
6868

6969
// GetEngine gets an existing db Engine/Statement or creates a new Session
70-
func GetEngine(ctx context.Context) (e Engine) {
71-
defer func() { contextSafetyCheck(e) }()
70+
func GetEngine(ctx context.Context) Engine {
7271
if engine, ok := ctx.Value(engineContextKey).(Engine); ok {
72+
// if reusing the existing session, need to do "contextSafetyCheck" because the Iterate creates a "autoResetStatement=false" session
73+
contextSafetyCheck(engine)
7374
return engine
7475
}
76+
// no need to do "contextSafetyCheck" because it's a new Session
7577
return xormEngine.Context(ctx)
7678
}
7779

@@ -301,11 +303,6 @@ func CountByBean(ctx context.Context, bean any) (int64, error) {
301303
return GetEngine(ctx).Count(bean)
302304
}
303305

304-
// TableName returns the table name according a bean object
305-
func TableName(bean any) string {
306-
return xormEngine.TableName(bean)
307-
}
308-
309306
// InTransaction returns true if the engine is in a transaction otherwise return false
310307
func InTransaction(ctx context.Context) bool {
311308
return getTransactionSession(ctx) != nil

models/db/context_test.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -100,31 +100,36 @@ func TestContextSafety(t *testing.T) {
100100
assert.NoError(t, db.Insert(t.Context(), &TestModel2{ID: int64(-i)}))
101101
}
102102

103-
actualCount := 0
104-
// here: db.GetEngine(t.Context()) is a new *Session created from *Engine
105-
_ = db.WithTx(t.Context(), func(ctx context.Context) error {
106-
_ = db.GetEngine(ctx).Iterate(&TestModel1{}, func(i int, bean any) error {
107-
// here: db.GetEngine(ctx) is always the unclosed "Iterate" *Session with autoResetStatement=false,
108-
// and the internal states (including "cond" and others) are always there and not be reset in this callback.
109-
m1 := bean.(*TestModel1)
110-
assert.EqualValues(t, i+1, m1.ID)
111-
112-
// here: XORM bug, it fails because the SQL becomes "WHERE id=-1", "WHERE id=-1 AND id=-2", "WHERE id=-1 AND id=-2 AND id=-3" ...
113-
// and it conflicts with the "Iterate"'s internal states.
114-
// has, err := db.GetEngine(ctx).Get(&TestModel2{ID: -m1.ID})
115-
116-
actualCount++
103+
t.Run("Show-XORM-Bug", func(t *testing.T) {
104+
actualCount := 0
105+
// here: db.GetEngine(t.Context()) is a new *Session created from *Engine
106+
_ = db.WithTx(t.Context(), func(ctx context.Context) error {
107+
_ = db.GetEngine(ctx).Iterate(&TestModel1{}, func(i int, bean any) error {
108+
// here: db.GetEngine(ctx) is always the unclosed "Iterate" *Session with autoResetStatement=false,
109+
// and the internal states (including "cond" and others) are always there and not be reset in this callback.
110+
m1 := bean.(*TestModel1)
111+
assert.EqualValues(t, i+1, m1.ID)
112+
113+
// here: XORM bug, it fails because the SQL becomes "WHERE id=-1", "WHERE id=-1 AND id=-2", "WHERE id=-1 AND id=-2 AND id=-3" ...
114+
// and it conflicts with the "Iterate"'s internal states.
115+
// has, err := db.GetEngine(ctx).Get(&TestModel2{ID: -m1.ID})
116+
117+
actualCount++
118+
return nil
119+
})
117120
return nil
118121
})
119-
return nil
122+
assert.Equal(t, testCount, actualCount)
120123
})
121-
assert.Equal(t, testCount, actualCount)
122124

123-
// deny the bad usages
124-
assert.PanicsWithError(t, "using database context in an iterator would cause corrupted results", func() {
125-
_ = unittest.GetXORMEngine().Iterate(&TestModel1{}, func(i int, bean any) error {
126-
_ = db.GetEngine(t.Context())
127-
return nil
125+
t.Run("DenyBadUsage", func(t *testing.T) {
126+
assert.PanicsWithError(t, "using session context in an iterator would cause corrupted results", func() {
127+
_ = db.WithTx(t.Context(), func(ctx context.Context) error {
128+
return db.GetEngine(ctx).Iterate(&TestModel1{}, func(i int, bean any) error {
129+
_ = db.GetEngine(ctx)
130+
return nil
131+
})
132+
})
128133
})
129134
})
130135
}

models/db/engine.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"strings"
1313

1414
"xorm.io/xorm"
15-
"xorm.io/xorm/schemas"
1615

1716
_ "github.com/go-sql-driver/mysql" // Needed for the MySQL driver
1817
_ "github.com/lib/pq" // Needed for the Postgresql driver
@@ -67,11 +66,6 @@ var (
6766
_ Engine = (*xorm.Session)(nil)
6867
)
6968

70-
// TableInfo returns table's information via an object
71-
func TableInfo(v any) (*schemas.Table, error) {
72-
return xormEngine.TableInfo(v)
73-
}
74-
7569
// RegisterModel registers model, if initFuncs provided, it will be invoked after data model sync
7670
func RegisterModel(bean any, initFunc ...func() error) {
7771
registeredModels = append(registeredModels, bean)

models/db/engine_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestPrimaryKeys(t *testing.T) {
7070
}
7171

7272
for _, bean := range beans {
73-
table, err := db.TableInfo(bean)
73+
table, err := db.GetXORMEngineForTesting().TableInfo(bean)
7474
if err != nil {
7575
t.Fatal(err)
7676
}

models/db/index.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,7 @@ type ResourceIndex struct {
1919
MaxIndex int64 `xorm:"index"`
2020
}
2121

22-
var (
23-
// ErrResouceOutdated represents an error when request resource outdated
24-
ErrResouceOutdated = errors.New("resource outdated")
25-
// ErrGetResourceIndexFailed represents an error when resource index retries 3 times
26-
ErrGetResourceIndexFailed = errors.New("get resource index failed")
27-
)
22+
var ErrGetResourceIndexFailed = errors.New("get resource index failed")
2823

2924
// SyncMaxResourceIndex sync the max index with the resource
3025
func SyncMaxResourceIndex(ctx context.Context, tableName string, groupID, maxIndex int64) (err error) {

models/issues/issue_search.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ func applySorts(sess *xorm.Session, sortType string, priorityRepoID int64) {
106106
"WHEN milestone.deadline_unix = 0 OR milestone.deadline_unix IS NULL THEN issue.deadline_unix " +
107107
"WHEN milestone.deadline_unix < issue.deadline_unix OR issue.deadline_unix = 0 THEN milestone.deadline_unix " +
108108
"ELSE issue.deadline_unix END ASC").
109-
Desc("issue.created_unix").
110-
Desc("issue.id")
109+
Asc("issue.created_unix").
110+
Asc("issue.id")
111111
case "farduedate":
112112
sess.Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
113113
OrderBy("CASE " +

0 commit comments

Comments
 (0)