|
|
|
@ -1,6 +1,7 @@ |
|
|
|
/* © SRSoftware 2025 */ |
|
|
|
/* © SRSoftware 2025 */ |
|
|
|
package de.srsoftware.umbrella.wiki; |
|
|
|
package de.srsoftware.umbrella.wiki; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static de.srsoftware.tools.jdbc.Condition.equal; |
|
|
|
import static de.srsoftware.tools.jdbc.Query.*; |
|
|
|
import static de.srsoftware.tools.jdbc.Query.*; |
|
|
|
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL; |
|
|
|
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL; |
|
|
|
import static de.srsoftware.umbrella.core.Constants.*; |
|
|
|
import static de.srsoftware.umbrella.core.Constants.*; |
|
|
|
@ -142,10 +143,37 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
|
|
|
|
public long getNextId() { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
var id = 0L; |
|
|
|
|
|
|
|
var rs = select("MAX(ID)").from(TABLE_PAGES).exec(db); |
|
|
|
|
|
|
|
if (rs.next()) id = rs.getLong(1); |
|
|
|
|
|
|
|
rs.close(); |
|
|
|
|
|
|
|
return id+1; |
|
|
|
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
|
|
|
throw databaseException("Failed to query next free page id!"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean isAvailable(String title) { |
|
|
|
|
|
|
|
if (title==null||title.isBlank())return false; |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
var count = 1; |
|
|
|
|
|
|
|
var rs = select("COUNT(ID)").from(TABLE_PAGES).where(TITLE,equal(title)).exec(db); |
|
|
|
|
|
|
|
if (rs.next()) count = rs.getInt(1); |
|
|
|
|
|
|
|
rs.close(); |
|
|
|
|
|
|
|
return count < 1; |
|
|
|
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
|
|
|
throw databaseException("Failed to query availability of {0}!",title); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public List<String> listUserPages(long userId) { |
|
|
|
public List<String> listUserPages(long userId) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
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 rs = select(TITLE,"MAX(version) AS version").from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID, 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(TITLE)); |
|
|
|
while (rs.next()) set.add(rs.getString(TITLE)); |
|
|
|
rs.close(); |
|
|
|
rs.close(); |
|
|
|
@ -160,11 +188,11 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
WikiPage page = null; |
|
|
|
WikiPage page = null; |
|
|
|
try { // Try to load by id
|
|
|
|
try { // Try to load by id
|
|
|
|
long id = Long.parseLong(title); |
|
|
|
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, equal(id)); |
|
|
|
if (version == null) { |
|
|
|
if (version == null) { |
|
|
|
query.sort(VERSION+" DESC").limit(1); |
|
|
|
query.sort(VERSION+" DESC").limit(1); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
query.where(VERSION,Condition.equal(version)); |
|
|
|
query.where(VERSION, equal(version)); |
|
|
|
} |
|
|
|
} |
|
|
|
var rs = query.exec(db); |
|
|
|
var rs = query.exec(db); |
|
|
|
if (rs.next()) page = WikiPage.of(rs); |
|
|
|
if (rs.next()) page = WikiPage.of(rs); |
|
|
|
@ -175,11 +203,11 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
throw databaseException("Failed to load wiki page \"{0}\" from database!",title); |
|
|
|
throw databaseException("Failed to load wiki page \"{0}\" from database!",title); |
|
|
|
} |
|
|
|
} |
|
|
|
if (page == null) try { // page was not loaded by ID
|
|
|
|
if (page == null) try { // page was not loaded by ID
|
|
|
|
var query = select(ALL).from(TABLE_PAGES).where(TITLE,Condition.equal(title)); |
|
|
|
var query = select(ALL).from(TABLE_PAGES).where(TITLE, equal(title)); |
|
|
|
if (version == null) { |
|
|
|
if (version == null) { |
|
|
|
query.sort(VERSION+" DESC").limit(1); |
|
|
|
query.sort(VERSION+" DESC").limit(1); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
query.where(VERSION,Condition.equal(version)); |
|
|
|
query.where(VERSION, equal(version)); |
|
|
|
} |
|
|
|
} |
|
|
|
var rs = query.exec(db); |
|
|
|
var rs = query.exec(db); |
|
|
|
if (rs.next()) page = WikiPage.of(rs); |
|
|
|
if (rs.next()) page = WikiPage.of(rs); |
|
|
|
@ -189,7 +217,7 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
} |
|
|
|
} |
|
|
|
if (page == null) throw notFound("Failed to load wiki page \"{0}\" from database!",title); |
|
|
|
if (page == null) throw notFound("Failed to load wiki page \"{0}\" from database!",title); |
|
|
|
try { |
|
|
|
try { |
|
|
|
var rs = select(VERSION).from(TABLE_PAGES).where(ID,Condition.equal(page.id())).sort(VERSION).exec(db); |
|
|
|
var rs = select(VERSION).from(TABLE_PAGES).where(ID, 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(); |
|
|
|
@ -291,7 +319,7 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
public Map<Long, Permission> loadMembers(WikiPage page) { |
|
|
|
public Map<Long, Permission> loadMembers(WikiPage page) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
var map = new HashMap<Long, Permission>(); |
|
|
|
var map = new HashMap<Long, Permission>(); |
|
|
|
var rs = select(ALL).from(TABLE_PAGES_USERS).where(PAGE_ID,Condition.equal(page.id())).exec(db); |
|
|
|
var rs = select(ALL).from(TABLE_PAGES_USERS).where(PAGE_ID, equal(page.id())).exec(db); |
|
|
|
while (rs.next()){ |
|
|
|
while (rs.next()){ |
|
|
|
var permission = wikiPermission(rs.getInt(PERMISSIONS)); |
|
|
|
var permission = wikiPermission(rs.getInt(PERMISSIONS)); |
|
|
|
if (permission != null) map.put(rs.getLong(USER_ID),permission); |
|
|
|
if (permission != null) map.put(rs.getLong(USER_ID),permission); |
|
|
|
@ -309,7 +337,7 @@ public class SqliteDb extends BaseDb implements WikiDb { |
|
|
|
if (page.isDirty(CONTENT) || page.isDirty(ID) || page.isDirty(TITLE)) insertInto(TABLE_PAGES,ID,VERSION,TITLE,CONTENT) |
|
|
|
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(); |
|
|
|
.values(page.id(),page.version(),page.title(),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.title())).where(USER_ID,Condition.notIn(page.members().keySet().toArray())).execute(db); |
|
|
|
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); |
|
|
|
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.id(),member.getKey(),wikiPermissionCode(member.getValue().permission())); |
|
|
|
query.execute(db).close(); |
|
|
|
query.execute(db).close(); |
|
|
|
|