normalize common database errors

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
Nicola Murino
2024-01-17 17:36:35 +01:00
parent 5ac99ee556
commit 87451560e3
13 changed files with 200 additions and 68 deletions

View File

@@ -26,8 +26,7 @@ import (
"path/filepath"
"time"
// we import go-sqlite3 here to be able to disable SQLite support using a build tag
_ "github.com/mattn/go-sqlite3"
"github.com/mattn/go-sqlite3"
"github.com/drakkan/sftpgo/v2/internal/logger"
"github.com/drakkan/sftpgo/v2/internal/util"
@@ -264,7 +263,7 @@ func (p *SQLiteProvider) userExists(username, role string) (User, error) {
}
func (p *SQLiteProvider) addUser(user *User) error {
return sqlCommonAddUser(user, p.dbHandle)
return p.normalizeError(sqlCommonAddUser(user, p.dbHandle), fieldUsername)
}
func (p *SQLiteProvider) updateUser(user *User) error {
@@ -310,7 +309,7 @@ func (p *SQLiteProvider) getFolderByName(name string) (vfs.BaseVirtualFolder, er
}
func (p *SQLiteProvider) addFolder(folder *vfs.BaseVirtualFolder) error {
return sqlCommonAddFolder(folder, p.dbHandle)
return p.normalizeError(sqlCommonAddFolder(folder, p.dbHandle), fieldName)
}
func (p *SQLiteProvider) updateFolder(folder *vfs.BaseVirtualFolder) error {
@@ -346,7 +345,7 @@ func (p *SQLiteProvider) groupExists(name string) (Group, error) {
}
func (p *SQLiteProvider) addGroup(group *Group) error {
return sqlCommonAddGroup(group, p.dbHandle)
return p.normalizeError(sqlCommonAddGroup(group, p.dbHandle), fieldName)
}
func (p *SQLiteProvider) updateGroup(group *Group) error {
@@ -366,7 +365,7 @@ func (p *SQLiteProvider) adminExists(username string) (Admin, error) {
}
func (p *SQLiteProvider) addAdmin(admin *Admin) error {
return sqlCommonAddAdmin(admin, p.dbHandle)
return p.normalizeError(sqlCommonAddAdmin(admin, p.dbHandle), fieldUsername)
}
func (p *SQLiteProvider) updateAdmin(admin *Admin) error {
@@ -526,7 +525,7 @@ func (p *SQLiteProvider) eventActionExists(name string) (BaseEventAction, error)
}
func (p *SQLiteProvider) addEventAction(action *BaseEventAction) error {
return sqlCommonAddEventAction(action, p.dbHandle)
return p.normalizeError(sqlCommonAddEventAction(action, p.dbHandle), fieldName)
}
func (p *SQLiteProvider) updateEventAction(action *BaseEventAction) error {
@@ -554,7 +553,7 @@ func (p *SQLiteProvider) eventRuleExists(name string) (EventRule, error) {
}
func (p *SQLiteProvider) addEventRule(rule *EventRule) error {
return sqlCommonAddEventRule(rule, p.dbHandle)
return p.normalizeError(sqlCommonAddEventRule(rule, p.dbHandle), fieldName)
}
func (p *SQLiteProvider) updateEventRule(rule *EventRule) error {
@@ -606,7 +605,7 @@ func (p *SQLiteProvider) roleExists(name string) (Role, error) {
}
func (p *SQLiteProvider) addRole(role *Role) error {
return sqlCommonAddRole(role, p.dbHandle)
return p.normalizeError(sqlCommonAddRole(role, p.dbHandle), fieldName)
}
func (p *SQLiteProvider) updateRole(role *Role) error {
@@ -747,6 +746,28 @@ func (p *SQLiteProvider) resetDatabase() error {
return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, []string{sql}, 0, false)
}
func (p *SQLiteProvider) normalizeError(err error, fieldType int) error {
if err == nil {
return nil
}
if e, ok := err.(sqlite3.Error); ok {
switch e.ExtendedCode {
case 1555, 2067:
message := util.I18nErrorDuplicatedName
if fieldType == fieldUsername {
message = util.I18nErrorDuplicatedUsername
}
return util.NewI18nError(
fmt.Errorf("%w: %s", ErrDuplicatedKey, err.Error()),
message,
)
case 787:
return fmt.Errorf("%w: %s", ErrForeignKeyViolated, err.Error())
}
}
return err
}
/*func setPragmaFK(dbHandle *sql.DB, value string) error {
ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
defer cancel()