diff options
author | Daniel Baumann <daniel@debian.org> | 2024-10-18 20:33:49 +0200 |
---|---|---|
committer | Daniel Baumann <daniel@debian.org> | 2024-12-12 23:57:56 +0100 |
commit | e68b9d00a6e05b3a941f63ffb696f91e554ac5ec (patch) | |
tree | 97775d6c13b0f416af55314eb6a89ef792474615 /models/system/appstate.go | |
parent | Initial commit. (diff) | |
download | forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.tar.xz forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.zip |
Adding upstream version 9.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to '')
-rw-r--r-- | models/system/appstate.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/models/system/appstate.go b/models/system/appstate.go new file mode 100644 index 0000000..01faa1a --- /dev/null +++ b/models/system/appstate.go @@ -0,0 +1,56 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package system + +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 +func SaveAppStateContent(ctx context.Context, key, content string) error { + return db.WithTx(ctx, func(ctx context.Context) error { + 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 +func GetAppStateContent(ctx context.Context, key string) (content string, err error) { + e := db.GetEngine(ctx) + appState := &AppState{ID: key} + has, err := e.Get(appState) + if err != nil { + return "", err + } else if !has { + return "", nil + } + return appState.Content, nil +} |