Skip to content

Commit

Permalink
Merge pull request #113 from ToberoCat/h2
Browse files Browse the repository at this point in the history
Added h2 support
  • Loading branch information
ToberoCat authored May 15, 2024
2 parents a7f6236 + 989991e commit 7661593
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 235 deletions.
33 changes: 0 additions & 33 deletions improved-factions-base/options/FactionOption.java

This file was deleted.

49 changes: 0 additions & 49 deletions improved-factions-base/options/FactionPermissionOption.java

This file was deleted.

51 changes: 0 additions & 51 deletions improved-factions-base/options/FactionPriorityOption.java

This file was deleted.

51 changes: 0 additions & 51 deletions improved-factions-base/options/FactionRankOption.java

This file was deleted.

13 changes: 10 additions & 3 deletions improved-factions-base/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
<server.location>../server/plugins</server.location>

<!-- Versions -->
<exposed.version>0.40.1</exposed.version>
<exposed.version>0.50.0</exposed.version>
<jackson.version>2.15.2</jackson.version>
<spigot.version>1.18.1-R0.1-SNAPSHOT</spigot.version>
<sqlite-jdbc.version>3.43.0.0</sqlite-jdbc.version>
<sqlite-jdbc.version>3.45.3.0</sqlite-jdbc.version>
<spigot-update-checker.version>3.0.3</spigot-update-checker.version>
<kotlinx-datetime.version>0.4.0</kotlinx-datetime.version>
<toberocore.version>be356f9253</toberocore.version>
Expand All @@ -42,6 +42,7 @@
<bstats-bukkit.version>3.0.2</bstats-bukkit.version>
<placeholderapi.version>2.11.3</placeholderapi.version>
<dynmap-api.version>3.5</dynmap-api.version>
<h2.version>2.2.220</h2.version>
</properties>

<repositories>
Expand Down Expand Up @@ -127,7 +128,6 @@
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<outputFile>${server.location}\${project.name}-${project.version}.jar</outputFile>
<relocations>
<relocation>
<pattern>org.bstats</pattern>
Expand Down Expand Up @@ -236,6 +236,13 @@
<artifactId>sqlite-jdbc</artifactId>
<version>${sqlite-jdbc.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>

<dependency>
<groupId>com.jeff_media</groupId>
<artifactId>SpigotUpdateChecker</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import io.github.toberocat.improvedfactions.permissions.FactionPermissions
import io.github.toberocat.improvedfactions.ranks.FactionRankHandler
import io.github.toberocat.improvedfactions.ranks.FactionRanks
import io.github.toberocat.improvedfactions.user.FactionUsers
import io.github.toberocat.improvedfactions.utils.getEnum
import io.github.toberocat.improvedfactions.utils.options.limit.PlayerUsageLimits
import org.bukkit.configuration.file.FileConfiguration
import org.bukkit.plugin.java.JavaPlugin
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.StdOutSqlLogger
Expand All @@ -22,6 +22,74 @@ import java.sql.SQLException
import java.sql.Statement
import java.util.logging.Logger

enum class DatabaseType {
H2 {
override fun connect(plugin: ImprovedFactionsPlugin) = Database.connect(
"jdbc:h2:file:${plugin.dataFolder.absolutePath}/database.h2", driver = "org.h2.Driver"
)
},
SQLITE {
override fun connect(plugin: ImprovedFactionsPlugin) = Database.connect(
"jdbc:sqlite:${plugin.dataFolder.absolutePath}/database.sqlite", driver = "org.sqlite.JDBC"
)
},
MYSQL {
override fun connect(plugin: ImprovedFactionsPlugin): Database? {
val config = plugin.config
val logger = plugin.logger

val host = config.getString("mysql.host")
val db = config.getString("mysql.database")
val user = config.getString("mysql.user") ?: "root"
val password = config.getString("mysql.password") ?: "1234"
val port = config.getInt("mysql.port")

if (isMySQLServerReachable(host, port, user, password)) {
try {
val database = Database.connect(
"jdbc:mysql://$host:$port/$db",
driver = "com.mysql.cj.jdbc.Driver",
user = user,
password = password
)

logger.info("Successfully connected to MySQL")
return database
} catch (e: SQLException) {
logger.warning("Failed to connect to MySQL: ${e.message}")
}
} else {
throw IllegalArgumentException("MySqL server not reachable. Check credentials")
}
return null
}

private fun isMySQLServerReachable(
host: String?,
port: Int,
username: String,
password: String
): Boolean {
var connection: Connection? = null

return try {
Class.forName("com.mysql.cj.jdbc.Driver")
val url = "jdbc:mysql://$host:$port"
connection = DriverManager.getConnection(url, username, password)
val statement: Statement = connection.createStatement()
val resultSet = statement.executeQuery("SELECT 1")
resultSet.next()
} catch (e: SQLException) {
false
} finally {
connection?.close()
}
}
};

abstract fun connect(plugin: ImprovedFactionsPlugin): Database?;
}

/**
* Created: 04.08.2023
* @author Tobias Madlberger (Tobias)
Expand Down Expand Up @@ -56,53 +124,14 @@ class DatabaseConnector(private val plugin: ImprovedFactionsPlugin) {
}

private fun connectDatabase(): Database {
val host = config.getString("mysql.host")
val db = config.getString("mysql.database")
val user = config.getString("mysql.user") ?: "root"
val password = config.getString("mysql.password") ?: "1234"
val port = config.getInt("mysql.port")

if (isMySQLServerReachable(host, port, user, password)) {
try {
val database = Database.connect(
"jdbc:mysql://$host:$port/$db",
driver = "com.mysql.cj.jdbc.Driver",
user = user,
password = password
)

logger.info("Successfully connected to MySQL")
return database
} catch (e: SQLException) {
logger.warning("Failed to connect to MySQL: ${e.message}")

}
val databaseType = config.getEnum<DatabaseType>("database").let {
if (it != null)
return@let it
logger.warning("No database specified. Using sqlite as default")
return@let DatabaseType.SQLITE
}
logger.warning("Connection to MySQL server not possible. Falling back to SQLite...")
return Database.connect(
"jdbc:sqlite:${plugin.dataFolder.absolutePath}/database.sqlite", driver = "org.sqlite.JDBC"
)
}

private fun isMySQLServerReachable(
host: String?,
port: Int,
username: String,
password: String
): Boolean {
var connection: Connection? = null

return try {
Class.forName("com.mysql.cj.jdbc.Driver")
val url = "jdbc:mysql://$host:$port"
connection = DriverManager.getConnection(url, username, password)
val statement: Statement = connection.createStatement()
val resultSet = statement.executeQuery("SELECT 1")
resultSet.next()
} catch (e: SQLException) {
false
} finally {
connection?.close()
}
logger.info("Using database $databaseType as database")
return databaseType.connect(plugin) ?: throw IllegalArgumentException("Database connection failed")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import kotlin.math.abs
inline fun <reified T : Enum<T>> ConfigurationSection.getEnum(path: String): T? = getString(path).getEnum<T>()

inline fun <reified T : Enum<T>> String?.getEnum(): T? {
return enumValueOf<T>(this ?: return null)
return enumValueOf<T>(this?.uppercase() ?: return null)
}

fun ConfigurationSection.getUnsignedDouble(path: String, default: Double) = abs(getDouble(path, default))
1 change: 1 addition & 0 deletions improved-factions-base/src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ update-checker: true

# Configure a mysql connection. If no connection was established, the plugin uses sqlite.
# This allows to use this plugin without a mysql server
database: "sqlite" # ImprovedFactions supports H2, SQLite and MySQL. H2 and SQLite are local databases
mysql:
host: "localhost"
port: 3306
Expand Down

0 comments on commit 7661593

Please sign in to comment.