143 lines
4.6 KiB
Java
143 lines
4.6 KiB
Java
package server.db.common;
|
|
|
|
import server.errors.ServerException;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.logging.Logger;
|
|
|
|
import java.sql.*;
|
|
|
|
public class Database {
|
|
|
|
public static final boolean AUTO_PRIMARY_KEY = true;
|
|
public static final boolean SPECIFIED_PRIMARY_KEY = false;
|
|
public static final boolean PRODUCTION_MODE = true;
|
|
public static final boolean DEVELOPMENT_MODE = true;
|
|
public static final boolean TEST_MODE = false;
|
|
|
|
private static Logger logger;
|
|
|
|
private Connection connection;
|
|
|
|
private static String dbUrl = "";
|
|
|
|
public static void init(boolean production) throws ServerException {
|
|
try {
|
|
final String driver = "org.sqlite.JDBC";
|
|
Class.forName(driver);
|
|
|
|
if(production) dbUrl = "jdbc:sqlite:db/database.sqlite3";
|
|
else dbUrl = "jdbc:sqlite:db/test.sqlite3";
|
|
} catch (ClassNotFoundException e) {
|
|
e.printStackTrace();
|
|
throw new ServerException("SQLite was not found");
|
|
}
|
|
}
|
|
|
|
public static void erase() throws ServerException, SQLException {
|
|
Database database = new Database();
|
|
database.openConnection();
|
|
database.voidQuery("delete from users;");
|
|
database.voidQuery("delete from projects;");
|
|
database.voidQuery("delete from records;");
|
|
database.voidQuery("delete from images;");
|
|
database.voidQuery("delete from 'values';");
|
|
database.voidQuery("delete from fields;");
|
|
database.commit();
|
|
database.closeConnection();
|
|
}
|
|
|
|
public void openConnection() throws ServerException {
|
|
try {
|
|
// Ensure we don't hit a collision
|
|
if(connection != null) return;
|
|
|
|
connection = DriverManager.getConnection(dbUrl);
|
|
connection.setAutoCommit(false);
|
|
} catch (SQLException e) {
|
|
throw new ServerException("Error establishing connection to: " + dbUrl);
|
|
}
|
|
}
|
|
|
|
public void closeConnection() throws SQLException {
|
|
connection.close();
|
|
connection = null;
|
|
}
|
|
|
|
public void commit() throws ServerException, SQLException {
|
|
try {
|
|
for(PreparedStatement query : queryBatch) {
|
|
int response = 0;
|
|
response = query.executeUpdate();
|
|
if(response != 1) {
|
|
connection.rollback();
|
|
throw new ServerException("Bad query update");
|
|
}
|
|
}
|
|
try {
|
|
connection.commit();
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
} catch (SQLException e) {
|
|
//e.printStackTrace();
|
|
throw new ServerException(String.format("Error committing %d queries, rolling back!",
|
|
queryBatch.size()));
|
|
} finally {
|
|
queryBatch.clear();
|
|
}
|
|
}
|
|
|
|
public ResultSet query(String sql) throws ServerException, SQLException {
|
|
PreparedStatement preparedStatement;
|
|
try {
|
|
|
|
preparedStatement = connection.prepareStatement(sql);
|
|
|
|
return preparedStatement.executeQuery();
|
|
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
throw new ServerException("Error running query!");
|
|
}
|
|
}
|
|
|
|
public void voidQuery(String sql) throws ServerException, SQLException {
|
|
Statement statement;
|
|
try {
|
|
statement = connection.createStatement();
|
|
statement.addBatch(sql);
|
|
statement.executeBatch();
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
throw new ServerException("Error running query!");
|
|
}
|
|
}
|
|
|
|
private List<PreparedStatement> queryBatch = new ArrayList<PreparedStatement>();
|
|
|
|
public void addQuery(String sql) throws SQLException {
|
|
PreparedStatement preparedStatement;
|
|
|
|
preparedStatement = connection.prepareStatement(sql);
|
|
queryBatch.add(preparedStatement);
|
|
}
|
|
|
|
public int getLastIdForTable(String table) throws SQLException, ServerException {
|
|
ResultSet resultSet = query("SELECT MAX(ID) FROM '" +table+ "';" );
|
|
if(resultSet.next()) return resultSet.getInt(1);
|
|
|
|
return -1;
|
|
}
|
|
|
|
public String LAST_PROJECT = "(SELECT MAX(ID) FROM projects)";
|
|
public String LAST_IMAGE = "(SELECT MAX(ID) FROM images)";
|
|
public String LAST_RECORD = "(SELECT MAX(ID) FROM records)";
|
|
public String LAST_FIELD = "(SELECT MAX(ID) FROM fields)";
|
|
public String LAST_USER = "(SELECT MAX(ID) FROM users)";
|
|
public String LAST_VALUE = "(SELECT MAX(ID) FROM \'values\')";
|
|
|
|
}
|