|
|
|
@ -3,7 +3,7 @@ package de.srsoftware.umbrella.wiki; |
|
|
|
import de.srsoftware.tools.jdbc.Condition; |
|
|
|
import de.srsoftware.tools.jdbc.Condition; |
|
|
|
import de.srsoftware.tools.jdbc.Query; |
|
|
|
import de.srsoftware.tools.jdbc.Query; |
|
|
|
import de.srsoftware.umbrella.core.BaseDb; |
|
|
|
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.Permission; |
|
|
|
import de.srsoftware.umbrella.core.model.WikiPage; |
|
|
|
import de.srsoftware.umbrella.core.model.WikiPage; |
|
|
|
|
|
|
|
|
|
|
|
@ -25,10 +25,11 @@ import static java.text.MessageFormat.format; |
|
|
|
|
|
|
|
|
|
|
|
public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
private static final System.Logger LOG = System.getLogger("TaskDb"); |
|
|
|
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); |
|
|
|
super(connection); |
|
|
|
|
|
|
|
this.registry = registry; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -63,11 +64,26 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
var newUsers = TABLE_PAGES_USERS+"_new"; |
|
|
|
var newUsers = TABLE_PAGES_USERS+"_new"; |
|
|
|
createNewTables(newPages, newUsers); |
|
|
|
createNewTables(newPages, newUsers); |
|
|
|
transferValues(newPages, newUsers); |
|
|
|
transferValues(newPages, newUsers); |
|
|
|
//dropOldTables();
|
|
|
|
dropOldTables(); |
|
|
|
//moveNewTables();
|
|
|
|
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) { |
|
|
|
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 |
|
|
|
@Override |
|
|
|
public List<String> listUserPages(long userId) { |
|
|
|
public List<String> listUserPages(long userId) { |
|
|
|
try { |
|
|
|
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>(); |
|
|
|
var set = new ArrayList<String>(); |
|
|
|
while (rs.next()) set.add(rs.getString(ID)); |
|
|
|
while (rs.next()) set.add(rs.getString(TITLE)); |
|
|
|
rs.close(); |
|
|
|
rs.close(); |
|
|
|
return set; |
|
|
|
return set; |
|
|
|
} catch (SQLException e) { |
|
|
|
} catch (SQLException e) { |
|
|
|
@ -126,8 +157,10 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public WikiPage load(String id, Integer version) { |
|
|
|
public WikiPage load(String title, Integer version) { |
|
|
|
try { |
|
|
|
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)); |
|
|
|
var query = select(ALL).from(TABLE_PAGES).where(ID,Condition.equal(id)); |
|
|
|
if (version == null) { |
|
|
|
if (version == null) { |
|
|
|
query.sort(VERSION+" DESC").limit(1); |
|
|
|
query.sort(VERSION+" DESC").limit(1); |
|
|
|
@ -135,17 +168,35 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
query.where(VERSION,Condition.equal(version)); |
|
|
|
query.where(VERSION,Condition.equal(version)); |
|
|
|
} |
|
|
|
} |
|
|
|
var rs = query.exec(db); |
|
|
|
var rs = query.exec(db); |
|
|
|
WikiPage page = null; |
|
|
|
|
|
|
|
if (rs.next()) page = WikiPage.of(rs); |
|
|
|
if (rs.next()) page = WikiPage.of(rs); |
|
|
|
rs.close(); |
|
|
|
rs.close(); |
|
|
|
if (page == null) throw notFound("Failed to load wiki page \"{0}\" from database!",id); |
|
|
|
} catch (NumberFormatException ignored){ |
|
|
|
rs = select(VERSION).from(TABLE_PAGES).where(ID,Condition.equal(id)).sort(VERSION).exec(db); |
|
|
|
// 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(); |
|
|
|
var versions = page.versions(); |
|
|
|
while (rs.next()) versions.add(rs.getInt(VERSION)); |
|
|
|
while (rs.next()) versions.add(rs.getInt(VERSION)); |
|
|
|
rs.close(); |
|
|
|
rs.close(); |
|
|
|
return page; |
|
|
|
return page; |
|
|
|
} catch (SQLException e) { |
|
|
|
} 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); |
|
|
|
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){ |
|
|
|
private int wikiPermissionCode(Permission perm){ |
|
|
|
@ -220,23 +277,23 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
rs.close(); |
|
|
|
rs.close(); |
|
|
|
return map; |
|
|
|
return map; |
|
|
|
} catch (SQLException e) { |
|
|
|
} 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 |
|
|
|
@Override |
|
|
|
public WikiPage save(WikiPage page) { |
|
|
|
public WikiPage save(WikiPage page) { |
|
|
|
try { |
|
|
|
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)){ |
|
|
|
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); |
|
|
|
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(); |
|
|
|
query.execute(db).close(); |
|
|
|
} |
|
|
|
} |
|
|
|
return page; |
|
|
|
return page; |
|
|
|
} catch (SQLException e) { |
|
|
|
} 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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |