mirror of
https://github.com/xHyroM/lighteco.git
synced 2024-11-21 22:41:06 +01:00
feat: mariadb [wip]
some weird syntax issues
This commit is contained in:
parent
818ffe28cf
commit
e556356e56
6 changed files with 174 additions and 19 deletions
|
@ -32,8 +32,8 @@ tasks.shadowJar {
|
||||||
relocate("eu.okaeri.configs", "dev.xhyrom.lighteco.libraries.okaeri.configs")
|
relocate("eu.okaeri.configs", "dev.xhyrom.lighteco.libraries.okaeri.configs")
|
||||||
relocate("eu.okaeri.validator", "dev.xhyrom.lighteco.libraries.okaeri.validator")
|
relocate("eu.okaeri.validator", "dev.xhyrom.lighteco.libraries.okaeri.validator")
|
||||||
|
|
||||||
relocate("net.kyori.adventure", "dev.xhyrom.lighteco.libraries.net.kyori.adventure")
|
//relocate("net.kyori.adventure", "dev.xhyrom.lighteco.libraries.net.kyori.adventure")
|
||||||
relocate("net.kyori.examination", "dev.xhyrom.lighteco.libraries.net.kyori.examination")
|
//relocate("net.kyori.examination", "dev.xhyrom.lighteco.libraries.net.kyori.examination")
|
||||||
|
|
||||||
relocate("org.yaml.snakeyaml", "dev.xhyrom.lighteco.libraries.org.yaml.snakeyaml")
|
relocate("org.yaml.snakeyaml", "dev.xhyrom.lighteco.libraries.org.yaml.snakeyaml")
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import dev.xhyrom.lighteco.common.manager.user.StandardUserManager;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.ServicePriority;
|
import org.bukkit.plugin.ServicePriority;
|
||||||
|
import org.bukkit.plugin.java.PluginClassLoader;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|
|
@ -3,10 +3,12 @@ package dev.xhyrom.lighteco.common.dependencies;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.io.MoreFiles;
|
import com.google.common.io.MoreFiles;
|
||||||
import dev.xhyrom.lighteco.common.plugin.LightEcoPlugin;
|
import dev.xhyrom.lighteco.common.plugin.LightEcoPlugin;
|
||||||
|
import dev.xhyrom.lighteco.common.plugin.classpath.URLClassLoaderAccess;
|
||||||
import dev.xhyrom.lighteco.common.storage.StorageType;
|
import dev.xhyrom.lighteco.common.storage.StorageType;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
|
@ -22,10 +24,13 @@ public class DependencyManagerImpl implements DependencyManager {
|
||||||
|
|
||||||
private final DependencyRegistry registry;
|
private final DependencyRegistry registry;
|
||||||
private final Path cacheDirectory;
|
private final Path cacheDirectory;
|
||||||
|
private final URLClassLoaderAccess classLoader;
|
||||||
|
|
||||||
public DependencyManagerImpl(LightEcoPlugin plugin) {
|
public DependencyManagerImpl(LightEcoPlugin plugin) {
|
||||||
this.registry = new DependencyRegistry();
|
this.registry = new DependencyRegistry();
|
||||||
this.cacheDirectory = setupCacheDirectory(plugin);
|
this.cacheDirectory = setupCacheDirectory(plugin);
|
||||||
|
this.classLoader = URLClassLoaderAccess.create((URLClassLoader) plugin.getBootstrap().getClass().getClassLoader());
|
||||||
|
System.out.println(this.classLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -56,17 +61,24 @@ public class DependencyManagerImpl implements DependencyManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDependency(Dependency dependency) {
|
private void loadDependency(Dependency dependency) throws Exception {
|
||||||
if (this.loaded.containsKey(dependency)) {
|
if (this.loaded.containsKey(dependency)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
Path file = downloadDependency(dependency);
|
||||||
Path file = downloadDependency(dependency);
|
|
||||||
|
|
||||||
this.loaded.put(dependency, file);
|
this.loaded.put(dependency, file);
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
System.out.println("HHHH");
|
||||||
|
if (this.registry.shouldAutoLoad(dependency)) {
|
||||||
|
System.out.println("Loaded dependency " + dependency + " from " + file);
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.classLoader.addURL(file.toUri().toURL());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,4 +24,11 @@ public class DependencyRegistry {
|
||||||
|
|
||||||
return dependencies;
|
return dependencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean shouldAutoLoad(Dependency dependency) {
|
||||||
|
return switch (dependency) {
|
||||||
|
case H2_DRIVER, SQLITE_DRIVER -> false;
|
||||||
|
default -> true;
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
package dev.xhyrom.lighteco.common.plugin.classpath;
|
||||||
|
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
public abstract class URLClassLoaderAccess {
|
||||||
|
public static URLClassLoaderAccess create(URLClassLoader classLoader) {
|
||||||
|
if (Reflection.isSupported()) {
|
||||||
|
return new Reflection(classLoader);
|
||||||
|
} else if (Unsafe.isSupported()) {
|
||||||
|
return new Unsafe(classLoader);
|
||||||
|
} else {
|
||||||
|
return Noop.INSTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final URLClassLoader classLoader;
|
||||||
|
|
||||||
|
protected URLClassLoaderAccess(URLClassLoader classLoader) {
|
||||||
|
this.classLoader = classLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void addURL(@NonNull URL url);
|
||||||
|
|
||||||
|
private static class Reflection extends URLClassLoaderAccess {
|
||||||
|
private static final Method ADD_URL_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Method addUrlMethod;
|
||||||
|
try {
|
||||||
|
addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
|
||||||
|
addUrlMethod.setAccessible(true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
addUrlMethod = null;
|
||||||
|
}
|
||||||
|
ADD_URL_METHOD = addUrlMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isSupported() {
|
||||||
|
return ADD_URL_METHOD != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Reflection(URLClassLoader classLoader) {
|
||||||
|
super(classLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addURL(@NonNull URL url) {
|
||||||
|
try {
|
||||||
|
ADD_URL_METHOD.invoke(super.classLoader, url);
|
||||||
|
} catch (ReflectiveOperationException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Unsafe extends URLClassLoaderAccess {
|
||||||
|
private static final sun.misc.Unsafe UNSAFE;
|
||||||
|
|
||||||
|
static {
|
||||||
|
sun.misc.Unsafe unsafe;
|
||||||
|
try {
|
||||||
|
Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
|
unsafeField.setAccessible(true);
|
||||||
|
unsafe = (sun.misc.Unsafe) unsafeField.get(null);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
unsafe = null;
|
||||||
|
}
|
||||||
|
UNSAFE = unsafe;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isSupported() {
|
||||||
|
return UNSAFE != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Collection<URL> unopenedURLs;
|
||||||
|
private final Collection<URL> pathURLs;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Unsafe(URLClassLoader classLoader) {
|
||||||
|
super(classLoader);
|
||||||
|
|
||||||
|
Collection<URL> unopenedURLs;
|
||||||
|
Collection<URL> pathURLs;
|
||||||
|
try {
|
||||||
|
Object ucp = fetchField(URLClassLoader.class, classLoader, "ucp");
|
||||||
|
unopenedURLs = (Collection<URL>) fetchField(ucp.getClass(), ucp, "unopenedUrls");
|
||||||
|
pathURLs = (Collection<URL>) fetchField(ucp.getClass(), ucp, "path");
|
||||||
|
} catch (Throwable e) {
|
||||||
|
unopenedURLs = null;
|
||||||
|
pathURLs = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.unopenedURLs = unopenedURLs;
|
||||||
|
this.pathURLs = pathURLs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object fetchField(final Class<?> clazz, final Object object, final String name) throws NoSuchFieldException {
|
||||||
|
Field field = clazz.getDeclaredField(name);
|
||||||
|
long offset = UNSAFE.objectFieldOffset(field);
|
||||||
|
return UNSAFE.getObject(object, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addURL(@NonNull URL url) {
|
||||||
|
if (this.unopenedURLs == null || this.pathURLs == null) {
|
||||||
|
throw new NullPointerException("unopenedURLs or pathURLs");
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized (this.unopenedURLs) {
|
||||||
|
this.unopenedURLs.add(url);
|
||||||
|
this.pathURLs.add(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Noop extends URLClassLoaderAccess {
|
||||||
|
private static final Noop INSTANCE = new Noop();
|
||||||
|
|
||||||
|
private Noop() {
|
||||||
|
super(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addURL(@NonNull URL url) {
|
||||||
|
throw new UnsupportedOperationException("Noop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,17 +21,17 @@ public class SqlStorageProvider implements StorageProvider {
|
||||||
private final String SAVE_USER_LOCAL_CURRENCY;
|
private final String SAVE_USER_LOCAL_CURRENCY;
|
||||||
private final String SAVE_USER_GLOBAL_CURRENCY;
|
private final String SAVE_USER_GLOBAL_CURRENCY;
|
||||||
private static final String LOAD_WHOLE_USER = """
|
private static final String LOAD_WHOLE_USER = """
|
||||||
SELECT currency_identifier, balance
|
SELECT currency_identifier, balance
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
SELECT currency_identifier, balance
|
SELECT currency_identifier, balance
|
||||||
FROM {prefix}_users
|
FROM '{prefix}_users'
|
||||||
WHERE uuid=?1
|
WHERE uuid=?1
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT currency_identifier, balance
|
SELECT currency_identifier, balance
|
||||||
FROM {prefix}_{context}_users
|
FROM '{prefix}_{context}_users'
|
||||||
WHERE uuid=?1
|
WHERE uuid=?1
|
||||||
);
|
) AS combined_currencies;
|
||||||
""";
|
""";
|
||||||
|
|
||||||
private final LightEcoPlugin plugin;
|
private final LightEcoPlugin plugin;
|
||||||
|
@ -86,6 +86,7 @@ public class SqlStorageProvider implements StorageProvider {
|
||||||
try (Connection c = this.connectionFactory.getConnection()) {
|
try (Connection c = this.connectionFactory.getConnection()) {
|
||||||
try (PreparedStatement ps = c.prepareStatement(this.statementProcessor.apply(LOAD_WHOLE_USER))) {
|
try (PreparedStatement ps = c.prepareStatement(this.statementProcessor.apply(LOAD_WHOLE_USER))) {
|
||||||
ps.setString(1, uniqueIdString);
|
ps.setString(1, uniqueIdString);
|
||||||
|
ps.setString(2, uniqueIdString);
|
||||||
|
|
||||||
ResultSet rs = ps.executeQuery();
|
ResultSet rs = ps.executeQuery();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue