Skip to content

Commit 3c22921

Browse files
committed
fix sql things and add test.yml
1 parent e41e8ee commit 3c22921

10 files changed

Lines changed: 125 additions & 66 deletions

File tree

.github/workflows/test.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
on:
2+
push:
3+
4+
jobs:
5+
build:
6+
runs-on: ubuntu-latest
7+
if: "!contains(github.event.commits[0].message, '[ci-skip]')"
8+
steps:
9+
- uses: actions/checkout@v4
10+
- uses: actions/setup-java@v4
11+
with:
12+
distribution: temurin
13+
java-version: 21
14+
cache: 'gradle'
15+
- uses: gradle/actions/setup-gradle@v4
16+
- name: Grant execute permission for gradlew
17+
run: chmod +x gradlew
18+
- name: Build
19+
run: ./gradlew test --no-daemon --stacktrace
20+
- name: Rebuild on Failure
21+
if: ${{ failure() }}
22+
run: |
23+
./gradlew clean cleanCache
24+
./gradlew test --no-daemon --stacktrace

build.gradle.kts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,39 @@ repositories {
1717
}
1818

1919
dependencies {
20+
// MongoDB
2021
implementation("org.mongodb:mongodb-driver-sync:5.2.1")
21-
implementation("mysql:mysql-connector-java:8.0.33")
22+
testImplementation("org.mongodb:mongodb-driver-sync:5.2.1")
23+
24+
// Hibernate and Jakarta
2225
implementation("jakarta.persistence:jakarta.persistence-api:3.1.0")
2326
implementation("org.hibernate:hibernate-core:6.3.1.Final")
27+
implementation("org.hibernate.orm:hibernate-community-dialects:6.3.0.Final")
28+
testImplementation("org.hibernate.orm:hibernate-community-dialects:6.3.0.Final")
29+
30+
// SQLite
31+
implementation("org.xerial:sqlite-jdbc:3.47.1.0")
32+
testImplementation("org.xerial:sqlite-jdbc:3.47.1.0")
33+
34+
// PaperMC API
2435
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
36+
testImplementation("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
2537

38+
// Reflections
2639
implementation("org.reflections:reflections:0.10.2")
2740

41+
// Lombok
2842
implementation("org.projectlombok:lombok:1.18.36")
2943
annotationProcessor("org.projectlombok:lombok:1.18.36")
30-
implementation("org.jetbrains:annotations:26.0.1")
31-
implementation("org.jetbrains:annotations:26.0.1")
32-
33-
testImplementation("org.mongodb:mongodb-driver-sync:5.2.1")
34-
3544
compileOnly("org.projectlombok:lombok:1.18.36")
36-
annotationProcessor("org.projectlombok:lombok:1.18.36")
3745
testImplementation("org.projectlombok:lombok:1.18.36")
3846
testAnnotationProcessor("org.projectlombok:lombok:1.18.36")
3947

40-
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.11.4")
48+
// JetBrains Annotations
49+
implementation("org.jetbrains:annotations:26.0.1")
4150

51+
// JUnit and SLF4J for testing
52+
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.11.4")
4253
testImplementation("org.slf4j:slf4j-jdk14:2.0.16")
4354
}
4455

src/main/java/de/varilx/database/Service.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
public abstract class Service {
1616

17-
public Service(YamlConfiguration configuration, ClassLoader loader) {
17+
public Service(YamlConfiguration configuration, ClassLoader loader, ServiceType type) {
1818

1919
}
2020

@@ -24,7 +24,7 @@ public static Service load(YamlConfiguration configuration, ClassLoader loader)
2424
@Nullable ServiceType type = ServiceType.findBy(configuration.getString("type"));
2525
if (type == null) throw new RuntimeException("No Database Type found");
2626
try {
27-
return (Service) type.getClazz().getDeclaredConstructors()[0].newInstance(configuration, loader);
27+
return (Service) type.getClazz().getDeclaredConstructors()[0].newInstance(configuration, loader, type);
2828
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
2929
throw new RuntimeException(e);
3030
}
@@ -37,7 +37,9 @@ public static Service load(YamlConfiguration configuration, ClassLoader loader)
3737
public enum ServiceType {
3838

3939
MONGO(MongoService.class),
40-
SQL(SQLService.class);
40+
MYSQL(SQLService.class),
41+
SQLITE(SQLService.class);
42+
4143

4244
private final Class<? extends Service> clazz;
4345

src/main/java/de/varilx/database/mongo/MongoService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public class MongoService extends Service {
1818
MongoClient client;
1919
MongoDatabase database;
2020

21-
public MongoService(YamlConfiguration configuration, ClassLoader loader) {
22-
super(configuration, loader);
21+
public MongoService(YamlConfiguration configuration, ClassLoader loader, ServiceType type) {
22+
super(configuration, loader, type);
2323
this.client = MongoClients.create(Objects.requireNonNull(configuration.getString("connection-string"), "No Connection String given"));
2424
this.database = client.getDatabase(Objects.requireNonNull(configuration.getString("database"), "No database given"));
2525
}

src/main/java/de/varilx/database/sql/SQLService.java

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,16 @@ public class SQLService extends Service {
1919

2020
SessionFactory sessionFactory;
2121

22-
public SQLService(String connectionString, String username, String password, ClassLoader loader) {
23-
super(null, loader);
22+
public SQLService(YamlConfiguration configuration, ClassLoader loader, ServiceType type) {
23+
super(configuration, loader, type);
2424
HibernateConfiguration hibernateConfiguration = new HibernateConfiguration(
25-
connectionString,
26-
username,
27-
password
25+
configuration.getString("SQL.connection-string"),
26+
configuration.getString("SQL.username"),
27+
configuration.getString("SQL.password")
2828
);
2929

3030

31-
sessionFactory = hibernateConfiguration.toHibernateConfig(loader).buildSessionFactory();
32-
}
33-
34-
public SQLService(YamlConfiguration configuration, ClassLoader loader) {
35-
super(configuration, loader);
36-
HibernateConfiguration hibernateConfiguration = new HibernateConfiguration(
37-
Objects.requireNonNull(configuration.getString("MySQL.connection-string")),
38-
Objects.requireNonNull(configuration.getString("MySQL.username")),
39-
Objects.requireNonNull(configuration.getString("MySQL.password"))
40-
);
41-
42-
43-
sessionFactory = hibernateConfiguration.toHibernateConfig(loader).buildSessionFactory();
31+
sessionFactory = hibernateConfiguration.toHibernateConfig(loader, type).buildSessionFactory();
4432
}
4533

4634
@Override

src/main/java/de/varilx/database/sql/configuration/HibernateConfiguration.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package de.varilx.database.sql.configuration;
22

3+
import de.varilx.database.Service;
34
import jakarta.persistence.Entity;
45
import lombok.AccessLevel;
56
import lombok.AllArgsConstructor;
67
import lombok.experimental.FieldDefaults;
78
import org.hibernate.cfg.Configuration;
9+
import org.jetbrains.annotations.Nullable;
810
import org.reflections.Reflections;
911

1012
import java.util.logging.Level;
@@ -14,17 +16,30 @@
1416
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
1517
public class HibernateConfiguration {
1618

19+
@Nullable
1720
String connectionUri, userName, password;
1821

19-
public Configuration toHibernateConfig(ClassLoader loader) {
22+
public Configuration toHibernateConfig(ClassLoader loader, Service.ServiceType type) {
2023
Configuration configuration = new Configuration();
2124

22-
configuration.setProperty("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver");
23-
configuration.setProperty("hibernate.connection.url", connectionUri);
24-
configuration.setProperty("hibernate.connection.username", userName);
25-
configuration.setProperty("hibernate.connection.password", password);
2625

27-
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
26+
switch (type) {
27+
case MYSQL -> {
28+
configuration.setProperty("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver");
29+
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
30+
configuration.setProperty("hibernate.connection.url", connectionUri);
31+
configuration.setProperty("hibernate.connection.username", userName);
32+
configuration.setProperty("hibernate.connection.password", password);
33+
}
34+
case SQLITE -> {
35+
configuration.setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC");
36+
configuration.setProperty("hibernate.dialect", "org.hibernate.community.dialect.SQLiteDialect");
37+
configuration.setProperty("hibernate.connection.url", connectionUri);
38+
configuration.setProperty("hibernate.connection.username", "");
39+
configuration.setProperty("hibernate.connection.password", "");
40+
}
41+
}
42+
2843
configuration.setProperty("hibernate.hbm2ddl.auto", "update");
2944
configuration.setProperty("spring.jpa.hibernate.ddl-auto", "auto");
3045

src/main/java/de/varilx/database/sql/repository/SQLRepository.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -96,27 +96,27 @@ public CompletableFuture<Void> insert(E e) {
9696
@Override
9797
public CompletableFuture<Boolean> exists(ID id) {
9898
return CompletableFuture.supplyAsync(() -> {
99-
Session session = this.sessionFactory.openSession();
100-
session.beginTransaction();
101-
String query = "SELECT COUNT(1) FROM " + name + " o WHERE o.id = :id";
102-
E result = session.createQuery(query, entityClass).setParameter("id", id.toString())
103-
.uniqueResult();
104-
session.getTransaction().commit();
105-
session.close();
106-
return result != null;
99+
try (Session session = this.sessionFactory.openSession()) {
100+
session.beginTransaction();
101+
String query = "SELECT COUNT(1) FROM " + name + " o WHERE o.id = :id";
102+
E result = session.createQuery(query, entityClass).setParameter("id", id)
103+
.uniqueResult();
104+
session.getTransaction().commit();
105+
return result != null;
106+
}
107107
});
108108
}
109109

110110
@Override
111111
public CompletableFuture<Void> deleteAll() {
112112
return CompletableFuture.supplyAsync(() -> {
113-
Session session = this.sessionFactory.openSession();
114-
session.beginTransaction();
115-
String query = "DELETE FROM " + name;
116-
session.createQuery(query, entityClass).executeUpdate();
117-
session.getTransaction().commit();
118-
session.close();
119-
return null;
113+
try(Session session = this.sessionFactory.openSession()) {
114+
session.beginTransaction();
115+
String query = "DELETE FROM " + name;
116+
session.createMutationQuery(query).executeUpdate();
117+
session.getTransaction().commit();
118+
return null;
119+
}
120120
});
121121
}
122122
}

src/main/resources/database.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Mongo:
88

99

1010
# mysql
11-
MySQL:
11+
SQL:
1212
connection-string: "jdbc:mysql://localhost:3306/database"
1313
username: "username"
1414
password: "password"

src/test/java/de/varilx/test/SQLiteTest.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,40 @@
22

33

44
import de.varilx.database.Repository;
5+
import de.varilx.database.Service;
56
import de.varilx.database.sql.SQLService;
7+
import org.bukkit.configuration.file.YamlConfiguration;
8+
import org.junit.jupiter.api.Assertions;
69
import org.junit.jupiter.api.Test;
710

11+
import java.io.StringReader;
12+
import java.util.List;
813
import java.util.UUID;
914
import java.util.concurrent.ExecutionException;
1015

1116
public class SQLiteTest {
1217

1318
@Test
14-
public void testSQL() {
15-
SQLService service = new SQLService("jdbc:mysql://127.0.0.1:3306/db", "user", "password", this.getClass().getClassLoader());
19+
public void testSQL() throws ExecutionException, InterruptedException {
20+
YamlConfiguration configuration = YamlConfiguration.loadConfiguration(new StringReader("""
21+
type: SQLITE
22+
SQL:
23+
connection-string: "jdbc:sqlite:sample.db"
24+
25+
"""));
26+
27+
SQLService service = (SQLService) Service.load(configuration, this.getClass().getClassLoader());
1628
Repository<TestEntity, UUID> repo = service.create("TestEntity", TestEntity.class, UUID.class);
17-
try {
18-
UUID uuid = UUID.randomUUID();
19-
repo.insert(new TestEntity(uuid, 20)).get();
20-
System.out.println(repo.findFirstById(uuid).get());
21-
System.out.println(repo.findAll().get().size());
22-
} catch (InterruptedException | ExecutionException e) {
23-
throw new RuntimeException(e);
24-
}
25-
}
2629

30+
repo.deleteAll().get();
31+
repo.insert(new TestEntity(20)).get();
32+
List<TestEntity> result = repo.findAll().get();
33+
Assertions.assertEquals(result.size(), 1);
34+
Assertions.assertEquals(repo.exists(result.getFirst().getId()).get(), true);
35+
Assertions.assertEquals(repo.findFirstById(result.getFirst().getId()).get(), result.getFirst());
36+
repo.deleteAll().get();
37+
Assertions.assertEquals(repo.findAll().get().size(), 0);
38+
}
2739

2840

2941
}

src/test/java/de/varilx/test/TestEntity.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,18 @@
1616
public class TestEntity {
1717

1818
@jakarta.persistence.Id
19+
@GeneratedValue(strategy = GenerationType.UUID)
1920
private UUID id;
2021

2122
private int age;
2223

24+
public TestEntity(int age) {
25+
this.age = age;
26+
}
2327

24-
25-
28+
@Override
29+
public boolean equals(Object obj) {
30+
if (!(obj instanceof TestEntity entity)) return false;
31+
return entity.getId() == this.id && entity.getAge() == this.age;
32+
}
2633
}

0 commit comments

Comments
 (0)