From b88010b779289ea2f81262c331815cf7e74e001e Mon Sep 17 00:00:00 2001 From: wwt Date: Fri, 9 Feb 2024 20:05:17 +0800 Subject: [PATCH] fix: db SaveServer by insert-or-update --- storage/sql/server.go | 54 +++++++++++++++++++++++++++++++++++------ storage/sql/settings.go | 3 ++- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/storage/sql/server.go b/storage/sql/server.go index 121619c0..cf195d6d 100644 --- a/storage/sql/server.go +++ b/storage/sql/server.go @@ -94,20 +94,60 @@ func (s settingsBackend) SaveServer(ss *settings.Server) error { return err } table := quoteName(s.dbType, SettingsTable) - k := quoteName(s.dbType, "key") + keyName := quoteName(s.dbType, "key") p1 := placeHolder(s.dbType, 1) p2 := placeHolder(s.dbType, 2) - sql := fmt.Sprintf("INSERT INTO %s (%s, value) VALUES(%s,%s)", table, k, p1, p2) - for i, field := range fields { - stmt, err := s.db.Prepare(sql) + + Insert := func(key string, value string) bool { + insertSql := fmt.Sprintf("INSERT INTO %s (%s, value) VALUES(%s,%s)", table, keyName, p1, p2) + stmt, err := s.db.Prepare(insertSql) defer stmt.Close() if checkError(err, "Fail to prepare statement") { tx.Rollback() - break + return false } - _, err = stmt.Exec(field, values[i]) - if checkError(err, "Fail to insert field "+field+" of settings.Server") { + _, err = stmt.Exec(key, value) + if checkError(err, "Fail to insert field "+key+" of settings.Server") { tx.Rollback() + return false + } + return true + } + Update := func(key string, value string) bool { + updateSql := fmt.Sprintf("UPDATE %s SET value=%s WHERE %s=%s", table, p1, keyName, p2) + stmt, err := s.db.Prepare(updateSql) + defer stmt.Close() + if checkError(err, "Fail to prepare statement") { + tx.Rollback() + return false + } + _, err = stmt.Exec(value, key) + if checkError(err, "Fail to update field "+key+" of settings.Server") { + tx.Rollback() + return false + } + return true + } + Exist := func(key string) bool { + querySql := fmt.Sprintf("SELECT count(*) FROM %s WHERE %s=%s", table, keyName, p1) + row := s.db.QueryRow(querySql, key) + count := 0 + err := row.Scan(&count) + if checkError(err, "Fail to Query "+key+" for GetServer") { + return false + } + return count == 1 + } + InsertOrUpdate := func(key string, value string) bool { + if Exist(key) { + return Update(key, value) + } else { + return Insert(key, value) + } + } + + for i, field := range fields { + if !InsertOrUpdate(field, values[i]) { break } } diff --git a/storage/sql/settings.go b/storage/sql/settings.go index 3e2a6e70..ece43f6c 100644 --- a/storage/sql/settings.go +++ b/storage/sql/settings.go @@ -174,7 +174,8 @@ func (s settingsBackend) Get() (*settings.Settings, error) { } } if len(settings1.Key) == 0 { - return nil, nil + fmt.Println("The tables may not exist. Please run 'filebrowser config init' first") + return &settings1, nil } return &settings1, nil }