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

@ -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() {

View File

@ -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()
}

View File

@ -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
}

View File

@ -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
}
}

View File

@ -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() {