mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/dev' into dev_1207_dm
This commit is contained in:
		
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -26,6 +26,13 @@
 | 
				
			|||||||
      "unicode": "e8b7",
 | 
					      "unicode": "e8b7",
 | 
				
			||||||
      "unicode_decimal": 59575
 | 
					      "unicode_decimal": 59575
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        "icon_id": "12295203",
 | 
				
			||||||
 | 
					        "name": "达梦数据库",
 | 
				
			||||||
 | 
					        "font_class": "db-dm",
 | 
				
			||||||
 | 
					        "unicode": "e6f0",
 | 
				
			||||||
 | 
					        "unicode_decimal": 59120
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "icon_id": "10055634",
 | 
					      "icon_id": "10055634",
 | 
				
			||||||
      "name": "云数据库MongoDB",
 | 
					      "name": "云数据库MongoDB",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,10 +8,11 @@
 | 
				
			|||||||
                            <el-input v-model.trim="form.name" placeholder="请输入数据库别名" auto-complete="off"></el-input>
 | 
					                            <el-input v-model.trim="form.name" placeholder="请输入数据库别名" auto-complete="off"></el-input>
 | 
				
			||||||
                        </el-form-item>
 | 
					                        </el-form-item>
 | 
				
			||||||
                        <el-form-item prop="type" label="类型" required>
 | 
					                        <el-form-item prop="type" label="类型" required>
 | 
				
			||||||
                            <el-select style="width: 100%" v-model="form.type" placeholder="请选择数据库类型">
 | 
					                            <el-select @change="changeDbType" style="width: 100%" v-model="form.type" placeholder="请选择数据库类型">
 | 
				
			||||||
                                <el-option key="item.id" label="mysql" value="mysql"> </el-option>
 | 
					                                <el-option v-for="dt in dbTypes" :key="dt.type" :value="dt.type">
 | 
				
			||||||
                                <el-option key="item.id" label="postgres" value="postgres"> </el-option>
 | 
					                                    <SvgIcon :name="getDbDialect(dt.type).getInfo().icon" :size="18" />
 | 
				
			||||||
                                <el-option key="item.id" label="达梦(暂不支持ssh)" value="dm"> </el-option>
 | 
					                                    {{ dt.label }}
 | 
				
			||||||
 | 
					                                </el-option>
 | 
				
			||||||
                            </el-select>
 | 
					                            </el-select>
 | 
				
			||||||
                        </el-form-item>
 | 
					                        </el-form-item>
 | 
				
			||||||
                        <el-form-item prop="host" label="host" required>
 | 
					                        <el-form-item prop="host" label="host" required>
 | 
				
			||||||
@@ -86,6 +87,8 @@ import { ElMessage } from 'element-plus';
 | 
				
			|||||||
import { notBlank } from '@/common/assert';
 | 
					import { notBlank } from '@/common/assert';
 | 
				
			||||||
import { RsaEncrypt } from '@/common/rsa';
 | 
					import { RsaEncrypt } from '@/common/rsa';
 | 
				
			||||||
import SshTunnelSelect from '../component/SshTunnelSelect.vue';
 | 
					import SshTunnelSelect from '../component/SshTunnelSelect.vue';
 | 
				
			||||||
 | 
					import { getDbDialect } from './dialect';
 | 
				
			||||||
 | 
					import SvgIcon from '@/components/svgIcon/index.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps({
 | 
					const props = defineProps({
 | 
				
			||||||
    visible: {
 | 
					    visible: {
 | 
				
			||||||
@@ -121,7 +124,7 @@ const rules = {
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            required: true,
 | 
					            required: true,
 | 
				
			||||||
            message: '请输入主机ip和port',
 | 
					            message: '请输入主机ip和port',
 | 
				
			||||||
            trigger: ['change', 'blur'],
 | 
					            trigger: ['blur'],
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    username: [
 | 
					    username: [
 | 
				
			||||||
@@ -135,6 +138,21 @@ const rules = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const dbForm: any = ref(null);
 | 
					const dbForm: any = ref(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const dbTypes = [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        type: 'mysql',
 | 
				
			||||||
 | 
					        label: 'mysql',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        type: 'postgres',
 | 
				
			||||||
 | 
					        label: 'postgres',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        type: 'dm',
 | 
				
			||||||
 | 
					        label: '达梦(暂不支持ssh)',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const state = reactive({
 | 
					const state = reactive({
 | 
				
			||||||
    dialogVisible: false,
 | 
					    dialogVisible: false,
 | 
				
			||||||
    tabActiveName: 'basic',
 | 
					    tabActiveName: 'basic',
 | 
				
			||||||
@@ -143,7 +161,7 @@ const state = reactive({
 | 
				
			|||||||
        type: null,
 | 
					        type: null,
 | 
				
			||||||
        name: null,
 | 
					        name: null,
 | 
				
			||||||
        host: '',
 | 
					        host: '',
 | 
				
			||||||
        port: 3306,
 | 
					        port: null,
 | 
				
			||||||
        username: null,
 | 
					        username: null,
 | 
				
			||||||
        password: null,
 | 
					        password: null,
 | 
				
			||||||
        params: null,
 | 
					        params: null,
 | 
				
			||||||
@@ -170,11 +188,17 @@ watch(props, (newValue: any) => {
 | 
				
			|||||||
        state.form = { ...newValue.data };
 | 
					        state.form = { ...newValue.data };
 | 
				
			||||||
        state.oldUserName = state.form.username;
 | 
					        state.oldUserName = state.form.username;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        state.form = { port: 3306 } as any;
 | 
					        state.form = { port: null } as any;
 | 
				
			||||||
        state.oldUserName = null;
 | 
					        state.oldUserName = null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const changeDbType = (val: string) => {
 | 
				
			||||||
 | 
					    if (!state.form.id) {
 | 
				
			||||||
 | 
					        state.form.port = getDbDialect(val).getInfo().defaultPort as any;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getDbPwd = async () => {
 | 
					const getDbPwd = async () => {
 | 
				
			||||||
    state.pwd = await dbApi.getInstancePwd.request({ id: state.form.id });
 | 
					    state.pwd = await dbApi.getInstancePwd.request({ id: state.form.id });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
                        <span v-if="data.type.value == SqlExecNodeType.DbInst">
 | 
					                        <span v-if="data.type.value == SqlExecNodeType.DbInst">
 | 
				
			||||||
                            <el-popover :show-after="500" placement="right-start" title="数据库实例信息" trigger="hover" :width="250">
 | 
					                            <el-popover :show-after="500" placement="right-start" title="数据库实例信息" trigger="hover" :width="250">
 | 
				
			||||||
                                <template #reference>
 | 
					                                <template #reference>
 | 
				
			||||||
                                    <SvgIcon :name="getDbDialect(data.params.type).getIcon()" :size="18" />
 | 
					                                    <SvgIcon :name="getDbDialect(data.params.type).getInfo().icon" :size="18" />
 | 
				
			||||||
                                </template>
 | 
					                                </template>
 | 
				
			||||||
                                <template #default>
 | 
					                                <template #default>
 | 
				
			||||||
                                    <el-descriptions :column="1" size="small">
 | 
					                                    <el-descriptions :column="1" size="small">
 | 
				
			||||||
@@ -66,7 +66,7 @@
 | 
				
			|||||||
                            <el-descriptions-item label-align="right">
 | 
					                            <el-descriptions-item label-align="right">
 | 
				
			||||||
                                <template #label>
 | 
					                                <template #label>
 | 
				
			||||||
                                    <div>
 | 
					                                    <div>
 | 
				
			||||||
                                        <SvgIcon :name="getDbDialect(nowDbInst.type).getIcon()" :size="18" />
 | 
					                                        <SvgIcon :name="getDbDialect(nowDbInst.type).getInfo().icon" :size="18" />
 | 
				
			||||||
                                        实例
 | 
					                                        实例
 | 
				
			||||||
                                    </div>
 | 
					                                    </div>
 | 
				
			||||||
                                </template>
 | 
					                                </template>
 | 
				
			||||||
@@ -104,7 +104,7 @@
 | 
				
			|||||||
                                                {{ dt.params.name }}
 | 
					                                                {{ dt.params.name }}
 | 
				
			||||||
                                            </el-descriptions-item>
 | 
					                                            </el-descriptions-item>
 | 
				
			||||||
                                            <el-descriptions-item label="host">
 | 
					                                            <el-descriptions-item label="host">
 | 
				
			||||||
                                                <SvgIcon :name="getDbDialect(dt.params.type).getIcon()" :size="18" />
 | 
					                                                <SvgIcon :name="getDbDialect(dt.params.type).getInfo().icon" :size="18" />
 | 
				
			||||||
                                                {{ dt.params.host }}
 | 
					                                                {{ dt.params.host }}
 | 
				
			||||||
                                            </el-descriptions-item>
 | 
					                                            </el-descriptions-item>
 | 
				
			||||||
                                            <el-descriptions-item label="库名">
 | 
					                                            <el-descriptions-item label="库名">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -332,7 +332,7 @@ const selectData = async () => {
 | 
				
			|||||||
    const table = props.tableName;
 | 
					    const table = props.tableName;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        const countRes = await dbInst.runSql(db, dbInst.getDefaultCountSql(table, state.condition));
 | 
					        const countRes = await dbInst.runSql(db, dbInst.getDefaultCountSql(table, state.condition));
 | 
				
			||||||
        state.count = countRes.res[0].count || countRes.res[0].COUNT;
 | 
					        state.count = countRes.res[0].count || countRes.res[0].COUNT || 0;
 | 
				
			||||||
        let sql = dbInst.getDefaultSelectSql(table, state.condition, state.orderBy, state.pageNum, state.pageSize);
 | 
					        let sql = dbInst.getDefaultSelectSql(table, state.condition, state.orderBy, state.pageNum, state.pageSize);
 | 
				
			||||||
        state.sql = sql;
 | 
					        state.sql = sql;
 | 
				
			||||||
        if (state.count > 0) {
 | 
					        if (state.count > 0) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -167,7 +167,7 @@ const state = reactive({
 | 
				
			|||||||
    dialogVisible: false,
 | 
					    dialogVisible: false,
 | 
				
			||||||
    btnloading: false,
 | 
					    btnloading: false,
 | 
				
			||||||
    activeName: '1',
 | 
					    activeName: '1',
 | 
				
			||||||
    columnTypeList: dbDialect.getColumnTypes(),
 | 
					    columnTypeList: dbDialect.getInfo().columnTypes,
 | 
				
			||||||
    indexTypeList: ['BTREE'], // mysql索引类型详解 http://c.biancheng.net/view/7897.html
 | 
					    indexTypeList: ['BTREE'], // mysql索引类型详解 http://c.biancheng.net/view/7897.html
 | 
				
			||||||
    tableData: {
 | 
					    tableData: {
 | 
				
			||||||
        fields: {
 | 
					        fields: {
 | 
				
			||||||
@@ -425,7 +425,7 @@ const submit = async () => {
 | 
				
			|||||||
        sql: sql,
 | 
					        sql: sql,
 | 
				
			||||||
        dbId: props.dbId as any,
 | 
					        dbId: props.dbId as any,
 | 
				
			||||||
        db: props.db as any,
 | 
					        db: props.db as any,
 | 
				
			||||||
        dbType: dbDialect.getFormatDialect(),
 | 
					        dbType: dbDialect.getInfo().formatSqlDialect,
 | 
				
			||||||
        runSuccessCallback: () => {
 | 
					        runSuccessCallback: () => {
 | 
				
			||||||
            emit('submit-sql', { tableName: state.tableData.tableName });
 | 
					            emit('submit-sql', { tableName: state.tableData.tableName });
 | 
				
			||||||
            // cancel();
 | 
					            // cancel();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
import { DbDialect, sqlColumnType } from './index';
 | 
					import { DbDialect, sqlColumnType, DialectInfo } from './index';
 | 
				
			||||||
import { SqlLanguage } from 'sql-formatter/lib/src/sqlFormatter';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { DMDialect, GAUSS_TYPE_LIST };
 | 
					export { DMDialect, GAUSS_TYPE_LIST };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -83,13 +82,16 @@ const GAUSS_TYPE_LIST: sqlColumnType[] = [
 | 
				
			|||||||
    { udtName: 'macaddr', dataType: 'macaddr', desc: 'MAC地址', space: '6字节' },
 | 
					    { udtName: 'macaddr', dataType: 'macaddr', desc: 'MAC地址', space: '6字节' },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DMDialect implements DbDialect {
 | 
					const dmDialectInfo: DialectInfo = {
 | 
				
			||||||
    getFormatDialect(): SqlLanguage {
 | 
					    icon: 'iconfont icon-db-dm',
 | 
				
			||||||
        return 'postgresql';
 | 
					    defaultPort: 5236,
 | 
				
			||||||
    }
 | 
					    formatSqlDialect: 'postgresql',
 | 
				
			||||||
 | 
					    columnTypes: GAUSS_TYPE_LIST.sort((a, b) => a.udtName.localeCompare(b.udtName)),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getIcon() {
 | 
					class DMDialect implements DbDialect {
 | 
				
			||||||
        return 'iconfont icon-op-postgres';
 | 
					    getInfo() {
 | 
				
			||||||
 | 
					        return dmDialectInfo;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number) {
 | 
					    getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number) {
 | 
				
			||||||
@@ -102,10 +104,6 @@ class DMDialect implements DbDialect {
 | 
				
			|||||||
        return name;
 | 
					        return name;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getColumnTypes(): sqlColumnType[] {
 | 
					 | 
				
			||||||
        return GAUSS_TYPE_LIST.sort((a, b) => a.udtName.localeCompare(b.udtName));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    matchType(text: string, arr: string[]): boolean {
 | 
					    matchType(text: string, arr: string[]): boolean {
 | 
				
			||||||
        if (!text || !arr || arr.length === 0) {
 | 
					        if (!text || !arr || arr.length === 0) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,29 @@ export interface sqlColumnType {
 | 
				
			|||||||
    range?: string;
 | 
					    range?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 数据库基础信息
 | 
				
			||||||
 | 
					export interface DialectInfo {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 图标
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    icon: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 默认端口
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    defaultPort: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 格式化sql的方言
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    formatSqlDialect: SqlLanguage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 列字段类型
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    columnTypes: sqlColumnType[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const DbType = {
 | 
					export const DbType = {
 | 
				
			||||||
    mysql: 'mysql',
 | 
					    mysql: 'mysql',
 | 
				
			||||||
    postgresql: 'postgres',
 | 
					    postgresql: 'postgres',
 | 
				
			||||||
@@ -19,14 +42,9 @@ export const DbType = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export interface DbDialect {
 | 
					export interface DbDialect {
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取格式化sql对应的dialect名称
 | 
					     * 获取一些数据库默认信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    getFormatDialect(): SqlLanguage;
 | 
					    getInfo(): DialectInfo;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获取图标信息
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    getIcon(): string;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取默认查询sql
 | 
					     * 获取默认查询sql
 | 
				
			||||||
@@ -44,11 +62,6 @@ export interface DbDialect {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    wrapName(name: string): string;
 | 
					    wrapName(name: string): string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     *  生成字段类型列表
 | 
					 | 
				
			||||||
     * */
 | 
					 | 
				
			||||||
    getColumnTypes(): sqlColumnType[];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 生成创建表sql
 | 
					     * 生成创建表sql
 | 
				
			||||||
     * @param tableData 建表数据
 | 
					     * @param tableData 建表数据
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
import { DbDialect, sqlColumnType } from './index';
 | 
					import { DbDialect, DialectInfo } from './index';
 | 
				
			||||||
import { SqlLanguage } from 'sql-formatter/lib/src/sqlFormatter';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { MYSQL_TYPE_LIST, MysqlDialect, language };
 | 
					export { MYSQL_TYPE_LIST, MysqlDialect, language };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,13 +29,16 @@ const MYSQL_TYPE_LIST = [
 | 
				
			|||||||
    'varchar',
 | 
					    'varchar',
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MysqlDialect implements DbDialect {
 | 
					const mysqlDialectInfo: DialectInfo = {
 | 
				
			||||||
    getFormatDialect(): SqlLanguage {
 | 
					    icon: 'iconfont icon-op-mysql',
 | 
				
			||||||
        return 'mysql';
 | 
					    defaultPort: 3306,
 | 
				
			||||||
    }
 | 
					    formatSqlDialect: 'mysql',
 | 
				
			||||||
 | 
					    columnTypes: MYSQL_TYPE_LIST.map((a) => ({ udtName: a, dataType: a, desc: '', space: '' })),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getIcon() {
 | 
					class MysqlDialect implements DbDialect {
 | 
				
			||||||
        return 'iconfont icon-op-mysql';
 | 
					    getInfo(): DialectInfo {
 | 
				
			||||||
 | 
					        return mysqlDialectInfo;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number) {
 | 
					    getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number) {
 | 
				
			||||||
@@ -49,10 +51,6 @@ class MysqlDialect implements DbDialect {
 | 
				
			|||||||
        return `\`${name}\``;
 | 
					        return `\`${name}\``;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getColumnTypes(): sqlColumnType[] {
 | 
					 | 
				
			||||||
        return MYSQL_TYPE_LIST.map((a) => ({ udtName: a, dataType: a, desc: '', space: '' }));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    genColumnBasicSql(cl: any): string {
 | 
					    genColumnBasicSql(cl: any): string {
 | 
				
			||||||
        let val = cl.value ? (cl.value === 'CURRENT_TIMESTAMP' ? cl.value : `'${cl.value}'`) : '';
 | 
					        let val = cl.value ? (cl.value === 'CURRENT_TIMESTAMP' ? cl.value : `'${cl.value}'`) : '';
 | 
				
			||||||
        let defVal = val ? `DEFAULT ${val}` : '';
 | 
					        let defVal = val ? `DEFAULT ${val}` : '';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
import { DbDialect, sqlColumnType } from './index';
 | 
					import { DbDialect, DialectInfo, sqlColumnType } from './index';
 | 
				
			||||||
import { SqlLanguage } from 'sql-formatter/lib/src/sqlFormatter';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { PostgresqlDialect, GAUSS_TYPE_LIST };
 | 
					export { PostgresqlDialect, GAUSS_TYPE_LIST };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -83,13 +82,16 @@ const GAUSS_TYPE_LIST: sqlColumnType[] = [
 | 
				
			|||||||
    { udtName: 'macaddr', dataType: 'macaddr', desc: 'MAC地址', space: '6字节' },
 | 
					    { udtName: 'macaddr', dataType: 'macaddr', desc: 'MAC地址', space: '6字节' },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PostgresqlDialect implements DbDialect {
 | 
					const postgresDialectInfo: DialectInfo = {
 | 
				
			||||||
    getFormatDialect(): SqlLanguage {
 | 
					    icon: 'iconfont icon-op-postgres',
 | 
				
			||||||
        return 'postgresql';
 | 
					    defaultPort: 5432,
 | 
				
			||||||
    }
 | 
					    formatSqlDialect: 'postgresql',
 | 
				
			||||||
 | 
					    columnTypes: GAUSS_TYPE_LIST.sort((a, b) => a.udtName.localeCompare(b.udtName)),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getIcon() {
 | 
					class PostgresqlDialect implements DbDialect {
 | 
				
			||||||
        return 'iconfont icon-op-postgres';
 | 
					    getInfo(): DialectInfo {
 | 
				
			||||||
 | 
					        return postgresDialectInfo;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number) {
 | 
					    getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number) {
 | 
				
			||||||
@@ -102,10 +104,6 @@ class PostgresqlDialect implements DbDialect {
 | 
				
			|||||||
        return name;
 | 
					        return name;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getColumnTypes(): sqlColumnType[] {
 | 
					 | 
				
			||||||
        return GAUSS_TYPE_LIST.sort((a, b) => a.udtName.localeCompare(b.udtName));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    matchType(text: string, arr: string[]): boolean {
 | 
					    matchType(text: string, arr: string[]): boolean {
 | 
				
			||||||
        if (!text || !arr || arr.length === 0) {
 | 
					        if (!text || !arr || arr.length === 0) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,8 +34,6 @@ require (
 | 
				
			|||||||
	gorm.io/gorm v1.25.5
 | 
						gorm.io/gorm v1.25.5
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require golang.org/x/exp v0.0.0-20230519143937-03e91628a987
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
 | 
						github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
 | 
				
			||||||
	github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
 | 
						github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
 | 
				
			||||||
@@ -79,6 +77,7 @@ require (
 | 
				
			|||||||
	github.com/xdg-go/stringprep v1.0.4 // indirect
 | 
						github.com/xdg-go/stringprep v1.0.4 // indirect
 | 
				
			||||||
	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 | 
						github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 | 
				
			||||||
	golang.org/x/arch v0.3.0 // indirect
 | 
						golang.org/x/arch v0.3.0 // indirect
 | 
				
			||||||
 | 
						golang.org/x/exp v0.0.0-20230519143937-03e91628a987
 | 
				
			||||||
	golang.org/x/image v0.0.0-20220302094943-723b81ca9867 // indirect
 | 
						golang.org/x/image v0.0.0-20220302094943-723b81ca9867 // indirect
 | 
				
			||||||
	golang.org/x/net v0.18.0 // indirect
 | 
						golang.org/x/net v0.18.0 // indirect
 | 
				
			||||||
	golang.org/x/sync v0.1.0 // indirect
 | 
						golang.org/x/sync v0.1.0 // indirect
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -115,7 +115,7 @@ func (d *Db) ExecSql(rc *req.Ctx) {
 | 
				
			|||||||
	ctx := rc.MetaCtx
 | 
						ctx := rc.MetaCtx
 | 
				
			||||||
	// 如果存在执行id,则保存取消函数,用于后续可能的取消操作
 | 
						// 如果存在执行id,则保存取消函数,用于后续可能的取消操作
 | 
				
			||||||
	if form.ExecId != "" {
 | 
						if form.ExecId != "" {
 | 
				
			||||||
		cancelCtx, cancel := context.WithCancel(rc.MetaCtx)
 | 
							cancelCtx, cancel := context.WithTimeout(rc.MetaCtx, 55*time.Second)
 | 
				
			||||||
		ctx = cancelCtx
 | 
							ctx = cancelCtx
 | 
				
			||||||
		cancelExecSqlMap.Store(form.ExecId, cancel)
 | 
							cancelExecSqlMap.Store(form.ExecId, cancel)
 | 
				
			||||||
		defer cancelExecSqlMap.Delete(form.ExecId)
 | 
							defer cancelExecSqlMap.Delete(form.ExecId)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,10 +33,7 @@ func (d *DbConn) QueryContext(ctx context.Context, querySql string) ([]string, [
 | 
				
			|||||||
		result = append(result, record)
 | 
							result = append(result, record)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if err == context.Canceled {
 | 
							return nil, nil, wrapSqlError(err)
 | 
				
			||||||
			return nil, nil, errorx.NewBiz("取消执行")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return nil, nil, err
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return columns, result, nil
 | 
						return columns, result, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -74,10 +71,7 @@ func (d *DbConn) Exec(sql string) (int64, error) {
 | 
				
			|||||||
func (d *DbConn) ExecContext(ctx context.Context, sql string) (int64, error) {
 | 
					func (d *DbConn) ExecContext(ctx context.Context, sql string) (int64, error) {
 | 
				
			||||||
	res, err := d.db.ExecContext(ctx, sql)
 | 
						res, err := d.db.ExecContext(ctx, sql)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if err == context.Canceled {
 | 
							return 0, wrapSqlError(err)
 | 
				
			||||||
			return 0, errorx.NewBiz("取消执行")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return res.RowsAffected()
 | 
						return res.RowsAffected()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -202,3 +196,14 @@ func valueConvert(data []byte, colType *sql.ColumnType) any {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return stringV
 | 
						return stringV
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 包装sql执行相关错误
 | 
				
			||||||
 | 
					func wrapSqlError(err error) error {
 | 
				
			||||||
 | 
						if err == context.Canceled {
 | 
				
			||||||
 | 
							return errorx.NewBiz("取消执行")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err == context.DeadlineExceeded {
 | 
				
			||||||
 | 
							return errorx.NewBiz("执行超时")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,10 +4,11 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"database/sql"
 | 
						"database/sql"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	_ "gitee.com/chunanyong/dm"
 | 
					 | 
				
			||||||
	"mayfly-go/pkg/errorx"
 | 
						"mayfly-go/pkg/errorx"
 | 
				
			||||||
	"mayfly-go/pkg/utils/anyx"
 | 
						"mayfly-go/pkg/utils/anyx"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_ "gitee.com/chunanyong/dm"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getDmDB(d *DbInfo) (*sql.DB, error) {
 | 
					func getDmDB(d *DbInfo) (*sql.DB, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user