WindChat/windchat-storage/src/main/java/com/windchat/im/storage/DataSourceManager.java

144 lines
5.5 KiB
Java
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright 2018-2028 Akaxin Group
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.windchat.im.storage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.windchat.im.storage.dao.config.DBConfig;
import com.windchat.im.storage.dao.config.DBType;
import com.windchat.im.storage.dao.config.JdbcConst;
import com.windchat.im.storage.dao.config.PrepareSiteConfigData;
import com.windchat.im.storage.dao.mysql.manager.MysqlManager;
import com.windchat.im.storage.dao.sqlite.manager.SQLiteJDBCManager;
import com.windchat.im.storage.dao.sqlite.manager.SQLiteUpgrade;
import com.windchat.im.storage.exception.InitDatabaseException;
import com.windchat.im.storage.exception.MigrateDatabaseException;
import com.windchat.im.storage.exception.NeedInitMysqlException;
import com.windchat.im.storage.exception.UpgradeDatabaseException;
import com.windchat.im.storage.util.FileUtils;
import com.windchat.im.storage.util.MigrateUtils;
/**
* 数据源初始化管理,不做具体操作对外提供方法
*
* @author Sam{@link an.guoyue254@gmail.com}
* @since 2018-01-31 12:15:15
*/
public class DataSourceManager {
private static final Logger logger = LoggerFactory.getLogger(DataSourceManager.class);
private static final String WINDCHAT_DATABASE_CONFIG = "windchat-server.config";
private DataSourceManager() {
}
// server启动初始化数据库
public static void init(DBConfig config)
throws InitDatabaseException, UpgradeDatabaseException, NeedInitMysqlException {
try {
DBType dbType = DBType.PERSONAL;
Properties pro = loadDatabaseConfig(WINDCHAT_DATABASE_CONFIG);
if (pro != null && pro.size() > 0) {
// get edition from config file
String edition = MysqlManager.trimToNull(pro, JdbcConst.WINDCHAT_EDITION);
if (StringUtils.isNotEmpty(edition)) {
dbType = DBType.getDBType(edition);
}
}
config.setDb(dbType);
logger.info("load database config finish databaseType:{}", dbType);
switch (dbType) {
case PERSONAL:
System.setProperty("database", dbType.getName());
SQLiteJDBCManager.initSqliteDB(config);
PrepareSiteConfigData.init(config);// 初始化数据库中初始数据
break;
case TEAM:
System.setProperty("database", dbType.getName());
MysqlManager.initMysqlDB(pro); // 初始化数据库以及数据库连接
PrepareSiteConfigData.init(config);// 初始化数据库中初始数据
break;
}
} catch (SQLException e) {
throw new InitDatabaseException("init database error", e);
}
}
// 初始化生成mysql的配置文件
public static void initMysqlConfig() throws FileNotFoundException, IOException {
// 生成配置文件
File configFile = new File(WINDCHAT_DATABASE_CONFIG);
if (!configFile.exists()) {
FileUtils.writeResourceToFile("/" + WINDCHAT_DATABASE_CONFIG, configFile);
}
}
// 手动升级数据库
public static int upgradeDB(DBConfig config) throws UpgradeDatabaseException {
try {
switch (config.getDb()) {
case PERSONAL:
return SQLiteUpgrade.doUpgrade(config, true);
case TEAM:
throw new UpgradeDatabaseException("database upgrade can't support mysql");
}
} catch (SQLException e) {
throw new UpgradeDatabaseException("upgrade database error", e);
}
return 0;
}
// 迁移数据库把sqlite迁移至mysql数据库
public static void migrateDB() throws MigrateDatabaseException, NeedInitMysqlException {
// 加载配置文件中的数据库配置
Properties prop = loadDatabaseConfig(WINDCHAT_DATABASE_CONFIG);
MigrateUtils.sqlite2Mysql(prop);
}
public static Properties loadDatabaseConfig(String configPath) {
Properties properties = null;
InputStream inputStream = null;
try {
properties = new Properties();
inputStream = new FileInputStream(configPath);
properties.load(inputStream);
} catch (Exception e) {
logger.error("load database config fail,WindChat will use sqlite database,cause={}", e.getMessage());
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
logger.error("close db config inputstream error", e);
}
}
return properties;
}
}