|
|
|
|
@ -17,7 +17,10 @@ import de.srsoftware.tools.jdbc.Query;
@@ -17,7 +17,10 @@ import de.srsoftware.tools.jdbc.Query;
|
|
|
|
|
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; |
|
|
|
|
import de.srsoftware.umbrella.core.model.Permission; |
|
|
|
|
import de.srsoftware.umbrella.core.model.Project; |
|
|
|
|
import de.srsoftware.umbrella.core.model.Status; |
|
|
|
|
|
|
|
|
|
import java.sql.Connection; |
|
|
|
|
import java.sql.PreparedStatement; |
|
|
|
|
import java.sql.ResultSet; |
|
|
|
|
import java.sql.SQLException; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
@ -34,40 +37,60 @@ public class SqliteDb implements ProjectDb {
@@ -34,40 +37,60 @@ public class SqliteDb implements ProjectDb {
|
|
|
|
|
init(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int createTables() { |
|
|
|
|
createProjectTables(); |
|
|
|
|
return createSettingsTable(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void createProjectTables() { |
|
|
|
|
private void createProjectTable() { |
|
|
|
|
var createTable = """ |
|
|
|
|
CREATE TABLE IF NOT EXISTS {0} ( |
|
|
|
|
`{1}` INTEGER PRIMARY KEY, |
|
|
|
|
`{2}` INTEGER, |
|
|
|
|
`{3}` VARCHAR(255) NOT NULL, |
|
|
|
|
`{4}` TEXT, |
|
|
|
|
`{5}` INT DEFAULT {6}, |
|
|
|
|
`{7}` BOOLEAN DEFAULT 0 |
|
|
|
|
)"""; |
|
|
|
|
CREATE TABLE IF NOT EXISTS {0} ( |
|
|
|
|
`{1}` INTEGER PRIMARY KEY, |
|
|
|
|
`{2}` INTEGER, |
|
|
|
|
`{3}` VARCHAR(255) NOT NULL, |
|
|
|
|
`{4}` TEXT, |
|
|
|
|
`{5}` INT DEFAULT {6}, |
|
|
|
|
`{7}` BOOLEAN DEFAULT 0 |
|
|
|
|
)"""; |
|
|
|
|
try { |
|
|
|
|
var stmt = db.prepareStatement(format(createTable,TABLE_PROJECTS, ID, COMPANY_ID, NAME, DESCRIPTION, STATUS, OPEN.code(), SHOW_CLOSED)); |
|
|
|
|
var stmt = db.prepareStatement(format(createTable, TABLE_PROJECTS, ID, COMPANY_ID, NAME, DESCRIPTION, STATUS, OPEN.code(), SHOW_CLOSED)); |
|
|
|
|
stmt.execute(); |
|
|
|
|
stmt.close(); |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
LOG.log(ERROR,ERROR_FAILED_CREATE_TABLE,TABLE_PROJECTS ,e); |
|
|
|
|
LOG.log(ERROR, ERROR_FAILED_CREATE_TABLE, TABLE_PROJECTS, e); |
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
long count = 0L; |
|
|
|
|
private void createStatesTable(){ |
|
|
|
|
var sql = """ |
|
|
|
|
CREATE TABLE IF NOT EXISTS custom_states ( |
|
|
|
|
project_id LONG NOT NULL, |
|
|
|
|
code INT NOT NULL, |
|
|
|
|
name VARCHAR(64) NOT NULL, |
|
|
|
|
PRIMARY KEY (project_id, code) |
|
|
|
|
); |
|
|
|
|
"""; |
|
|
|
|
try { |
|
|
|
|
ResultSet rs = select("COUNT(*)").from(TABLE_PROJECTS).exec(db); |
|
|
|
|
if (rs.next()) count = rs.getLong(1); |
|
|
|
|
rs.close(); |
|
|
|
|
} catch (SQLException ignored) { |
|
|
|
|
// go on with table creation
|
|
|
|
|
var stmt = db.prepareStatement(format(sql)); |
|
|
|
|
stmt.execute(); |
|
|
|
|
stmt.close(); |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
LOG.log(ERROR, ERROR_FAILED_CREATE_TABLE, TABLE_CUSTOM_STATES, e); |
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
createTable = """ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int createTables() { |
|
|
|
|
int currentVersion = createSettingsTable(); |
|
|
|
|
switch (currentVersion){ |
|
|
|
|
case 0: |
|
|
|
|
createProjectTable(); |
|
|
|
|
createUsersTable(); |
|
|
|
|
case 1: |
|
|
|
|
createStatesTable(); |
|
|
|
|
} |
|
|
|
|
return setCurrentVersion(2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void createUsersTable(){ |
|
|
|
|
var createTable = """ |
|
|
|
|
CREATE TABLE IF NOT EXISTS {0} ( |
|
|
|
|
{1} INT NOT NULL, |
|
|
|
|
{2} INT NOT NULL, |
|
|
|
|
@ -97,15 +120,11 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
@@ -97,15 +120,11 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Integer version = null; |
|
|
|
|
var version = 0; |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(VALUE).from(TABLE_SETTINGS).where(KEY, equal(DB_VERSION)).exec(db); |
|
|
|
|
if (rs.next()) version = rs.getInt(VALUE); |
|
|
|
|
rs.close(); |
|
|
|
|
if (version == null) { |
|
|
|
|
version = INITIAL_DB_VERSION; |
|
|
|
|
insertInto(TABLE_SETTINGS, KEY, VALUE).values(DB_VERSION,version).execute(db).close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return version; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
@ -152,6 +171,10 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
@@ -152,6 +171,10 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
if (rs.next()) result = Project.of(rs); |
|
|
|
|
rs.close(); |
|
|
|
|
if (result == null) throw UmbrellaException.notFound("No project found for id {0}",projectId); |
|
|
|
|
rs = select(ALL).from(TABLE_CUSTOM_STATES).where(PROJECT_ID,equal(projectId)).exec(db); |
|
|
|
|
var states = result.allowedStates(); |
|
|
|
|
while (rs.next()) states.add(Status.of(rs)); |
|
|
|
|
rs.close(); |
|
|
|
|
return result; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw new UmbrellaException("Failed to load project from database"); |
|
|
|
|
@ -236,4 +259,24 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
@@ -236,4 +259,24 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Status save(long projectId, Status newState) { |
|
|
|
|
try { |
|
|
|
|
insertInto(TABLE_CUSTOM_STATES,PROJECT_ID,CODE,NAME).values(projectId,newState.code(),newState.name()).execute(db).close(); |
|
|
|
|
return newState; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw new UmbrellaException("Failed to create custom state!"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int setCurrentVersion(int version) { |
|
|
|
|
try { |
|
|
|
|
replaceInto(TABLE_SETTINGS, KEY, VALUE).values(DB_VERSION,version).execute(db).close(); |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
} |
|
|
|
|
return version; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|