overhaule db layout, so we have LONG values as keys

This commit is contained in:
2025-08-03 14:03:40 +02:00
parent e6c70a13b1
commit 6de65f3070
4 changed files with 30 additions and 25 deletions

View File

@@ -2,11 +2,10 @@
package de.srsoftware.umbrella.bookmarks; package de.srsoftware.umbrella.bookmarks;
import de.srsoftware.umbrella.core.model.Bookmark; import de.srsoftware.umbrella.core.model.Bookmark;
import de.srsoftware.umbrella.core.model.Hash;
import java.util.Map; import java.util.Map;
public interface BookmarkDb { public interface BookmarkDb {
Bookmark save(String url, String comment, long userId); Bookmark save(String url, String comment, long userId);
Map<Hash, Bookmark> list(long id); Map<Long, Bookmark> list(long id);
} }

View File

@@ -6,5 +6,6 @@ public class Constants {
public static final String SAVE = "save"; public static final String SAVE = "save";
public static final String TABLE_URLS = "urls"; public static final String TABLE_URLS = "urls";
public static final String TABLE_URL_COMMENTS = "url_comments"; public static final String TABLE_URL_COMMENTS = "url_comments";
public static final String URL_ID = "url_id";
} }

View File

@@ -15,8 +15,8 @@ import de.srsoftware.tools.jdbc.Condition;
import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.Bookmark; import de.srsoftware.umbrella.core.model.Bookmark;
import de.srsoftware.umbrella.core.model.Hash;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
@@ -41,14 +41,14 @@ public class SqliteDb extends BaseDb implements BookmarkDb {
private void createUrlCommentsTable() { private void createUrlCommentsTable() {
var sql = """ var sql = """
CREATE TABLE IF NOT EXISTS {0} ( CREATE TABLE IF NOT EXISTS {0} (
`{1}` VARCHAR ( 255 ) NOT NULL, `{1}` INTEGER NOT NULL,
`{2}` LONG NOT NULL, `{2}` INTEGER NOT NULL,
`{3}` TEXT NOT NULL, `{3}` TEXT NOT NULL,
`{4}` DATETIME NOT NULL, `{4}` DATETIME NOT NULL,
PRIMARY KEY (`{1}`,`{2}`) PRIMARY KEY (`{1}`,`{2}`)
)"""; )""";
try { try {
var stmt = db.prepareStatement(format(sql,TABLE_URL_COMMENTS,HASH,USER_ID,COMMENT,TIMESTAMP)); var stmt = db.prepareStatement(format(sql,TABLE_URL_COMMENTS,URL_ID,USER_ID,COMMENT,TIMESTAMP));
stmt.execute(); stmt.execute();
stmt.close(); stmt.close();
} catch (SQLException e) { } catch (SQLException e) {
@@ -58,7 +58,7 @@ CREATE TABLE IF NOT EXISTS {0} (
} }
private void createUrlsTable() { private void createUrlsTable() {
var sql = "CREATE TABLE IF NOT EXISTS urls (hash VARCHAR(255) PRIMARY KEY, url TEXT NOT NULL)"; var sql = "CREATE TABLE IF NOT EXISTS urls (ID INTEGER PRIMARY KEY, url TEXT UNIQUE NOT NULL)";
try { try {
var stmt = db.prepareStatement(sql); var stmt = db.prepareStatement(sql);
stmt.execute(); stmt.execute();
@@ -70,14 +70,13 @@ CREATE TABLE IF NOT EXISTS {0} (
} }
@Override @Override
public Map<Hash, Bookmark> list(long userId) { public Map<Long, Bookmark> list(long userId) {
try { try {
var map = new HashMap<Hash,Bookmark>(); var map = new HashMap<Long,Bookmark>();
var rs = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(HASH,TABLE_URLS,HASH).where(USER_ID, Condition.equal(userId)).exec(db); var rs = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(URL_ID,TABLE_URLS,ID).where(USER_ID, Condition.equal(userId)).exec(db);
while (rs.next()){ while (rs.next()){
var bookmark = Bookmark.of(rs); var bookmark = Bookmark.of(rs);
map.put(bookmark.hash(),bookmark); map.put(bookmark.id(),bookmark);
} }
rs.close();; rs.close();;
return map; return map;
@@ -88,15 +87,23 @@ CREATE TABLE IF NOT EXISTS {0} (
@Override @Override
public Bookmark save(String url, String comment, long userId) { public Bookmark save(String url, String comment, long userId) {
var hash = sha1(url);
try { try {
var timestamp = LocalDateTime.now(); var timestamp = LocalDateTime.now();
replaceInto(TABLE_URLS,HASH,URL) var rs = select(ID).from(TABLE_URLS).where(URL,Condition.equal(url)).exec(db);
.values(hash,url).execute(db).close(); var id = 0L;
replaceInto(TABLE_URL_COMMENTS,HASH,USER_ID,COMMENT, TIMESTAMP) if (rs.next()) id = rs.getLong(ID);
.values(hash,userId,comment,timestamp.toEpochSecond(UTC)) rs.close();
if (id == 0) {
var stmt = insertInto(TABLE_URLS, URL).values(url).execute(db);
rs = stmt.getGeneratedKeys();
if (rs.next()) id = rs.getLong(1);
rs.close();
stmt.close();
}
replaceInto(TABLE_URL_COMMENTS,URL_ID,USER_ID,COMMENT, TIMESTAMP)
.values(id,userId,comment,timestamp.toEpochSecond(UTC))
.execute(db).close(); .execute(db).close();
return Bookmark.of(url,comment,timestamp); return Bookmark.of(id,url,comment,timestamp);
} catch (SQLException e) { } catch (SQLException e) {
throw new UmbrellaException("Failed to store url"); throw new UmbrellaException("Failed to store url");
} }

View File

@@ -2,8 +2,6 @@
package de.srsoftware.umbrella.core.model; package de.srsoftware.umbrella.core.model;
import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Util.SHA1;
import static de.srsoftware.umbrella.core.Util.sha1;
import static java.time.ZoneOffset.UTC; import static java.time.ZoneOffset.UTC;
import de.srsoftware.tools.Mappable; import de.srsoftware.tools.Mappable;
@@ -14,22 +12,22 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
public record Bookmark(String url, Hash hash, String comment, LocalDateTime timestamp, Collection<String> tags) implements Mappable { public record Bookmark(long id, String url, String comment, LocalDateTime timestamp, Collection<String> tags) implements Mappable {
public static Bookmark of(ResultSet rs) throws SQLException { public static Bookmark of(ResultSet rs) throws SQLException {
return new Bookmark(rs.getString(URL),new Hash(rs.getString(HASH),SHA1),rs.getString(COMMENT),LocalDateTime.ofEpochSecond(rs.getLong(TIMESTAMP),0, UTC),new ArrayList<>()); return new Bookmark(rs.getLong(ID),rs.getString(URL),rs.getString(COMMENT),LocalDateTime.ofEpochSecond(rs.getLong(TIMESTAMP),0, UTC),new ArrayList<>());
} }
public static Bookmark of(String url, String comment, LocalDateTime timestamp){ public static Bookmark of(long id, String url, String comment, LocalDateTime timestamp){
return new Bookmark(url,sha1(url),comment,timestamp,new ArrayList<>()); return new Bookmark(id,url,comment,timestamp,new ArrayList<>());
} }
@Override @Override
public Map<String, Object> toMap() { public Map<String, Object> toMap() {
return Map.of( return Map.of(
ID,id,
URL, url, URL, url,
COMMENT, comment, COMMENT, comment,
HASH, Map.of(VALUE,hash.value(),TYPE,hash.type()),
TAGS, tags, TAGS, tags,
TIMESTAMP, timestamp.withNano(0) TIMESTAMP, timestamp.withNano(0)
); );