@@ -83,13 +83,47 @@ func mysqlGetCommitStatusIndex(ctx context.Context, repoID int64, sha string) (i
8383 return idx , nil
8484}
8585
86+ func mssqlGetCommitStatusIndex (ctx context.Context , repoID int64 , sha string ) (int64 , error ) {
87+ if _ , err := db .GetEngine (ctx ).Exec (`
88+ MERGE INTO commit_status_index WITH (HOLDLOCK) AS target
89+ USING (SELECT ? AS repo_id, ? AS sha) AS source
90+ (repo_id, sha)
91+ ON target.repo_id = source.repo_id AND target.sha = source.sha
92+ WHEN MATCHED
93+ THEN UPDATE
94+ SET max_index = max_index + 1
95+ WHEN NOT MATCHED
96+ THEN INSERT (repo_id, sha, max_index)
97+ VALUES (?, ?, 1);
98+ ` , repoID , sha , repoID , sha ); err != nil {
99+ return 0 , err
100+ }
101+
102+ var idx int64
103+ _ , err := db .GetEngine (ctx ).SQL ("SELECT max_index FROM `commit_status_index` WHERE repo_id = ? AND sha = ?" ,
104+ repoID , sha ).Get (& idx )
105+ if err != nil {
106+ return 0 , err
107+ }
108+ if idx == 0 {
109+ return 0 , errors .New ("cannot get the correct index" )
110+ }
111+ return idx , nil
112+ }
113+
86114// GetNextCommitStatusIndex retried 3 times to generate a resource index
87115func GetNextCommitStatusIndex (ctx context.Context , repoID int64 , sha string ) (int64 , error ) {
116+ if ! git .IsValidSHAPattern (sha ) {
117+ return 0 , git.ErrInvalidSHA {SHA : sha }
118+ }
119+
88120 switch {
89121 case setting .Database .Type .IsPostgreSQL ():
90122 return postgresGetCommitStatusIndex (ctx , repoID , sha )
91123 case setting .Database .Type .IsMySQL ():
92124 return mysqlGetCommitStatusIndex (ctx , repoID , sha )
125+ case setting .Database .Type .IsMSSQL ():
126+ return mssqlGetCommitStatusIndex (ctx , repoID , sha )
93127 }
94128
95129 e := db .GetEngine (ctx )
0 commit comments