diff --git a/pom.xml b/pom.xml index e1cb2c3..9084652 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.skymc TabooLib - 4.65 + 4.67 UTF-8 diff --git a/src/main/java/me/skymc/taboolib/Main.java b/src/main/java/me/skymc/taboolib/Main.java index 8e1c4c8..c364a0a 100644 --- a/src/main/java/me/skymc/taboolib/Main.java +++ b/src/main/java/me/skymc/taboolib/Main.java @@ -91,8 +91,6 @@ public class Main extends JavaPlugin { TabooLibLoader.setup(); // 载入大饼 TLib.initPost(); - // 载入连接池 - HikariHandler.init(); } @Override diff --git a/src/main/java/me/skymc/taboolib/TabooLibLoader.java b/src/main/java/me/skymc/taboolib/TabooLibLoader.java index 363bb5d..8ad09da 100644 --- a/src/main/java/me/skymc/taboolib/TabooLibLoader.java +++ b/src/main/java/me/skymc/taboolib/TabooLibLoader.java @@ -109,7 +109,13 @@ public class TabooLibLoader implements Listener { public static void runTaskOnEnabled(Runnable runnable) { if (Main.isStarted()) { - runnable.run(); + Bukkit.getScheduler().runTask(TabooLib.instance(), () -> { + try { + runnable.run(); + } catch (Throwable t) { + t.printStackTrace(); + } + }); } else { tasks.add(runnable); } @@ -212,6 +218,7 @@ public class TabooLibLoader implements Listener { } catch (Exception e) { e.printStackTrace(); } + loaders.sort(Comparator.comparingInt(Loader::priority)); }); } @@ -274,6 +281,10 @@ public class TabooLibLoader implements Listener { default void unload(Plugin plugin, Class cancelClass) { } + + default int priority() { + return 0; + } } @Target(ElementType.TYPE) diff --git a/src/main/java/me/skymc/taboolib/common/inject/TInjectLoader.java b/src/main/java/me/skymc/taboolib/common/inject/TInjectLoader.java index cc8d9b1..7151031 100644 --- a/src/main/java/me/skymc/taboolib/common/inject/TInjectLoader.java +++ b/src/main/java/me/skymc/taboolib/common/inject/TInjectLoader.java @@ -77,6 +77,11 @@ public class TInjectLoader implements TabooLibLoader.Loader { }); } + @Override + public int priority() { + return -999; + } + @Override public void preLoad(Plugin plugin, Class pluginClass) { for (Field declaredField : pluginClass.getDeclaredFields()) { diff --git a/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java b/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java index 61f6fdc..6d153f4 100644 --- a/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java +++ b/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java @@ -100,5 +100,7 @@ public class ListenerPlugin implements Listener { TLocale.Logger.error("MYSQL-CONNECTION.FAIL-EXECUTE-TASK"); runnable.run(); } + // 注销异常拦截 + e.getPlugin().getLogger().setFilter(null); } } diff --git a/src/main/java/me/skymc/taboolib/mysql/IColumn.java b/src/main/java/me/skymc/taboolib/mysql/IColumn.java new file mode 100644 index 0000000..6a5f90d --- /dev/null +++ b/src/main/java/me/skymc/taboolib/mysql/IColumn.java @@ -0,0 +1,11 @@ +package me.skymc.taboolib.mysql; + +/** + * @Author 坏黑 + * @Since 2018-12-08 13:46 + */ +public abstract class IColumn { + + abstract public String convertToCommand(); + +} diff --git a/src/main/java/me/skymc/taboolib/mysql/IHost.java b/src/main/java/me/skymc/taboolib/mysql/IHost.java new file mode 100644 index 0000000..5adf5fa --- /dev/null +++ b/src/main/java/me/skymc/taboolib/mysql/IHost.java @@ -0,0 +1,42 @@ +package me.skymc.taboolib.mysql; + +import org.bukkit.plugin.Plugin; + +/** + * @Author sky + * @Since 2018-05-14 19:07 + */ +public abstract class IHost { + + private Plugin plugin; + private boolean autoClose; + + public IHost(Plugin plugin) { + this.plugin = plugin; + } + + public IHost(Plugin plugin, boolean autoClose) { + this.plugin = plugin; + this.autoClose = autoClose; + } + + public Plugin getPlugin() { + return plugin; + } + + public void setPlugin(Plugin plugin) { + this.plugin = plugin; + } + + public boolean isAutoClose() { + return autoClose; + } + + public void setAutoClose(boolean autoClose) { + this.autoClose = autoClose; + } + + abstract public String getConnectionUrl(); + + abstract public String getConnectionUrlSimple(); +} diff --git a/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumn.java b/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumn.java index dd6463f..8d14f1b 100644 --- a/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumn.java +++ b/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumn.java @@ -1,6 +1,7 @@ package me.skymc.taboolib.mysql.builder; import com.ilummc.tlib.util.Strings; +import me.skymc.taboolib.mysql.IColumn; import java.util.Arrays; @@ -8,7 +9,7 @@ import java.util.Arrays; * @Author sky * @Since 2018-05-14 19:09 */ -public class SQLColumn { +public class SQLColumn extends IColumn { public static final SQLColumn PRIMARY_KEY_ID = new SQLColumn(SQLColumnType.INT, "id", SQLColumnOption.NOTNULL, SQLColumnOption.PRIMARY_KEY, SQLColumnOption.AUTO_INCREMENT); @@ -94,6 +95,7 @@ public class SQLColumn { return this; } + @Override public String convertToCommand() { if (this.m == 0 && this.d == 0) { return Strings.replaceWithOrder("`{0}` {1}{2}", columnName, columnType.name().toLowerCase(), convertToOptions()); @@ -106,23 +108,7 @@ public class SQLColumn { private String convertToOptions() { StringBuilder builder = new StringBuilder(); - for (SQLColumnOption options : columnOptions) { - switch (options) { - case NOTNULL: - builder.append(" NOT NULL"); - break; - case PRIMARY_KEY: - builder.append(" PRIMARY KEY"); - break; - case AUTO_INCREMENT: - builder.append(" AUTO_INCREMENT"); - break; - case UNIQUE_KEY: - builder.append(" UNIQUE KEY"); - break; - default: - } - } + Arrays.stream(columnOptions).forEach(option -> builder.append(" ").append(option)); if (defaultValue != null) { if (defaultValue instanceof String) { builder.append(" DEFAULT '").append(defaultValue).append("'"); @@ -135,6 +121,13 @@ public class SQLColumn { @Override public String toString() { - return "columnType=" + "SQLColumn{" + columnType + ", m=" + m + ", d=" + d + ", columnName='" + columnName + '\'' + ", defaultValue=" + defaultValue + ", columnOptions=" + Arrays.toString(columnOptions) + '}'; + return "SQLColumn{" + + "columnType=" + columnType + + ", m=" + m + + ", d=" + d + + ", columnName='" + columnName + '\'' + + ", defaultValue=" + defaultValue + + ", columnOptions=" + Arrays.toString(columnOptions) + + '}'; } } diff --git a/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumnOption.java b/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumnOption.java index 8e9dee4..bedc9de 100644 --- a/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumnOption.java +++ b/src/main/java/me/skymc/taboolib/mysql/builder/SQLColumnOption.java @@ -9,21 +9,30 @@ public enum SQLColumnOption { /** * 不能为空 */ - NOTNULL, + NOTNULL("NOT NULL"), /** * 唯一 */ - UNIQUE_KEY, + UNIQUE_KEY("UNIQUE KEY"), /** * 主键 */ - PRIMARY_KEY, + PRIMARY_KEY("PRIMARY KEY"), /** * 递增 */ - AUTO_INCREMENT + AUTO_INCREMENT("AUTO_INCREMENT"); + String text; + + SQLColumnOption(String text) { + this.text = text; + } + + public String getText() { + return text; + } } diff --git a/src/main/java/me/skymc/taboolib/mysql/builder/SQLHost.java b/src/main/java/me/skymc/taboolib/mysql/builder/SQLHost.java index 9b095a6..96fa4ea 100644 --- a/src/main/java/me/skymc/taboolib/mysql/builder/SQLHost.java +++ b/src/main/java/me/skymc/taboolib/mysql/builder/SQLHost.java @@ -1,6 +1,7 @@ package me.skymc.taboolib.mysql.builder; import com.ilummc.tlib.util.Strings; +import me.skymc.taboolib.mysql.IHost; import me.skymc.taboolib.string.ArrayUtils; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.plugin.Plugin; @@ -13,15 +14,13 @@ import java.util.stream.Collectors; * @Author sky * @Since 2018-05-14 19:01 */ -public class SQLHost { +public class SQLHost extends IHost { private String host; private String user; private String port; private String password; private String database; - private Plugin plugin; - private boolean autoClose; private List flags = ArrayUtils.asList("characterEncoding=utf-8", "useSSL=false"); public SQLHost(ConfigurationSection section, Plugin plugin) { @@ -32,18 +31,32 @@ public class SQLHost { this(section.getString("host", "localhost"), section.getString("user", "root"), section.getString("port", "3306"), section.getString("password", ""), section.getString("database", "test"), plugin); } + public SQLHost(String host, int port, String user, String password, String database, Plugin plugin) { + this(host, user, String.valueOf(port), password, database, plugin, false); + } + + @Deprecated public SQLHost(String host, String user, String port, String password, String database, Plugin plugin) { this(host, user, port, password, database, plugin, false); } public SQLHost(String host, String user, String port, String password, String database, Plugin plugin, boolean autoClose) { + super(plugin, autoClose); this.host = host; this.user = user; this.port = port; this.password = password; this.database = database; - this.plugin = plugin; - this.autoClose = false; + } + + @Override + public String getConnectionUrl() { + return Strings.replaceWithOrder("jdbc:mysql://{0}:{1}/{2}" + getFlagsInUrl(), this.host, this.port, this.database); + } + + @Override + public String getConnectionUrlSimple() { + return Strings.replaceWithOrder("jdbc:mysql://{0}:{1}/{2}", this.host, this.port, this.database); } public String getHost() { @@ -66,26 +79,10 @@ public class SQLHost { return database; } - public Plugin getPlugin() { - return plugin; - } - - public boolean isAutoClose() { - return autoClose; - } - public List getFlags() { return flags; } - public String getConnectionUrl() { - return Strings.replaceWithOrder("jdbc:mysql://{0}:{1}/{2}" + getFlagsInUrl(), this.host, this.port, this.database); - } - - public String getConnectionUrlSimple() { - return Strings.replaceWithOrder("jdbc:mysql://{0}:{1}/{2}", this.host, this.port, this.database); - } - public String getFlagsInUrl() { if (flags.isEmpty()) { return ""; @@ -103,18 +100,17 @@ public class SQLHost { return false; } SQLHost sqlHost = (SQLHost) o; - return autoClose == sqlHost.autoClose && - Objects.equals(getHost(), sqlHost.getHost()) && + return Objects.equals(getHost(), sqlHost.getHost()) && Objects.equals(getUser(), sqlHost.getUser()) && Objects.equals(getPort(), sqlHost.getPort()) && Objects.equals(getPassword(), sqlHost.getPassword()) && Objects.equals(getDatabase(), sqlHost.getDatabase()) && - Objects.equals(getPlugin(), sqlHost.getPlugin()); + Objects.equals(getFlags(), sqlHost.getFlags()); } @Override public int hashCode() { - return Objects.hash(getHost(), getUser(), getPort(), getPassword(), getDatabase(), getPlugin(), autoClose); + return Objects.hash(getHost(), getUser(), getPort(), getPassword(), getDatabase(), getFlags()); } @Override @@ -125,8 +121,7 @@ public class SQLHost { ", port='" + port + '\'' + ", password='" + password + '\'' + ", database='" + database + '\'' + - ", plugin=" + plugin + - ", autoClose=" + autoClose + + ", flags=" + flags + '}'; } } diff --git a/src/main/java/me/skymc/taboolib/mysql/builder/SQLTable.java b/src/main/java/me/skymc/taboolib/mysql/builder/SQLTable.java index fb52e5e..4e3412d 100644 --- a/src/main/java/me/skymc/taboolib/mysql/builder/SQLTable.java +++ b/src/main/java/me/skymc/taboolib/mysql/builder/SQLTable.java @@ -1,14 +1,12 @@ package me.skymc.taboolib.mysql.builder; import com.ilummc.tlib.util.Strings; -import me.skymc.taboolib.mysql.builder.data.Insert; -import me.skymc.taboolib.mysql.builder.data.Select; +import me.skymc.taboolib.mysql.IColumn; import me.skymc.taboolib.mysql.builder.query.RunnableQuery; import me.skymc.taboolib.mysql.builder.query.RunnableUpdate; import me.skymc.taboolib.string.ArrayUtils; import java.util.Arrays; -import java.util.stream.Collectors; /** * @Author sky @@ -17,17 +15,28 @@ import java.util.stream.Collectors; public class SQLTable { private String tableName; - private SQLColumn[] columns; + private IColumn[] columns; public SQLTable(String tableName) { this.tableName = tableName; } + public SQLTable(String tableName, IColumn... column) { + this.tableName = tableName; + this.columns = column; + } + public SQLTable(String tableName, SQLColumn... column) { this.tableName = tableName; this.columns = column; } + public SQLTable column(IColumn column) { + columns = columns == null ? new IColumn[] {column} : ArrayUtils.arrayAppend(columns, column); + return this; + } + + @Deprecated public SQLTable addColumn(SQLColumn sqlColumn) { columns = columns == null ? new SQLColumn[] {sqlColumn} : ArrayUtils.arrayAppend(columns, sqlColumn); return this; @@ -51,18 +60,6 @@ public class SQLTable { return Strings.replaceWithOrder("truncate table `{0}`", tableName); } - public RunnableQuery select(Select where) { - return executeSelect(Arrays.stream(where.getColumn()).map(s -> s + " = ?").collect(Collectors.joining(", "))); - } - - public RunnableUpdate insert(Insert... inserts) { - return executeInsert(Arrays.stream(inserts).map(Insert::getText).collect(Collectors.joining(", "))); - } - - public RunnableUpdate update(Select update, Select where) { - return executeUpdate(Arrays.stream(update.getColumn()).map(s -> s + " = ?").collect(Collectors.joining(", ")), Arrays.stream(where.getColumn()).map(s -> s + " = ?").collect(Collectors.joining(", "))); - } - public RunnableQuery executeQuery(String query) { return new RunnableQuery(query); } @@ -97,7 +94,7 @@ public class SQLTable { return tableName; } - public SQLColumn[] getColumns() { + public IColumn[] getColumns() { return columns; } } diff --git a/src/main/java/me/skymc/taboolib/mysql/builder/data/Insert.java b/src/main/java/me/skymc/taboolib/mysql/builder/data/Insert.java deleted file mode 100644 index a8cc7af..0000000 --- a/src/main/java/me/skymc/taboolib/mysql/builder/data/Insert.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.skymc.taboolib.mysql.builder.data; - -/** - * @Author 坏黑 - * @Since 2018-12-01 23:32 - */ -public enum Insert { - - NULL("null"), - - VARIABLE("?"); - - private String text; - - Insert(String text) { - this.text = text; - } - - public String getText() { - return text; - } -} diff --git a/src/main/java/me/skymc/taboolib/mysql/builder/data/Select.java b/src/main/java/me/skymc/taboolib/mysql/builder/data/Select.java deleted file mode 100644 index 22afe2b..0000000 --- a/src/main/java/me/skymc/taboolib/mysql/builder/data/Select.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.skymc.taboolib.mysql.builder.data; - -/** - * @Author 坏黑 - * @Since 2018-12-02 11:12 - */ -public class Select { - - private String[] column; - - public Select(String... column) { - this.column = column; - } - - public String[] getColumn() { - return column; - } - - public static Select of(String... column) { - return new Select(column); - } -} diff --git a/src/main/java/me/skymc/taboolib/mysql/hikari/HikariHandler.java b/src/main/java/me/skymc/taboolib/mysql/hikari/HikariHandler.java index d18cc9b..aa3fc79 100644 --- a/src/main/java/me/skymc/taboolib/mysql/hikari/HikariHandler.java +++ b/src/main/java/me/skymc/taboolib/mysql/hikari/HikariHandler.java @@ -6,7 +6,9 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import me.skymc.taboolib.Main; import me.skymc.taboolib.fileutils.ConfigUtils; +import me.skymc.taboolib.mysql.IHost; import me.skymc.taboolib.mysql.builder.SQLHost; +import me.skymc.taboolib.mysql.sqlite.SQLiteHost; import org.bukkit.configuration.file.FileConfiguration; import javax.sql.DataSource; @@ -18,24 +20,20 @@ import java.util.concurrent.ConcurrentHashMap; */ public class HikariHandler { - private static ConcurrentHashMap dataSource = new ConcurrentHashMap<>(); - private static FileConfiguration settings; + private static ConcurrentHashMap dataSource = new ConcurrentHashMap<>(); + private static FileConfiguration settings = ConfigUtils.saveDefaultConfig(Main.getInst(), "hikarisettings.yml"); - public static void init() { - settings = ConfigUtils.saveDefaultConfig(Main.getInst(), "hikarisettings.yml"); - } - - public static DataSource createDataSource(SQLHost host) { + public static DataSource createDataSource(IHost host) { return createDataSource(host, null); } - public static HikariDataSource createDataSource(SQLHost host, HikariConfig hikariConfig) { + public static HikariDataSource createDataSource(IHost host, HikariConfig hikariConfig) { MapDataSource mapDataSource = dataSource.computeIfAbsent(host, x -> new MapDataSource(x, new HikariDataSource(hikariConfig == null ? createConfig(host) : hikariConfig))); mapDataSource.getActivePlugin().getAndIncrement(); if (mapDataSource.getActivePlugin().get() == 1) { TLocale.Logger.info("MYSQL-HIKARI.CREATE-SUCCESS", host.getPlugin().getName(), host.getConnectionUrlSimple()); } else { - TLocale.Logger.info("MYSQL-HIKARI.CREATE-EXISTS", host.getPlugin().getName(), mapDataSource.getSqlHost().getPlugin().getName()); + TLocale.Logger.info("MYSQL-HIKARI.CREATE-EXISTS", host.getPlugin().getName(), mapDataSource.getHost().getPlugin().getName()); } return mapDataSource.getHikariDataSource(); } @@ -45,7 +43,7 @@ public class HikariHandler { dataSource.values().forEach(x -> x.getHikariDataSource().close()); } - public static void closeDataSource(SQLHost host) { + public static void closeDataSource(IHost host) { if (host != null && dataSource.containsKey(host)) { MapDataSource mapDataSource = dataSource.get(host); if (mapDataSource.getActivePlugin().getAndDecrement() <= 1) { @@ -58,14 +56,20 @@ public class HikariHandler { } } - public static HikariConfig createConfig(SQLHost sqlHost) { + public static HikariConfig createConfig(IHost host) { HikariConfig config = new HikariConfig(); - config.setDriverClassName(settings.getString("DefaultSettings.DriverClassName", "com.mysql.jdbc.Driver")); - config.setJdbcUrl(sqlHost.getConnectionUrl()); - config.setUsername(sqlHost.getUser()); - config.setPassword(sqlHost.getPassword()); + config.setJdbcUrl(host.getConnectionUrl()); + if (host instanceof SQLHost) { + config.setDriverClassName(settings.getString("DefaultSettings.DriverClassName", "com.mysql.jdbc.Driver")); + config.setUsername(((SQLHost) host).getUser()); + config.setPassword(((SQLHost) host).getPassword()); + } else if (host instanceof SQLiteHost) { + config.setDriverClassName("org.sqlite.JDBC"); + } else { + throw new IllegalArgumentException("Invalid host: " + host.getClass().getName()); + } config.setAutoCommit(settings.getBoolean("DefaultSettings.AutoCommit", true)); - config.setMinimumIdle(settings.getInt("DefaultSettings.MinimumIdle", -1)); + config.setMinimumIdle(settings.getInt("DefaultSettings.MinimumIdle", 1)); config.setMaximumPoolSize(settings.getInt("DefaultSettings.MaximumPoolSize", 10)); config.setValidationTimeout(settings.getInt("DefaultSettings.ValidationTimeout", 5000)); config.setConnectionTimeout(settings.getInt("DefaultSettings.ConnectionTimeout", 30000)); @@ -80,13 +84,33 @@ public class HikariHandler { return config; } + @Deprecated + public static DataSource createDataSource(SQLHost host) { + return createDataSource((IHost) host, null); + } + + @Deprecated + public static HikariConfig createConfig(SQLHost host) { + return createConfig((IHost) host); + } + + @Deprecated + public static HikariDataSource createDataSource(SQLHost host, HikariConfig hikariConfig) { + return createDataSource((IHost) host, hikariConfig); + } + + @Deprecated + public static void closeDataSource(SQLHost host) { + closeDataSource((IHost) host); + } + // ********************************* // // Getter and Setter // // ********************************* - public static ConcurrentHashMap getDataSource() { + public static ConcurrentHashMap getDataSource() { return dataSource; } diff --git a/src/main/java/me/skymc/taboolib/mysql/hikari/MapDataSource.java b/src/main/java/me/skymc/taboolib/mysql/hikari/MapDataSource.java index d53a503..17a95c9 100644 --- a/src/main/java/me/skymc/taboolib/mysql/hikari/MapDataSource.java +++ b/src/main/java/me/skymc/taboolib/mysql/hikari/MapDataSource.java @@ -1,7 +1,7 @@ package me.skymc.taboolib.mysql.hikari; import com.zaxxer.hikari.HikariDataSource; -import me.skymc.taboolib.mysql.builder.SQLHost; +import me.skymc.taboolib.mysql.IHost; import java.util.concurrent.atomic.AtomicInteger; @@ -11,18 +11,18 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class MapDataSource { - private SQLHost sqlHost; + private IHost host; private AtomicInteger activePlugin; private HikariDataSource hikariDataSource; - MapDataSource(SQLHost sqlHost, HikariDataSource hikariDataSource) { - this.sqlHost = sqlHost; + MapDataSource(IHost host, HikariDataSource hikariDataSource) { + this.host = host; this.activePlugin = new AtomicInteger(); this.hikariDataSource = hikariDataSource; } - public SQLHost getSqlHost() { - return sqlHost; + public IHost getHost() { + return host; } public AtomicInteger getActivePlugin() { diff --git a/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumn.java b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumn.java new file mode 100644 index 0000000..4b7098b --- /dev/null +++ b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumn.java @@ -0,0 +1,132 @@ +package me.skymc.taboolib.mysql.sqlite; + +import com.ilummc.tlib.util.Strings; +import me.skymc.taboolib.mysql.IColumn; + +import java.util.Arrays; + +/** + * @Author sky + * @Since 2018-05-14 19:09 + */ +public class SQLiteColumn extends IColumn { + + public static final SQLiteColumn PRIMARY_KEY_ID = new SQLiteColumn(SQLiteColumnType.INTEGER, "id", SQLiteColumnOption.NOTNULL, SQLiteColumnOption.PRIMARY_KEY, SQLiteColumnOption.AUTOINCREMENT); + + private SQLiteColumnType columnType; + private int m; + private int d; + + private String columnName; + private Object defaultValue; + + private SQLiteColumnOption[] columnOptions; + + /** + * 文本 类型常用构造器 + * new SQLColumn(SQLiteColumnType.TEXT, "username"); + */ + public SQLiteColumn(SQLiteColumnType columnType, String columnName) { + this(columnType, 0, 0, columnName, null); + } + + /** + * CHAR 类型常用构造器 + * + * @param columnType + * @param columnName + */ + public SQLiteColumn(SQLiteColumnType columnType, int m, String columnName) { + this(columnType, m, 0, columnName, null); + } + + /** + * 主键 类型常用构造器 + * new SQLColumn(SQLiteColumnType.TEXT, "username", SQLiteColumnOption.PRIMARY_KEY, SQLiteColumnOption.AUTO_INCREMENT); + */ + public SQLiteColumn(SQLiteColumnType columnType, String columnName, SQLiteColumnOption... columnOptions) { + this(columnType, 0, 0, columnName, null, columnOptions); + } + + /** + * 数据 类型常用构造器 + * new SQLColumn(SQLiteColumnType.TEXT, "player_group", "PLAYER"); + */ + public SQLiteColumn(SQLiteColumnType columnType, String columnName, Object defaultValue) { + this(columnType, 0, 0, columnName, defaultValue); + } + + /** + * 完整构造器 + * + * @param columnType 类型 + * @param m m值 + * @param d d值 + * @param columnName 名称 + * @param defaultValue 默认值 + * @param columnOptions 属性值 + */ + public SQLiteColumn(SQLiteColumnType columnType, int m, int d, String columnName, Object defaultValue, SQLiteColumnOption... columnOptions) { + this.columnType = columnType; + this.m = m; + this.d = d; + this.columnName = columnName; + this.defaultValue = defaultValue; + this.columnOptions = columnOptions; + } + + public SQLiteColumn m(int m) { + this.m = m; + return this; + } + + public SQLiteColumn d(int d) { + this.d = d; + return this; + } + + public SQLiteColumn defaultValue(Object defaultValue) { + this.defaultValue = defaultValue; + return this; + } + + public SQLiteColumn columnOptions(SQLiteColumnOption... columnOptions) { + this.columnOptions = columnOptions; + return this; + } + + public String convertToCommand() { + if (this.m == 0 && this.d == 0) { + return Strings.replaceWithOrder("`{0}` {1}{2}", columnName, columnType.name().toLowerCase(), convertToOptions()); + } else if (this.d == 0) { + return Strings.replaceWithOrder("`{0}` {1}({2}){3}", columnName, columnType.name().toLowerCase(), m, convertToOptions()); + } else { + return Strings.replaceWithOrder("`{0}` {1}({2},{3}){4}", columnName, columnType.name().toLowerCase(), m, d, convertToOptions()); + } + } + + private String convertToOptions() { + StringBuilder builder = new StringBuilder(); + Arrays.stream(columnOptions).forEach(option -> builder.append(" ").append(option.getText())); + if (defaultValue != null) { + if (defaultValue instanceof String) { + builder.append(" DEFAULT '").append(defaultValue).append("'"); + } else { + builder.append(" DEFAULT ").append(defaultValue); + } + } + return builder.toString(); + } + + @Override + public String toString() { + return "SQLiteColumn{" + + "columnType=" + columnType + + ", m=" + m + + ", d=" + d + + ", columnName='" + columnName + '\'' + + ", defaultValue=" + defaultValue + + ", columnOptions=" + Arrays.toString(columnOptions) + + '}'; + } +} diff --git a/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumnOption.java b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumnOption.java new file mode 100644 index 0000000..4967b0e --- /dev/null +++ b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumnOption.java @@ -0,0 +1,38 @@ +package me.skymc.taboolib.mysql.sqlite; + +/** + * @Author sky + * @Since 2018-05-14 21:43 + */ +public enum SQLiteColumnOption { + + /** + * 不能为空 + */ + NOTNULL("NOT NULL"), + + /** + * 唯一 + */ + UNIQUE("UNIQUE"), + + /** + * 主键 + */ + PRIMARY_KEY("PRIMARY KEY"), + + /** + * 递增 + */ + AUTOINCREMENT("AUTOINCREMENT"); + + String text; + + SQLiteColumnOption(String text) { + this.text = text; + } + + public String getText() { + return text; + } +} diff --git a/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumnType.java b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumnType.java new file mode 100644 index 0000000..894aa9a --- /dev/null +++ b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteColumnType.java @@ -0,0 +1,36 @@ +package me.skymc.taboolib.mysql.sqlite; + +/** + * @Author 坏黑 + * @Since 2018-12-08 13:28 + */ +public enum SQLiteColumnType { + + NULL, + + /** + * 带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 + */ + INTEGER, + + /** + * 浮点值,存储为 8 字节的 IEEE 浮点数字。 + */ + REAL, + + /** + * 文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 + */ + TEXT, + + /** + * blob 数据,完全根据它的输入存储。 + */ + BLOB, + + /** + * 数字自动转换 + */ + NUMERIC + +} diff --git a/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteHost.java b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteHost.java new file mode 100644 index 0000000..7d0928d --- /dev/null +++ b/src/main/java/me/skymc/taboolib/mysql/sqlite/SQLiteHost.java @@ -0,0 +1,64 @@ +package me.skymc.taboolib.mysql.sqlite; + +import me.skymc.taboolib.mysql.IHost; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.util.Objects; + +/** + * @Author 坏黑 + * @Since 2018-12-08 12:58 + */ +public class SQLiteHost extends IHost { + + private final File file; + + public SQLiteHost(File file, Plugin plugin) { + super(plugin); + this.file = file; + } + + public SQLiteHost(File file, Plugin plugin, boolean autoClose) { + super(plugin, autoClose); + this.file = file; + } + + public File getFile() { + return file; + } + + @Override + public String getConnectionUrl() { + return "jdbc:sqlite:" + file.getPath(); + } + + @Override + public String getConnectionUrlSimple() { + return "jdbc:sqlite:" + file.getPath(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof SQLiteHost)) { + return false; + } + SQLiteHost that = (SQLiteHost) o; + return Objects.equals(getFile(), that.getFile()); + } + + @Override + public int hashCode() { + return Objects.hash(getFile()); + } + + @Override + public String toString() { + return "SQLiteHost{" + + "file=" + file + + '}'; + } +}