diff --git a/object/adapter.go b/object/adapter.go index 1fb3e691..e5090724 100644 --- a/object/adapter.go +++ b/object/adapter.go @@ -30,16 +30,15 @@ type Adapter struct { Name string `xorm:"varchar(100) notnull pk" json:"name"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"` - UseSameDb bool `json:"useSameDb"` - Type string `xorm:"varchar(100)" json:"type"` - DatabaseType string `xorm:"varchar(100)" json:"databaseType"` - Host string `xorm:"varchar(100)" json:"host"` - Port int `json:"port"` - User string `xorm:"varchar(100)" json:"user"` - Password string `xorm:"varchar(100)" json:"password"` - Database string `xorm:"varchar(100)" json:"database"` - Table string `xorm:"varchar(100)" json:"table"` - TableNamePrefix string `xorm:"varchar(100)" json:"tableNamePrefix"` + Table string `xorm:"varchar(100)" json:"table"` + UseSameDb bool `json:"useSameDb"` + Type string `xorm:"varchar(100)" json:"type"` + DatabaseType string `xorm:"varchar(100)" json:"databaseType"` + Host string `xorm:"varchar(100)" json:"host"` + Port int `json:"port"` + User string `xorm:"varchar(100)" json:"user"` + Password string `xorm:"varchar(100)" json:"password"` + Database string `xorm:"varchar(100)" json:"database"` *xormadapter.Adapter `xorm:"-" json:"-"` } @@ -140,63 +139,69 @@ func (adapter *Adapter) GetId() string { return fmt.Sprintf("%s/%s", adapter.Owner, adapter.Name) } -func (adapter *Adapter) getTable() string { - if adapter.DatabaseType == "mssql" { - return fmt.Sprintf("[%s]", adapter.Table) - } else { - return adapter.Table - } -} - func (adapter *Adapter) InitAdapter() error { - if adapter.Adapter == nil { - var dataSourceName string + if adapter.Adapter != nil { + return nil + } - if adapter.UseSameDb || adapter.isBuiltIn() { - dataSourceName = conf.GetConfigString("dataSourceName") - if adapter.DatabaseType == "mysql" { - dataSourceName = dataSourceName + adapter.Database - } - } else { - switch adapter.DatabaseType { - case "mssql": - dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", adapter.User, - adapter.Password, adapter.Host, adapter.Port, adapter.Database) - case "mysql": - dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", adapter.User, - adapter.Password, adapter.Host, adapter.Port, adapter.Database) - case "postgres": - dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=disable dbname=%s", adapter.User, - adapter.Password, adapter.Host, adapter.Port, adapter.Database) - case "CockroachDB": - dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=disable dbname=%s serial_normalization=virtual_sequence", - adapter.User, adapter.Password, adapter.Host, adapter.Port, adapter.Database) - case "sqlite3": - dataSourceName = fmt.Sprintf("file:%s", adapter.Host) - default: - return fmt.Errorf("unsupported database type: %s", adapter.DatabaseType) - } + var driverName string + var dataSourceName string + if adapter.UseSameDb || adapter.isBuiltIn() { + driverName = conf.GetConfigString("driverName") + dataSourceName = conf.GetConfigString("dataSourceName") + if conf.GetConfigString("driverName") == "mysql" { + dataSourceName = dataSourceName + conf.GetConfigString("dbName") } - - if !isCloudIntranet { - dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") - } - - var err error - engine, err := xorm.NewEngine(adapter.DatabaseType, dataSourceName) - - if (adapter.UseSameDb || adapter.isBuiltIn()) && adapter.DatabaseType == "postgres" { - schema := util.GetValueFromDataSourceName("search_path", dataSourceName) - if schema != "" { - engine.SetSchema(schema) - } - } - - adapter.Adapter, err = xormadapter.NewAdapterByEngineWithTableName(engine, adapter.getTable(), adapter.TableNamePrefix) - if err != nil { - return err + } else { + driverName = adapter.DatabaseType + switch driverName { + case "mssql": + dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", adapter.User, + adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "mysql": + dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", adapter.User, + adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "postgres": + dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=disable dbname=%s", adapter.User, + adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "CockroachDB": + dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=disable dbname=%s serial_normalization=virtual_sequence", + adapter.User, adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "sqlite3": + dataSourceName = fmt.Sprintf("file:%s", adapter.Host) + default: + return fmt.Errorf("unsupported database type: %s", adapter.DatabaseType) } } + + if !isCloudIntranet { + dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") + } + + engine, err := xorm.NewEngine(driverName, dataSourceName) + if err != nil { + return err + } + + if (adapter.UseSameDb || adapter.isBuiltIn()) && driverName == "postgres" { + schema := util.GetValueFromDataSourceName("search_path", dataSourceName) + if schema != "" { + engine.SetSchema(schema) + } + } + + var tableName string + if driverName == "mssql" { + tableName = fmt.Sprintf("[%s]", adapter.Table) + } else { + tableName = adapter.Table + } + + adapter.Adapter, err = xormadapter.NewAdapterByEngineWithTableName(engine, tableName, "") + if err != nil { + return err + } + return nil } diff --git a/object/init.go b/object/init.go index 00acd7e8..028beafc 100644 --- a/object/init.go +++ b/object/init.go @@ -426,8 +426,8 @@ func initBuiltInUserAdapter() { Owner: "built-in", Name: "user-adapter-built-in", CreatedTime: util.GetCurrentTime(), - UseSameDb: true, Table: "casbin_user_rule", + UseSameDb: true, } _, err = AddAdapter(adapter) if err != nil { @@ -449,8 +449,8 @@ func initBuiltInApiAdapter() { Owner: "built-in", Name: "api-adapter-built-in", CreatedTime: util.GetCurrentTime(), - UseSameDb: true, Table: "casbin_api_rule", + UseSameDb: true, } _, err = AddAdapter(adapter) if err != nil { diff --git a/web/src/AdapterEditPage.js b/web/src/AdapterEditPage.js index 47e688b8..29b3680d 100644 --- a/web/src/AdapterEditPage.js +++ b/web/src/AdapterEditPage.js @@ -115,6 +115,17 @@ class AdapterEditPage extends React.Component { }} /> + + + {Setting.getLabel(i18next.t("syncer:Table"), i18next.t("syncer:Table - Tooltip"))} : + + + { + this.updateAdapterField("table", e.target.value); + }} /> + + {Setting.getLabel(i18next.t("adapter:Use same DB"), i18next.t("adapter:Use same DB - Tooltip"))} : @@ -122,6 +133,23 @@ class AdapterEditPage extends React.Component { { this.updateAdapterField("useSameDb", checked); + if (checked) { + this.updateAdapterField("type", ""); + this.updateAdapterField("databaseType", ""); + this.updateAdapterField("host", ""); + this.updateAdapterField("port", 0); + this.updateAdapterField("user", ""); + this.updateAdapterField("password", ""); + this.updateAdapterField("database", ""); + } else { + this.updateAdapterField("type", "Database"); + this.updateAdapterField("databaseType", "mysql"); + this.updateAdapterField("host", "localhost"); + this.updateAdapterField("port", 3306); + this.updateAdapterField("user", "root"); + this.updateAdapterField("password", "123456"); + this.updateAdapterField("database", "dbName"); + } }} /> @@ -219,17 +247,6 @@ class AdapterEditPage extends React.Component { ) } - - - {Setting.getLabel(i18next.t("syncer:Table"), i18next.t("syncer:Table - Tooltip"))} : - - - { - this.updateAdapterField("table", e.target.value); - }} /> - - {Setting.getLabel(i18next.t("provider:DB test"), i18next.t("provider:DB test - Tooltip"))} : diff --git a/web/src/AdapterListPage.js b/web/src/AdapterListPage.js index c8a74c48..f5601517 100644 --- a/web/src/AdapterListPage.js +++ b/web/src/AdapterListPage.js @@ -14,7 +14,7 @@ import React from "react"; import {Link} from "react-router-dom"; -import {Button, Table} from "antd"; +import {Button, Switch, Table} from "antd"; import moment from "moment"; import * as Setting from "./Setting"; import * as AdapterBackend from "./backend/AdapterBackend"; @@ -30,14 +30,8 @@ class AdapterListPage extends BaseListPage { owner: owner, name: `adapter_${randomName}`, createdTime: moment().format(), - type: "Database", - host: "localhost", - port: 3306, - user: "root", - password: "123456", - databaseType: "mysql", - database: "dbName", table: "tableName", + useSameDb: true, }; } @@ -118,6 +112,25 @@ class AdapterListPage extends BaseListPage { return Setting.getFormattedDate(text); }, }, + { + title: i18next.t("syncer:Table"), + dataIndex: "table", + key: "table", + width: "120px", + sorter: true, + }, + { + title: i18next.t("adapter:Use same DB"), + dataIndex: "useSameDb", + key: "useSameDb", + width: "120px", + sorter: true, + render: (text, record, index) => { + return ( + + ); + }, + }, { title: i18next.t("provider:Type"), dataIndex: "type", @@ -181,13 +194,6 @@ class AdapterListPage extends BaseListPage { width: "120px", sorter: true, }, - { - title: i18next.t("syncer:Table"), - dataIndex: "table", - key: "table", - width: "120px", - sorter: true, - }, { title: i18next.t("general:Action"), dataIndex: "",