67 Commits

Author SHA1 Message Date
bf5429634a Minimize Jar [pom.xl]
Added minimize jar to configuration. Greatly reduces exported jar file size.
2022-08-18 09:45:40 +00:00
abd2d6fe03 Update 'pom.xml' 2022-08-18 09:44:50 +00:00
2cc46fdae5 Unnecessary Import [EffExecuteStatement.java]
Removed unnecessary import.
2022-08-18 09:43:54 +00:00
4fee9f2898 Update 'pom.xml' 2022-08-18 09:41:44 +00:00
bbbfb83518 Small Changes [pom.xml]
Added minimize jar to configuration. Makes exported jar file size substantially smaller.
2022-08-18 09:41:10 +00:00
f51db586ef Document supported Minecraft server versions 2022-08-12 08:38:18 +00:00
3466a04ec8 Fix null pointer exception 2022-03-21 17:28:59 +02:00
d0191007a5 Fix mistake in readme 2022-03-20 11:30:51 +01:00
b1df041ccb Update 'README.md' 2022-03-20 11:29:17 +01:00
b9e14652ea Update 'README.md' 2022-03-20 11:28:55 +01:00
0098450441 Update 'README.md' 2022-03-20 11:28:25 +01:00
9c41039217 Update 'README.md' 2022-03-20 11:27:35 +01:00
46a72639af Add config to readme 2022-03-20 11:26:33 +01:00
cbd1565896 Add installation to readme 2022-03-20 11:21:59 +01:00
0332ad9334 If we're moving to Java 9, let's move to Java 11 as it is LTS 2022-03-20 12:08:41 +02:00
32f40af484 Fix blob column types & Use Java 9 2022-03-20 11:57:25 +02:00
2a24a974ef Update dependency, performance improvement 2022-01-28 15:06:16 +02:00
d80df616c3 Update dependencies 2022-01-23 11:39:02 +02:00
0b3b183a14 Fix compilation 2021-10-21 11:00:14 +03:00
70fa7b7105 1.3.3 2021-10-21 11:00:12 +03:00
c85d579645 fix expressions in queries, thanks to TPGamesNL 2021-10-21 11:00:12 +03:00
1e039c1bfe fix skript 2.6 support 2021-10-21 11:00:11 +03:00
2a4d7f6a6d add null check on locals 2021-10-21 11:00:11 +03:00
2dcd4edf58 reformat code (thanks TPGamesNL) 2021-10-21 11:00:11 +03:00
9b694206d3 Update README.md 2021-10-21 11:00:10 +03:00
d8cb6fedb5 finish experimental (disabled) on complete of sql query event 2021-10-21 11:00:10 +03:00
2eda1418cf Add Java 8 support 2021-10-21 11:00:09 +03:00
83d2795519 set api version to 1.13
I think this will help with performance in 1.13+ version, but will keep working in 1.9+
2021-10-21 11:00:09 +03:00
66459c6190 Merge pull request #10 from ham1255/master
Fixed Govindas weirdness on project files (maven fix)
2021-10-21 11:00:08 +03:00
b1ef437b96 partially fixed pom.xml 2021-10-21 11:00:08 +03:00
mohammed jasem alaajel
35cfb0b4bb Fixed Govindas weirdness on project files 2021-10-21 11:00:08 +03:00
4da64624d8 Fix pom.xml & update HikariCP 2021-10-21 11:00:07 +03:00
0c16b98553 make sql auto sync if not main thread 2021-10-21 11:00:07 +03:00
9e7c5fcbee Preparations for quicker queries (no 50ms delay) feature 2021-10-21 11:00:07 +03:00
8b3d26cf78 Update README.md 2021-10-21 11:00:07 +03:00
5a22864650 remove thread pool config option & Use CachedThreadPool to make sure all threads are used properly
CachedThreadPool automatically creates threads on demand and automatically deletes unused threads after 60 seconds of no usage, so we can remove config option
2021-10-21 11:00:06 +03:00
05554a0043 1.2.1 2021-10-21 11:00:06 +03:00
f6a43f0b53 Make config more informative 2021-10-21 11:00:06 +03:00
5803be55b7 Support missing config options 2021-10-21 11:00:06 +03:00
d57b921b4f Shade MariaDB driver & add configurable driver class to config 2021-10-21 11:00:06 +03:00
4fd654c743 bump HikariCP version 2021-10-21 11:00:06 +03:00
233d21a30b Fix memory leak introduced by last commit 2021-10-21 11:00:06 +03:00
8e760c4d8b Merge branch 'master' of https://github.com/Govindass/skript-db 2021-10-21 11:00:06 +03:00
fe2231ae23 Update README.md 2021-10-21 11:00:06 +03:00
a132912f6b Switch from gradle to maven (preference) and optimize code 2021-10-21 11:00:05 +03:00
d4f9a394fd Add synchronous syntax to readme 2021-10-21 11:00:05 +03:00
a63a4c6d6f Fix local variables in sql queries within the same tick & first startup errors 2021-10-21 11:00:05 +03:00
11063c166d Bump HikariCP 3.4.3 -> 3.4.5 2021-10-21 11:00:05 +03:00
b5f2d56263 Remove debug message 2021-10-21 11:00:05 +03:00
8b5121d5fb Make thread pool configurable 2021-10-21 11:00:05 +03:00
b435696385 Add synchronous support on current thread 2021-10-21 11:00:05 +03:00
4d795edf01 Merge FranKusmiruk's Pull Request 2021-10-21 11:00:05 +03:00
2570408906 add gradle fatJar task 2021-10-21 11:00:05 +03:00
8d94a85779 Update HikariCP, should fix a lot of issues 2021-10-21 11:00:05 +03:00
6d0ec81e2e Remove unused class 2021-10-21 11:00:05 +03:00
c4379d45b7 add synchronous 2021-10-21 11:00:04 +03:00
434ea07410 Delete EffSyncExecuteStatement.java 2021-10-21 11:00:04 +03:00
8ca308802f Delete EffExecuteStatement.java 2021-10-21 11:00:04 +03:00
2ce1dd924e Delete plugin.yml 2021-10-21 11:00:02 +03:00
b20740b020 Add files via upload 2021-10-21 10:59:57 +03:00
Bryan Terce
7906dd8eb1 0.2.1 Hotfix 2019-06-26 01:56:29 -07:00
Bryan Terce
33f4d5ff54 Fix sync execute logic (fixes #16) 2019-06-26 01:55:08 -07:00
Bryan Terce
9a20da02a0 0.2.0 Update 2019-06-22 12:12:27 -07:00
Bryan Terce
f13bf78007 Manually fix README 2019-06-22 12:11:29 -07:00
Bryan Terce
55081e5d28 Update README 2019-06-22 12:09:59 -07:00
Bryan Terce
d88e431f07 Add synchronous execution flag 2019-06-22 12:09:17 -07:00
Bryan Terce
e6606a012a Fix lifespan syntax 2019-06-22 12:05:22 -07:00
11 changed files with 566 additions and 463 deletions

View File

@@ -5,10 +5,18 @@
### Difference from original skript-db
- Fixed local variables disappearance in newer Skript versions (very hacky fix, but it works, so that's good!)
- Thread-pool size is now automatically increasing on demand to use of CachedThreadPool, instead of a fixed hard-coded number
- Uses a newer version of HikariCP
- Only meant to be used by newer Minecraft versions (1.8 is not supported)
- Thread-pool size is now automatically increasing on demand with use of CachedThreadPool, instead of a fixed hard-coded number
- Uses newer versions of dependencies (Increased performance and security)
- Replaced `synchronously execute` with `quickly execute`, which allows to speed up queries by 50ms with some risk
- SQL Driver is configurable
- A few variable type related bugs fixed
- Uses Java 11 instead of Java 8
### Installation
1. Use 1.8+ Minecraft server version.
2. Use Skript 2.5+ (1.8 Skript fork is needed if you're using 1.8)
3. Use Java 11+ (If you use 1.8, a spigot fork is needed to support Java 11+)
4. Put skript-db in plugins folder and restart the server
### Expression `Data Source` => `datasource`
Stores the connection information for a data source. This should be saved to a variable in a
`script load` event or manually through an effect command.
@@ -36,10 +44,10 @@ Executes a statement on a database and optionally stores the result in a variabl
If a list variable, such as `{test::*}`, is passed, the query result will be mapped to the list
variable in the form `{test::<column name>::<row number>}`
If `synchronously` is specified, the SQL query will be done on the current thread.
If `quickly` is specified, the SQL query will be done without jumping back to main thread, which speeds it up by 50ms, however that makes code after it to also be on separate thread, you can jump back to main thread by adding `wait a tick`
#### Syntax
```
[synchronously] execute %string% (in|on) %datasource% [and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]
[quickly] execute %string% (in|on) %datasource% [and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]
```
#### Examples
@@ -77,4 +85,10 @@ execute unsafe {fully dynamic query} in {sql}
```
---
### Configuration
plugins/skript-db/config.yml
```
# Only change this if you wish to use a different driver than Java's default, like MariaDB driver.
# If you use MariaDB, its driver is shaded together with skript-db, so you can just specify: "org.mariadb.jdbc.Driver"
sql-driver-class-name: "default"
```

13
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>com.btk5h</groupId>
<artifactId>skript-db</artifactId>
<version>1.3.1</version>
<version>1.3.5</version>
<packaging>jar</packaging>
<repositories>
@@ -45,8 +45,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>8</source>
<target>8</target>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
@@ -56,6 +56,7 @@
<version>3.2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
</configuration>
<executions>
<execution>
@@ -81,7 +82,7 @@
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
<version>5.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
@@ -93,14 +94,14 @@
<dependency>
<groupId>com.github.SkriptLang</groupId>
<artifactId>Skript</artifactId>
<version>2.5.3</version>
<version>2.6-beta3</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.2</version>
<version>3.0.3</version>
<scope>compile</scope>
</dependency>

View File

@@ -5,14 +5,18 @@ import org.bukkit.event.HandlerList;
public class SQLQueryCompleteEvent extends Event {
private final static HandlerList HANDLERS = new HandlerList();
private String argument;
private Object variables;
private final String argument;
public SQLQueryCompleteEvent(String argument) {
super(true);
this.argument = argument;
// this.variables = variables;
}
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public String getEventName() {
return super.getEventName();
@@ -22,11 +26,8 @@ public class SQLQueryCompleteEvent extends Event {
public HandlerList getHandlers() {
return HANDLERS;
}
public static HandlerList getHandlerList() {
return HANDLERS;
}
public String getArgument() {
public String getQuery() {
return argument;
}

View File

@@ -8,13 +8,15 @@ import ch.njol.util.Kleenean;
import ch.njol.util.Pair;
import com.btk5h.skriptdb.SkriptDB;
import com.btk5h.skriptdb.SkriptUtil;
import com.btk5h.skriptdb.events.SQLQueryCompleteEvent;
import com.zaxxer.hikari.HikariDataSource;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import javax.sql.DataSource;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
@@ -42,18 +44,17 @@ import java.util.concurrent.Executors;
* @since 0.1.0
*/
public class EffExecuteStatement extends Effect {
private static final ExecutorService threadPool =
Executors.newCachedThreadPool();
static String lastError;
static {
Skript.registerEffect(EffExecuteStatement.class,
"execute %string% (in|on) %datasource% " +
"[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]", "synchronously execute %string% (in|on) %datasource% " +
"[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]", "quickly execute %string% (in|on) %datasource% " +
"[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]");
}
static String lastError;
private static final ExecutorService threadPool =
Executors.newCachedThreadPool();
private Expression<String> query;
private Expression<HikariDataSource> dataSource;
private VariableString var;
@@ -73,19 +74,19 @@ public class EffExecuteStatement extends Effect {
}
TriggerItem.walk(getNext(), e);
}
@Override
protected void execute(Event e) {
DataSource ds = dataSource.getSingle(e);
Pair<String, List<Object>> query = parseQuery(e);
String baseVariable = var != null ? var.toString(e).toLowerCase(Locale.ENGLISH) : null;
//if data source isn't set
if (ds == null) return;
boolean sync = false;
if (!Bukkit.isPrimaryThread()) {
sync = true;
}
boolean sync = !Bukkit.isPrimaryThread();
//if current thread is not main thread, then make this query to not have delays
Object locals = Variables.removeLocals(e);
//execute SQL statement
@@ -95,7 +96,9 @@ public class EffExecuteStatement extends Effect {
//when SQL statement is completed
boolean finalSync = sync;
sql.whenComplete((res, err) -> {
if (err != null) { err.printStackTrace(); }
if (err != null) {
err.printStackTrace();
}
//handle last error syntax data
lastError = null;
@@ -105,7 +108,6 @@ public class EffExecuteStatement extends Effect {
if (getNext() != null) {
//if local variables are present
if (locals != null)
//bring back local variables
//populate SQL data into variables
@@ -113,20 +115,30 @@ public class EffExecuteStatement extends Effect {
//also set variables in the sql query complete event
SQLQueryCompleteEvent event = new SQLQueryCompleteEvent("something");
((Map<String, Object>) res).forEach((name, value) -> setVariable(event, name, value));
SkriptDB.getPlugin(SkriptDB.class).getServer().getPluginManager().callEvent(event);
//TEMPORARILY DISABLED, AS THIS WOULD WORSEN PERFORMANCE OF THE QUERIES AND NOT BE USED BY MOST PEOPLE.
//I may add config option to enable this later?
//SQLQueryCompleteEvent event = new SQLQueryCompleteEvent(this.query.getSingle(e));
//((Map<String, Object>) res).forEach((name, value) -> setVariable(event, name, value));
//SkriptDB.getPlugin(SkriptDB.class).getServer().getPluginManager().callEvent(event);
}
if (isSync || finalSync) {
if (locals != null) {
Variables.setLocalVariables(e, locals);
if (!(res instanceof String)) { ((Map<String, Object>) res).forEach((name, value) -> setVariable(e, name, value)); }
}
if (!(res instanceof String)) {
((Map<String, Object>) res).forEach((name, value) -> setVariable(e, name, value));
}
TriggerItem.walk(getNext(), e);
Variables.removeLocals(e);
} else {
Bukkit.getScheduler().runTask(SkriptDB.getInstance(), () -> {
if (locals != null) {
Variables.setLocalVariables(e, locals);
if (!(res instanceof String)) { ((Map<String, Object>) res).forEach((name, value) -> setVariable(e, name, value)); }
}
if (!(res instanceof String)) {
((Map<String, Object>) res).forEach((name, value) -> setVariable(e, name, value));
}
TriggerItem.walk(getNext(), e);
//the line below is required to prevent memory leaks
//no functionality difference notice with it being removed from my test, but the memory gets filled with leaks
@@ -167,7 +179,11 @@ public class EffExecuteStatement extends Effect {
if (o instanceof String) {
sb.append(o);
} else {
Expression<?> expr = SkriptUtil.getExpressionFromInfo(o);
Expression<?> expr;
if (o instanceof Expression)
expr = (Expression<?>) o;
else
expr = SkriptUtil.getExpressionFromInfo(o);
String before = getString(objects, i - 1);
String after = getString(objects, i + 1);
@@ -286,6 +302,21 @@ public class EffExecuteStatement extends Effect {
}
private void setVariable(Event e, String name, Object obj) {
//fix mediumblob and similar column types, so they return a String correctly
if (obj != null) {
if (obj.getClass().getName().equals("[B")) {
obj = new String((byte[]) obj);
//in some servers instead of being byte array, it appears as SerialBlob (depends on mc version, 1.12.2 is bvte array, 1.16.5 SerialBlob)
} else if (obj instanceof SerialBlob) {
try {
obj = new String(((SerialBlob) obj).getBinaryStream().readAllBytes());
} catch (IOException | SerialException ex) {
ex.printStackTrace();
}
}
}
Variables.setVariable(name.toLowerCase(Locale.ENGLISH), obj, e, isLocal);
}

View File

@@ -6,12 +6,12 @@ import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser;
import com.btk5h.skriptdb.events.SQLQueryCompleteEvent;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;
public class EvtSQLQueryComplete extends SkriptEvent {
static {
Skript.registerEvent("complete of sql query", EvtSQLQueryComplete.class, SQLQueryCompleteEvent.class, "complete of [(sql|database)] query");
}
@Override
public boolean init(final Literal<?>[] literals, final int i, final SkriptParser.ParseResult parseResult) {
return true;
@@ -23,7 +23,7 @@ public class EvtSQLQueryComplete extends SkriptEvent {
}
@Override
public String toString(@Nullable Event event, boolean debug) {
public String toString(Event event, boolean debug) {
return "complete of sql query";
}
}

View File

@@ -1,13 +1,12 @@
package com.btk5h.skriptdb.skript;
import org.bukkit.event.Event;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;
/**
* Stores the error from the last executed statement, if there was one.

View File

@@ -1,13 +1,5 @@
package com.btk5h.skriptdb.skript;
import com.btk5h.skriptdb.SkriptDB;
import com.zaxxer.hikari.HikariDataSource;
import org.bukkit.event.Event;
import java.util.HashMap;
import java.util.Map;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
@@ -15,11 +7,17 @@ import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.skript.util.Timespan;
import ch.njol.util.Kleenean;
import com.btk5h.skriptdb.SkriptDB;
import com.zaxxer.hikari.HikariDataSource;
import org.bukkit.event.Event;
import java.util.HashMap;
import java.util.Map;
/**
* Stores the connection information for a data source. This should be saved to a variable in a
* `script load` event or manually through an effect command.
*
* <p>
* The url format for your database may vary! The example provided uses a MySQL database.
*
* @name Data Source
@@ -30,14 +28,14 @@ import ch.njol.util.Kleenean;
* @since 0.1.0
*/
public class ExprDataSource extends SimpleExpression<HikariDataSource> {
private static final Map<String, HikariDataSource> connectionCache = new HashMap<>();
static {
Skript.registerExpression(ExprDataSource.class, HikariDataSource.class,
ExpressionType.COMBINED, "[the] data(base|[ ]source) [(of|at)] %string% " +
"[with [a] [max[imum]] [connection] life[ ]time of %-timespan%]");
}
private static Map<String, HikariDataSource> connectionCache = new HashMap<>();
private Expression<String> url;
private Expression<Timespan> maxLifetime;

View File

@@ -0,0 +1,60 @@
package com.btk5h.skriptdb.skript;
import ch.njol.skript.ScriptLoader;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.skript.log.ErrorQuality;
import ch.njol.util.Kleenean;
import com.btk5h.skriptdb.events.SQLQueryCompleteEvent;
import org.bukkit.event.Event;
/**
* Stores the error from the last executed statement, if there was one.
*
* @name Last Data Source Error
* @pattern [the] [last] (sql|db|data(base|[ ]source)) error
* @return text
* @since 0.1.0
*/
public class ExprSQLQuery extends SimpleExpression<String> {
static {
Skript.registerExpression(ExprSQLQuery.class, String.class,
ExpressionType.SIMPLE, "sql query");
}
@Override
protected String[] get(Event e) {
if (e instanceof SQLQueryCompleteEvent) {
return new String[]{((SQLQueryCompleteEvent) e).getQuery()};
}
return null;
}
@Override
public boolean isSingle() {
return true;
}
@Override
public Class<? extends String> getReturnType() {
return String.class;
}
@Override
public String toString(Event e, boolean debug) {
return "sql query";
}
@Override
public boolean init(final Expression<?>[] expressions, final int matchedPattern, final Kleenean isDelayed, final SkriptParser.ParseResult parseResult) {
if (!ScriptLoader.isCurrentEvent(SQLQueryCompleteEvent.class)) {
Skript.error("Cannot use 'sql query' outside of a complete of sql query event", ErrorQuality.SEMANTIC_ERROR);
return false;
}
return true;
}
}

View File

@@ -1,13 +1,12 @@
package com.btk5h.skriptdb.skript;
import org.bukkit.event.Event;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;
/**
* Opts out of automatic SQL injection protection for a specific expression in a statement.

View File

@@ -1,6 +1,6 @@
name: skript-db
version: 1.3.1
version: 1.3.5
main: com.btk5h.skriptdb.SkriptDB
depend: [Skript]
authors: [btk5h, FranKusmiruk, Govindas]
authors: [btk5h, FranKusmiruk, Govindas, TPGamesNL]
api-version: 1.13