diff --git a/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java b/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java index 29de9c5..755b683 100644 --- a/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java +++ b/de.srsoftware.cal.app/src/main/java/de/srsoftware/cal/app/AutoImporter.java @@ -19,14 +19,19 @@ public class AutoImporter implements Runnable, ClassListener { private static final System.Logger LOG = System.getLogger(AutoImporter.class.getSimpleName()); private static final Map<String, String> DESCRIPTION_TAGS = Map.<String, String>ofEntries( entry("50s","50er"), + entry("50’s","50er"), entry("50er","50er"), entry("60s","60er"), + entry("60’s","60er"), entry("60er","60er"), entry("70s","70er"), + entry("70’s","70er"), entry("70er","70er"), entry("80s","80er"), + entry("80’s","80er"), entry("80er","80er"), entry("90s","90er"), + entry("90’s","90er"), entry("90er","90er"), entry("ac dc","Metal"), entry("alternative rock","AlternativeRock"), @@ -91,6 +96,7 @@ public class AutoImporter implements Runnable, ClassListener { entry("humor","Comedy"), entry("humpa","Humppa"), entry("humppa","Humppa"), + entry("indie","indie"), entry("industrial","Industrial"), entry("industrial metal","IndustrialMetal"), entry("jam session","JamSession"), @@ -281,7 +287,7 @@ public class AutoImporter implements Runnable, ClassListener { @Override public void classAdded(Class<?> aClass) { - if (Importer.class.isAssignableFrom(aClass)) try { + if (Importer.class.isAssignableFrom(aClass) && aClass.getSimpleName().contains("Ebu")) try { var instance = aClass.getDeclaredConstructor().newInstance(); importers.add((Importer) instance); lastImport = null; diff --git a/de.srsoftware.cal.db/src/main/java/de/srsoftware/cal/db/MariaDB.java b/de.srsoftware.cal.db/src/main/java/de/srsoftware/cal/db/MariaDB.java index 70458da..255289f 100644 --- a/de.srsoftware.cal.db/src/main/java/de/srsoftware/cal/db/MariaDB.java +++ b/de.srsoftware.cal.db/src/main/java/de/srsoftware/cal/db/MariaDB.java @@ -1,6 +1,7 @@ /* © SRSoftware 2024 */ package de.srsoftware.cal.db; +import static de.srsoftware.cal.Util.extractCoords; import static de.srsoftware.cal.db.Fields.*; import static de.srsoftware.cal.db.Fields.ALL; import static de.srsoftware.tools.Error.error; @@ -74,38 +75,10 @@ public class MariaDB implements Database { keys.close(); if (saved == null) return error("Insert query did not return appointment id!"); - { // link to attachments - var attachments = saved.attachments(); - InsertQuery assignQuery = null; - for (var attachment : attachments) { - var urlId = getOrCreateUrl(attachment.url()); - if (assignQuery == null) assignQuery = insertInto(APPOINTMENT_ATTACHMENTS, AID, UID, MIME); - if (urlId.isPresent()) assignQuery.values(saved.id(), urlId.get(), attachment.mime()); - } - if (assignQuery != null) assignQuery.ignoreDuplicates().execute(connection); - } - - { // link to links - var links = saved.links(); - InsertQuery assignQuery = null; - for (var link : links) { - var urlId = getOrCreateUrl(link.url()); - if (assignQuery == null) assignQuery = insertInto(APPOINTMENT_URLS, AID, UID, DESCRIPTION); - if (urlId.isPresent()) assignQuery.values(saved.id(), urlId.get(), link.desciption()); - } - if (assignQuery != null) assignQuery.ignoreDuplicates().execute(connection); - } + addAttachments(saved); + addLinks(saved); + addTags(saved); - { - var tags = saved.tags(); - InsertQuery assignQuery = null; - for (var tag : tags) { - var tagId = getOrCreateTag(tag); - if (assignQuery == null) assignQuery = insertInto(APPOINTMENT_TAGS, AID, TID); - if (tagId.isPresent()) assignQuery.values(saved.id(), tagId.get()); - } - if (assignQuery != null) assignQuery.ignoreDuplicates().execute(connection); - } return Payload.of(saved); } catch (SQLException e) { LOG.log(ERROR, "Failed to store appointment", e); @@ -113,6 +86,39 @@ public class MariaDB implements Database { } } + private void addAttachments(Appointment saved) throws SQLException { // link to attachments + var attachments = saved.attachments(); + InsertQuery assignQuery = null; + for (var attachment : attachments) { + var urlId = getOrCreateUrl(attachment.url()); + if (assignQuery == null) assignQuery = insertInto(APPOINTMENT_ATTACHMENTS, AID, UID, MIME); + if (urlId.isPresent()) assignQuery.values(saved.id(), urlId.get(), attachment.mime()); + } + if (assignQuery != null) assignQuery.ignoreDuplicates().execute(connection); + } + + private void addLinks(Appointment saved) throws SQLException { // link to links + var links = saved.links(); + InsertQuery assignQuery = null; + for (var link : links) { + var urlId = getOrCreateUrl(link.url()); + if (assignQuery == null) assignQuery = insertInto(APPOINTMENT_URLS, AID, UID, DESCRIPTION); + if (urlId.isPresent()) assignQuery.values(saved.id(), urlId.get(), link.desciption()); + } + if (assignQuery != null) assignQuery.ignoreDuplicates().execute(connection); + } + + private void addTags(Appointment saved) throws SQLException { + var tags = saved.tags(); + InsertQuery assignQuery = null; + for (var tag : tags) { + var tagId = getOrCreateTag(tag); + if (assignQuery == null) assignQuery = insertInto(APPOINTMENT_TAGS, AID, TID); + if (tagId.isPresent()) assignQuery.values(saved.id(), tagId.get()); + } + if (assignQuery != null) assignQuery.ignoreDuplicates().execute(connection); + } + private Optional<Long> getOrCreateUrl(URL url) throws SQLException { var rs = select(UID).from(URLS).where(URL, equal(url.toString())).exec(connection); Long uid = null; @@ -158,8 +164,7 @@ public class MariaDB implements Database { @Override public Result<List<Appointment>> list(LocalDateTime from, LocalDateTime till, Integer count, Integer offset) { - var query = Query // - .select("appointments.*", "GROUP_CONCAT(keyword) AS tags") + var query = select("appointments.*", "GROUP_CONCAT(keyword) AS tags") .from(APPOINTMENTS) .leftJoin(AID, "appointment_tags", AID) .leftJoin("tid", "tags", "tid") @@ -279,7 +284,7 @@ public class MariaDB implements Database { var appointment = new BaseAppointment(id, title, description, start, end, location); try { - Util.extractCoords(results.getString(COORDS)).optional().ifPresent(appointment::coords); + extractCoords(results.getString(COORDS)).optional().ifPresent(appointment::coords); } catch (SQLException e) { LOG.log(WARNING, "Failed to read coordinates from database!"); } @@ -301,10 +306,10 @@ public class MariaDB implements Database { @Override public Result<Long> removeAppointment(long id) { try { - Query.delete().from(APPOINTMENTS).where(AID, equal(id)).execute(connection); - Query.delete().from(APPOINTMENT_TAGS).where(AID, equal(id)).execute(connection); - Query.delete().from(APPOINTMENT_ATTACHMENTS).where(AID, equal(id)).execute(connection); - Query.delete().from(APPOINTMENT_URLS).where(AID, equal(id)).execute(connection); + delete().from(APPOINTMENTS).where(AID, equal(id)).execute(connection); + delete().from(APPOINTMENT_TAGS).where(AID, equal(id)).execute(connection); + delete().from(APPOINTMENT_ATTACHMENTS).where(AID, equal(id)).execute(connection); + delete().from(APPOINTMENT_URLS).where(AID, equal(id)).execute(connection); return Payload.of(id); } catch (SQLException e) { return SqlError.of(e, "Failed to delete event %s", id); @@ -318,15 +323,20 @@ public class MariaDB implements Database { var coords = event.coords().map(Object::toString).orElse(null); var location = event.location().orElse(null); try { - Query - .update(APPOINTMENTS) // + long id = event.id(); + Query.update(APPOINTMENTS) .set(TITLE, DESCRIPTION, START, END, LOCATION, COORDS) - .where(AID, equal(event.id())) + .where(AID, equal(id)) .prepare(connection) .apply(event.title(), event.description(), start, end, location, coords); - // TODO: update links, attachments, tags - LOG.log(WARNING,"updating of tags, links and attachments not implemented!"); + delete().from(APPOINTMENT_TAGS).where(AID, equal(id)).execute(connection); + addTags(event); + delete().from(APPOINTMENT_ATTACHMENTS).where(AID, equal(id)).execute(connection); + addAttachments(event); + delete().from(APPOINTMENT_URLS).where(AID, equal(id)).execute(connection); + addLinks(event); + return Payload.of(event); } catch (SQLException sqle) { return error(sqle, "Failed to update database entry");