|
|
|
@ -7,7 +7,7 @@ import static de.srsoftware.cal.db.Fields.ALL;
@@ -7,7 +7,7 @@ import static de.srsoftware.cal.db.Fields.ALL;
|
|
|
|
|
import static de.srsoftware.tools.Optionals.*; |
|
|
|
|
import static de.srsoftware.tools.Result.transform; |
|
|
|
|
import static de.srsoftware.tools.jdbc.Condition.*; |
|
|
|
|
import static de.srsoftware.tools.jdbc.Query.MARK; |
|
|
|
|
import static de.srsoftware.tools.jdbc.Query.*; |
|
|
|
|
import static java.lang.System.Logger.Level.*; |
|
|
|
|
|
|
|
|
|
import de.srsoftware.cal.BaseAppointment; |
|
|
|
@ -44,7 +44,7 @@ public class MariaDB implements Database {
@@ -44,7 +44,7 @@ public class MariaDB implements Database {
|
|
|
|
|
|
|
|
|
|
private void applyUpdates() throws SQLException { |
|
|
|
|
LOG.log(INFO, "Checking for updates…"); |
|
|
|
|
var rs = Query.select("value").from("config").where("keyname", equal("dbversion")).exec(connection); |
|
|
|
|
var rs = select("value").from("config").where("keyname", equal("dbversion")).exec(connection); |
|
|
|
|
var version = 0; |
|
|
|
|
if (rs.next()) { |
|
|
|
|
version = rs.getInt("value"); |
|
|
|
@ -68,7 +68,7 @@ public class MariaDB implements Database {
@@ -68,7 +68,7 @@ public class MariaDB implements Database {
|
|
|
|
|
connection.prepareStatement(ADD_SLUG).execute(); |
|
|
|
|
var slugMap = new HashMap<Long, String>(); |
|
|
|
|
LOG.log(DEBUG, "Reading existing appointments…"); |
|
|
|
|
var rs = Query.select(ALL).from("appointments").exec(connection); |
|
|
|
|
var rs = select(ALL).from("appointments").exec(connection); |
|
|
|
|
while (rs.next()) { |
|
|
|
|
var id = rs.getLong(AID); |
|
|
|
|
var location = nullable(nullIfEmpty(rs.getString("location"))); |
|
|
|
@ -84,13 +84,13 @@ public class MariaDB implements Database {
@@ -84,13 +84,13 @@ public class MariaDB implements Database {
|
|
|
|
|
} |
|
|
|
|
rs.close(); |
|
|
|
|
LOG.log(DEBUG, "Creating slugs…"); |
|
|
|
|
var query = Query.updateIgnore("appointments").set("slug").where(AID, equal(MARK)).prepare(connection); |
|
|
|
|
var query = updateIgnore("appointments").set("slug").where(AID, equal(MARK)).prepare(connection); |
|
|
|
|
for (var entry : slugMap.entrySet()) { |
|
|
|
|
query.apply(entry.getValue(), entry.getKey()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LOG.log(DEBUG, "Writing new db version marker…"); |
|
|
|
|
Query.update("config").set("value").where("keyname", equal("dbversion")).prepare(connection).apply(2); |
|
|
|
|
update("config").set("value").where("keyname", equal("dbversion")).prepare(connection).apply(2); |
|
|
|
|
connection.setAutoCommit(true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -102,8 +102,7 @@ public class MariaDB implements Database {
@@ -102,8 +102,7 @@ public class MariaDB implements Database {
|
|
|
|
|
@Override |
|
|
|
|
public Result<Appointment> add(Appointment appointment) { |
|
|
|
|
try { |
|
|
|
|
ResultSet keys = Query //
|
|
|
|
|
.insertInto(APPOINTMENTS, TITLE, DESCRIPTION, START, END, LOCATION, COORDS, SLUG) |
|
|
|
|
ResultSet keys = insertInto(APPOINTMENTS, TITLE, DESCRIPTION, START, END, LOCATION, COORDS, SLUG) //
|
|
|
|
|
.values(appointment.title(), appointment.description(), appointment.start(), appointment.end().orElse(null), appointment.location(), appointment.coords().orElse(null), appointment.slug()) |
|
|
|
|
.execute(connection) |
|
|
|
|
.getGeneratedKeys(); |
|
|
|
@ -111,36 +110,72 @@ public class MariaDB implements Database {
@@ -111,36 +110,72 @@ public class MariaDB implements Database {
|
|
|
|
|
if (keys.next()) saved = appointment.clone(keys.getLong(1)); |
|
|
|
|
keys.close(); |
|
|
|
|
if (saved == null) return Error.of("Insert query did not return appointment id!"); |
|
|
|
|
var attachments = saved.attachments(); |
|
|
|
|
Query.InsertQuery assignQuery = null; |
|
|
|
|
|
|
|
|
|
for (var attachment : attachments){ |
|
|
|
|
if (assignQuery == null) assignQuery = Query.insertInto(APPOINTMENT_ATTACHMENTS,AID,UID,MIME); |
|
|
|
|
var urlId = getOrCreateUrl(attachment.url()); |
|
|
|
|
if (urlId.isPresent()) assignQuery.values(saved.id(), urlId.get(),attachment.mime()); |
|
|
|
|
{ // 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.execute(connection); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
{ // link to links
|
|
|
|
|
var links = saved.urls(); |
|
|
|
|
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.execute(connection); |
|
|
|
|
} |
|
|
|
|
if (assignQuery != null) assignQuery.execute(connection); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
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.execute(connection); |
|
|
|
|
} |
|
|
|
|
return Payload.of(saved); |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
LOG.log(ERROR,"Failed to store appointment",e); |
|
|
|
|
LOG.log(ERROR, "Failed to store appointment", e); |
|
|
|
|
return Error.of("Failed to store appointment", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Optional<Long> getOrCreateUrl(URL url) throws SQLException { |
|
|
|
|
var rs = Query.select(UID).from(URLS).where(URL,equal(url.toString())).exec(connection); |
|
|
|
|
var rs = select(UID).from(URLS).where(URL, equal(url.toString())).exec(connection); |
|
|
|
|
Long uid = null; |
|
|
|
|
if (rs.next()) uid = rs.getLong(1); |
|
|
|
|
rs.close(); |
|
|
|
|
if (uid == null){ |
|
|
|
|
rs = Query.insertInto(URLS,URL).values(url.toString()).execute(connection).getGeneratedKeys(); |
|
|
|
|
if (uid == null) { |
|
|
|
|
rs = insertInto(URLS, URL).values(url.toString()).execute(connection).getGeneratedKeys(); |
|
|
|
|
if (rs.next()) uid = rs.getLong(1); |
|
|
|
|
rs.close(); |
|
|
|
|
} |
|
|
|
|
return nullable(uid); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Optional<Long> getOrCreateTag(String tag) throws SQLException { |
|
|
|
|
var rs = select(TID).from(TAGS).where(KEYWORD, equal(tag)).exec(connection); |
|
|
|
|
Long tid = null; |
|
|
|
|
if (rs.next()) tid = rs.getLong(1); |
|
|
|
|
rs.close(); |
|
|
|
|
if (tid == null) { |
|
|
|
|
rs = insertInto(TAGS, KEYWORD).values(tag).execute(connection).getGeneratedKeys(); |
|
|
|
|
if (rs.next()) tid = rs.getLong(1); |
|
|
|
|
rs.close(); |
|
|
|
|
} |
|
|
|
|
return nullable(tid); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static Database connect(String jdbc, String user, String pass) throws SQLException { |
|
|
|
|
return new MariaDB(DriverManager.getConnection(jdbc, user, pass)); |
|
|
|
|
} |
|
|
|
@ -149,7 +184,7 @@ public class MariaDB implements Database {
@@ -149,7 +184,7 @@ public class MariaDB implements Database {
|
|
|
|
|
public Result<List<String>> findTags(String infix) { |
|
|
|
|
try { |
|
|
|
|
List<String> results = new ArrayList<>(); |
|
|
|
|
var rs = Query.select(KEYWORD).from(TAGS).where(KEYWORD, like("%%%s%%".formatted(infix))).sort(KEYWORD).exec(connection); |
|
|
|
|
var rs = select(KEYWORD).from(TAGS).where(KEYWORD, like("%%%s%%".formatted(infix))).sort(KEYWORD).exec(connection); |
|
|
|
|
while (rs.next()) results.add(rs.getString(KEYWORD)); |
|
|
|
|
rs.close(); |
|
|
|
|
return Payload.of(results); |
|
|
|
@ -161,7 +196,7 @@ public class MariaDB implements Database {
@@ -161,7 +196,7 @@ public class MariaDB implements Database {
|
|
|
|
|
@Override |
|
|
|
|
public List<Appointment> list(Integer count, Integer offset) throws SQLException { |
|
|
|
|
var list = new ArrayList<Appointment>(); |
|
|
|
|
var results = Query.select(ALL).from(APPOINTMENTS).sort("start").exec(connection); |
|
|
|
|
var results = select(ALL).from(APPOINTMENTS).sort("start").exec(connection); |
|
|
|
|
while (results.next()) createAppointmentOf(results).optional().ifPresent(list::add); |
|
|
|
|
results.close(); |
|
|
|
|
return list; |
|
|
|
@ -170,7 +205,7 @@ public class MariaDB implements Database {
@@ -170,7 +205,7 @@ public class MariaDB implements Database {
|
|
|
|
|
@Override |
|
|
|
|
public Result<Appointment> loadEvent(long id) { |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(ALL).from(APPOINTMENTS).where(AID, equal(id)).exec(connection); |
|
|
|
|
var rs = select(ALL).from(APPOINTMENTS).where(AID, equal(id)).exec(connection); |
|
|
|
|
Result<Appointment> result = rs.next() ? createAppointmentOf(rs).map(MariaDB::loadExtra) : Error.format("Failed to find appointment with id %s", id); |
|
|
|
|
rs.close(); |
|
|
|
|
return result; |
|
|
|
@ -182,7 +217,7 @@ public class MariaDB implements Database {
@@ -182,7 +217,7 @@ public class MariaDB implements Database {
|
|
|
|
|
@Override |
|
|
|
|
public Result<Appointment> loadEvent(String slug) { |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(ALL).from(APPOINTMENTS).where(SLUG, equal(slug)).exec(connection); |
|
|
|
|
var rs = select(ALL).from(APPOINTMENTS).where(SLUG, equal(slug)).exec(connection); |
|
|
|
|
Result<Appointment> result = rs.next() ? createAppointmentOf(rs).map(MariaDB::loadExtra) : Error.format("Failed to find appointment with slug %s", slug); |
|
|
|
|
rs.close(); |
|
|
|
|
return result; |
|
|
|
@ -200,7 +235,7 @@ public class MariaDB implements Database {
@@ -200,7 +235,7 @@ public class MariaDB implements Database {
|
|
|
|
|
BaseAppointment event = res.optional().get(); |
|
|
|
|
var id = event.id(); |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(KEYWORD).from(APPOINTMENT_TAGS).leftJoin(TID, "tags", TID).where(AID, equal(id)).exec(connection); |
|
|
|
|
var rs = select(KEYWORD).from(APPOINTMENT_TAGS).leftJoin(TID, "tags", TID).where(AID, equal(id)).exec(connection); |
|
|
|
|
while (rs.next()) event.tags(rs.getString(1)); |
|
|
|
|
rs.close(); |
|
|
|
|
return Payload.of(event); |
|
|
|
@ -214,7 +249,7 @@ public class MariaDB implements Database {
@@ -214,7 +249,7 @@ public class MariaDB implements Database {
|
|
|
|
|
BaseAppointment event = res.optional().get(); |
|
|
|
|
var id = event.id(); |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(URL, DESCRIPTION).from(APPOINTMENT_URLS).leftJoin(UID, URLS, UID).where(AID, equal(id)).exec(connection); |
|
|
|
|
var rs = select(URL, DESCRIPTION).from(APPOINTMENT_URLS).leftJoin(UID, URLS, UID).where(AID, equal(id)).exec(connection); |
|
|
|
|
while (rs.next()) { |
|
|
|
|
var u = rs.getString(URL); |
|
|
|
|
try { |
|
|
|
@ -237,7 +272,7 @@ public class MariaDB implements Database {
@@ -237,7 +272,7 @@ public class MariaDB implements Database {
|
|
|
|
|
BaseAppointment event = res.optional().get(); |
|
|
|
|
var id = event.id(); |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(URL, MIME).from(APPOINTMENT_ATTACHMENTS).leftJoin(UID, URLS, UID).where(AID, equal(id)).exec(connection); |
|
|
|
|
var rs = select(URL, MIME).from(APPOINTMENT_ATTACHMENTS).leftJoin(UID, URLS, UID).where(AID, equal(id)).exec(connection); |
|
|
|
|
while (rs.next()) { |
|
|
|
|
var u = rs.getString(URL); |
|
|
|
|
try { |
|
|
|
|