mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-08-02 13:34:07 +08:00
datagrip导入实现
This commit is contained in:
@ -4,6 +4,7 @@ import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
|||||||
import ai.chat2db.server.tools.common.util.ConfigUtils;
|
import ai.chat2db.server.tools.common.util.ConfigUtils;
|
||||||
import ai.chat2db.server.web.api.controller.ncx.service.ConverterService;
|
import ai.chat2db.server.web.api.controller.ncx.service.ConverterService;
|
||||||
import ai.chat2db.server.web.api.controller.ncx.vo.UploadVO;
|
import ai.chat2db.server.web.api.controller.ncx.vo.UploadVO;
|
||||||
|
import ai.chat2db.server.web.api.util.FileUtils;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -12,7 +13,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import ai.chat2db.server.web.api.util.FileUtils;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -33,10 +33,10 @@ public class ConverterController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出教程
|
* 导出教程
|
||||||
* @see <a href="https://blog.csdn.net/kkk123445/article/details/122514124?spm=1001.2014.3001.5502" />
|
|
||||||
*
|
*
|
||||||
* @param file file
|
* @param file file
|
||||||
* @return DataResult<UploadVO>
|
* @return DataResult<UploadVO>
|
||||||
|
* @see <a href="https://blog.csdn.net/kkk123445/article/details/122514124?spm=1001.2014.3001.5502" />
|
||||||
**/
|
**/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@PostMapping("/ncx/upload")
|
@PostMapping("/ncx/upload")
|
||||||
@ -67,7 +67,7 @@ public class ConverterController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入datagrip的连接信息,通过 ctrl/cmd + c(shift多选)复制连接,再导入进来
|
* 导入datagrip的连接信息,通过 ctrl/cmd + c(shift多选)复制连接,再导入进来
|
||||||
* 目前复制的连接信息里面是没有密码的
|
* 目前复制的连接信息里面是没有密码的、ssh连接信息也没有
|
||||||
*
|
*
|
||||||
* @param text text
|
* @param text text
|
||||||
* @return DataResult<UploadVO>
|
* @return DataResult<UploadVO>
|
||||||
|
@ -16,25 +16,21 @@ import lombok.SneakyThrows;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.*;
|
||||||
import org.w3c.dom.NamedNodeMap;
|
|
||||||
import org.w3c.dom.Node;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.SAXParser;
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ConverterServiceImpl
|
* ConverterServiceImpl
|
||||||
@ -58,13 +54,17 @@ public class ConverterServiceImpl implements ConverterService {
|
|||||||
* xml连接信息开始标志位
|
* xml连接信息开始标志位
|
||||||
**/
|
**/
|
||||||
private static final String BEGIN = "#BEGIN#";
|
private static final String BEGIN = "#BEGIN#";
|
||||||
/**
|
|
||||||
* xml连接信息结束标志位
|
|
||||||
**/
|
|
||||||
private static final String END = "#END#";
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DataSourceMapper dataSourceMapper;
|
private DataSourceMapper dataSourceMapper;
|
||||||
|
/**
|
||||||
|
* jdbc通用匹配ip和端口
|
||||||
|
*/
|
||||||
|
public static final Pattern IP_PORT = Pattern.compile("jdbc:(?<type>[a-z]+)://(?<host>[a-zA-Z0-9-//.]+):(?<port>[0-9]+)");
|
||||||
|
/**
|
||||||
|
* oracle匹配ip和端口
|
||||||
|
*/
|
||||||
|
public static final Pattern ORACLE_IP_PORT = Pattern.compile("jdbc:(?<type>[a-z]+):(?<child>[a-z]+):@(?<host>[a-zA-Z0-9-//.]+):(?<port>[0-9]+)");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UploadVO uploadFile(File file) {
|
public UploadVO uploadFile(File file) {
|
||||||
@ -137,7 +137,7 @@ public class ConverterServiceImpl implements ConverterService {
|
|||||||
List<String> configs = new ArrayList<>();
|
List<String> configs = new ArrayList<>();
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (int i = 0; i < items.length; i++) {
|
||||||
if (items[i].equals(BEGIN)) {
|
if (items[i].equals(BEGIN)) {
|
||||||
configs.add(items[i + 1]);
|
configs.add(XML_HEADER + items[i + 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (String config : configs) {
|
for (String config : configs) {
|
||||||
@ -149,19 +149,48 @@ public class ConverterServiceImpl implements ConverterService {
|
|||||||
//3、通过DocumentBuilder对象的parser方法加载xml文件到当前项目下
|
//3、通过DocumentBuilder对象的parser方法加载xml文件到当前项目下
|
||||||
try (InputStream inputStream = new ByteArrayInputStream(config.getBytes(StandardCharsets.UTF_8))) {
|
try (InputStream inputStream = new ByteArrayInputStream(config.getBytes(StandardCharsets.UTF_8))) {
|
||||||
Document document = db.parse(inputStream);
|
Document document = db.parse(inputStream);
|
||||||
//获取Connection节点的集合
|
// 获取根元素
|
||||||
NodeList connectList = document.getElementsByTagName("data-source");
|
Element rootElement = document.getDocumentElement();
|
||||||
//选中第一个节点
|
|
||||||
NamedNodeMap itemMap = connectList.item(0).getAttributes();
|
|
||||||
//创建datasource
|
//创建datasource
|
||||||
DataSourceDO dataSourceDO = new DataSourceDO();
|
DataSourceDO dataSourceDO = new DataSourceDO();
|
||||||
dataSourceDO.setAlias(itemMap.getNamedItem("name").getNodeValue());
|
LocalDateTime dateTime = LocalDateTime.now();
|
||||||
for (int i = 0; i < connectList.getLength(); i++) {
|
dataSourceDO.setGmtCreate(dateTime);
|
||||||
//通过 item(i)方法 获取一个Connection节点,nodeList的索引值从0开始
|
dataSourceDO.setGmtModified(dateTime);
|
||||||
Node connect = connectList.item(i);
|
dataSourceDO.setAlias(rootElement.getAttribute("name"));
|
||||||
//获取Connection节点的所有属性集合
|
// 获取子元素 database-info
|
||||||
NamedNodeMap attrs = connect.getAttributes();
|
Element databaseInfoElement = (Element) rootElement.getElementsByTagName("database-info").item(0);
|
||||||
|
|
||||||
|
// 获取连接相关信息
|
||||||
|
String type = databaseInfoElement.getAttribute("dbms");
|
||||||
|
String jdbcUrl = rootElement.getElementsByTagName("jdbc-url").item(0).getTextContent();
|
||||||
|
String username = rootElement.getElementsByTagName("user-name").item(0).getTextContent();
|
||||||
|
String driverName = rootElement.getElementsByTagName("jdbc-driver").item(0).getTextContent();
|
||||||
|
String host = "";
|
||||||
|
String port = "";
|
||||||
|
if (type.equals(DataBaseType.ORACLE.name())) {
|
||||||
|
// 创建 Matcher 对象
|
||||||
|
Matcher matcher = ORACLE_IP_PORT.matcher(jdbcUrl);
|
||||||
|
// 查找匹配的 IP 地址和端口号
|
||||||
|
if (matcher.find()) {
|
||||||
|
host = matcher.group("host");
|
||||||
|
port = matcher.group("port");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 创建 Matcher 对象
|
||||||
|
Matcher matcher = IP_PORT.matcher(jdbcUrl);
|
||||||
|
// 查找匹配的 IP 地址和端口号
|
||||||
|
if (matcher.find()) {
|
||||||
|
host = matcher.group("host");
|
||||||
|
port = matcher.group("port");
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
dataSourceDO.setHost(host);
|
||||||
|
dataSourceDO.setPort(port);
|
||||||
|
dataSourceDO.setUrl(jdbcUrl);
|
||||||
|
dataSourceDO.setUserName(username);
|
||||||
|
dataSourceDO.setDriver(driverName);
|
||||||
|
dataSourceDO.setType(type);
|
||||||
dataSourceMapper.insert(dataSourceDO);
|
dataSourceMapper.insert(dataSourceDO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user