working on wiki db transition
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -3,7 +3,7 @@ package de.srsoftware.umbrella.wiki;
|
||||
import de.srsoftware.tools.jdbc.Condition;
|
||||
import de.srsoftware.tools.jdbc.Query;
|
||||
import de.srsoftware.umbrella.core.BaseDb;
|
||||
import de.srsoftware.umbrella.core.model.Hash;
|
||||
import de.srsoftware.umbrella.core.ModuleRegistry;
|
||||
import de.srsoftware.umbrella.core.model.Permission;
|
||||
import de.srsoftware.umbrella.core.model.WikiPage;
|
||||
|
||||
@@ -25,10 +25,11 @@ import static java.text.MessageFormat.format;
|
||||
|
||||
public class SqliteDb extends BaseDb implements WikiDb {
|
||||
private static final System.Logger LOG = System.getLogger("TaskDb");
|
||||
private static final int INITIAL_DB_VERSION = 1;
|
||||
private final ModuleRegistry registry;
|
||||
|
||||
public SqliteDb(Connection connection) {
|
||||
public SqliteDb(Connection connection, ModuleRegistry registry) {
|
||||
super(connection);
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,11 +64,26 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
||||
var newUsers = TABLE_PAGES_USERS+"_new";
|
||||
createNewTables(newPages, newUsers);
|
||||
transferValues(newPages, newUsers);
|
||||
//dropOldTables();
|
||||
//moveNewTables();
|
||||
dropOldTables();
|
||||
moveNewTables(newPages, newUsers);
|
||||
}
|
||||
|
||||
return setCurrentVersion(1);
|
||||
return setCurrentVersion(2);
|
||||
}
|
||||
|
||||
private void moveNewTables(String newPages, String newUsers) {
|
||||
try {
|
||||
db.prepareStatement(format("ALTER TABLE {0} RENAME TO {1}",newPages,TABLE_PAGES)).execute();
|
||||
} catch (SQLException e) {
|
||||
LOG.log(ERROR, "Failed to rename table {0} → {1}", newPages, TABLE_PAGES, e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
try {
|
||||
db.prepareStatement(format("ALTER TABLE {0} RENAME TO {1}",newUsers,TABLE_PAGES_USERS)).execute();
|
||||
} catch (SQLException e) {
|
||||
LOG.log(ERROR, "Failed to rename table {0} → {1}", newUsers, TABLE_PAGES_USERS, e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void createNewTables(String newPages, String newUsers) {
|
||||
@@ -112,12 +128,27 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
||||
}
|
||||
}
|
||||
|
||||
private void dropOldTables() {
|
||||
try {
|
||||
db.prepareStatement(format("DROP TABLE {0}",TABLE_PAGES)).execute();
|
||||
} catch (SQLException e) {
|
||||
LOG.log(ERROR, "Failed to drop table {0}", TABLE_PAGES, e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
try {
|
||||
db.prepareStatement(format("DROP TABLE {0}",TABLE_PAGES_USERS)).execute();
|
||||
} catch (SQLException e) {
|
||||
LOG.log(ERROR, "Failed to drop table {0}", TABLE_PAGES, e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> listUserPages(long userId) {
|
||||
try {
|
||||
var rs = select(ID,"MAX(version) AS version").from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID, Condition.equal(userId)).groupBy(ID).sort("ID COLLATE NOCASE ASC").exec(db);
|
||||
var rs = select(TITLE,"MAX(version) AS version").from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID, Condition.equal(userId)).groupBy(TITLE).sort("TITLE COLLATE NOCASE ASC").exec(db);
|
||||
var set = new ArrayList<String>();
|
||||
while (rs.next()) set.add(rs.getString(ID));
|
||||
while (rs.next()) set.add(rs.getString(TITLE));
|
||||
rs.close();
|
||||
return set;
|
||||
} catch (SQLException e) {
|
||||
@@ -126,8 +157,10 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
||||
}
|
||||
|
||||
@Override
|
||||
public WikiPage load(String id, Integer version) {
|
||||
try {
|
||||
public WikiPage load(String title, Integer version) {
|
||||
WikiPage page = null;
|
||||
try { // Try to load by id
|
||||
long id = Long.parseLong(title);
|
||||
var query = select(ALL).from(TABLE_PAGES).where(ID,Condition.equal(id));
|
||||
if (version == null) {
|
||||
query.sort(VERSION+" DESC").limit(1);
|
||||
@@ -135,17 +168,35 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
||||
query.where(VERSION,Condition.equal(version));
|
||||
}
|
||||
var rs = query.exec(db);
|
||||
WikiPage page = null;
|
||||
if (rs.next()) page = WikiPage.of(rs);
|
||||
rs.close();
|
||||
if (page == null) throw notFound("Failed to load wiki page \"{0}\" from database!",id);
|
||||
rs = select(VERSION).from(TABLE_PAGES).where(ID,Condition.equal(id)).sort(VERSION).exec(db);
|
||||
} catch (NumberFormatException ignored){
|
||||
// title is not an id, go on…
|
||||
} catch (SQLException e) {
|
||||
throw databaseException("Failed to load wiki page \"{0}\" from database!",title);
|
||||
}
|
||||
if (page == null) try { // page was not loaded by ID
|
||||
var query = select(ALL).from(TABLE_PAGES).where(TITLE,Condition.equal(title));
|
||||
if (version == null) {
|
||||
query.sort(VERSION+" DESC").limit(1);
|
||||
} else {
|
||||
query.where(VERSION,Condition.equal(version));
|
||||
}
|
||||
var rs = query.exec(db);
|
||||
if (rs.next()) page = WikiPage.of(rs);
|
||||
rs.close();
|
||||
} catch (SQLException e) {
|
||||
throw databaseException("Failed to load wiki page \"{0}\" from database!",title);
|
||||
}
|
||||
if (page == null) throw notFound("Failed to load wiki page \"{0}\" from database!",title);
|
||||
try {
|
||||
var rs = select(VERSION).from(TABLE_PAGES).where(ID,Condition.equal(page.id())).sort(VERSION).exec(db);
|
||||
var versions = page.versions();
|
||||
while (rs.next()) versions.add(rs.getInt(VERSION));
|
||||
rs.close();
|
||||
return page;
|
||||
} catch (SQLException e) {
|
||||
throw databaseException("Failed to load wiki page \"{0}\" from database!",id);
|
||||
throw databaseException("Failed to load wiki page \"{0}\" from database!",title);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,6 +242,12 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
||||
throw new RuntimeException(e);
|
||||
|
||||
}
|
||||
var notes = registry.noteService();
|
||||
for (var entry : pageMap.entrySet()){
|
||||
var oldId = entry.getKey();
|
||||
var newId = entry.getValue();
|
||||
notes.updateId("wiki",oldId,newId);
|
||||
}
|
||||
}
|
||||
|
||||
private int wikiPermissionCode(Permission perm){
|
||||
@@ -220,23 +277,23 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
||||
rs.close();
|
||||
return map;
|
||||
} catch (SQLException e) {
|
||||
throw databaseException("Failed to load members of \"{0}\" from database!",page.id());
|
||||
throw databaseException("Failed to load members of \"{0}\" from database!",page.title());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public WikiPage save(WikiPage page) {
|
||||
try {
|
||||
if (page.isDirty(CONTENT) || page.isDirty(ID)) insertInto(TABLE_PAGES,ID,VERSION,CONTENT).values(page.id(),page.version(),page.content()).execute(db).close();
|
||||
if (page.isDirty(CONTENT) || page.isDirty(ID)) insertInto(TABLE_PAGES,ID,VERSION,CONTENT).values(page.title(),page.version(),page.content()).execute(db).close();
|
||||
if (page.isDirty(MEMBERS)){
|
||||
Query.delete().from(TABLE_PAGES_USERS).where(PAGE_ID,Condition.equal(page.id())).where(USER_ID,Condition.notIn(page.members().keySet().toArray())).execute(db);
|
||||
Query.delete().from(TABLE_PAGES_USERS).where(PAGE_ID,Condition.equal(page.title())).where(USER_ID,Condition.notIn(page.members().keySet().toArray())).execute(db);
|
||||
var query = replaceInto(TABLE_PAGES_USERS,PAGE_ID,USER_ID,PERMISSIONS);
|
||||
for (var member : page.members().entrySet()) query.values(page.id(),member.getKey(),wikiPermissionCode(member.getValue().permission()));
|
||||
for (var member : page.members().entrySet()) query.values(page.title(),member.getKey(),wikiPermissionCode(member.getValue().permission()));
|
||||
query.execute(db).close();
|
||||
}
|
||||
return page;
|
||||
} catch (SQLException e) {
|
||||
throw databaseException("Failed to write wiki page \"{0}\" to database",page.id(),e);
|
||||
throw databaseException("Failed to write wiki page \"{0}\" to database",page.title(),e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ public class WikiModule extends BaseHandler implements WikiService {
|
||||
public WikiModule(ModuleRegistry registry, Configuration config) {
|
||||
super(registry);
|
||||
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE));
|
||||
wikiDb = new SqliteDb(connect(dbFile));
|
||||
wikiDb = new SqliteDb(connect(dbFile),registry);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user