diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java index c81d190..b28bd35 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java @@ -2,11 +2,10 @@ package de.srsoftware.umbrella.bookmarks; import de.srsoftware.umbrella.core.model.Bookmark; -import de.srsoftware.umbrella.core.model.Hash; import java.util.Map; public interface BookmarkDb { Bookmark save(String url, String comment, long userId); - Map list(long id); + Map list(long id); } diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java index c04ba99..e80e195 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java @@ -6,5 +6,6 @@ public class Constants { public static final String SAVE = "save"; public static final String TABLE_URLS = "urls"; public static final String TABLE_URL_COMMENTS = "url_comments"; + public static final String URL_ID = "url_id"; } diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java index 0fa0f63..ba2cf23 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java @@ -15,8 +15,8 @@ import de.srsoftware.tools.jdbc.Condition; import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Bookmark; -import de.srsoftware.umbrella.core.model.Hash; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.SQLException; import java.time.LocalDateTime; import java.util.HashMap; @@ -41,14 +41,14 @@ public class SqliteDb extends BaseDb implements BookmarkDb { private void createUrlCommentsTable() { var sql = """ CREATE TABLE IF NOT EXISTS {0} ( - `{1}` VARCHAR ( 255 ) NOT NULL, - `{2}` LONG NOT NULL, + `{1}` INTEGER NOT NULL, + `{2}` INTEGER NOT NULL, `{3}` TEXT NOT NULL, `{4}` DATETIME NOT NULL, PRIMARY KEY (`{1}`,`{2}`) )"""; 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.close(); } catch (SQLException e) { @@ -58,7 +58,7 @@ CREATE TABLE IF NOT EXISTS {0} ( } 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 { var stmt = db.prepareStatement(sql); stmt.execute(); @@ -70,14 +70,13 @@ CREATE TABLE IF NOT EXISTS {0} ( } @Override - public Map list(long userId) { - + public Map list(long userId) { try { - var map = new HashMap(); - var rs = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(HASH,TABLE_URLS,HASH).where(USER_ID, Condition.equal(userId)).exec(db); + var map = new HashMap(); + 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()){ var bookmark = Bookmark.of(rs); - map.put(bookmark.hash(),bookmark); + map.put(bookmark.id(),bookmark); } rs.close();; return map; @@ -88,15 +87,23 @@ CREATE TABLE IF NOT EXISTS {0} ( @Override public Bookmark save(String url, String comment, long userId) { - var hash = sha1(url); try { var timestamp = LocalDateTime.now(); - replaceInto(TABLE_URLS,HASH,URL) - .values(hash,url).execute(db).close(); - replaceInto(TABLE_URL_COMMENTS,HASH,USER_ID,COMMENT, TIMESTAMP) - .values(hash,userId,comment,timestamp.toEpochSecond(UTC)) + var rs = select(ID).from(TABLE_URLS).where(URL,Condition.equal(url)).exec(db); + var id = 0L; + if (rs.next()) id = rs.getLong(ID); + 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(); - return Bookmark.of(url,comment,timestamp); + return Bookmark.of(id,url,comment,timestamp); } catch (SQLException e) { throw new UmbrellaException("Failed to store url"); } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Bookmark.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Bookmark.java index 9496d13..24d5ae8 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Bookmark.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Bookmark.java @@ -2,8 +2,6 @@ package de.srsoftware.umbrella.core.model; 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 de.srsoftware.tools.Mappable; @@ -14,22 +12,22 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; -public record Bookmark(String url, Hash hash, String comment, LocalDateTime timestamp, Collection tags) implements Mappable { +public record Bookmark(long id, String url, String comment, LocalDateTime timestamp, Collection tags) implements Mappable { 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){ - return new Bookmark(url,sha1(url),comment,timestamp,new ArrayList<>()); + public static Bookmark of(long id, String url, String comment, LocalDateTime timestamp){ + return new Bookmark(id,url,comment,timestamp,new ArrayList<>()); } @Override public Map toMap() { return Map.of( + ID,id, URL, url, COMMENT, comment, - HASH, Map.of(VALUE,hash.value(),TYPE,hash.type()), TAGS, tags, TIMESTAMP, timestamp.withNano(0) );