Improve adapter error handling

This commit is contained in:
Yang Luo
2023-09-27 01:11:58 +08:00
parent 81a8b91e3f
commit 06e3b8481f
6 changed files with 64 additions and 58 deletions

View File

@ -176,9 +176,7 @@
], ],
"permissions": [ "permissions": [
{ {
"actions": [ "actions": [],
""
],
"displayName": "", "displayName": "",
"effect": "", "effect": "",
"isEnabled": true, "isEnabled": true,
@ -186,15 +184,9 @@
"name": "", "name": "",
"owner": "", "owner": "",
"resourceType": "", "resourceType": "",
"resources": [ "resources": [],
"" "roles": [],
], "users": []
"roles": [
""
],
"users": [
""
]
} }
], ],
"payments": [ "payments": [
@ -236,9 +228,7 @@
"name": "", "name": "",
"owner": "", "owner": "",
"price": 0, "price": 0,
"providers": [ "providers": [],
""
],
"quantity": 0, "quantity": 0,
"returnUrl": "", "returnUrl": "",
"sold": 0, "sold": 0,
@ -268,12 +258,8 @@
"isEnabled": true, "isEnabled": true,
"name": "", "name": "",
"owner": "", "owner": "",
"roles": [ "roles": [],
"" "users": []
],
"users": [
""
]
} }
], ],
"syncers": [ "syncers": [
@ -284,7 +270,7 @@
"databaseType": "", "databaseType": "",
"errorText": "", "errorText": "",
"host": "", "host": "",
"isEnabled": true, "isEnabled": false,
"name": "", "name": "",
"organization": "", "organization": "",
"owner": "", "owner": "",
@ -298,9 +284,7 @@
"isHashed": true, "isHashed": true,
"name": "", "name": "",
"type": "", "type": "",
"values": [ "values": []
""
]
} }
], ],
"tablePrimaryKey": "", "tablePrimaryKey": "",
@ -330,9 +314,7 @@
"webhooks": [ "webhooks": [
{ {
"contentType": "", "contentType": "",
"events": [ "events": [],
""
],
"headers": [ "headers": [
{ {
"name": "", "name": "",

View File

@ -86,7 +86,11 @@ func InitAdapter() {
} }
} }
ormer = NewAdapter(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName")) var err error
ormer, err = NewAdapter(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName"))
if err != nil {
panic(err)
}
tableNamePrefix := conf.GetConfigString("tableNamePrefix") tableNamePrefix := conf.GetConfigString("tableNamePrefix")
tbMapper := core.NewPrefixMapper(core.SnakeMapper{}, tableNamePrefix) tbMapper := core.NewPrefixMapper(core.SnakeMapper{}, tableNamePrefix)
@ -121,19 +125,22 @@ func finalizer(a *Ormer) {
} }
// NewAdapter is the constructor for Ormer. // NewAdapter is the constructor for Ormer.
func NewAdapter(driverName string, dataSourceName string, dbName string) *Ormer { func NewAdapter(driverName string, dataSourceName string, dbName string) (*Ormer, error) {
a := &Ormer{} a := &Ormer{}
a.driverName = driverName a.driverName = driverName
a.dataSourceName = dataSourceName a.dataSourceName = dataSourceName
a.dbName = dbName a.dbName = dbName
// Open the DB, create it if not existed. // Open the DB, create it if not existed.
a.open() err := a.open()
if err != nil {
return nil, err
}
// Call the destructor when the object is released. // Call the destructor when the object is released.
runtime.SetFinalizer(a, finalizer) runtime.SetFinalizer(a, finalizer)
return a return a, nil
} }
func refineDataSourceNameForPostgres(dataSourceName string) string { func refineDataSourceNameForPostgres(dataSourceName string) string {
@ -192,7 +199,7 @@ func (a *Ormer) CreateDatabase() error {
return err return err
} }
func (a *Ormer) open() { func (a *Ormer) open() error {
dataSourceName := a.dataSourceName + a.dbName dataSourceName := a.dataSourceName + a.dbName
if a.driverName != "mysql" { if a.driverName != "mysql" {
dataSourceName = a.dataSourceName dataSourceName = a.dataSourceName
@ -200,8 +207,9 @@ func (a *Ormer) open() {
engine, err := xorm.NewEngine(a.driverName, dataSourceName) engine, err := xorm.NewEngine(a.driverName, dataSourceName)
if err != nil { if err != nil {
panic(err) return err
} }
if a.driverName == "postgres" { if a.driverName == "postgres" {
schema := util.GetValueFromDataSourceName("search_path", dataSourceName) schema := util.GetValueFromDataSourceName("search_path", dataSourceName)
if schema != "" { if schema != "" {
@ -210,6 +218,7 @@ func (a *Ormer) open() {
} }
a.Engine = engine a.Engine = engine
return nil
} }
func (a *Ormer) close() { func (a *Ormer) close() {

View File

@ -252,6 +252,10 @@ func (syncer *Syncer) getKey() string {
} }
func RunSyncer(syncer *Syncer) error { func RunSyncer(syncer *Syncer) error {
syncer.initAdapter() err := syncer.initAdapter()
if err != nil {
return err
}
return syncer.syncUsers() return syncer.syncUsers()
} }

View File

@ -50,9 +50,12 @@ func addSyncerJob(syncer *Syncer) error {
return nil return nil
} }
syncer.initAdapter() err := syncer.initAdapter()
if err != nil {
return err
}
err := syncer.syncUsers() err = syncer.syncUsers()
if err != nil { if err != nil {
return err return err
} }

View File

@ -38,7 +38,11 @@ func getEnabledSyncerForOrganization(organization string) (*Syncer, error) {
for _, syncer := range syncers { for _, syncer := range syncers {
if syncer.Organization == organization && syncer.IsEnabled { if syncer.Organization == organization && syncer.IsEnabled {
syncer.initAdapter() err = syncer.initAdapter()
if err != nil {
return nil, err
}
return syncer, nil return syncer, nil
} }
} }

View File

@ -162,27 +162,31 @@ func (syncer *Syncer) calculateHash(user *OriginalUser) string {
return util.GetMd5Hash(s) return util.GetMd5Hash(s)
} }
func (syncer *Syncer) initAdapter() { func (syncer *Syncer) initAdapter() error {
if syncer.Ormer == nil { if syncer.Ormer != nil {
var dataSourceName string return nil
if syncer.DatabaseType == "mssql" {
dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, syncer.Database)
} else if syncer.DatabaseType == "postgres" {
sslMode := "disable"
if syncer.SslMode != "" {
sslMode = syncer.SslMode
}
dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=%s dbname=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, sslMode, syncer.Database)
} else {
dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/", syncer.User, syncer.Password, syncer.Host, syncer.Port)
}
if !isCloudIntranet {
dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.")
}
syncer.Ormer = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database)
} }
var dataSourceName string
if syncer.DatabaseType == "mssql" {
dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, syncer.Database)
} else if syncer.DatabaseType == "postgres" {
sslMode := "disable"
if syncer.SslMode != "" {
sslMode = syncer.SslMode
}
dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=%s dbname=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, sslMode, syncer.Database)
} else {
dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/", syncer.User, syncer.Password, syncer.Host, syncer.Port)
}
if !isCloudIntranet {
dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.")
}
var err error
syncer.Ormer, err = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database)
return err
} }
func RunSyncUsersJob() { func RunSyncUsersJob() {