diff --git a/private/i18n.ts b/private/i18n.ts index d105961..a36b80e 100644 --- a/private/i18n.ts +++ b/private/i18n.ts @@ -303,4 +303,7 @@ export default { 'Dec-Dcm_Connection_Analytic_DB': '阿里云AnalyticDB', 'Dec-Dcm_Connection_Value_Out_Range': '数值超出范围', 'Dec-Dcm_Socket_Unable_Connect_Tip': '可能出现编辑冲突', + 'Dec-Connection_Lic_Limit_Approach_Tip': '当前数据连接数量超过注册lic限制({}个),所有数据连接都不可用,请删除多余的数据连接', + 'Dec-Connection_Lic_Limit_Approach_Prevent_Tip': '当前数据连接数量已经达到注册lic限制({}个),无法新增', + 'Dec-Dcm_Connection_Check_Fetch_Size_Range': '请输入0-1000000之间的值', }; diff --git a/src/modules/app.model.ts b/src/modules/app.model.ts index 8dd78a8..79b06f6 100644 --- a/src/modules/app.model.ts +++ b/src/modules/app.model.ts @@ -31,7 +31,7 @@ export class AppModel extends Model { setPageIndex: (index: string) => { this.model.pageIndex = index; }, - setFilter:(filter: string) => { + setFilter: (filter: string) => { this.model.filter = filter; }, setDatebaseTypeSelected: (datebaseTypeSelected: string) => { diff --git a/src/modules/constants/constant.ts b/src/modules/constants/constant.ts index ba6a849..c519031 100644 --- a/src/modules/constants/constant.ts +++ b/src/modules/constants/constant.ts @@ -19,17 +19,17 @@ export const DATEBASE_FILTER_TYPE = { }; export const DATA_BASE_TYPES_OTHER = -{ - text: OTHER_JDBC, - databaseType: OTHER_JDBC, - driver: '', - url: '', - commonly: false, - internal: false, - type: 'jdbc', - hasSchema: true, - kerberos: false, -}; + { + text: OTHER_JDBC, + databaseType: OTHER_JDBC, + driver: '', + url: '', + commonly: false, + internal: false, + type: 'jdbc', + hasSchema: true, + kerberos: false, + }; export const DATA_BASE_DRIVER_LINK = DecCst && DecCst.Hyperlink ? [ { databaseType: 'ads', @@ -444,6 +444,7 @@ export const DATA_BASE_TYPES = [ type: 'jdbc', hasSchema: true, kerberos: false, + fetchSize: 50, }, { text: 'INFORMIX', databaseType: 'informix', @@ -521,6 +522,7 @@ export const DATA_BASE_TYPES = [ type: 'jdbc', hasSchema: true, kerberos: false, + fetchSize: 128, }, { text: 'Pivotal Greenplum Database', @@ -547,6 +549,7 @@ export const DATA_BASE_TYPES = [ type: 'jdbc', hasSchema: true, kerberos: false, + fetchSize: 10000, }, { text: 'Presto', databaseType: 'presto', @@ -648,7 +651,6 @@ export const DATA_BASE_TYPES = [ ]; - export const CONNECT_CHARSET = [ { text: BI.i18nText('Dec-Dcm_Connection_Form_Auto'), @@ -740,10 +742,10 @@ export const CONNECTION_LAYOUT = { export const JNDI_FACTORYS = [ { - factory:'', + factory: '', url: '', }, { - factory:'weblogic.jndi.WLInitialContextFactory', + factory: 'weblogic.jndi.WLInitialContextFactory', url: 't3://localhost:7001', }, { factory: 'com.ibm.websphere.naming.WsnInitialContextFactory', diff --git a/src/modules/crud/api.ts b/src/modules/crud/api.ts index 0122e48..1d917b8 100644 --- a/src/modules/crud/api.ts +++ b/src/modules/crud/api.ts @@ -1,4 +1,11 @@ -import { Connection, TestRequest, ConnectionPoolType, SocketResult, ResultType } from './crud.typings'; +import { + Connection, + ConnectionLicInfo, + TestRequest, + ConnectionPoolType, + SocketResult, + ResultType, +} from './crud.typings'; export interface Api { /** @@ -9,7 +16,12 @@ export interface Api { /** * 获取已添加的数据连接 */ - getConnectionlist(): Promise<{ data?: Connection[] }>; + getConnectionList(): Promise<{ data?: Connection[] }>; + + /** + * 获取数据连接lic限制信息 + */ + getConnectionLicInfo(): Promise<{ data?: ConnectionLicInfo }>; /** * 删除数据连接 diff --git a/src/modules/crud/crud.typings.d.ts b/src/modules/crud/crud.typings.d.ts index 84181fe..bdbf770 100644 --- a/src/modules/crud/crud.typings.d.ts +++ b/src/modules/crud/crud.typings.d.ts @@ -25,6 +25,11 @@ export interface Connection { }[] } +export interface ConnectionLicInfo { + currentConnectionNum: number; + maxConnectionNum: number +} + export interface ConnectionJDBC { /** * 数据库名称 @@ -103,6 +108,10 @@ export interface ConnectionJDBC { * 秘钥路径 */ keyPath?: string; + /** + * fetchSize + */ + fetchSize?: string; connectionPoolAttr: ConnectionPoolJDBC; } diff --git a/src/modules/crud/decision.api.ts b/src/modules/crud/decision.api.ts index 6c2f2a5..a15cd14 100644 --- a/src/modules/crud/decision.api.ts +++ b/src/modules/crud/decision.api.ts @@ -1,15 +1,19 @@ import { Api } from './api'; -import { Connection, TestRequest, ConnectionPoolType, SocketResult } from './crud.typings'; +import { Connection, TestRequest, ConnectionPoolType, SocketResult, ConnectionLicInfo } from './crud.typings'; import { requestGet, requestDelete, requestPost, requestPut } from './crud.service'; import { editStatusEvent, errorCode } from '@constants/env'; export class DecisionApi implements Api { isDec = true; - getConnectionlist(): Promise<{ data?: Connection[] }> { + getConnectionList(): Promise<{ data?: Connection[] }> { return requestGet('list', {}); } + getConnectionLicInfo(): Promise<{ data?: ConnectionLicInfo }> { + return requestGet('lic/info', {}); + } + deleteConnection(connectionName: string) { return requestDelete('', { connectionName, @@ -49,28 +53,29 @@ export class DecisionApi implements Api { } getConnectionStatus(name: string): Promise { - return this.sendEditStatusEvent(name, editStatusEvent.OPEN).then(re => { - if (re.errorCode) { - let errorMessage = ''; - switch (re.errorCode) { - case errorCode.CONNECTION_DELETED: - errorMessage = 'Dec-Dcm_Connection_Deleted'; - break; - case errorCode.CONNECTION_UNDER_EDIT: - errorMessage = 'Dec-Dcm_Connection_Is_Using'; - break; - default: - errorMessage = re.errorMsg; - break; + return this.sendEditStatusEvent(name, editStatusEvent.OPEN) + .then(re => { + if (re.errorCode) { + let errorMessage = ''; + switch (re.errorCode) { + case errorCode.CONNECTION_DELETED: + errorMessage = 'Dec-Dcm_Connection_Deleted'; + break; + case errorCode.CONNECTION_UNDER_EDIT: + errorMessage = 'Dec-Dcm_Connection_Is_Using'; + break; + default: + errorMessage = re.errorMsg; + break; + } + BI.Msg.toast(BI.i18nText(errorMessage, re.errorMsg), { + level: 'error', + }); + throw re; + } else { + return re; } - BI.Msg.toast(BI.i18nText(errorMessage, re.errorMsg), { - level: 'error', - }); - throw re; - } else { - return re; - } - }); + }); } shutdownConnectionStatus(name: string): Promise { @@ -94,11 +99,13 @@ export class DecisionApi implements Api { } getCipher(password: string) { - return BI.Providers.getProvider('dec.provider.cipher').getCipher(password); + return BI.Providers.getProvider('dec.provider.cipher') + .getCipher(password); } getPlain(cipher: string) { - return BI.Providers.getProvider('dec.provider.cipher').getPlain(cipher); + return BI.Providers.getProvider('dec.provider.cipher') + .getPlain(cipher); } getHyperlink(name: string) { diff --git a/src/modules/crud/design.api.ts b/src/modules/crud/design.api.ts index 2402db7..f010918 100644 --- a/src/modules/crud/design.api.ts +++ b/src/modules/crud/design.api.ts @@ -1,16 +1,21 @@ import { Api } from './api'; -import { Connection, TestRequest, ConnectionPoolType, SocketResult } from './crud.typings'; +import { Connection, TestRequest, ConnectionPoolType, SocketResult, ConnectionLicInfo } from './crud.typings'; +import { requestGet } from './crud.service'; // TODO: 此页面的接口等待设计器提供相应的方法 export class DesignApi implements Api { isDec = false; - getConnectionlist(): Promise<{ data: Connection[] }> { + getConnectionList(): Promise<{ data: Connection[] }> { return new Promise(resolve => { resolve({ data: [] }); }); } + getConnectionLicInfo(): Promise<{ data?: ConnectionLicInfo }> { + return requestGet('lic/info', {}); + } + deleteConnection(connectionName: string): Promise<{ data: string }> { return new Promise(resolve => { resolve({ data: 'success' }); diff --git a/src/modules/pages/connection/connection.model.ts b/src/modules/pages/connection/connection.model.ts index 6fe86dc..bdea196 100644 --- a/src/modules/pages/connection/connection.model.ts +++ b/src/modules/pages/connection/connection.model.ts @@ -1,24 +1,60 @@ import { model, Model } from '@core/core'; import { AppModel } from '../../app.model'; import { ApiFactory } from 'src/modules/crud/apiFactory'; +import { PAGE_INDEX } from '@constants/constant'; + const api = new ApiFactory().create(); + @model() export class ConnectionModel extends Model<{ - types : { + types: { pageIndex: AppModel['TYPE']['pageIndex']; connections: AppModel['TYPE']['connections']; connectionSelected: AppModel['TYPE']['connectionSelected']; connectionSelectedOne: AppModel['TYPE']['connectionSelectedOne']; datebaseTypeSelected: AppModel['TYPE']['datebaseTypeSelected']; }, + childContext: ConnectionModel['childContext']; context: ConnectionModel['context']; }> { static xtype = 'dec.dcm.model.connection'; + state() { + return { + connectionLicInfo: { + currentConnectionNum: 0, + maxConnectionNum: 0, + }, + }; + } + + childContext: ['connectionLicInfo']; + context = ['pageIndex', 'connectionSelected', 'connectionSelectedOne', 'datebaseTypeSelected']; actions = { - setPageIndex:(index: string) => { + initConnectionLicInfo: (cb: Function) => { + return api.getConnectionLicInfo() + .then(res => { + this.model.connectionLicInfo = res.data; + if (res.data.currentConnectionNum > res.data.maxConnectionNum) { + BI.Services.getService('dec.service.component.icon_text.msg').alert({ + text: BI.i18nText('Dec-Connection_Lic_Limit_Approach_Tip', res.data.maxConnectionNum), + }); + } + cb(); + }); + }, + createNewConnection: () => { + if (this.model.connectionLicInfo.currentConnectionNum < this.model.connectionLicInfo.maxConnectionNum) { + this.setPageIndex(PAGE_INDEX.DATEBASE); + } else { + BI.Services.getService('dec.service.component.icon_text.msg').alert({ + text: BI.i18nText('Dec-Connection_Lic_Limit_Approach_Prevent_Tip', this.model.connectionLicInfo.maxConnectionNum), + }); + } + }, + setPageIndex: (index: string) => { this.model.pageIndex = index; }, setDatebaseTypeSelected(name: string) { @@ -30,5 +66,8 @@ export class ConnectionModel extends Model<{ getConnectionStatus() { return api.getConnectionStatus(this.model.connectionSelected); }, - } + checkConnectionLic() { + return this.model.connectionLicInfo.currentConnectionNum > this.model.connectionLicInfo.maxConnectionNum; + }, + }; } diff --git a/src/modules/pages/connection/connection.ts b/src/modules/pages/connection/connection.ts index 43387d5..60327af 100644 --- a/src/modules/pages/connection/connection.ts +++ b/src/modules/pages/connection/connection.ts @@ -24,7 +24,7 @@ export class Connection extends BI.Widget { title: HTapeLayout; watch = { - connectionSelected:(name: string) => { + connectionSelected: (name: string) => { if (name) { const canEdit = connectionCanEdit(this.model.connectionSelectedOne); const type = this.getSelectConnectionType(); @@ -43,11 +43,15 @@ export class Connection extends BI.Widget { this.connectionEditWidget.setVisible(false); } }, + }; + + beforeRender(cb: Function) { + this.store.initConnectionLicInfo(cb); } render() { this.store.setConnectionSelected(''); - + return { type: BI.HTapeLayout.xtype, hgap: 10, @@ -66,7 +70,7 @@ export class Connection extends BI.Widget { type: BI.Button.xtype, text: BI.i18nText('Dec-Dcm_Connection_New'), handler: () => { - this.store.setPageIndex(PAGE_INDEX.DATEBASE); + this.store.createNewConnection(); }, }], }, @@ -110,11 +114,13 @@ export class Connection extends BI.Widget { this.connectionEditWidget = _ref; }, handler: () => { - this.store.getConnectionStatus().then(re => { - this.store.setPageIndex(PAGE_INDEX.MAINTAIN); - this.store.setDatebaseTypeSelected(''); - }) - .catch(() => {}); + this.store.getConnectionStatus() + .then(re => { + this.store.setPageIndex(PAGE_INDEX.MAINTAIN); + this.store.setDatebaseTypeSelected(''); + }) + .catch(() => { + }); }, }], }, @@ -209,7 +215,7 @@ export class Connection extends BI.Widget { const connectionJDBC = this.model.connectionSelectedOne.connectionData as ConnectionJDBC; databaseType = getJdbcDatabaseType(connectionJDBC.database, connectionJDBC.driver).databaseType; } - + return databaseType; } } diff --git a/src/modules/pages/connection/connection_jdbc/connection_jdbc.ts b/src/modules/pages/connection/connection_jdbc/connection_jdbc.ts index 9e205aa..3c35f03 100644 --- a/src/modules/pages/connection/connection_jdbc/connection_jdbc.ts +++ b/src/modules/pages/connection/connection_jdbc/connection_jdbc.ts @@ -19,9 +19,20 @@ export class ConnectionJdbc extends BI.Widget { model: ConnectionJdecModel['model']; allDatabaseTypes = getAllDatabaseTypes(); - render () { + render() { const connectionData = this.model.connectionSelectedOne.connectionData as ConnectionJDBC; - const { driver, database, user, originalCharsetName, schema, connectionPoolAttr, authType, principal, url } = connectionData; + const { + driver, + database, + user, + originalCharsetName, + schema, + connectionPoolAttr, + authType, + principal, + url, + fetchSize, + } = connectionData; const databaseType = getJdbcDatabaseType(database, driver); const { host, port, databaseName } = resolveUrlInfo(url, database); const { hgap, vgap } = CONNECTION_LAYOUT; @@ -169,6 +180,10 @@ export class ConnectionJdbc extends BI.Widget { name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Min_Evictable_Idle_Time_Millis'), value: connectionPoolAttr.minEvictableIdleTimeMillis, unit: BI.i18nText('BI-Basic_Seconds'), + }, { + type: FormItem.xtype, + name: 'Fetchsize', + value: fetchSize, }, ], }, diff --git a/src/modules/pages/connection/connection_jndi/connection_jndi.ts b/src/modules/pages/connection/connection_jndi/connection_jndi.ts index 1db4a3b..874120a 100644 --- a/src/modules/pages/connection/connection_jndi/connection_jndi.ts +++ b/src/modules/pages/connection/connection_jndi/connection_jndi.ts @@ -19,7 +19,7 @@ export class ConnectionJndi extends BI.Widget { const connectionData = this.model.connectionSelectedOne.connectionData as ConnectionJNDI; const { jndiName, contextHashtable, originalCharsetName } = connectionData; const { hgap, vgap } = CONNECTION_LAYOUT; - + return { type: BI.VerticalLayout.xtype, $testId: 'dec-dcm-connection-jndi', diff --git a/src/modules/pages/connection/list/list.model.ts b/src/modules/pages/connection/list/list.model.ts index 036f320..5d650e9 100644 --- a/src/modules/pages/connection/list/list.model.ts +++ b/src/modules/pages/connection/list/list.model.ts @@ -19,7 +19,7 @@ export class ConnectionListModel extends Model<{ } actions = { - setConnections: ():Promise => api.getConnectionlist().then(data => { + setConnections: ():Promise => api.getConnectionList().then(data => { if (BI.size(data.data) > 0) { this.model.connections = data.data; this.model.connections.forEach(item => { @@ -30,7 +30,7 @@ export class ConnectionListModel extends Model<{ } else { this.model.connectionSelected = ''; } - + return new Promise(resolve => { resolve(); }); diff --git a/src/modules/pages/connection/list/list.ts b/src/modules/pages/connection/list/list.ts index 0e4be9b..f674dab 100644 --- a/src/modules/pages/connection/list/list.ts +++ b/src/modules/pages/connection/list/list.ts @@ -6,7 +6,7 @@ import { Tab } from '@fui/core'; @shortcut() @store(ConnectionListModel) -export class ConnectionList extends BI.LoadingPane { +export class ConnectionList extends BI.Pane { static xtype = 'dec.dcm.connection.list'; store: ConnectionListModel['store']; @@ -15,7 +15,7 @@ export class ConnectionList extends BI.LoadingPane { groupWidget: any; tab: Tab; - beforeInit(cb: Function) { + beforeRender(cb: Function) { this.store.setConnections().then(() => { cb(); }); @@ -67,7 +67,7 @@ export class ConnectionList extends BI.LoadingPane { ], }; } - + return { type: BI.Loader.xtype, itemsCreator: (options: {times: number}, populate) => { diff --git a/src/modules/pages/connection/list/list_item/list_item.model.ts b/src/modules/pages/connection/list/list_item/list_item.model.ts index a02695d..f23de66 100644 --- a/src/modules/pages/connection/list/list_item/list_item.model.ts +++ b/src/modules/pages/connection/list/list_item/list_item.model.ts @@ -4,11 +4,13 @@ import { ApiFactory } from '../../../../crud/apiFactory'; import { ResultType } from '../../../../crud/crud.typings'; import { getChartLength } from '../../../../app.service'; import { NAME_MAX_LENGTH } from '../../../../app.constant'; +import { PAGE_INDEX } from '@constants/constant'; + const api = new ApiFactory().create(); @model() export class ListItemModel extends Model<{ - types : { + types: { connectionSelected: AppModel['TYPE']['connectionSelected']; connectionSelectedOne: AppModel['TYPE']['connectionSelectedOne']; datebaseTypeSelectedOne: AppModel['TYPE']['datebaseTypeSelectedOne']; @@ -21,7 +23,7 @@ export class ListItemModel extends Model<{ }> { static xtype = 'dec.dcm.model.connection.list_item'; - context = ['connectionSelected', 'connections', 'pageIndex', 'datebaseTypeSelectedOne', 'connectionSelectedOne', 'datebaseTypeSelected', 'isCopy']; + context = ['connectionSelected', 'connections', 'pageIndex', 'datebaseTypeSelectedOne', 'connectionSelectedOne', 'datebaseTypeSelected', 'isCopy', 'connectionLicInfo']; state() { return { @@ -52,10 +54,12 @@ export class ListItemModel extends Model<{ }, setIsEdit: (isEdit: boolean, name: string) => { if (isEdit) { - api.getConnectionStatus(name).then(re => { - this.model.isEdit = true; - }) - .catch(() => {}); + api.getConnectionStatus(name) + .then(re => { + this.model.isEdit = true; + }) + .catch(() => { + }); } else { api.shutdownConnectionStatus(name); this.model.isEdit = false; @@ -69,7 +73,10 @@ export class ListItemModel extends Model<{ } if (getChartLength(newName) > NAME_MAX_LENGTH) { return new Promise(resolve => { - resolve({ errorCode: '1', errorMsg: BI.i18nText('Dec-Dcm_Connection_Cannot_Too_Lang', NAME_MAX_LENGTH) }); + resolve({ + errorCode: '1', + errorMsg: BI.i18nText('Dec-Dcm_Connection_Cannot_Too_Lang', NAME_MAX_LENGTH), + }); }); } const hasNamed = this.model.connections.some(item => item.connectionName === newName); @@ -82,31 +89,50 @@ export class ListItemModel extends Model<{ connection.connectionId = oldName; connection.connectionName = newName; - - return api.updateConnection(connection).then(re => { - if (!re.errorCode) { - this.model.connections = this.model.connections.map(item => { - return { - ...item, - connectionName: item.connectionName === oldName ? newName : item.connectionName, - connectionId: item.connectionName === oldName ? newName : item.connectionName, - }; - }); - if (this.model.connectionSelected === oldName) { - this.model.connectionSelected = newName; + + return api.updateConnection(connection) + .then(re => { + if (!re.errorCode) { + this.model.connections = this.model.connections.map(item => { + return { + ...item, + connectionName: item.connectionName === oldName ? newName : item.connectionName, + connectionId: item.connectionName === oldName ? newName : item.connectionName, + }; + }); + if (this.model.connectionSelected === oldName) { + this.model.connectionSelected = newName; + } } - } - - return re; - }); + + return re; + }); + }, + copyConnection(connectionName) { + if (this.model.connectionLicInfo.currentConnectionNum >= this.model.connectionLicInfo.maxConnectionNum) { + BI.Services.getService('dec.service.component.icon_text.msg').alert({ + text: BI.i18nText('Dec-Connection_Lic_Limit_Approach_Prevent_Tip', this.model.connectionLicInfo.maxConnectionNum), + }); + + return; + } + this.setConnectionSelected(connectionName); + this.setIsCopy(true); + this.setPageIndex(PAGE_INDEX.MAINTAIN); }, setIsCopy: (isCopy: boolean) => { this.model.isCopy = isCopy; }, isDriverError: (errorCode: string) => api.isDriverError(errorCode), - } + }; + removeConnection(name: string) { - api.deleteConnection(name).then(re => api.getConnectionlist()) + api.deleteConnection(name) + .then(re => { + this.model.connectionLicInfo.currentConnectionNum -= 1; + + return api.getConnectionList(); + }) .then(connections => { this.model.connections = connections.data; this.model.connections.forEach(item => { diff --git a/src/modules/pages/connection/list/list_item/list_item.ts b/src/modules/pages/connection/list/list_item/list_item.ts index 4f098bc..58537d7 100644 --- a/src/modules/pages/connection/list/list_item/list_item.ts +++ b/src/modules/pages/connection/list/list_item/list_item.ts @@ -19,7 +19,7 @@ export class ListItem extends BI.BasicButton { height: 25, baseCls: 'dec-dcm-connection-list-item bi-list-item-active2', $testId: 'dec-dcm-connection-list-item', - } + }; store: ListItemModel['store']; model: ListItemModel['model']; @@ -36,7 +36,7 @@ export class ListItem extends BI.BasicButton { this.nameEditor.focus(); } }, - } + }; render() { const { name, databaseType } = this.options; @@ -220,15 +220,14 @@ export class ListItem extends BI.BasicButton { this.store.setPageIndex(PAGE_INDEX.MAINTAIN); this.store.setDatebaseTypeSelected(''); }) - .catch(() => { }); + .catch(() => { + }); }, changeName: () => { this.store.setIsEdit(true, name); }, copy: () => { - this.store.setConnectionSelected(name); - this.store.setIsCopy(true); - this.store.setPageIndex(PAGE_INDEX.MAINTAIN); + this.store.copyConnection(name); }, delete: () => { this.store.deleteConnection(name); diff --git a/src/modules/pages/connection_pool/connection_pool.ts b/src/modules/pages/connection_pool/connection_pool.ts index e3547f7..2cec421 100644 --- a/src/modules/pages/connection_pool/connection_pool.ts +++ b/src/modules/pages/connection_pool/connection_pool.ts @@ -4,6 +4,7 @@ import { ListItem } from './list_item/list_item'; import { Pool } from './pool/pool'; import { PAGE_SIZE } from '@constants/constant'; import { Label } from '@fui/core'; + @shortcut() @store(ConnectionPoolModel) export class ConnectionPool extends BI.Widget { @@ -18,7 +19,7 @@ export class ConnectionPool extends BI.Widget { selected: (selected: string) => { this.title.setText(selected); }, - } + }; mounted() { const defaultSelected = this.model.connectionJDBC.length > 0 ? this.model.connectionJDBC[0].connectionName : ''; @@ -29,7 +30,7 @@ export class ConnectionPool extends BI.Widget { if (BI.size(this.model.connectionJDBC) === 0) { return this.renderNoConnection(); } - + return { type: BI.HTapeLayout.xtype, items: [ @@ -37,6 +38,7 @@ export class ConnectionPool extends BI.Widget { el: { type: BI.VTapeLayout.xtype, cls: 'bi-border-right', + hgap: 10, items: [ { el: { @@ -44,16 +46,18 @@ export class ConnectionPool extends BI.Widget { cls: 'bi-border-bottom', textAlign: 'left', text: BI.i18nText('Dec-Dcm_Data_Connections'), - lgap: 10, }, height: 40, }, { - type: BI.Loader.xtype, - itemsCreator: (options: {times: number}, populate) => { - populate(this.renderList((options.times - 1) * PAGE_SIZE, options.times * PAGE_SIZE)); + el: { + type: BI.Loader.xtype, + itemsCreator: (options: { times: number }, populate) => { + populate(this.renderList((options.times - 1) * PAGE_SIZE, options.times * PAGE_SIZE)); + }, + hasNext: options => options.times * PAGE_SIZE < BI.size(this.model.connectionJDBC), }, - hasNext: options => options.times * PAGE_SIZE < BI.size(this.model.connectionJDBC), + vgap: 10, }, ], }, @@ -116,14 +120,15 @@ export class ConnectionPool extends BI.Widget { private renderList(start = 0, end = 0) { const defaultSelected = this.model.connectionJDBC.length > 0 ? this.model.connectionJDBC[0].connectionName : ''; - - return this.model.connectionJDBC.slice(start, end).map(item => { - return { - type: ListItem.xtype, - name: item.connectionName, - value: item.connectionName, - selected: item.connectionName === defaultSelected, - }; - }); + + return this.model.connectionJDBC.slice(start, end) + .map(item => { + return { + type: ListItem.xtype, + name: item.connectionName, + value: item.connectionName, + selected: item.connectionName === defaultSelected, + }; + }); } } diff --git a/src/modules/pages/maintain/forms/components/form.jdbc.ts b/src/modules/pages/maintain/forms/components/form.jdbc.ts index b00d993..1c2f519 100644 --- a/src/modules/pages/maintain/forms/components/form.jdbc.ts +++ b/src/modules/pages/maintain/forms/components/form.jdbc.ts @@ -1,12 +1,12 @@ -import {shortcut} from '@core/core'; -import {Collapse, EVENT_CHANGE} from 'src/modules/components/collapse/collapse'; -import {FormItem} from '../../components/form_item/form_item'; -import {Connection, ConnectionJDBC, ConnectionPoolJDBC} from 'src/modules/crud/crud.typings'; -import {connectionType} from '@constants/env'; -import {CONNECT_CHARSET, CONNECTION_LAYOUT, INT_MAX_VALUE, INT_MIN_VALUE} from '@constants/constant'; -import {getAllDatabaseTypes, getJdbcDatabaseType, resolveUrlInfo, splitUrl} from '../../../../app.service'; -import {TextChecker} from '../../../../components/text_checker/text_checker'; -import {ApiFactory} from 'src/modules/crud/apiFactory'; +import { shortcut } from '@core/core'; +import { Collapse, EVENT_CHANGE } from 'src/modules/components/collapse/collapse'; +import { FormItem } from '../../components/form_item/form_item'; +import { Connection, ConnectionJDBC, ConnectionPoolJDBC } from 'src/modules/crud/crud.typings'; +import { connectionType } from '@constants/env'; +import { CONNECT_CHARSET, CONNECTION_LAYOUT, INT_MAX_VALUE, INT_MIN_VALUE } from '@constants/constant'; +import { getAllDatabaseTypes, getJdbcDatabaseType, resolveUrlInfo, splitUrl } from '../../../../app.service'; +import { TextChecker } from '../../../../components/text_checker/text_checker'; +import { ApiFactory } from 'src/modules/crud/apiFactory'; import { Editor, EditorIconCheckCombo, @@ -14,7 +14,7 @@ import { TextAreaEditor, TextEditor, TextValueCombo, - VerticalLayout + VerticalLayout, } from '@fui/core'; const api = new ApiFactory().create(); @@ -25,7 +25,7 @@ export class FormJdbc extends BI.Widget { props = { formData: {} as Connection, - } + }; oldPassword = ''; allDatabaseTypes = getAllDatabaseTypes(); @@ -63,10 +63,11 @@ export class FormJdbc extends BI.Widget { numTestsPerEvictionRun: null, minIdle: null, minEvictableIdleTimeMillis: null, + fetchSize: null, }; render() { - const {connectionName, connectionData} = this.options.formData; + const { connectionName, connectionData } = this.options.formData; const { driver, user, @@ -78,7 +79,8 @@ export class FormJdbc extends BI.Widget { database, authType, principal, - keyPath + keyPath, + fetchSize, } = connectionData as ConnectionJDBC; const { initialSize, @@ -92,12 +94,12 @@ export class FormJdbc extends BI.Widget { timeBetweenEvictionRunsMillis, numTestsPerEvictionRun, minIdle, - minEvictableIdleTimeMillis + minEvictableIdleTimeMillis, } = connectionPoolAttr as ConnectionPoolJDBC; const databaseType = getJdbcDatabaseType(database, driver); this.oldPassword = password; - const {host, port, databaseName} = resolveUrlInfo(url, database); - const {hgap, vgap} = CONNECTION_LAYOUT; + const { host, port, databaseName } = resolveUrlInfo(url, database); + const { hgap, vgap } = CONNECTION_LAYOUT; const valueRangeConfig = { errorText: BI.i18nText('Dec-Dcm_Connection_Value_Out_Range'), @@ -394,7 +396,7 @@ export class FormJdbc extends BI.Widget { vgap: 15, disabled: true, value: schema, - items: schema ? [{text: schema, value: schema}] : [], + items: schema ? [{ text: schema, value: schema }] : [], ref: (_ref: TextValueCombo) => { this.form.schema = _ref; }, @@ -702,6 +704,37 @@ export class FormJdbc extends BI.Widget { text: BI.i18nText('BI-Basic_Seconds'), }, ], + }, { + el: { + type: BI.VerticalLayout.xtype, + cls: 'bi-border-top', + invisible: BI.parseInt(fetchSize) < 0, + items: [ + { + el: { + type: FormItem.xtype, + name: 'Fetchsize', + forms: [{ + type: TextChecker.xtype, + $value: 'fetch-size', + width: 300, + allowBlank: true, + value: fetchSize, + watermark: 'Fetchsize', + validationChecker: [{ + errorText: BI.i18nText('Dec-Dcm_Connection_Check_Fetch_Size_Range'), + checker: (value: string) => BI.isInteger(value) && BI.parseInt(value) >= 0 && BI.parseInt(value) <= 1000000, + autoFix: true, + }], + ref: (_ref: TextChecker) => { + this.form.fetchSize = _ref; + }, + }], + }, + vgap: 15, + }, + ], + }, }, ], }, @@ -767,7 +800,7 @@ export class FormJdbc extends BI.Widget { } private onHostPortChange(databaseType) { - const {urls, url} = databaseType; + const { urls, url } = databaseType; const driver = this.form.driver.getValue(); const selectUrl = BI.get(urls, driver) || url; const host = this.form.host.getValue(); @@ -816,6 +849,7 @@ export class FormJdbc extends BI.Widget { creator: Dec ? Dec.personal.username : '', principal: this.form.principal.getValue(), keyPath: this.form.keyPath.getValue(), + fetchSize: this.form.fetchSize.getValue(), connectionPoolAttr: { initialSize: this.form.initialSize.getValue(), maxActive: this.form.maxActive.getValue(),