|
|
|
|
@ -71,21 +71,6 @@ public class SqliteDb extends BaseDb implements WikiDb {
@@ -71,21 +71,6 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
|
|
|
|
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) { |
|
|
|
|
var pages = "CREATE TABLE IF NOT EXISTS {0} ( {1} INT NOT NULL, {2} INT NOT NULL, {3} VARCHAR(255) NOT NULL, {4} TEXT NOT NULL, PRIMARY KEY({1},{2}))"; |
|
|
|
|
var users = "CREATE TABLE IF NOT EXISTS {0} ( {1} INT NOT NULL, {2} INT NOT NULL, {3} INT NOT NULL, PRIMARY KEY({1}, {2}))"; |
|
|
|
|
@ -128,6 +113,16 @@ public class SqliteDb extends BaseDb implements WikiDb {
@@ -128,6 +113,16 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public WikiPage drop(WikiPage page) { |
|
|
|
|
try { |
|
|
|
|
delete().from(TABLE_PAGES).where(ID,equal(page.id())).where(VERSION,equal(page.version())).execute(db); |
|
|
|
|
return page; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw databaseException("Failed to delete page version!"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void dropOldTables() { |
|
|
|
|
try { |
|
|
|
|
db.prepareStatement(format("DROP TABLE {0}",TABLE_PAGES)).execute(); |
|
|
|
|
@ -227,6 +222,54 @@ public class SqliteDb extends BaseDb implements WikiDb {
@@ -227,6 +222,54 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<Long, Permission> loadMembers(WikiPage page) { |
|
|
|
|
try { |
|
|
|
|
var map = new HashMap<Long, Permission>(); |
|
|
|
|
var rs = select(ALL).from(TABLE_PAGES_USERS).where(PAGE_ID, equal(page.id())).exec(db); |
|
|
|
|
while (rs.next()){ |
|
|
|
|
var permission = wikiPermission(rs.getInt(PERMISSIONS)); |
|
|
|
|
if (permission != null) map.put(rs.getLong(USER_ID),permission); |
|
|
|
|
} |
|
|
|
|
rs.close(); |
|
|
|
|
return map; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw databaseException("Failed to load members of \"{0}\" from database!",page.title()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public WikiPage save(WikiPage page) { |
|
|
|
|
try { |
|
|
|
|
if (page.isDirty(CONTENT) || page.isDirty(ID) || page.isDirty(TITLE)) insertInto(TABLE_PAGES,ID,VERSION,TITLE,CONTENT) |
|
|
|
|
.values(page.id(),page.version(),page.title(),page.content()).execute(db).close(); |
|
|
|
|
if (page.isDirty(MEMBERS)){ |
|
|
|
|
Query.delete().from(TABLE_PAGES_USERS).where(PAGE_ID, 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())); |
|
|
|
|
query.execute(db).close(); |
|
|
|
|
} |
|
|
|
|
return page; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw databaseException("Failed to write wiki page \"{0}\" to database",page.title(),e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void transferValues(String newTable, String newUsers) { |
|
|
|
|
var pageMap = new HashMap<String,Long>(); // map from old IDs to new IDs
|
|
|
|
|
try { |
|
|
|
|
@ -314,37 +357,4 @@ public class SqliteDb extends BaseDb implements WikiDb {
@@ -314,37 +357,4 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
|
|
|
|
default -> null; |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<Long, Permission> loadMembers(WikiPage page) { |
|
|
|
|
try { |
|
|
|
|
var map = new HashMap<Long, Permission>(); |
|
|
|
|
var rs = select(ALL).from(TABLE_PAGES_USERS).where(PAGE_ID, equal(page.id())).exec(db); |
|
|
|
|
while (rs.next()){ |
|
|
|
|
var permission = wikiPermission(rs.getInt(PERMISSIONS)); |
|
|
|
|
if (permission != null) map.put(rs.getLong(USER_ID),permission); |
|
|
|
|
} |
|
|
|
|
rs.close(); |
|
|
|
|
return map; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
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) || page.isDirty(TITLE)) insertInto(TABLE_PAGES,ID,VERSION,TITLE,CONTENT) |
|
|
|
|
.values(page.id(),page.version(),page.title(),page.content()).execute(db).close(); |
|
|
|
|
if (page.isDirty(MEMBERS)){ |
|
|
|
|
Query.delete().from(TABLE_PAGES_USERS).where(PAGE_ID, 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())); |
|
|
|
|
query.execute(db).close(); |
|
|
|
|
} |
|
|
|
|
return page; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
throw databaseException("Failed to write wiki page \"{0}\" to database",page.title(),e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |