2021-10-21 12:22:43 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-10-21 12:22:43 +03:00
2022-10-17 02:29:26 +03:00
package system
2021-10-21 12:22:43 +03:00
import (
"context"
"code.gitea.io/gitea/models/db"
)
// AppState represents a state record in database
// if one day we would make Gitea run as a cluster,
// we can introduce a new field `Scope` here to store different states for different nodes
type AppState struct {
ID string ` xorm:"pk varchar(200)" `
Revision int64
Content string ` xorm:"LONGTEXT" `
}
func init ( ) {
db . RegisterModel ( new ( AppState ) )
}
// SaveAppStateContent saves the app state item to database
2023-10-15 18:46:06 +03:00
func SaveAppStateContent ( ctx context . Context , key , content string ) error {
return db . WithTx ( ctx , func ( ctx context . Context ) error {
2021-10-21 12:22:43 +03:00
eng := db . GetEngine ( ctx )
// try to update existing row
res , err := eng . Exec ( "UPDATE app_state SET revision=revision+1, content=? WHERE id=?" , content , key )
if err != nil {
return err
}
rows , _ := res . RowsAffected ( )
if rows != 0 {
// the existing row is updated, so we can return
return nil
}
// if no existing row, insert a new row
_ , err = eng . Insert ( & AppState { ID : key , Content : content } )
return err
} )
}
// GetAppStateContent gets an app state from database
2023-10-15 18:46:06 +03:00
func GetAppStateContent ( ctx context . Context , key string ) ( content string , err error ) {
e := db . GetEngine ( ctx )
2021-10-21 12:22:43 +03:00
appState := & AppState { ID : key }
has , err := e . Get ( appState )
if err != nil {
return "" , err
} else if ! has {
return "" , nil
}
return appState . Content , nil
}