初始化
25
.gitee/ISSUE_TEMPLATE.zh-CN.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
碰到问题,请在 <https://gitee.com/zhijiantianya/yudao-cloud/issues> 搜索是否存在相似的 issue。
|
||||||
|
|
||||||
|
不按照模板提交的 issue,会被系统自动删除。
|
||||||
|
|
||||||
|
### 基本信息
|
||||||
|
|
||||||
|
- ruoyi-vue-pro 版本:
|
||||||
|
- 操作系统:
|
||||||
|
- 数据库:
|
||||||
|
|
||||||
|
### 你猜测可能的原因
|
||||||
|
|
||||||
|
(必填)我花费了 2-4 小时自查,发现可能的原因是:xxxxxx
|
||||||
|
|
||||||
|
### 复现步骤
|
||||||
|
|
||||||
|
第一步,
|
||||||
|
|
||||||
|
第二步,
|
||||||
|
|
||||||
|
第三步,
|
||||||
|
|
||||||
|
### 报错信息
|
||||||
|
|
||||||
|
带上必要的截图
|
34
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
name: 问题反馈
|
||||||
|
about: 请详细描述,以便更高快的获得到解决
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
碰到问题,请在 <https://github.com/YunaiV/yudao-cloud/issues> 搜索是否存在相似的 issue。
|
||||||
|
|
||||||
|
不按照模板提交的 issue,会被系统自动删除。
|
||||||
|
|
||||||
|
### 基本信息
|
||||||
|
|
||||||
|
- ruoyi-vue-pro 版本:
|
||||||
|
- 操作系统:
|
||||||
|
- 数据库:
|
||||||
|
|
||||||
|
### 你猜测可能的原因
|
||||||
|
|
||||||
|
(必填)我花费了 2-4 小时自查,发现可能的原因是:xxxxxx
|
||||||
|
|
||||||
|
### 复现步骤
|
||||||
|
|
||||||
|
第一步,
|
||||||
|
|
||||||
|
第二步,
|
||||||
|
|
||||||
|
第三步,
|
||||||
|
|
||||||
|
### 报错信息
|
||||||
|
|
||||||
|
带上必要的截图
|
30
.github/workflows/maven.yml
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
|
||||||
|
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
||||||
|
|
||||||
|
name: Java CI with Maven
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
# pull_request:
|
||||||
|
# branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
java: [ '8', '11', '17' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Set up JDK ${{ matrix.Java }}
|
||||||
|
uses: actions/setup-java@v2
|
||||||
|
with:
|
||||||
|
java-version: ${{ matrix.java }}
|
||||||
|
distribution: 'temurin'
|
||||||
|
cache: maven
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -B package --file pom.xml -Dmaven.test.skip=true
|
75
.gitignore
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
|
||||||
|
# 查看更多 .gitignore 配置 -> https://help.github.com/articles/ignoring-files/
|
||||||
|
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
|
||||||
|
.flattened-pom.xml
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.class
|
||||||
|
target/*
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### admin-web ###
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
**/node_modules
|
||||||
|
|
||||||
|
# roadhog-api-doc ignore
|
||||||
|
/src/utils/request-temp.js
|
||||||
|
_roadhog-api-doc
|
||||||
|
|
||||||
|
# production
|
||||||
|
/dist
|
||||||
|
/.vscode
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
/coverage
|
||||||
|
.idea
|
||||||
|
yarn.lock
|
||||||
|
package-lock.json
|
||||||
|
*bak
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# visual studio code
|
||||||
|
.history
|
||||||
|
*.log
|
||||||
|
|
||||||
|
functions/mock
|
||||||
|
.temp/**
|
||||||
|
|
||||||
|
# umi
|
||||||
|
.umi
|
||||||
|
.umi-production
|
||||||
|
|
||||||
|
# screenshot
|
||||||
|
screenshot
|
||||||
|
.firebase
|
||||||
|
sessionStore
|
BIN
.image/Java监控.jpg
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
.image/MySQL.jpg
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
.image/OA请假-列表.jpg
Normal file
After Width: | Height: | Size: 152 KiB |
BIN
.image/OA请假-发起.jpg
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
.image/OA请假-详情.jpg
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
.image/Redis.jpg
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
.image/admin-uniapp/01.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
.image/admin-uniapp/02.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
.image/admin-uniapp/03.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
.image/admin-uniapp/04.png
Normal file
After Width: | Height: | Size: 9.7 KiB |
BIN
.image/admin-uniapp/05.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
.image/admin-uniapp/06.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
.image/admin-uniapp/07.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
.image/admin-uniapp/08.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
.image/admin-uniapp/09.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
.image/common/ai-feature.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
.image/common/ai-preview.gif
Normal file
After Width: | Height: | Size: 348 KiB |
BIN
.image/common/bpm-feature.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
.image/common/crm-feature.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
.image/common/erp-feature.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
.image/common/infra-feature.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
.image/common/mall-feature.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
.image/common/mall-preview.png
Normal file
After Width: | Height: | Size: 204 KiB |
BIN
.image/common/project-vs.png
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
.image/common/ruoyi-vue-pro-architecture.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
.image/common/ruoyi-vue-pro-biz.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
.image/common/system-feature.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
.image/common/yudao-cloud-architecture.png
Normal file
After Width: | Height: | Size: 201 KiB |
BIN
.image/common/yudao-roadmap.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
.image/个人中心.jpg
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
.image/代码生成.jpg
Normal file
After Width: | Height: | Size: 130 KiB |
BIN
.image/令牌管理.jpg
Normal file
After Width: | Height: | Size: 89 KiB |
BIN
.image/任务列表-审批.jpg
Normal file
After Width: | Height: | Size: 89 KiB |
BIN
.image/任务列表-已办.jpg
Normal file
After Width: | Height: | Size: 160 KiB |
BIN
.image/任务列表-待办.jpg
Normal file
After Width: | Height: | Size: 150 KiB |
BIN
.image/任务日志.jpg
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
.image/商户信息.jpg
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
.image/在线用户.jpg
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
.image/大屏设计器-列表.jpg
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
.image/大屏设计器-编辑.jpg
Normal file
After Width: | Height: | Size: 109 KiB |
BIN
.image/大屏设计器-预览.jpg
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
.image/字典数据.jpg
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
.image/字典类型.jpg
Normal file
After Width: | Height: | Size: 126 KiB |
BIN
.image/定时任务.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
.image/岗位管理.jpg
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
.image/应用信息-列表.jpg
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
.image/应用信息-编辑.jpg
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
.image/应用管理.jpg
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
.image/我的流程-列表.jpg
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
.image/我的流程-发起.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
.image/我的流程-详情.jpg
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
.image/报表设计器-图形报表.jpg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
.image/报表设计器-打印设计.jpg
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
.image/报表设计器-数据报表.jpg
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
.image/操作日志.jpg
Normal file
After Width: | Height: | Size: 98 KiB |
BIN
.image/支付订单.jpg
Normal file
After Width: | Height: | Size: 208 KiB |
BIN
.image/敏感词.jpg
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
.image/数据库文档.jpg
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
.image/文件管理.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
.image/文件管理2.jpg
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
.image/文件配置.jpg
Normal file
After Width: | Height: | Size: 116 KiB |
BIN
.image/日志中心.jpg
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
.image/流程模型-列表.jpg
Normal file
After Width: | Height: | Size: 173 KiB |
BIN
.image/流程模型-定义.jpg
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
.image/流程模型-设计.jpg
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
.image/流程表单.jpg
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
.image/生成效果.jpg
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
.image/用户分组.jpg
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
.image/用户管理.jpg
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
.image/登录.jpg
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
.image/登录日志.jpg
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
.image/短信日志.jpg
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
.image/短信模板.jpg
Normal file
After Width: | Height: | Size: 248 KiB |
BIN
.image/短信渠道.jpg
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
.image/租户套餐.png
Normal file
After Width: | Height: | Size: 96 KiB |
BIN
.image/租户管理.jpg
Normal file
After Width: | Height: | Size: 115 KiB |
BIN
.image/系统接口.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
.image/菜单管理.jpg
Normal file
After Width: | Height: | Size: 129 KiB |
BIN
.image/表单构建.jpg
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
.image/角色管理.jpg
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
.image/访问日志.jpg
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
.image/退款订单.jpg
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
.image/通知公告.jpg
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
.image/部门管理.jpg
Normal file
After Width: | Height: | Size: 109 KiB |
BIN
.image/配置管理.jpg
Normal file
After Width: | Height: | Size: 89 KiB |
BIN
.image/链路追踪.jpg
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
.image/错误日志.jpg
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
.image/错误码管理.jpg
Normal file
After Width: | Height: | Size: 131 KiB |
BIN
.image/首页.jpg
Normal file
After Width: | Height: | Size: 62 KiB |
20
LICENSE
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2021 yudao-cloud
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
4
lombok.config
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
config.stopBubbling = true
|
||||||
|
lombok.tostring.callsuper=CALL
|
||||||
|
lombok.equalsandhashcode.callsuper=CALL
|
||||||
|
lombok.accessors.chain=true
|
144
pom.xml
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>cn.iocoder.cloud</groupId>
|
||||||
|
<artifactId>yudao</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<modules>
|
||||||
|
<module>yudao-dependencies</module>
|
||||||
|
<module>yudao-gateway</module>
|
||||||
|
<module>yudao-framework</module>
|
||||||
|
<!-- 各种 module 拓展 -->
|
||||||
|
<module>yudao-module-system</module>
|
||||||
|
<module>yudao-module-infra</module>
|
||||||
|
<module>yudao-module-member</module>
|
||||||
|
<module>yudao-module-bpm</module>
|
||||||
|
<module>yudao-module-pay</module>
|
||||||
|
<module>yudao-module-report</module>
|
||||||
|
<module>yudao-module-mp</module>
|
||||||
|
<module>yudao-module-mall</module>
|
||||||
|
<module>yudao-module-erp</module>
|
||||||
|
<module>yudao-module-crm</module>
|
||||||
|
<!-- 友情提示:基于 Spring AI 实现 LLM 大模型的接入,需要使用 JDK17 版本,详细可见 https://doc.iocoder.cn/ai/build/ -->
|
||||||
|
<!-- <module>yudao-module-ai</module>-->
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<name>${project.artifactId}</name>
|
||||||
|
<description>芋道项目基础脚手架</description>
|
||||||
|
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<revision>2.2.0-jdk8-snapshot</revision>
|
||||||
|
<!-- Maven 相关 -->
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
|
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
|
||||||
|
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
||||||
|
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
|
||||||
|
<!-- 看看咋放到 bom 里 -->
|
||||||
|
<lombok.version>1.18.34</lombok.version>
|
||||||
|
<spring.boot.version>2.7.18</spring.boot.version>
|
||||||
|
<mapstruct.version>1.5.5.Final</mapstruct.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.iocoder.cloud</groupId>
|
||||||
|
<artifactId>yudao-dependencies</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<!-- maven-surefire-plugin 插件,用于运行单元测试。 -->
|
||||||
|
<!-- 注意,需要使用 3.0.X+,因为要支持 Junit 5 版本 -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${maven-surefire-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
|
||||||
|
<!-- https://stackoverflow.com/questions/33483697/re-run-spring-boot-configuration-annotation-processor-to-update-generated-metada -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
<version>${spring.boot.version}</version>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>org.mapstruct</groupId>
|
||||||
|
<artifactId>mapstruct-processor</artifactId>
|
||||||
|
<version>${mapstruct.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<!-- 统一 revision 版本 -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>flatten-maven-plugin</artifactId>
|
||||||
|
<version>${flatten-maven-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<flattenMode>resolveCiFriendliesOnly</flattenMode>
|
||||||
|
<updatePomFile>true</updatePomFile>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>flatten</goal>
|
||||||
|
</goals>
|
||||||
|
<id>flatten</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>clean</goal>
|
||||||
|
</goals>
|
||||||
|
<id>flatten.clean</id>
|
||||||
|
<phase>clean</phase>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<!-- 使用 huawei / aliyun 的 Maven 源,提升下载速度 -->
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>huaweicloud</id>
|
||||||
|
<name>huawei</name>
|
||||||
|
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>aliyunmaven</id>
|
||||||
|
<name>aliyun</name>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
</project>
|
162
script/docker/docker-compose.yml
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
yudao-gateway:
|
||||||
|
image: yudao-gateway
|
||||||
|
container_name: yudao-gateway
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
restart: always
|
||||||
|
network_mode: host # 以主机网络环境运行
|
||||||
|
yudao-system:
|
||||||
|
image: yudao-module-system-biz
|
||||||
|
container_name: yudao-system
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
healthcheck:
|
||||||
|
test: [ "CMD","curl","-f","http://localhost:48081" ]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
yudao-infra:
|
||||||
|
image: yudao-module-infra-biz
|
||||||
|
container_name: yudao-infra
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
healthcheck:
|
||||||
|
test: [ "CMD","curl","-f","http://localhost:48082" ]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s
|
||||||
|
depends_on:
|
||||||
|
yudao-system:
|
||||||
|
condition: service_healthy
|
||||||
|
yudao-report:
|
||||||
|
image: yudao-module-report-biz
|
||||||
|
container_name: yudao-report
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
yudao-infra:
|
||||||
|
condition: service_healthy
|
||||||
|
yudao-bpm:
|
||||||
|
image: yudao-module-bpm-biz
|
||||||
|
container_name: yudao-bpm
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
yudao-infra:
|
||||||
|
condition: service_healthy
|
||||||
|
yudao-pay:
|
||||||
|
image: yudao-module-pay-biz
|
||||||
|
container_name: yudao-pay
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
yudao-infra:
|
||||||
|
condition: service_healthy
|
||||||
|
yudao-mp:
|
||||||
|
image: yudao-module-mp-biz
|
||||||
|
container_name: yudao-mp
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||||
|
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||||
|
- SW_AGENT_NAME=yudao-gateway
|
||||||
|
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||||
|
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||||
|
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||||
|
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||||
|
volumes:
|
||||||
|
- /docker/yudao-cloud/logs:/root/logs/
|
||||||
|
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
yudao-infra:
|
||||||
|
condition: service_healthy
|
28
script/idea/http-client.env.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"local": {
|
||||||
|
"baseUrl": "http://127.0.0.1:48080/admin-api",
|
||||||
|
"systemBaseUrl": "http://127.0.0.1:48081/admin-api",
|
||||||
|
"infaBaseUrl": "http://127.0.0.1:48082/admin-api",
|
||||||
|
|
||||||
|
"token": "test1",
|
||||||
|
"adminTenentId": "1",
|
||||||
|
"tag": "${HOSTNAME}",
|
||||||
|
|
||||||
|
"appApi": "http://127.0.0.1:48080/app-api",
|
||||||
|
"appToken": "test1",
|
||||||
|
"appTenentId": "1"
|
||||||
|
},
|
||||||
|
"gateway": {
|
||||||
|
"baseUrl": "http://127.0.0.1:48080/admin-api",
|
||||||
|
"systemBaseUrl": "http://127.0.0.1:48080/admin-api",
|
||||||
|
"infaBaseUrl": "http://127.0.0.1:48080/admin-api",
|
||||||
|
|
||||||
|
"token": "test1",
|
||||||
|
"adminTenentId": "1",
|
||||||
|
"tag": "${HOSTNAME}",
|
||||||
|
|
||||||
|
"appApi": "http://127.0.0.1:8888/app-api",
|
||||||
|
"appToken": "test1",
|
||||||
|
"appTenentId": "1"
|
||||||
|
}
|
||||||
|
}
|
3
sql/db2/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
暂未适配 IBM DB2 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。
|
||||||
|
|
||||||
|
你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。
|
@ -0,0 +1,598 @@
|
|||||||
|
package liquibase.database.core;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import liquibase.CatalogAndSchema;
|
||||||
|
import liquibase.Scope;
|
||||||
|
import liquibase.database.AbstractJdbcDatabase;
|
||||||
|
import liquibase.database.DatabaseConnection;
|
||||||
|
import liquibase.database.OfflineConnection;
|
||||||
|
import liquibase.database.jvm.JdbcConnection;
|
||||||
|
import liquibase.exception.DatabaseException;
|
||||||
|
import liquibase.exception.UnexpectedLiquibaseException;
|
||||||
|
import liquibase.exception.ValidationErrors;
|
||||||
|
import liquibase.executor.ExecutorService;
|
||||||
|
import liquibase.statement.DatabaseFunction;
|
||||||
|
import liquibase.statement.SequenceCurrentValueFunction;
|
||||||
|
import liquibase.statement.SequenceNextValueFunction;
|
||||||
|
import liquibase.statement.core.RawCallStatement;
|
||||||
|
import liquibase.statement.core.RawSqlStatement;
|
||||||
|
import liquibase.structure.DatabaseObject;
|
||||||
|
import liquibase.structure.core.Catalog;
|
||||||
|
import liquibase.structure.core.Index;
|
||||||
|
import liquibase.structure.core.PrimaryKey;
|
||||||
|
import liquibase.structure.core.Schema;
|
||||||
|
import liquibase.util.JdbcUtils;
|
||||||
|
import liquibase.util.StringUtil;
|
||||||
|
|
||||||
|
public class DmDatabase extends AbstractJdbcDatabase {
|
||||||
|
private static final String PRODUCT_NAME = "DM DBMS";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getDefaultDatabaseProductName() {
|
||||||
|
return PRODUCT_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this AbstractDatabase subclass the correct one to use for the given connection.
|
||||||
|
*
|
||||||
|
* @param conn
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException {
|
||||||
|
return PRODUCT_NAME.equalsIgnoreCase(conn.getDatabaseProductName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this database understands the given url, return the default driver class name. Otherwise return null.
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getDefaultDriver(String url) {
|
||||||
|
if(url.startsWith("jdbc:dm")) {
|
||||||
|
return "dm.jdbc.driver.DmDriver";
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an all-lower-case short name of the product. Used for end-user selecting of database type
|
||||||
|
* such as the DBMS precondition.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getShortName() {
|
||||||
|
return "dm";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getDefaultPort() {
|
||||||
|
return 5236;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this database support initially deferrable columns.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean supportsInitiallyDeferrableColumns() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsTablespaces() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPriority() {
|
||||||
|
return PRIORITY_DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Pattern PROXY_USER = Pattern.compile(".*(?:thin|oci)\\:(.+)/@.*");
|
||||||
|
|
||||||
|
protected final int SHORT_IDENTIFIERS_LENGTH = 30;
|
||||||
|
protected final int LONG_IDENTIFIERS_LEGNTH = 128;
|
||||||
|
public static final int ORACLE_12C_MAJOR_VERSION = 12;
|
||||||
|
|
||||||
|
private Set<String> reservedWords = new HashSet<>();
|
||||||
|
private Set<String> userDefinedTypes;
|
||||||
|
private Map<String, String> savedSessionNlsSettings;
|
||||||
|
|
||||||
|
private Boolean canAccessDbaRecycleBin;
|
||||||
|
private Integer databaseMajorVersion;
|
||||||
|
private Integer databaseMinorVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor for an object that represents the Oracle Database DBMS.
|
||||||
|
*/
|
||||||
|
public DmDatabase() {
|
||||||
|
super.unquotedObjectsAreUppercased = true;
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
super.setCurrentDateTimeFunction("SYSTIMESTAMP");
|
||||||
|
// Setting list of Oracle's native functions
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
dateFunctions.add(new DatabaseFunction("SYSDATE"));
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
dateFunctions.add(new DatabaseFunction("SYSTIMESTAMP"));
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
dateFunctions.add(new DatabaseFunction("CURRENT_TIMESTAMP"));
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
super.sequenceNextValueFunction = "%s.nextval";
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
super.sequenceCurrentValueFunction = "%s.currval";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryProxySession(final String url, final Connection con) {
|
||||||
|
Matcher m = PROXY_USER.matcher(url);
|
||||||
|
if (m.matches()) {
|
||||||
|
Properties props = new Properties();
|
||||||
|
props.put("PROXY_USER_NAME", m.group(1));
|
||||||
|
try {
|
||||||
|
Method method = con.getClass().getMethod("openProxySession", int.class, Properties.class);
|
||||||
|
method.setAccessible(true);
|
||||||
|
method.invoke(con, 1, props);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Scope.getCurrentScope().getLog(getClass()).info("Could not open proxy session on OracleDatabase: " + e.getCause().getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDatabaseMajorVersion() throws DatabaseException {
|
||||||
|
if (databaseMajorVersion == null) {
|
||||||
|
return super.getDatabaseMajorVersion();
|
||||||
|
} else {
|
||||||
|
return databaseMajorVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDatabaseMinorVersion() throws DatabaseException {
|
||||||
|
if (databaseMinorVersion == null) {
|
||||||
|
return super.getDatabaseMinorVersion();
|
||||||
|
} else {
|
||||||
|
return databaseMinorVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getJdbcCatalogName(CatalogAndSchema schema) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getJdbcSchemaName(CatalogAndSchema schema) {
|
||||||
|
return correctObjectName((schema.getCatalogName() == null) ? schema.getSchemaName() : schema.getCatalogName(), Schema.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getAutoIncrementClause(final String generationType, final Boolean defaultOnNull) {
|
||||||
|
if (StringUtil.isEmpty(generationType)) {
|
||||||
|
return super.getAutoIncrementClause();
|
||||||
|
}
|
||||||
|
|
||||||
|
String autoIncrementClause = "GENERATED %s AS IDENTITY"; // %s -- [ ALWAYS | BY DEFAULT [ ON NULL ] ]
|
||||||
|
String generationStrategy = generationType;
|
||||||
|
if (Boolean.TRUE.equals(defaultOnNull) && generationType.toUpperCase().equals("BY DEFAULT")) {
|
||||||
|
generationStrategy += " ON NULL";
|
||||||
|
}
|
||||||
|
return String.format(autoIncrementClause, generationStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String generatePrimaryKeyName(String tableName) {
|
||||||
|
if (tableName.length() > 27) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
return "PK_" + tableName.toUpperCase(Locale.US).substring(0, 27);
|
||||||
|
} else {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
return "PK_" + tableName.toUpperCase(Locale.US);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isReservedWord(String objectName) {
|
||||||
|
return reservedWords.contains(objectName.toUpperCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsSequences() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Oracle supports catalogs in liquibase terms
|
||||||
|
*
|
||||||
|
* @return false
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean supportsSchemas() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getConnectionCatalogName() throws DatabaseException {
|
||||||
|
if (getConnection() instanceof OfflineConnection) {
|
||||||
|
return getConnection().getCatalog();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
return Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForObject(new RawCallStatement("select sys_context( 'userenv', 'current_schema' ) from dual"), String.class);
|
||||||
|
} catch (Exception e) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
Scope.getCurrentScope().getLog(getClass()).info("Error getting default schema", e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDefaultCatalogName() {//NOPMD
|
||||||
|
return (super.getDefaultCatalogName() == null) ? null : super.getDefaultCatalogName().toUpperCase(Locale.US);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns an Oracle date literal with the same value as a string formatted using ISO 8601.</p>
|
||||||
|
*
|
||||||
|
* <p>Convert an ISO8601 date string to one of the following results:
|
||||||
|
* to_date('1995-05-23', 'YYYY-MM-DD')
|
||||||
|
* to_date('1995-05-23 09:23:59', 'YYYY-MM-DD HH24:MI:SS')</p>
|
||||||
|
* <p>
|
||||||
|
* Implementation restriction:<br>
|
||||||
|
* Currently, only the following subsets of ISO8601 are supported:<br>
|
||||||
|
* <ul>
|
||||||
|
* <li>YYYY-MM-DD</li>
|
||||||
|
* <li>YYYY-MM-DDThh:mm:ss</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getDateLiteral(String isoDate) {
|
||||||
|
String normalLiteral = super.getDateLiteral(isoDate);
|
||||||
|
|
||||||
|
if (isDateOnly(isoDate)) {
|
||||||
|
return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD')";
|
||||||
|
} else if (isTimeOnly(isoDate)) {
|
||||||
|
return "TO_DATE(" + normalLiteral + ", 'HH24:MI:SS')";
|
||||||
|
} else if (isTimestamp(isoDate)) {
|
||||||
|
return "TO_TIMESTAMP(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS.FF')";
|
||||||
|
} else if (isDateTime(isoDate)) {
|
||||||
|
int seppos = normalLiteral.lastIndexOf('.');
|
||||||
|
if (seppos != -1) {
|
||||||
|
normalLiteral = normalLiteral.substring(0, seppos) + "'";
|
||||||
|
}
|
||||||
|
return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS')";
|
||||||
|
}
|
||||||
|
return "UNSUPPORTED:" + isoDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSystemObject(DatabaseObject example) {
|
||||||
|
if (example == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.isLiquibaseObject(example)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (example instanceof Schema) {
|
||||||
|
//noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
|
||||||
|
if ("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
|
||||||
|
if ("SYSTEM".equals(example.getSchema().getCatalogName()) || "SYS".equals(example.getSchema().getCatalogName()) || "CTXSYS".equals(example.getSchema().getCatalogName()) || "XDB".equals(example.getSchema().getCatalogName())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (isSystemObject(example.getSchema())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (example instanceof Catalog) {
|
||||||
|
//noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
|
||||||
|
if (("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName()))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (example.getName() != null) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("BIN$")) { //oracle deleted table
|
||||||
|
boolean filteredInOriginalQuery = this.canAccessDbaRecycleBin();
|
||||||
|
if (!filteredInOriginalQuery) {
|
||||||
|
filteredInOriginalQuery = StringUtil.trimToEmpty(example.getSchema().getName()).equalsIgnoreCase(this.getConnection().getConnectionUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filteredInOriginalQuery) {
|
||||||
|
return !((example instanceof PrimaryKey) || (example instanceof Index) || (example instanceof
|
||||||
|
liquibase.statement.UniqueConstraint));
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("AQ$")) { //oracle AQ tables
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("DR$")) { //oracle index tables
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("SYS_IOT_OVER")) { //oracle system table
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral,HardCodedStringLiteral
|
||||||
|
if ((example.getName().startsWith("MDRT_") || example.getName().startsWith("MDRS_")) && example.getName().endsWith("$")) {
|
||||||
|
// CORE-1768 - Oracle creates these for spatial indices and will remove them when the index is removed.
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("MLOG$_")) { //Created by materliaized view logs for every table that is part of a materialized view. Not available for DDL operations.
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("RUPD$_")) { //Created by materialized view log tables using primary keys. Not available for DDL operations.
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("WM$_")) { //Workspace Manager backup tables.
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if ("CREATE$JAVA$LOB$TABLE".equals(example.getName())) { //This table contains the name of the Java object, the date it was loaded, and has a BLOB column to store the Java object.
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if ("JAVA$CLASS$MD5$TABLE".equals(example.getName())) { //This is a hash table that tracks the loading of Java objects into a schema.
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("ISEQ$$_")) { //System-generated sequence
|
||||||
|
return true;
|
||||||
|
} else //noinspection HardCodedStringLiteral
|
||||||
|
if (example.getName().startsWith("USLOG$")) { //for update materialized view
|
||||||
|
return true;
|
||||||
|
} else if (example.getName().startsWith("SYS_FBA")) { //for Flashback tables
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.isSystemObject(example);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsAutoIncrement() {
|
||||||
|
// Oracle supports Identity beginning with version 12c
|
||||||
|
boolean isAutoIncrementSupported = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (getDatabaseMajorVersion() >= 12) {
|
||||||
|
isAutoIncrementSupported = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returning true will generate create table command with 'IDENTITY' clause, example:
|
||||||
|
// CREATE TABLE AutoIncTest (IDPrimaryKey NUMBER(19) GENERATED BY DEFAULT AS IDENTITY NOT NULL, TypeID NUMBER(3) NOT NULL, Description NVARCHAR2(50), CONSTRAINT PK_AutoIncTest PRIMARY KEY (IDPrimaryKey));
|
||||||
|
|
||||||
|
// While returning false will continue to generate create table command without 'IDENTITY' clause, example:
|
||||||
|
// CREATE TABLE AutoIncTest (IDPrimaryKey NUMBER(19) NOT NULL, TypeID NUMBER(3) NOT NULL, Description NVARCHAR2(50), CONSTRAINT PK_AutoIncTest PRIMARY KEY (IDPrimaryKey));
|
||||||
|
|
||||||
|
} catch (DatabaseException ex) {
|
||||||
|
isAutoIncrementSupported = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isAutoIncrementSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public Set<UniqueConstraint> findUniqueConstraints(String schema) throws DatabaseException {
|
||||||
|
// Set<UniqueConstraint> returnSet = new HashSet<UniqueConstraint>();
|
||||||
|
//
|
||||||
|
// List<Map> maps = new Executor(this).queryForList(new RawSqlStatement("SELECT UC.CONSTRAINT_NAME, UCC.TABLE_NAME, UCC.COLUMN_NAME FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC WHERE UC.CONSTRAINT_NAME=UCC.CONSTRAINT_NAME AND CONSTRAINT_TYPE='U' ORDER BY UC.CONSTRAINT_NAME"));
|
||||||
|
//
|
||||||
|
// UniqueConstraint constraint = null;
|
||||||
|
// for (Map map : maps) {
|
||||||
|
// if (constraint == null || !constraint.getName().equals(constraint.getName())) {
|
||||||
|
// returnSet.add(constraint);
|
||||||
|
// Table table = new Table((String) map.get("TABLE_NAME"));
|
||||||
|
// constraint = new UniqueConstraint(map.get("CONSTRAINT_NAME").toString(), table);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (constraint != null) {
|
||||||
|
// returnSet.add(constraint);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return returnSet;
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsRestrictForeignKeys() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDataTypeMaxParameters(String dataTypeName) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
if ("BINARY_FLOAT".equals(dataTypeName.toUpperCase())) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
if ("BINARY_DOUBLE".equals(dataTypeName.toUpperCase())) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return super.getDataTypeMaxParameters(dataTypeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSystemTableWhereClause(String tableNameColumn) {
|
||||||
|
List<String> clauses = new ArrayList<String>(Arrays.asList("BIN$",
|
||||||
|
"AQ$",
|
||||||
|
"DR$",
|
||||||
|
"SYS_IOT_OVER",
|
||||||
|
"MLOG$_",
|
||||||
|
"RUPD$_",
|
||||||
|
"WM$_",
|
||||||
|
"ISEQ$$_",
|
||||||
|
"USLOG$",
|
||||||
|
"SYS_FBA"));
|
||||||
|
|
||||||
|
for (int i = 0;i<clauses.size(); i++) {
|
||||||
|
clauses.set(i, tableNameColumn+" NOT LIKE '"+clauses.get(i)+"%'");
|
||||||
|
}
|
||||||
|
return "("+ StringUtil.join(clauses, " AND ") + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean jdbcCallsCatalogsSchemas() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getUserDefinedTypes() {
|
||||||
|
if (userDefinedTypes == null) {
|
||||||
|
userDefinedTypes = new HashSet<>();
|
||||||
|
if ((getConnection() != null) && !(getConnection() instanceof OfflineConnection)) {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
userDefinedTypes.addAll(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForList(new RawSqlStatement("SELECT DISTINCT TYPE_NAME FROM ALL_TYPES"), String.class));
|
||||||
|
} catch (DatabaseException e) { //fall back to USER_TYPES if the user cannot see ALL_TYPES
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
userDefinedTypes.addAll(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForList(new RawSqlStatement("SELECT TYPE_NAME FROM USER_TYPES"), String.class));
|
||||||
|
}
|
||||||
|
} catch (DatabaseException e) {
|
||||||
|
//ignore error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return userDefinedTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String generateDatabaseFunctionValue(DatabaseFunction databaseFunction) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
if ((databaseFunction != null) && "current_timestamp".equalsIgnoreCase(databaseFunction.toString())) {
|
||||||
|
return databaseFunction.toString();
|
||||||
|
}
|
||||||
|
if ((databaseFunction instanceof SequenceNextValueFunction) || (databaseFunction instanceof
|
||||||
|
SequenceCurrentValueFunction)) {
|
||||||
|
String quotedSeq = super.generateDatabaseFunctionValue(databaseFunction);
|
||||||
|
// replace "myschema.my_seq".nextval with "myschema"."my_seq".nextval
|
||||||
|
return quotedSeq.replaceFirst("\"([^\\.\"]+)\\.([^\\.\"]+)\"", "\"$1\".\"$2\"");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.generateDatabaseFunctionValue(databaseFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ValidationErrors validate() {
|
||||||
|
ValidationErrors errors = super.validate();
|
||||||
|
DatabaseConnection connection = getConnection();
|
||||||
|
if ((connection == null) || (connection instanceof OfflineConnection)) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
Scope.getCurrentScope().getLog(getClass()).info("Cannot validate offline database");
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!canAccessDbaRecycleBin()) {
|
||||||
|
errors.addWarning(getDbaRecycleBinWarning());
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDbaRecycleBinWarning() {
|
||||||
|
//noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,
|
||||||
|
// HardCodedStringLiteral
|
||||||
|
//noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
|
||||||
|
return "Liquibase needs to access the DBA_RECYCLEBIN table so we can automatically handle the case where " +
|
||||||
|
"constraints are deleted and restored. Since Oracle doesn't properly restore the original table names " +
|
||||||
|
"referenced in the constraint, we use the information from the DBA_RECYCLEBIN to automatically correct this" +
|
||||||
|
" issue.\n" +
|
||||||
|
"\n" +
|
||||||
|
"The user you used to connect to the database (" + getConnection().getConnectionUserName() +
|
||||||
|
") needs to have \"SELECT ON SYS.DBA_RECYCLEBIN\" permissions set before we can perform this operation. " +
|
||||||
|
"Please run the following SQL to set the appropriate permissions, and try running the command again.\n" +
|
||||||
|
"\n" +
|
||||||
|
" GRANT SELECT ON SYS.DBA_RECYCLEBIN TO " + getConnection().getConnectionUserName() + ";";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canAccessDbaRecycleBin() {
|
||||||
|
if (canAccessDbaRecycleBin == null) {
|
||||||
|
DatabaseConnection connection = getConnection();
|
||||||
|
if ((connection == null) || (connection instanceof OfflineConnection)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Statement statement = null;
|
||||||
|
try {
|
||||||
|
statement = ((JdbcConnection) connection).createStatement();
|
||||||
|
@SuppressWarnings("HardCodedStringLiteral") ResultSet resultSet = statement.executeQuery("select 1 from dba_recyclebin where 0=1");
|
||||||
|
resultSet.close(); //don't need to do anything with the result set, just make sure statement ran.
|
||||||
|
this.canAccessDbaRecycleBin = true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
if ((e instanceof SQLException) && e.getMessage().startsWith("ORA-00942")) { //ORA-00942: table or view does not exist
|
||||||
|
this.canAccessDbaRecycleBin = false;
|
||||||
|
} else {
|
||||||
|
//noinspection HardCodedStringLiteral
|
||||||
|
Scope.getCurrentScope().getLog(getClass()).warning("Cannot check dba_recyclebin access", e);
|
||||||
|
this.canAccessDbaRecycleBin = false;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
JdbcUtils.close(null, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return canAccessDbaRecycleBin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsNotNullConstraintNames() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if the given String would be a valid identifier in Oracle DBMS. In Oracle, a valid identifier has
|
||||||
|
* the following form (case-insensitive comparison):
|
||||||
|
* 1st character: A-Z
|
||||||
|
* 2..n characters: A-Z0-9$_#
|
||||||
|
* The maximum length of an identifier differs by Oracle version and object type.
|
||||||
|
*/
|
||||||
|
public boolean isValidOracleIdentifier(String identifier, Class<? extends DatabaseObject> type) {
|
||||||
|
if ((identifier == null) || (identifier.length() < 1))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!identifier.matches("^(i?)[A-Z][A-Z0-9\\$\\_\\#]*$"))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @todo It seems we currently do not have a class for tablespace identifiers, and all other classes
|
||||||
|
* we do know seem to be supported as 12cR2 long identifiers, so:
|
||||||
|
*/
|
||||||
|
return (identifier.length() <= LONG_IDENTIFIERS_LEGNTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the maximum number of bytes (NOT: characters) for an identifier. For Oracle <=12c Release 20, this
|
||||||
|
* is 30 bytes, and starting from 12cR2, up to 128 (except for tablespaces, PDB names and some other rather rare
|
||||||
|
* object types).
|
||||||
|
*
|
||||||
|
* @return the maximum length of an object identifier, in bytes
|
||||||
|
*/
|
||||||
|
public int getIdentifierMaximumLength() {
|
||||||
|
try {
|
||||||
|
if (getDatabaseMajorVersion() < ORACLE_12C_MAJOR_VERSION) {
|
||||||
|
return SHORT_IDENTIFIERS_LENGTH;
|
||||||
|
} else if ((getDatabaseMajorVersion() == ORACLE_12C_MAJOR_VERSION) && (getDatabaseMinorVersion() <= 1)) {
|
||||||
|
return SHORT_IDENTIFIERS_LENGTH;
|
||||||
|
} else {
|
||||||
|
return LONG_IDENTIFIERS_LEGNTH;
|
||||||
|
}
|
||||||
|
} catch (DatabaseException ex) {
|
||||||
|
throw new UnexpectedLiquibaseException("Cannot determine the Oracle database version number", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|