From 06e3b8481ff9ab2179471686e883466dc4701010 Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Wed, 27 Sep 2023 01:11:58 +0800 Subject: [PATCH] Improve adapter error handling --- init_data.json.template | 38 +++++++++----------------------- object/ormer.go | 21 +++++++++++++----- object/syncer.go | 6 ++++- object/syncer_cron.go | 7 ++++-- object/syncer_public_api.go | 6 ++++- object/syncer_user.go | 44 ++++++++++++++++++++----------------- 6 files changed, 64 insertions(+), 58 deletions(-) diff --git a/init_data.json.template b/init_data.json.template index 7a4e8024..1d91266c 100644 --- a/init_data.json.template +++ b/init_data.json.template @@ -176,9 +176,7 @@ ], "permissions": [ { - "actions": [ - "" - ], + "actions": [], "displayName": "", "effect": "", "isEnabled": true, @@ -186,15 +184,9 @@ "name": "", "owner": "", "resourceType": "", - "resources": [ - "" - ], - "roles": [ - "" - ], - "users": [ - "" - ] + "resources": [], + "roles": [], + "users": [] } ], "payments": [ @@ -236,9 +228,7 @@ "name": "", "owner": "", "price": 0, - "providers": [ - "" - ], + "providers": [], "quantity": 0, "returnUrl": "", "sold": 0, @@ -268,12 +258,8 @@ "isEnabled": true, "name": "", "owner": "", - "roles": [ - "" - ], - "users": [ - "" - ] + "roles": [], + "users": [] } ], "syncers": [ @@ -284,7 +270,7 @@ "databaseType": "", "errorText": "", "host": "", - "isEnabled": true, + "isEnabled": false, "name": "", "organization": "", "owner": "", @@ -298,9 +284,7 @@ "isHashed": true, "name": "", "type": "", - "values": [ - "" - ] + "values": [] } ], "tablePrimaryKey": "", @@ -330,9 +314,7 @@ "webhooks": [ { "contentType": "", - "events": [ - "" - ], + "events": [], "headers": [ { "name": "", diff --git a/object/ormer.go b/object/ormer.go index 15e75aa8..604db4ca 100644 --- a/object/ormer.go +++ b/object/ormer.go @@ -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") tbMapper := core.NewPrefixMapper(core.SnakeMapper{}, tableNamePrefix) @@ -121,19 +125,22 @@ func finalizer(a *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.driverName = driverName a.dataSourceName = dataSourceName a.dbName = dbName // 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. runtime.SetFinalizer(a, finalizer) - return a + return a, nil } func refineDataSourceNameForPostgres(dataSourceName string) string { @@ -192,7 +199,7 @@ func (a *Ormer) CreateDatabase() error { return err } -func (a *Ormer) open() { +func (a *Ormer) open() error { dataSourceName := a.dataSourceName + a.dbName if a.driverName != "mysql" { dataSourceName = a.dataSourceName @@ -200,8 +207,9 @@ func (a *Ormer) open() { engine, err := xorm.NewEngine(a.driverName, dataSourceName) if err != nil { - panic(err) + return err } + if a.driverName == "postgres" { schema := util.GetValueFromDataSourceName("search_path", dataSourceName) if schema != "" { @@ -210,6 +218,7 @@ func (a *Ormer) open() { } a.Engine = engine + return nil } func (a *Ormer) close() { diff --git a/object/syncer.go b/object/syncer.go index 3d9776d9..e567ee48 100644 --- a/object/syncer.go +++ b/object/syncer.go @@ -252,6 +252,10 @@ func (syncer *Syncer) getKey() string { } func RunSyncer(syncer *Syncer) error { - syncer.initAdapter() + err := syncer.initAdapter() + if err != nil { + return err + } + return syncer.syncUsers() } diff --git a/object/syncer_cron.go b/object/syncer_cron.go index e2493017..4dff163e 100644 --- a/object/syncer_cron.go +++ b/object/syncer_cron.go @@ -50,9 +50,12 @@ func addSyncerJob(syncer *Syncer) error { return nil } - syncer.initAdapter() + err := syncer.initAdapter() + if err != nil { + return err + } - err := syncer.syncUsers() + err = syncer.syncUsers() if err != nil { return err } diff --git a/object/syncer_public_api.go b/object/syncer_public_api.go index 42a2fa35..d5290447 100644 --- a/object/syncer_public_api.go +++ b/object/syncer_public_api.go @@ -38,7 +38,11 @@ func getEnabledSyncerForOrganization(organization string) (*Syncer, error) { for _, syncer := range syncers { if syncer.Organization == organization && syncer.IsEnabled { - syncer.initAdapter() + err = syncer.initAdapter() + if err != nil { + return nil, err + } + return syncer, nil } } diff --git a/object/syncer_user.go b/object/syncer_user.go index 706316c0..acb9740b 100644 --- a/object/syncer_user.go +++ b/object/syncer_user.go @@ -162,27 +162,31 @@ func (syncer *Syncer) calculateHash(user *OriginalUser) string { return util.GetMd5Hash(s) } -func (syncer *Syncer) initAdapter() { - if syncer.Ormer == nil { - 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.") - } - - syncer.Ormer = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database) +func (syncer *Syncer) initAdapter() error { + if syncer.Ormer != nil { + return nil } + + 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() {