Add ErrorText to syncer.

This commit is contained in:
Gucheng Wang 2022-01-17 21:16:32 +08:00
parent d9bcce9485
commit 9fd175eefd
11 changed files with 87 additions and 20 deletions

View File

@ -48,6 +48,7 @@ type Syncer struct {
TableColumns []*TableColumn `xorm:"mediumtext" json:"tableColumns"` TableColumns []*TableColumn `xorm:"mediumtext" json:"tableColumns"`
AffiliationTable string `xorm:"varchar(100)" json:"affiliationTable"` AffiliationTable string `xorm:"varchar(100)" json:"affiliationTable"`
AvatarBaseUrl string `xorm:"varchar(100)" json:"avatarBaseUrl"` AvatarBaseUrl string `xorm:"varchar(100)" json:"avatarBaseUrl"`
ErrorText string `xorm:"mediumtext" json:"errorText"`
SyncInterval int `json:"syncInterval"` SyncInterval int `json:"syncInterval"`
IsEnabled bool `json:"isEnabled"` IsEnabled bool `json:"isEnabled"`
@ -147,6 +148,22 @@ func UpdateSyncer(id string, syncer *Syncer) bool {
return affected != 0 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 { func AddSyncer(syncer *Syncer) bool {
affected, err := adapter.Engine.Insert(syncer) affected, err := adapter.Engine.Insert(syncer)
if err != nil { if err != nil {

View File

@ -14,13 +14,25 @@
package object package object
import "fmt" import (
"fmt"
"time"
)
func (syncer *Syncer) syncUsers() { func (syncer *Syncer) syncUsers() {
fmt.Printf("Running syncUsers()..\n") fmt.Printf("Running syncUsers()..\n")
users, userMap := syncer.getUserMap() 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)) fmt.Printf("Users: %d, oUsers: %d\n", len(users), len(oUsers))
var affiliationMap map[int]string var affiliationMap map[int]string

View File

@ -25,42 +25,45 @@ import (
type OriginalUser = User type OriginalUser = User
func (syncer *Syncer) getOriginalUsers() []*OriginalUser { func (syncer *Syncer) getOriginalUsers() ([]*OriginalUser, error) {
sql := fmt.Sprintf("select * from %s", syncer.getTable()) sql := fmt.Sprintf("select * from %s", syncer.getTable())
results, err := syncer.Adapter.Engine.QueryString(sql) results, err := syncer.Adapter.Engine.QueryString(sql)
if err != nil { 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) { func (syncer *Syncer) getOriginalUserMap() ([]*OriginalUser, map[string]*OriginalUser, error) {
users := syncer.getOriginalUsers() users, err := syncer.getOriginalUsers()
if err != nil {
return users, nil, err
}
m := map[string]*OriginalUser{} m := map[string]*OriginalUser{}
for _, user := range users { for _, user := range users {
m[user.Id] = user 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) m := syncer.getMapFromOriginalUser(user)
keyString, valueString := syncer.getSqlKeyValueStringFromMap(m) keyString, valueString := syncer.getSqlKeyValueStringFromMap(m)
sql := fmt.Sprintf("insert into %s (%s) values (%s)", syncer.getTable(), keyString, valueString) sql := fmt.Sprintf("insert into %s (%s) values (%s)", syncer.getTable(), keyString, valueString)
res, err := syncer.Adapter.Engine.Exec(sql) res, err := syncer.Adapter.Engine.Exec(sql)
if err != nil { if err != nil {
panic(err) return false, err
} }
affected, err := res.RowsAffected() affected, err := res.RowsAffected()
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }
/*func (syncer *Syncer) getOriginalColumns() []string { /*func (syncer *Syncer) getOriginalColumns() []string {
@ -84,7 +87,7 @@ func (syncer *Syncer) getCasdoorColumns() []string {
return res return res
} }
func (syncer *Syncer) updateUser(user *OriginalUser) bool { func (syncer *Syncer) updateUser(user *OriginalUser) (bool, error) {
m := syncer.getMapFromOriginalUser(user) m := syncer.getMapFromOriginalUser(user)
pkValue := m[syncer.TablePrimaryKey] pkValue := m[syncer.TablePrimaryKey]
delete(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) sql := fmt.Sprintf("update %s set %s where %s = %s", syncer.getTable(), setString, syncer.TablePrimaryKey, pkValue)
res, err := syncer.Adapter.Engine.Exec(sql) res, err := syncer.Adapter.Engine.Exec(sql)
if err != nil { if err != nil {
panic(err) return false, err
} }
affected, err := res.RowsAffected() affected, err := res.RowsAffected()
if err != nil { 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()) owner, name := util.GetOwnerAndNameFromId(user.GetId())
oldUser := getUserById(owner, name) oldUser := getUserById(owner, name)
if oldUser == nil { if oldUser == nil {
return false return false, nil
} }
if user.Avatar != oldUser.Avatar && user.Avatar != "" { 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") columns = append(columns, "affiliation", "hash", "pre_hash")
affected, err := adapter.Engine.ID(core.PK{oldUser.Owner, oldUser.Name}).Cols(columns...).Update(user) affected, err := adapter.Engine.ID(core.PK{oldUser.Owner, oldUser.Name}).Cols(columns...).Update(user)
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }
func (syncer *Syncer) calculateHash(user *OriginalUser) string { func (syncer *Syncer) calculateHash(user *OriginalUser) string {

View File

@ -21,6 +21,11 @@ import * as Setting from "./Setting";
import i18next from "i18next"; import i18next from "i18next";
import SyncerTableColumnTable from "./SyncerTableColumnTable"; 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; const { Option } = Select;
class SyncerEditPage extends React.Component { class SyncerEditPage extends React.Component {
@ -248,6 +253,22 @@ class SyncerEditPage extends React.Component {
}} /> }} />
</Col> </Col>
</Row> </Row>
<Row style={{marginTop: '20px'}} >
<Col style={{marginTop: '5px'}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("syncer:Error text"), i18next.t("syncer:Error text - Tooltip"))} :
</Col>
<Col span={22} >
<div style={{width: "100%", height: "300px"}} >
<CodeMirror
value={this.state.syncer.errorText}
options={{mode: 'javascript', theme: "material-darker"}}
onBeforeChange={(editor, data, value) => {
this.updateSyncerField("errorText", value);
}}
/>
</div>
</Col>
</Row>
<Row style={{marginTop: '20px'}} > <Row style={{marginTop: '20px'}} >
<Col style={{marginTop: '5px'}} span={(Setting.isMobile()) ? 19 : 2}> <Col style={{marginTop: '5px'}} span={(Setting.isMobile()) ? 19 : 2}>
{Setting.getLabel(i18next.t("general:Is enabled"), i18next.t("general:Is enabled - Tooltip"))} : {Setting.getLabel(i18next.t("general:Is enabled"), i18next.t("general:Is enabled - Tooltip"))} :

View File

@ -386,6 +386,8 @@
"Database type": "Datenbanktyp", "Database type": "Datenbanktyp",
"Database type - Tooltip": "Datenbanktyp - Tooltip", "Database type - Tooltip": "Datenbanktyp - Tooltip",
"Edit Syncer": "Syncer bearbeiten", "Edit Syncer": "Syncer bearbeiten",
"Error text": "Error text",
"Error text - Tooltip": "Error text - Tooltip",
"Is hashed": "Ist gehasht", "Is hashed": "Ist gehasht",
"Sync interval": "Sync-Intervall", "Sync interval": "Sync-Intervall",
"Sync interval - Tooltip": "Sync-Intervall - Tooltip", "Sync interval - Tooltip": "Sync-Intervall - Tooltip",

View File

@ -386,6 +386,8 @@
"Database type": "Database type", "Database type": "Database type",
"Database type - Tooltip": "Database type - Tooltip", "Database type - Tooltip": "Database type - Tooltip",
"Edit Syncer": "Edit Syncer", "Edit Syncer": "Edit Syncer",
"Error text": "Error text",
"Error text - Tooltip": "Error text - Tooltip",
"Is hashed": "Is hashed", "Is hashed": "Is hashed",
"Sync interval": "Sync interval", "Sync interval": "Sync interval",
"Sync interval - Tooltip": "Sync interval - Tooltip", "Sync interval - Tooltip": "Sync interval - Tooltip",

View File

@ -386,6 +386,8 @@
"Database type": "Type de base de données", "Database type": "Type de base de données",
"Database type - Tooltip": "Type de base de données - infobulle", "Database type - Tooltip": "Type de base de données - infobulle",
"Edit Syncer": "Editer le synchro", "Edit Syncer": "Editer le synchro",
"Error text": "Error text",
"Error text - Tooltip": "Error text - Tooltip",
"Is hashed": "Est haché", "Is hashed": "Est haché",
"Sync interval": "Intervalle de synchronisation", "Sync interval": "Intervalle de synchronisation",
"Sync interval - Tooltip": "Intervalle de synchronisation - infobulle", "Sync interval - Tooltip": "Intervalle de synchronisation - infobulle",

View File

@ -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": "同期間隔 - ツールチップ",

View File

@ -386,6 +386,8 @@
"Database type": "Database type", "Database type": "Database type",
"Database type - Tooltip": "Database type - Tooltip", "Database type - Tooltip": "Database type - Tooltip",
"Edit Syncer": "Edit Syncer", "Edit Syncer": "Edit Syncer",
"Error text": "Error text",
"Error text - Tooltip": "Error text - Tooltip",
"Is hashed": "Is hashed", "Is hashed": "Is hashed",
"Sync interval": "Sync interval", "Sync interval": "Sync interval",
"Sync interval - Tooltip": "Sync interval - Tooltip", "Sync interval - Tooltip": "Sync interval - Tooltip",

View File

@ -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": "Интервал синхронизации - Tooltip", "Sync interval - Tooltip": "Интервал синхронизации - Tooltip",

View File

@ -386,6 +386,8 @@
"Database type": "数据库类型", "Database type": "数据库类型",
"Database type - Tooltip": "数据库类型", "Database type - Tooltip": "数据库类型",
"Edit Syncer": "编辑同步器", "Edit Syncer": "编辑同步器",
"Error text": "错误信息",
"Error text - Tooltip": "同步器连接数据库时发生的错误",
"Is hashed": "是否参与哈希计算", "Is hashed": "是否参与哈希计算",
"Sync interval": "同步间隔", "Sync interval": "同步间隔",
"Sync interval - Tooltip": "单位为秒", "Sync interval - Tooltip": "单位为秒",