overhaule db layout, so we have LONG values as keys
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user