diff --git a/object/syncer.go b/object/syncer.go index b827ce79..dcaa021d 100644 --- a/object/syncer.go +++ b/object/syncer.go @@ -48,6 +48,7 @@ type Syncer struct { TableColumns []*TableColumn `xorm:"mediumtext" json:"tableColumns"` AffiliationTable string `xorm:"varchar(100)" json:"affiliationTable"` AvatarBaseUrl string `xorm:"varchar(100)" json:"avatarBaseUrl"` + ErrorText string `xorm:"mediumtext" json:"errorText"` SyncInterval int `json:"syncInterval"` IsEnabled bool `json:"isEnabled"` @@ -147,6 +148,22 @@ func UpdateSyncer(id string, syncer *Syncer) bool { return affected != 0 } +func updateSyncerErrorText(syncer *Syncer, line string) bool { + s := getSyncer(syncer.Owner, syncer.Name) + if s == nil { + return false + } + + s.ErrorText = s.ErrorText + line + + affected, err := adapter.Engine.ID(core.PK{s.Owner, s.Name}).Cols("error_text").Update(s) + if err != nil { + panic(err) + } + + return affected != 0 +} + func AddSyncer(syncer *Syncer) bool { affected, err := adapter.Engine.Insert(syncer) if err != nil { diff --git a/object/syncer_sync.go b/object/syncer_sync.go index 569ef56e..733831bf 100644 --- a/object/syncer_sync.go +++ b/object/syncer_sync.go @@ -14,13 +14,25 @@ package object -import "fmt" +import ( + "fmt" + "time" +) func (syncer *Syncer) syncUsers() { fmt.Printf("Running syncUsers()..\n") users, userMap := syncer.getUserMap() - oUsers, oUserMap := syncer.getOriginalUserMap() + oUsers, oUserMap, err := syncer.getOriginalUserMap() + if err != nil { + fmt.Printf(err.Error()) + + timestamp := time.Now().Format("2006-01-02 15:04:05") + line := fmt.Sprintf("[%s] %s\n", timestamp, err.Error()) + updateSyncerErrorText(syncer, line) + return + } + fmt.Printf("Users: %d, oUsers: %d\n", len(users), len(oUsers)) var affiliationMap map[int]string diff --git a/object/syncer_user.go b/object/syncer_user.go index c3cf36ca..d415821e 100644 --- a/object/syncer_user.go +++ b/object/syncer_user.go @@ -25,42 +25,45 @@ import ( type OriginalUser = User -func (syncer *Syncer) getOriginalUsers() []*OriginalUser { +func (syncer *Syncer) getOriginalUsers() ([]*OriginalUser, error) { sql := fmt.Sprintf("select * from %s", syncer.getTable()) results, err := syncer.Adapter.Engine.QueryString(sql) if err != nil { - panic(err) + return nil, err } - return syncer.getOriginalUsersFromMap(results) + return syncer.getOriginalUsersFromMap(results), nil } -func (syncer *Syncer) getOriginalUserMap() ([]*OriginalUser, map[string]*OriginalUser) { - users := syncer.getOriginalUsers() +func (syncer *Syncer) getOriginalUserMap() ([]*OriginalUser, map[string]*OriginalUser, error) { + users, err := syncer.getOriginalUsers() + if err != nil { + return users, nil, err + } m := map[string]*OriginalUser{} for _, user := range users { m[user.Id] = user } - return users, m + return users, m, nil } -func (syncer *Syncer) addUser(user *OriginalUser) bool { +func (syncer *Syncer) addUser(user *OriginalUser) (bool, error) { m := syncer.getMapFromOriginalUser(user) keyString, valueString := syncer.getSqlKeyValueStringFromMap(m) sql := fmt.Sprintf("insert into %s (%s) values (%s)", syncer.getTable(), keyString, valueString) res, err := syncer.Adapter.Engine.Exec(sql) if err != nil { - panic(err) + return false, err } affected, err := res.RowsAffected() if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } /*func (syncer *Syncer) getOriginalColumns() []string { @@ -84,7 +87,7 @@ func (syncer *Syncer) getCasdoorColumns() []string { return res } -func (syncer *Syncer) updateUser(user *OriginalUser) bool { +func (syncer *Syncer) updateUser(user *OriginalUser) (bool, error) { m := syncer.getMapFromOriginalUser(user) pkValue := m[syncer.TablePrimaryKey] delete(m, syncer.TablePrimaryKey) @@ -93,22 +96,22 @@ func (syncer *Syncer) updateUser(user *OriginalUser) bool { sql := fmt.Sprintf("update %s set %s where %s = %s", syncer.getTable(), setString, syncer.TablePrimaryKey, pkValue) res, err := syncer.Adapter.Engine.Exec(sql) if err != nil { - panic(err) + return false, err } affected, err := res.RowsAffected() if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func (syncer *Syncer) updateUserForOriginalFields(user *User) bool { +func (syncer *Syncer) updateUserForOriginalFields(user *User) (bool, error) { owner, name := util.GetOwnerAndNameFromId(user.GetId()) oldUser := getUserById(owner, name) if oldUser == nil { - return false + return false, nil } if user.Avatar != oldUser.Avatar && user.Avatar != "" { @@ -119,10 +122,10 @@ func (syncer *Syncer) updateUserForOriginalFields(user *User) bool { columns = append(columns, "affiliation", "hash", "pre_hash") affected, err := adapter.Engine.ID(core.PK{oldUser.Owner, oldUser.Name}).Cols(columns...).Update(user) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } func (syncer *Syncer) calculateHash(user *OriginalUser) string { diff --git a/web/src/SyncerEditPage.js b/web/src/SyncerEditPage.js index 5d534ff5..c046de36 100644 --- a/web/src/SyncerEditPage.js +++ b/web/src/SyncerEditPage.js @@ -21,6 +21,11 @@ import * as Setting from "./Setting"; import i18next from "i18next"; import SyncerTableColumnTable from "./SyncerTableColumnTable"; +import {Controlled as CodeMirror} from 'react-codemirror2'; +import "codemirror/lib/codemirror.css"; +require('codemirror/theme/material-darker.css'); +require("codemirror/mode/javascript/javascript"); + const { Option } = Select; class SyncerEditPage extends React.Component { @@ -248,6 +253,22 @@ class SyncerEditPage extends React.Component { }} /> + + + {Setting.getLabel(i18next.t("syncer:Error text"), i18next.t("syncer:Error text - Tooltip"))} : + + +
+ { + this.updateSyncerField("errorText", value); + }} + /> +
+ +
{Setting.getLabel(i18next.t("general:Is enabled"), i18next.t("general:Is enabled - Tooltip"))} : diff --git a/web/src/locales/de/data.json b/web/src/locales/de/data.json index ea06af90..f145f747 100644 --- a/web/src/locales/de/data.json +++ b/web/src/locales/de/data.json @@ -386,6 +386,8 @@ "Database type": "Datenbanktyp", "Database type - Tooltip": "Datenbanktyp - Tooltip", "Edit Syncer": "Syncer bearbeiten", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", "Is hashed": "Ist gehasht", "Sync interval": "Sync-Intervall", "Sync interval - Tooltip": "Sync-Intervall - Tooltip", diff --git a/web/src/locales/en/data.json b/web/src/locales/en/data.json index b63d2b9d..f202a3dd 100644 --- a/web/src/locales/en/data.json +++ b/web/src/locales/en/data.json @@ -386,6 +386,8 @@ "Database type": "Database type", "Database type - Tooltip": "Database type - Tooltip", "Edit Syncer": "Edit Syncer", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", "Is hashed": "Is hashed", "Sync interval": "Sync interval", "Sync interval - Tooltip": "Sync interval - Tooltip", diff --git a/web/src/locales/fr/data.json b/web/src/locales/fr/data.json index 902d33bd..078b4f5a 100644 --- a/web/src/locales/fr/data.json +++ b/web/src/locales/fr/data.json @@ -386,6 +386,8 @@ "Database type": "Type de base de données", "Database type - Tooltip": "Type de base de données - infobulle", "Edit Syncer": "Editer le synchro", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", "Is hashed": "Est haché", "Sync interval": "Intervalle de synchronisation", "Sync interval - Tooltip": "Intervalle de synchronisation - infobulle", diff --git a/web/src/locales/ja/data.json b/web/src/locales/ja/data.json index fc3bde85..037b724a 100644 --- a/web/src/locales/ja/data.json +++ b/web/src/locales/ja/data.json @@ -386,6 +386,8 @@ "Database type": "データベースの種類", "Database type - Tooltip": "データベース タイプ - ツールチップ", "Edit Syncer": "同期ツールを編集", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", "Is hashed": "ハッシュされました", "Sync interval": "同期間隔", "Sync interval - Tooltip": "同期間隔 - ツールチップ", diff --git a/web/src/locales/ko/data.json b/web/src/locales/ko/data.json index 4b98484e..d835084b 100644 --- a/web/src/locales/ko/data.json +++ b/web/src/locales/ko/data.json @@ -386,6 +386,8 @@ "Database type": "Database type", "Database type - Tooltip": "Database type - Tooltip", "Edit Syncer": "Edit Syncer", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", "Is hashed": "Is hashed", "Sync interval": "Sync interval", "Sync interval - Tooltip": "Sync interval - Tooltip", diff --git a/web/src/locales/ru/data.json b/web/src/locales/ru/data.json index 9fe1ac71..1787e9ca 100644 --- a/web/src/locales/ru/data.json +++ b/web/src/locales/ru/data.json @@ -386,6 +386,8 @@ "Database type": "Тип базы данных", "Database type - Tooltip": "Тип базы данных - Подсказка", "Edit Syncer": "Изменить синхронизатор", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", "Is hashed": "Хэшировано", "Sync interval": "Интервал синхронизации", "Sync interval - Tooltip": "Интервал синхронизации - Tooltip", diff --git a/web/src/locales/zh/data.json b/web/src/locales/zh/data.json index 2d427b72..a20c0b41 100644 --- a/web/src/locales/zh/data.json +++ b/web/src/locales/zh/data.json @@ -386,6 +386,8 @@ "Database type": "数据库类型", "Database type - Tooltip": "数据库类型", "Edit Syncer": "编辑同步器", + "Error text": "错误信息", + "Error text - Tooltip": "同步器连接数据库时发生的错误", "Is hashed": "是否参与哈希计算", "Sync interval": "同步间隔", "Sync interval - Tooltip": "单位为秒",