mirror of
https://github.com/dbeaver/cloudbeaver.git
synced 2026-09-24 16:04:36 +08:00
#8 Database schema create
This commit is contained in:
@@ -20,7 +20,14 @@
|
||||
driver="h2_embedded",
|
||||
url: "jdbc:h2:${workspace}/.data/cb.h2.dat",
|
||||
|
||||
createDatabase: true
|
||||
createDatabase: true,
|
||||
|
||||
pool: {
|
||||
minIdleConnections: 4,
|
||||
maxIdleConnections: 10,
|
||||
maxConnections: 100,
|
||||
validationQuery: "SELECT 1"
|
||||
}
|
||||
}
|
||||
},
|
||||
app: {
|
||||
|
||||
@@ -23,9 +23,9 @@ Require-Bundle: org.eclipse.core.runtime;visibility:=reexport,
|
||||
org.eclipse.jetty.servlet;visibility:=reexport,
|
||||
org.eclipse.jetty.util;visibility:=reexport,
|
||||
com.google.gson;visibility:=reexport,
|
||||
org.jkiss.bundle.graphql.java;visibility:=reexport
|
||||
org.jkiss.bundle.graphql.java;visibility:=reexport,
|
||||
org.jkiss.bundle.apache.dbcp
|
||||
Export-Package: io.cloudbeaver,
|
||||
io.cloudbeaver.api,
|
||||
io.cloudbeaver.server,
|
||||
io.cloudbeaver.model,
|
||||
io.cloudbeaver.model.resources,
|
||||
|
||||
@@ -16,21 +16,28 @@
|
||||
*/
|
||||
package io.cloudbeaver.server;
|
||||
|
||||
import org.apache.commons.dbcp2.DriverConnectionFactory;
|
||||
import org.apache.commons.dbcp2.PoolableConnection;
|
||||
import org.apache.commons.dbcp2.PoolableConnectionFactory;
|
||||
import org.apache.commons.dbcp2.PoolingDataSource;
|
||||
import org.apache.commons.pool2.impl.GenericObjectPool;
|
||||
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
||||
import org.jkiss.dbeaver.DBException;
|
||||
import org.jkiss.dbeaver.Log;
|
||||
import org.jkiss.dbeaver.model.DBConstants;
|
||||
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
|
||||
import org.jkiss.dbeaver.model.runtime.LoggingProgressMonitor;
|
||||
import org.jkiss.dbeaver.registry.DataSourceProviderRegistry;
|
||||
import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
|
||||
import org.jkiss.dbeaver.utils.ContentUtils;
|
||||
import org.jkiss.dbeaver.utils.GeneralUtils;
|
||||
import org.jkiss.dbeaver.utils.SystemVariablesResolver;
|
||||
import org.jkiss.utils.CommonUtils;
|
||||
import org.jkiss.utils.IOUtils;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.Driver;
|
||||
import java.sql.SQLException;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
@@ -38,16 +45,21 @@ import java.util.Properties;
|
||||
*/
|
||||
public class CBDatabase {
|
||||
private static final Log log = Log.getLog(CBDatabase.class);
|
||||
public static final String SCHEMA_SQL_PATH = "db/cb-schema.sql";
|
||||
|
||||
private final CBApplication application;
|
||||
private final CBDatabaseConfig databaseConfiguration;
|
||||
private Connection connection;
|
||||
private PoolingDataSource<PoolableConnection> cdDataSource;
|
||||
|
||||
public CBDatabase(CBApplication application, CBDatabaseConfig databaseConfiguration) {
|
||||
this.application = application;
|
||||
this.databaseConfiguration = databaseConfiguration;
|
||||
}
|
||||
|
||||
public PoolingDataSource<PoolableConnection> getConnectionPool() {
|
||||
return cdDataSource;
|
||||
}
|
||||
|
||||
void connect() throws DBException {
|
||||
if (CommonUtils.isEmpty(databaseConfiguration.getDriver())) {
|
||||
throw new DBException("Database driver not specified");
|
||||
@@ -71,23 +83,72 @@ public class CBDatabase {
|
||||
dbProperties.put(DBConstants.DATA_SOURCE_PROPERTY_PASSWORD, databaseConfiguration.getPassword());
|
||||
}
|
||||
}
|
||||
try {
|
||||
connection = driverInstance.connect(dbURL, dbProperties);
|
||||
} catch (SQLException e) {
|
||||
throw new DBException("Error connecting to '" + dbURL + "'", e);
|
||||
}
|
||||
|
||||
try {
|
||||
// Create connection pool with custom connection factory
|
||||
DriverConnectionFactory conFactory = new DriverConnectionFactory(driverInstance, dbURL, dbProperties);
|
||||
PoolableConnectionFactory pcf = new PoolableConnectionFactory(conFactory, null);
|
||||
pcf.setValidationQuery(databaseConfiguration.getPool().getValidationQuery());
|
||||
|
||||
GenericObjectPoolConfig<PoolableConnection> config = new GenericObjectPoolConfig<>();
|
||||
config.setMinIdle(databaseConfiguration.getPool().getMinIdleConnections());
|
||||
config.setMaxIdle(databaseConfiguration.getPool().getMaxIdleConnections());
|
||||
config.setMaxTotal(databaseConfiguration.getPool().getMaxConnections());
|
||||
GenericObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(pcf, config);
|
||||
pcf.setPool(connectionPool);
|
||||
cdDataSource = new PoolingDataSource<>(connectionPool);
|
||||
|
||||
try (Connection connection = cdDataSource.getConnection()) {
|
||||
DatabaseMetaData metaData = connection.getMetaData();
|
||||
log.debug("Connected to " + metaData.getDatabaseProductName() + " " + metaData.getDatabaseProductVersion());
|
||||
} catch (SQLException e) {
|
||||
throw new DBException("Error getting database metadata", e);
|
||||
throw new DBException("Error connecting to '" + dbURL + "'", e);
|
||||
}
|
||||
|
||||
checkDatabaseStructure();
|
||||
}
|
||||
|
||||
private void checkDatabaseStructure() {
|
||||
|
||||
private void checkDatabaseStructure() throws DBException {
|
||||
try (Connection connection = cdDataSource.getConnection()) {
|
||||
boolean schemaExists = false;
|
||||
try (Statement dbStat = connection.createStatement()) {
|
||||
try (ResultSet dbResult = dbStat.executeQuery("SELECT * FROM CB_SERVER")) {
|
||||
schemaExists = true;
|
||||
} catch (SQLException e) {
|
||||
schemaExists = false;
|
||||
}
|
||||
}
|
||||
if (!schemaExists) {
|
||||
createDatabaseSchema(connection);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
throw new DBException("Error initializing schema", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void createDatabaseSchema(Connection connection) throws DBException {
|
||||
log.debug("Create database schema");
|
||||
InputStream ddlStream = getClass().getClassLoader().getResourceAsStream(SCHEMA_SQL_PATH);
|
||||
if (ddlStream == null) {
|
||||
throw new DBException("Can't find schema file " + SCHEMA_SQL_PATH);
|
||||
}
|
||||
try {
|
||||
ByteArrayOutputStream ddlBuffer = new ByteArrayOutputStream();
|
||||
IOUtils.copyStream(ddlStream, ddlBuffer);
|
||||
String ddl = new String(ddlBuffer.toByteArray(), StandardCharsets.UTF_8);
|
||||
for (String line : ddl.split(";")) {
|
||||
line = line.trim();
|
||||
if (line.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
try (Statement dbStat = connection.createStatement()) {
|
||||
dbStat.execute(line);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new DBException("Error processing schema DDL", e);
|
||||
} finally {
|
||||
ContentUtils.close(ddlStream);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+26
-14
@@ -31,6 +31,30 @@ public class CBDatabaseConfig {
|
||||
private String password;
|
||||
|
||||
private boolean createDatabase;
|
||||
private final Pool pool = new Pool();
|
||||
|
||||
public static class Pool {
|
||||
private int minIdleConnections = 2;
|
||||
private int maxIdleConnections = 10;
|
||||
private int maxConnections = 1000;
|
||||
private String validationQuery = "SELECT 1";
|
||||
|
||||
public int getMinIdleConnections() {
|
||||
return minIdleConnections;
|
||||
}
|
||||
|
||||
public int getMaxIdleConnections() {
|
||||
return maxIdleConnections;
|
||||
}
|
||||
|
||||
public int getMaxConnections() {
|
||||
return maxConnections;
|
||||
}
|
||||
|
||||
public String getValidationQuery() {
|
||||
return validationQuery;
|
||||
}
|
||||
}
|
||||
|
||||
public String getDriver() {
|
||||
return driver;
|
||||
@@ -44,31 +68,19 @@ public class CBDatabaseConfig {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(String user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public boolean isCreateDatabase() {
|
||||
return createDatabase;
|
||||
}
|
||||
|
||||
public void setCreateDatabase(boolean createDatabase) {
|
||||
this.createDatabase = createDatabase;
|
||||
public Pool getPool() {
|
||||
return pool;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<setEntry value="org.jkiss.dbeaver.db.feature:default"/>
|
||||
<setEntry value="org.jkiss.dbeaver.runtime.feature:default"/>
|
||||
</setAttribute>
|
||||
<stringAttribute key="selected_target_plugins" value="com.github.jsqlparser@default:default,com.google.gson@default:default,com.google.guava*27.1.0.v20190517-1946@default:default,com.ibm.icu.base@default:default,com.jcraft.jsch@default:default,com.jcraft.jzlib@default:default,com.sun.jna*4.5.1.v20190425-1842@default:default,com.sun.jna.platform*4.5.1.v20190425-1842@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet*3.1.0.v201410161800@default:default,javax.xml@default:default,net.sf.opencsv@default:default,org.apache.batik.constants@default:default,org.apache.batik.css@default:default,org.apache.batik.i18n@default:default,org.apache.batik.util@default:default,org.apache.commons.io@default:default,org.apache.commons.jexl@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.scr@1:true,org.apache.log4j@default:default,org.apache.lucene.analyzers-common*8.0.0.v20190404-1858@default:default,org.apache.lucene.analyzers-smartcn@default:default,org.apache.lucene.core*8.0.0.v20190404-1858@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.apache.xmlgraphics@default:default,org.bouncycastle.bcpkix@default:default,org.bouncycastle.bcprov@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.win32.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.win32.x86_64@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources.win32.x86_64@default:false,org.eclipse.core.resources@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions.supplier@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.win32.x86_64@default:false,org.eclipse.equinox.security@default:default,org.eclipse.jdt.annotation*2.2.300.v20190328-1431@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.team.core@default:default,org.eclipse.text@default:default,org.jkiss.bundle.gis@default:default,org.jkiss.bundle.graphql.java@default:default,org.jkiss.bundle.sshj@default:default,org.objectweb.asm*7.1.0.v20190412-2143@default:default,org.slf4j.api*1.7.10.v20170428-1633@default:default,org.tukaani.xz@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default,stax.api@default:default"/>
|
||||
<stringAttribute key="selected_target_plugins" value="com.github.jsqlparser@default:default,com.google.gson@default:default,com.google.guava*27.1.0.v20190517-1946@default:default,com.ibm.icu.base@default:default,com.jcraft.jsch@default:default,com.jcraft.jzlib@default:default,com.sun.jna*4.5.1.v20190425-1842@default:default,com.sun.jna.platform*4.5.1.v20190425-1842@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet*3.1.0.v201410161800@default:default,javax.xml@default:default,net.sf.opencsv@default:default,org.apache.batik.constants@default:default,org.apache.batik.css@default:default,org.apache.batik.i18n@default:default,org.apache.batik.util@default:default,org.apache.commons.io@default:default,org.apache.commons.jexl@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.scr@1:true,org.apache.log4j@default:default,org.apache.lucene.analyzers-common*8.0.0.v20190404-1858@default:default,org.apache.lucene.analyzers-smartcn@default:default,org.apache.lucene.core*8.0.0.v20190404-1858@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.apache.xmlgraphics@default:default,org.bouncycastle.bcpkix@default:default,org.bouncycastle.bcprov@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.win32.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.win32.x86_64@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources.win32.x86_64@default:false,org.eclipse.core.resources@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions.supplier@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.win32.x86_64@default:false,org.eclipse.equinox.security@default:default,org.eclipse.jdt.annotation*2.2.300.v20190328-1431@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.team.core@default:default,org.eclipse.text@default:default,org.jkiss.bundle.apache.dbcp@default:default,org.jkiss.bundle.gis@default:default,org.jkiss.bundle.graphql.java@default:default,org.jkiss.bundle.sshj@default:default,org.objectweb.asm*7.1.0.v20190412-2143@default:default,org.slf4j.api*1.7.10.v20170428-1633@default:default,org.tukaani.xz@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default,stax.api@default:default"/>
|
||||
<stringAttribute key="selected_workspace_plugins" value="io.cloudbeaver.connect.provider.sample@default:default,io.cloudbeaver.resources.drivers.base@default:default,io.cloudbeaver.server@default:default,io.cloudbeaver.service.admin@default:default,io.cloudbeaver.service.auth@default:default,io.cloudbeaver.service.data.transfer@default:default,io.cloudbeaver.service.metadata@default:default,org.jkiss.dbeaver.cmp.simple@default:default,org.jkiss.dbeaver.data.gis@default:default,org.jkiss.dbeaver.data.transfer@default:default,org.jkiss.dbeaver.ext.clickhouse@default:default,org.jkiss.dbeaver.ext.db2.i@default:default,org.jkiss.dbeaver.ext.db2.zos@default:default,org.jkiss.dbeaver.ext.derby@default:default,org.jkiss.dbeaver.ext.firebird@default:default,org.jkiss.dbeaver.ext.generic@default:default,org.jkiss.dbeaver.ext.greenplum@default:default,org.jkiss.dbeaver.ext.h2@default:default,org.jkiss.dbeaver.ext.h2gis@default:default,org.jkiss.dbeaver.ext.hana@default:default,org.jkiss.dbeaver.ext.hive@default:default,org.jkiss.dbeaver.ext.hsqldb@default:default,org.jkiss.dbeaver.ext.informix@default:default,org.jkiss.dbeaver.ext.kognitio@default:default,org.jkiss.dbeaver.ext.mssql@default:default,org.jkiss.dbeaver.ext.mysql@default:default,org.jkiss.dbeaver.ext.netezza@default:default,org.jkiss.dbeaver.ext.opendistro@default:default,org.jkiss.dbeaver.ext.oracle@default:default,org.jkiss.dbeaver.ext.phoenix@default:default,org.jkiss.dbeaver.ext.postgresql@default:default,org.jkiss.dbeaver.ext.snowflake.core@default:default,org.jkiss.dbeaver.ext.teradata@default:default,org.jkiss.dbeaver.ext.vertica@default:default,org.jkiss.dbeaver.model.sql@default:default,org.jkiss.dbeaver.model@default:default,org.jkiss.dbeaver.net.ssh.sshj@default:default,org.jkiss.dbeaver.net.ssh@default:default,org.jkiss.dbeaver.registry@default:default,org.jkiss.dbeaver.slf4j@default:false,org.jkiss.dbeaver.tasks.native@default:default,org.jkiss.utils@default:default,org.jkiss.wmi@default:default"/>
|
||||
<booleanAttribute key="show_selected_only" value="false"/>
|
||||
<booleanAttribute key="tracing" value="false"/>
|
||||
|
||||
Reference in New Issue
Block a user