Skip to content

Commit 7cdda68

Browse files
committed
Lock SQLite databases to stop concurrent writes and bump to 1.0.1
1 parent 04c13c2 commit 7cdda68

File tree

4 files changed

+93
-11
lines changed

4 files changed

+93
-11
lines changed

pom.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>ru.nukkit.dblib</groupId>
77
<artifactId>DbLib</artifactId>
8-
<version>1.0-SNAPSHOT</version>
8+
<version>1.0.1</version>
99

1010
<properties>
1111
<maven.compiler.source>1.8</maven.compiler.source>
@@ -75,6 +75,16 @@
7575

7676

7777
<build>
78+
<finalName>${project.name}</finalName>
79+
<defaultGoal>clean package</defaultGoal>
80+
81+
<resources>
82+
<resource>
83+
<directory>src/main/resources</directory>
84+
<filtering>true</filtering>
85+
</resource>
86+
</resources>
87+
7888
<plugins>
7989
<plugin>
8090
<groupId>org.apache.maven.plugins</groupId>

src/main/java/ru/nukkit/dblib/DbLib.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
package ru.nukkit.dblib;
22

3+
import com.j256.ormlite.db.DatabaseType;
4+
import com.j256.ormlite.db.DatabaseTypeUtils;
5+
import com.j256.ormlite.db.SqliteDatabaseType;
6+
import com.j256.ormlite.jdbc.DataSourceConnectionSource;
37
import com.j256.ormlite.jdbc.JdbcConnectionSource;
48
import com.j256.ormlite.jdbc.JdbcPooledConnectionSource;
9+
import com.j256.ormlite.jdbc.JdbcSingleConnectionSource;
510
import com.j256.ormlite.logger.LocalLog;
611
import com.j256.ormlite.support.ConnectionSource;
12+
import com.j256.ormlite.support.DatabaseConnection;
713
import org.sql2o.Sql2o;
14+
import ru.nukkit.dblib.connectionsource.LockedJdbcSingleConnectionSource;
815
import ru.nukkit.dblib.core.M;
916
import ru.nukkit.dblib.nukkit.ConfigNukkit;
1017

@@ -43,7 +50,7 @@ public static void init(ConfigNukkit cfg, File dataFolder) {
4350
* Get DbLib's default ORMLite connection source.
4451
* All plugins used this method will share same database
4552
*
46-
* @return - ConnectionSource (ORMlite)
53+
* @return - {@link ConnectionSource}
4754
*/
4855
public static ConnectionSource getConnectionSource() {
4956
return connectionSource;
@@ -54,18 +61,21 @@ public static ConnectionSource getConnectionSource() {
5461
* Allows plugins to use custom connection source
5562
*
5663
* @param url - database url (including database protocol). Examples:
57-
* jdbc:sqlite:c:\server\plugins\MyPugin\data.db
64+
* jdbc:sqlite:c:\server\plugins\MyPlugin\data.db
5865
* jdbc:mysql://localhost:3306/db
5966
* @param userName - Database user name, will be ignored for sqlite
6067
* @param password - Database user password, will be ignored for sqlite
61-
* @return - ConnectionSource (ORMlite)
68+
* @return - {@link ConnectionSource}
6269
*/
6370
public static ConnectionSource getConnectionSource(String url, String userName, String password) {
71+
DatabaseType type = DatabaseTypeUtils.createDatabaseType(url);
6472
try {
65-
if (config.ormLiteKeepAlive() <= 0) {
73+
if (type instanceof SqliteDatabaseType) {
74+
return new LockedJdbcSingleConnectionSource(url, userName, password, type);
75+
} else if (config.ormLiteKeepAlive() <= 0) {
6676
return new JdbcConnectionSource(url, userName, password);
6777
} else {
68-
JdbcPooledConnectionSource jdbcCon = new JdbcPooledConnectionSource(url, userName, password);
78+
JdbcPooledConnectionSource jdbcCon = new JdbcPooledConnectionSource(url, userName, password, type);
6979
jdbcCon.setCheckConnectionsEveryMillis(config.ormLiteKeepAlive());
7080
return jdbcCon;
7181
}
@@ -80,7 +90,7 @@ public static ConnectionSource getConnectionSource(String url, String userName,
8090
* Get custom SQLite ORMLite connection source.
8191
*
8292
* @param fileName - database file name
83-
* @return - ConnectionSource (ORMlite)
93+
* @return - {@link ConnectionSource}
8494
*/
8595
public static ConnectionSource getConnectionSourceSQLite(String fileName) {
8696
File f = new File(folder + File.separator + fileName);
@@ -98,7 +108,7 @@ public static ConnectionSource getConnectionSourceSQLite(String fileName) {
98108
* @param database - MySQL database
99109
* @param user - MySQL user name
100110
* @param password - MySQL password
101-
* @return - ConnectionSource (ORMlite)
111+
* @return - {@link ConnectionSource}
102112
*/
103113
public static ConnectionSource getConnectionSourceMySql(String host, int port, String database, String user, String password) {
104114
return getConnectionSource(getMySqlUrl(host, port, database), user, password);
@@ -122,7 +132,7 @@ public static Connection getDefaultConnection() {
122132
* @param url - MySQL url, example: localhost:3306/db
123133
* @param user - MySQL user name
124134
* @param password - MySQL password
125-
* @return - Connection (SQL)
135+
* @return - {@link Connection}
126136
*/
127137
public static Connection getMySqlConnection(String url, String user, String password) {
128138
try {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package ru.nukkit.dblib.connectionsource;
2+
3+
import com.j256.ormlite.db.DatabaseType;
4+
import com.j256.ormlite.jdbc.JdbcConnectionSource;
5+
import com.j256.ormlite.logger.Logger;
6+
import com.j256.ormlite.logger.LoggerFactory;
7+
import com.j256.ormlite.support.DatabaseConnection;
8+
9+
import java.sql.SQLException;
10+
import java.util.concurrent.locks.Lock;
11+
import java.util.concurrent.locks.ReentrantLock;
12+
13+
public class LockedJdbcSingleConnectionSource extends JdbcConnectionSource {
14+
private static final Logger logger = LoggerFactory.getLogger(LockedJdbcSingleConnectionSource.class);
15+
private final Lock lock = new ReentrantLock(true);
16+
private DatabaseConnection connection;
17+
18+
public LockedJdbcSingleConnectionSource() {
19+
// for spring type wiring
20+
super();
21+
}
22+
23+
public LockedJdbcSingleConnectionSource(String url) throws SQLException {
24+
super(url);
25+
}
26+
27+
public LockedJdbcSingleConnectionSource(String url, DatabaseType databaseType) throws SQLException {
28+
super(url, databaseType);
29+
}
30+
31+
public LockedJdbcSingleConnectionSource(String url, String username, String password) throws SQLException {
32+
super(url, username, password);
33+
}
34+
35+
public LockedJdbcSingleConnectionSource(String url, String username, String password, DatabaseType type) throws SQLException {
36+
super(url, username, password, type);
37+
}
38+
39+
@Override
40+
public void initialize() throws SQLException {
41+
super.initialize();
42+
this.connection = this.makeConnection(logger);
43+
}
44+
45+
@Override
46+
public void close() {
47+
// no-op because we don't want to close the connection
48+
}
49+
50+
@Override
51+
public void releaseConnection(DatabaseConnection connection) {
52+
lock.unlock();
53+
// no-op because we don't want to close the connection
54+
}
55+
56+
57+
@Override
58+
public DatabaseConnection getReadWriteConnection(String tableName) throws SQLException {
59+
lock.lock();
60+
return this.connection;
61+
}
62+
}

src/main/resources/plugin.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: DbLib
22
main: ru.nukkit.dblib.nukkit.DbLibPlugin
3-
version: "0.2.5"
3+
version: ${project.version}
44
author: fromgate, nukkit.ru
5-
api: ["1.0.7"]
5+
api: ["1.0.8"]
66
description: SQLite/MySQL library for your plugins (Nukkit)

0 commit comments

Comments
 (0)