Skip to content

Commit c44a535

Browse files
committed
Implement postgresql
1 parent b2efa74 commit c44a535

8 files changed

Lines changed: 185 additions & 25 deletions

File tree

api/surf-database-r2dbc.api

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,112 @@ public final class dev/slne/surf/database/columns/time/ZonedDateTimeColumnTypeKt
121121
public static final fun zonedDateTime (Lorg/jetbrains/exposed/v1/core/Table;Ljava/lang/String;)Lorg/jetbrains/exposed/v1/core/Column;
122122
}
123123

124+
public final class dev/slne/surf/database/config/ConnectionDetails {
125+
public fun <init> ()V
126+
public fun <init> (Ldev/slne/surf/database/config/DatabaseType;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
127+
public synthetic fun <init> (Ldev/slne/surf/database/config/DatabaseType;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
128+
public final fun component1 ()Ldev/slne/surf/database/config/DatabaseType;
129+
public final fun component2 ()Ljava/lang/String;
130+
public final fun component3 ()I
131+
public final fun component4 ()Ljava/lang/String;
132+
public final fun component5 ()Ljava/lang/String;
133+
public final fun component6 ()Ljava/lang/String;
134+
public final fun copy (Ldev/slne/surf/database/config/DatabaseType;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ldev/slne/surf/database/config/ConnectionDetails;
135+
public static synthetic fun copy$default (Ldev/slne/surf/database/config/ConnectionDetails;Ldev/slne/surf/database/config/DatabaseType;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ldev/slne/surf/database/config/ConnectionDetails;
136+
public fun equals (Ljava/lang/Object;)Z
137+
public final fun getDatabase ()Ljava/lang/String;
138+
public final fun getDatabaseType ()Ldev/slne/surf/database/config/DatabaseType;
139+
public final fun getHost ()Ljava/lang/String;
140+
public final fun getPassword ()Ljava/lang/String;
141+
public final fun getPort ()I
142+
public final fun getUsername ()Ljava/lang/String;
143+
public fun hashCode ()I
144+
public fun toString ()Ljava/lang/String;
145+
}
146+
147+
public final class dev/slne/surf/database/config/DatabaseConfig {
148+
public static final field Companion Ldev/slne/surf/database/config/DatabaseConfig$Companion;
149+
public fun <init> ()V
150+
public fun <init> (Lorg/slf4j/event/Level;Ldev/slne/surf/database/config/ConnectionDetails;Ldev/slne/surf/database/config/PoolConfig;)V
151+
public synthetic fun <init> (Lorg/slf4j/event/Level;Ldev/slne/surf/database/config/ConnectionDetails;Ldev/slne/surf/database/config/PoolConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
152+
public final fun component1 ()Lorg/slf4j/event/Level;
153+
public final fun component2 ()Ldev/slne/surf/database/config/ConnectionDetails;
154+
public final fun component3 ()Ldev/slne/surf/database/config/PoolConfig;
155+
public final fun copy (Lorg/slf4j/event/Level;Ldev/slne/surf/database/config/ConnectionDetails;Ldev/slne/surf/database/config/PoolConfig;)Ldev/slne/surf/database/config/DatabaseConfig;
156+
public static synthetic fun copy$default (Ldev/slne/surf/database/config/DatabaseConfig;Lorg/slf4j/event/Level;Ldev/slne/surf/database/config/ConnectionDetails;Ldev/slne/surf/database/config/PoolConfig;ILjava/lang/Object;)Ldev/slne/surf/database/config/DatabaseConfig;
157+
public fun equals (Ljava/lang/Object;)Z
158+
public final fun getCredentials ()Ldev/slne/surf/database/config/ConnectionDetails;
159+
public final fun getLogLevel ()Lorg/slf4j/event/Level;
160+
public final fun getPool ()Ldev/slne/surf/database/config/PoolConfig;
161+
public fun hashCode ()I
162+
public fun toString ()Ljava/lang/String;
163+
}
164+
165+
public final class dev/slne/surf/database/config/DatabaseConfig$Companion {
166+
public final fun create (Ljava/nio/file/Path;)Ldev/slne/surf/database/config/DatabaseConfig;
167+
}
168+
169+
public final class dev/slne/surf/database/config/DatabaseType : java/lang/Enum {
170+
public static final field MARIADB Ldev/slne/surf/database/config/DatabaseType;
171+
public static final field POSTGRESQL Ldev/slne/surf/database/config/DatabaseType;
172+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
173+
public static fun valueOf (Ljava/lang/String;)Ldev/slne/surf/database/config/DatabaseType;
174+
public static fun values ()[Ldev/slne/surf/database/config/DatabaseType;
175+
}
176+
177+
public final class dev/slne/surf/database/config/PoolConfig {
178+
public fun <init> ()V
179+
public fun <init> (Ldev/slne/surf/database/config/PoolConfig$Sizing;Ldev/slne/surf/database/config/PoolConfig$Timeouts;)V
180+
public synthetic fun <init> (Ldev/slne/surf/database/config/PoolConfig$Sizing;Ldev/slne/surf/database/config/PoolConfig$Timeouts;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
181+
public final fun component1 ()Ldev/slne/surf/database/config/PoolConfig$Sizing;
182+
public final fun component2 ()Ldev/slne/surf/database/config/PoolConfig$Timeouts;
183+
public final fun copy (Ldev/slne/surf/database/config/PoolConfig$Sizing;Ldev/slne/surf/database/config/PoolConfig$Timeouts;)Ldev/slne/surf/database/config/PoolConfig;
184+
public static synthetic fun copy$default (Ldev/slne/surf/database/config/PoolConfig;Ldev/slne/surf/database/config/PoolConfig$Sizing;Ldev/slne/surf/database/config/PoolConfig$Timeouts;ILjava/lang/Object;)Ldev/slne/surf/database/config/PoolConfig;
185+
public fun equals (Ljava/lang/Object;)Z
186+
public final fun getSizing ()Ldev/slne/surf/database/config/PoolConfig$Sizing;
187+
public final fun getTimeouts ()Ldev/slne/surf/database/config/PoolConfig$Timeouts;
188+
public fun hashCode ()I
189+
public fun toString ()Ljava/lang/String;
190+
}
191+
192+
public final class dev/slne/surf/database/config/PoolConfig$Sizing {
193+
public fun <init> ()V
194+
public fun <init> (III)V
195+
public synthetic fun <init> (IIIILkotlin/jvm/internal/DefaultConstructorMarker;)V
196+
public final fun component1 ()I
197+
public final fun component2 ()I
198+
public final fun component3 ()I
199+
public final fun copy (III)Ldev/slne/surf/database/config/PoolConfig$Sizing;
200+
public static synthetic fun copy$default (Ldev/slne/surf/database/config/PoolConfig$Sizing;IIIILjava/lang/Object;)Ldev/slne/surf/database/config/PoolConfig$Sizing;
201+
public fun equals (Ljava/lang/Object;)Z
202+
public final fun getInitialSize ()I
203+
public final fun getMaxSize ()I
204+
public final fun getMinIdle ()I
205+
public fun hashCode ()I
206+
public fun toString ()Ljava/lang/String;
207+
}
208+
209+
public final class dev/slne/surf/database/config/PoolConfig$Timeouts {
210+
public fun <init> ()V
211+
public fun <init> (JJJJJ)V
212+
public synthetic fun <init> (JJJJJILkotlin/jvm/internal/DefaultConstructorMarker;)V
213+
public final fun component1 ()J
214+
public final fun component2 ()J
215+
public final fun component3 ()J
216+
public final fun component4 ()J
217+
public final fun component5 ()J
218+
public final fun copy (JJJJJ)Ldev/slne/surf/database/config/PoolConfig$Timeouts;
219+
public static synthetic fun copy$default (Ldev/slne/surf/database/config/PoolConfig$Timeouts;JJJJJILjava/lang/Object;)Ldev/slne/surf/database/config/PoolConfig$Timeouts;
220+
public fun equals (Ljava/lang/Object;)Z
221+
public final fun getMaxAcquireTimeMillis ()J
222+
public final fun getMaxCreateConnectionTimeMillis ()J
223+
public final fun getMaxIdleTimeMillis ()J
224+
public final fun getMaxLifeTimeMillis ()J
225+
public final fun getMaxValidationTimeMillis ()J
226+
public fun hashCode ()I
227+
public fun toString ()Ljava/lang/String;
228+
}
229+
124230
public final class dev/slne/surf/database/logger/ComponentSqlLogger : org/jetbrains/exposed/v1/core/SqlLogger {
125231
public fun <init> (Lnet/kyori/adventure/text/logger/slf4j/ComponentLogger;Lorg/slf4j/event/Level;)V
126232
public synthetic fun <init> (Lnet/kyori/adventure/text/logger/slf4j/ComponentLogger;Lorg/slf4j/event/Level;ILkotlin/jvm/internal/DefaultConstructorMarker;)V

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ kotlin.stdlib.default.dependency=false
33
org.gradle.parallel=true
44
#org.gradle.caching=true
55
#org.gradle.configureondemand=true
6-
version=1.4.0
6+
version=2.0.0

gradle/libs.versions.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[versions]
2-
exposed = "1.2.0"
3-
r2dbc-mariadb = "1.3.0"
2+
exposed = "1.3.0"
3+
r2dbc-mariadb = "1.4.1"
4+
r2dbc-postgresql = "1.1.1.RELEASE"
45
r2dbc-pool = "1.0.2.RELEASE"
56

67
[libraries]
@@ -9,9 +10,10 @@ exposed-r2dbc = { module = "org.jetbrains.exposed:exposed-r2dbc", version.ref =
910
exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" }
1011
exposed-json = { module = "org.jetbrains.exposed:exposed-json", version.ref = "exposed" }
1112
r2dbc-mariadb = { module = "org.mariadb:r2dbc-mariadb", version.ref = "r2dbc-mariadb" }
13+
r2dbc-postgresql = { module = "org.postgresql:r2dbc-postgresql", version.ref = "r2dbc-postgresql" }
1214
r2dbc-pool = { module = "io.r2dbc:r2dbc-pool", version.ref = "r2dbc-pool" }
1315

1416

1517
[bundles]
1618
exposed = ["exposed-core", "exposed-r2dbc", "exposed-java-time", "exposed-json"]
17-
databaseDriver = ["r2dbc-mariadb"]
19+
databaseDriver = ["r2dbc-mariadb", "r2dbc-postgresql"]

src/main/kotlin/dev/slne/surf/database/DatabaseApi.kt

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ package dev.slne.surf.database
22

33
import dev.slne.surf.api.core.util.getCallerClass
44
import dev.slne.surf.database.config.DatabaseConfig
5+
import dev.slne.surf.database.config.DatabaseType
56
import dev.slne.surf.database.logger.ComponentSqlLogger
67
import io.r2dbc.pool.ConnectionPool
78
import io.r2dbc.pool.ConnectionPoolConfiguration
9+
import io.r2dbc.postgresql.PostgresqlConnectionConfiguration
10+
import io.r2dbc.postgresql.PostgresqlConnectionFactory
811
import io.r2dbc.spi.ConnectionFactory
912
import io.r2dbc.spi.IsolationLevel
1013
import net.kyori.adventure.text.logger.slf4j.ComponentLogger
1114
import org.jetbrains.exposed.v1.core.vendors.MariaDBDialect
15+
import org.jetbrains.exposed.v1.core.vendors.PostgreSQLDialect
1216
import org.jetbrains.exposed.v1.r2dbc.R2dbcDatabase
1317
import org.jetbrains.exposed.v1.r2dbc.R2dbcDatabaseConfig
1418
import org.jetbrains.exposed.v1.r2dbc.transactions.TransactionManager
@@ -45,23 +49,50 @@ class DatabaseApi internal constructor(val database: R2dbcDatabase) {
4549
configCustomizer: R2dbcDatabaseConfig.Builder.() -> Unit = {}
4650
): DatabaseApi {
4751
val config = DatabaseConfig.create(pluginPath)
48-
val configuration = MariadbConnectionConfiguration.builder()
49-
.host(config.credentials.host)
50-
.port(config.credentials.port)
51-
.username(config.credentials.username)
52-
.password(config.credentials.password)
53-
.database(config.credentials.database)
54-
.loopResources(
55-
LoopResources.create(
56-
"mariadb-r2dbc-event-loop-$poolName",
57-
1,
58-
4,
59-
true
60-
)
61-
)
62-
.build()
52+
val databaseType = config.credentials.databaseType
53+
54+
val connectionFactory: ConnectionFactory = when (databaseType) {
55+
DatabaseType.MARIADB -> {
56+
val configuration = MariadbConnectionConfiguration.builder()
57+
.host(config.credentials.host)
58+
.port(config.credentials.port)
59+
.username(config.credentials.username)
60+
.password(config.credentials.password)
61+
.database(config.credentials.database)
62+
.loopResources(
63+
LoopResources.create(
64+
"mariadb-r2dbc-event-loop-$poolName",
65+
1,
66+
4,
67+
true
68+
)
69+
)
70+
.build()
71+
72+
MariadbConnectionFactory.from(configuration)
73+
}
74+
75+
DatabaseType.POSTGRESQL -> {
76+
val configuration = PostgresqlConnectionConfiguration.builder()
77+
.host(config.credentials.host)
78+
.port(config.credentials.port)
79+
.username(config.credentials.username)
80+
.password(config.credentials.password)
81+
.database(config.credentials.database)
82+
.loopResources(
83+
LoopResources.create(
84+
"postgresql-r2dbc-event-loop-$poolName",
85+
1,
86+
4,
87+
true
88+
)
89+
)
90+
.build()
91+
92+
PostgresqlConnectionFactory(configuration)
93+
}
94+
}
6395

64-
val connectionFactory = MariadbConnectionFactory.from(configuration)
6596
val poolConfig = ConnectionPoolConfiguration.builder()
6697
.connectionFactory(connectionFactory)
6798
.acquireRetry(1)
@@ -83,7 +114,12 @@ class DatabaseApi internal constructor(val database: R2dbcDatabase) {
83114
val logger = ComponentLogger.logger(caller)
84115
val logLevel = config.logLevel
85116

86-
return create(pool, logger, logLevel, configCustomizer)
117+
return create(
118+
connectionFactory = pool,
119+
logger = logger,
120+
logLevel = logLevel,
121+
configCustomizer = configCustomizer
122+
)
87123
}
88124

89125
/**
@@ -103,8 +139,14 @@ class DatabaseApi internal constructor(val database: R2dbcDatabase) {
103139
logLevel: Level = Level.DEBUG,
104140
configCustomizer: R2dbcDatabaseConfig.Builder.() -> Unit = {}
105141
): DatabaseApi {
142+
val dialect = when (connectionFactory) {
143+
is MariadbConnectionFactory -> MariaDBDialect()
144+
is PostgresqlConnectionFactory -> PostgreSQLDialect()
145+
else -> throw IllegalArgumentException("Unsupported ConnectionFactory type: ${connectionFactory::class.java.name}")
146+
}
147+
106148
val database = R2dbcDatabase.connect(connectionFactory, R2dbcDatabaseConfig {
107-
explicitDialect = MariaDBDialect()
149+
explicitDialect = dialect
108150
sqlLogger = ComponentSqlLogger(logger, logLevel)
109151
defaultR2dbcIsolationLevel = IsolationLevel.READ_UNCOMMITTED
110152
configCustomizer()

src/main/kotlin/dev/slne/surf/database/config/ConnectionDetails.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package dev.slne.surf.database.config
33
import org.spongepowered.configurate.objectmapping.ConfigSerializable
44

55
@ConfigSerializable
6-
internal data class ConnectionDetails(
6+
data class ConnectionDetails(
7+
val databaseType: DatabaseType = DatabaseType.MARIADB,
78
val host: String = "localhost",
89
val port: Int = 3306,
910
val database: String = "database",

src/main/kotlin/dev/slne/surf/database/config/DatabaseConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import org.spongepowered.configurate.objectmapping.ConfigSerializable
77
import java.nio.file.Path
88

99
@ConfigSerializable
10-
internal data class DatabaseConfig(
10+
data class DatabaseConfig(
1111
val logLevel: Level = Level.DEBUG,
1212
val credentials: ConnectionDetails = ConnectionDetails(),
1313
val pool: PoolConfig = PoolConfig()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.slne.surf.database.config
2+
3+
import org.spongepowered.configurate.objectmapping.ConfigSerializable
4+
5+
@ConfigSerializable
6+
enum class DatabaseType {
7+
MARIADB,
8+
POSTGRESQL
9+
}

src/main/kotlin/dev/slne/surf/database/config/PoolConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import kotlin.time.Duration.Companion.minutes
55
import kotlin.time.Duration.Companion.seconds
66

77
@ConfigSerializable
8-
internal data class PoolConfig(
8+
data class PoolConfig(
99
val sizing: Sizing = Sizing(),
1010
val timeouts: Timeouts = Timeouts()
1111
) {

0 commit comments

Comments
 (0)