WindChat/windchat-storage/src/main/java/com/windchat/im/storage/dao/sqlite/manager/SQLiteJDBCManager.java

216 lines
6.2 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
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.dao.sqlite.manager;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.windchat.im.storage.dao.config.DBConfig;
import com.windchat.im.storage.dao.sql.SQLConst;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.windchat.im.storage.exception.UpgradeDatabaseException;
/**
* <pre>
* SQLite数据源连接管理
* 1.数据源加载
* 2.检测数据库中的表
* 3.自动化升级
* </pre>
*
* @author Sam{@link an.guoyue254@gmail.com}
* @since 2017.10.22 11:59:38
*
*/
public class SQLiteJDBCManager {
private static final Logger logger = LoggerFactory.getLogger(SQLiteJDBCManager.class);
private static int SITE_DB_VERSION = SQLConst.SITE_DB_VERSION_10;
private static String sqliteDriverName = "org.sqlite.JDBC";
private static Connection sqlitConnection = null;
private static final String DB_FILE_PATH = "windchatDB.sqlite3";
private SQLiteJDBCManager() {
}
public static void initSqliteDB(DBConfig config) throws SQLException, UpgradeDatabaseException {
// try to upgrade
SQLiteUpgrade.doUpgrade(config);
// reload sqlite driver
loadDatabaseDriver(config.getDbDir());
if (getDbVersion() < SITE_DB_VERSION) {
throw new UpgradeDatabaseException("windchat-server need to upgrade before run it");
}
}
// 指定目录加载默认数据库dbDir目录下存放默认数据库
public static void loadDatabaseDriver(String dbDir) {
try {
if (sqlitConnection != null) {
sqlitConnection.close();
}
Class.forName(sqliteDriverName);
String dbUrl = "jdbc:sqlite:";
if (StringUtils.isNotEmpty(dbDir)) {
if (dbDir.endsWith("/")) {
dbUrl += dbDir + DB_FILE_PATH;
} else {
dbUrl += dbDir + "/" + DB_FILE_PATH;
}
} else {
dbUrl += "./" + DB_FILE_PATH;
}
// logger.info("load data base connectionUrl={}", dbUrl);
sqlitConnection = DriverManager.getConnection(dbUrl);
} catch (ClassNotFoundException e) {
logger.error("class not found.", e);
} catch (SQLException e) {
logger.error("load sqlite driver error.", e);
}
}
// 指定目录加载默认数据库dbDir目录下存放默认数据库
public static void loadDriver(String dbFile) throws Exception {
if (sqlitConnection != null) {
sqlitConnection.close();
}
Class.forName(sqliteDriverName);
String dbUrl = "jdbc:sqlite:" + dbFile;
sqlitConnection = DriverManager.getConnection(dbUrl);
}
// public static void checkDatabaseBeforeRun() throws SQLException,
// UpgradeDatabaseException {
// int dbVersion = getDbVersion();
// logger.info("SQLite current user-version : {}", dbVersion);
//
// // 不是最新版本,启动需要创建表
// if (dbVersion < SITE_DB_VERSION) {
// int num = checkDatabaseTable();
// if (num == SQLConst.SITE_TABLES_MAP.size()) {
// // database index
// checkDatabaseIndex();
// // 版本设置为 SITE_DB_VERSION
// setDbVersion(SITE_DB_VERSION);
// logger.info("create all database tables finish, currentuser-version:{}",
// getDbVersion());
// }
// }
// }
public static int getDbVersion() throws SQLException {
PreparedStatement pst = sqlitConnection.prepareStatement("PRAGMA user_version");
ResultSet rs = pst.executeQuery();
if (rs.next()) {
return rs.getInt(1);
}
return 0;
}
public static void setDbVersion(int version) throws SQLException {
String sql = "PRAGMA user_version=" + version;
PreparedStatement pst = sqlitConnection.prepareStatement(sql);
pst.executeUpdate();
}
// public static int checkDatabaseTable() {
// int num = 0;
// for (String tableName : SQLConst.SITE_TABLES_MAP.keySet()) {
// int result = createTable(tableName, SQLConst.SITE_TABLES_MAP.get(tableName));
// num += result;
// logger.info("create table:{} {}", tableName, result == 1 ? "OK" : "false");
// }
// return num;
// }
// private static void checkDatabaseIndex() {
// for (String indexSql : SQLIndex.DB_INDEXS_SQL) {
// boolean result = createIndex(indexSql);
// logger.info("create index result:{} sql:{}", result, indexSql);
// }
// }
private static boolean existTable(String tableName) {
if (StringUtils.isBlank(tableName)) {
return false;
}
String checkTableSql = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=? AND tbl_name=?;";
try {
PreparedStatement pst = sqlitConnection.prepareStatement(checkTableSql);
pst.setString(1, tableName);
pst.setString(2, tableName);
ResultSet rs = pst.executeQuery();
if (rs.next()) {
return rs.getInt(1) >= 1;
}
} catch (SQLException e) {
logger.error("check table exist error.", e);
}
return false;
}
private static int createTable(String tableName, String createTableSQL) {
try {
if (existTable(tableName)) {
return 0;
}
PreparedStatement pst = sqlitConnection.prepareStatement(createTableSQL);
pst.executeUpdate();
// 再次检测是否创建成功
if (existTable(tableName)) {
return 1;
}
} catch (Exception e) {
logger.error("create table " + tableName + " sql=" + createTableSQL + " error.,", e);
}
return 0;
}
private static boolean createIndex(String indexSQL) {
boolean result = false;
try {
PreparedStatement pst = sqlitConnection.prepareStatement(indexSQL);
pst.executeUpdate();
result = true;
} catch (Exception e) {
logger.error("create index sql=" + indexSQL + " error.,", e);
}
return result;
}
public static Connection getConnection() {
return sqlitConnection;
}
public static String getDbFileName() {
return DB_FILE_PATH;
}
}